From 50b017332f47559862f9c2b1ae4ca67286ea28a7 Mon Sep 17 00:00:00 2001 From: Floris Bos Date: Fri, 24 Mar 2023 14:05:29 +0100 Subject: [PATCH] Update dependencies libarchive/zlib/liblzma/zstd Update various bundled dependencies to handle archive formats. (Only used on Windows and OSX. On Linux system libraries are used) --- src/CMakeLists.txt | 36 +- src/dependencies/cmliblzma/.gitattributes | 1 + src/dependencies/cmliblzma/CMakeLists.txt | 2 - src/dependencies/cmliblzma/common/mythread.h | 521 + src/dependencies/cmliblzma/common/sysdefs.h | 11 +- .../cmliblzma/common/tuklib_common.h | 71 + .../cmliblzma/common/tuklib_config.h | 7 + .../cmliblzma/common/tuklib_cpucores.c | 100 + .../cmliblzma/common/tuklib_cpucores.h | 23 + .../cmliblzma/common/tuklib_integer.h | 510 +- src/dependencies/cmliblzma/config.h.in | 14 - src/dependencies/cmliblzma/liblzma/api/lzma.h | 5 +- .../cmliblzma/liblzma/api/lzma/block.h | 2 +- .../cmliblzma/liblzma/api/lzma/filter.h | 7 +- .../cmliblzma/liblzma/api/lzma/hardware.h | 2 +- .../cmliblzma/liblzma/api/lzma/lzma12.h | 2 +- .../cmliblzma/liblzma/api/lzma/version.h | 2 +- .../cmliblzma/liblzma/api/lzma/vli.h | 2 +- .../cmliblzma/liblzma/check/crc32_fast.c | 4 +- .../cmliblzma/liblzma/check/crc32_table.c | 3 + .../cmliblzma/liblzma/check/crc64_fast.c | 4 +- .../cmliblzma/liblzma/check/crc64_table.c | 3 + .../cmliblzma/liblzma/common/alone_decoder.c | 3 +- .../cmliblzma/liblzma/common/alone_encoder.c | 9 +- .../liblzma/common/block_header_decoder.c | 4 +- .../liblzma/common/block_header_encoder.c | 2 +- .../cmliblzma/liblzma/common/block_util.c | 2 +- .../cmliblzma/liblzma/common/common.c | 8 +- .../cmliblzma/liblzma/common/common.h | 1 + .../cmliblzma/liblzma/common/filter_common.h | 2 +- .../cmliblzma/liblzma/common/filter_decoder.h | 2 +- .../liblzma/common/filter_flags_encoder.c | 2 +- .../liblzma/common/hardware_physmem.c | 2 +- .../cmliblzma/liblzma/common/index.c | 8 +- .../cmliblzma/liblzma/common/memcmplen.h | 19 +- .../liblzma/common/stream_encoder_mt.c | 4 +- .../liblzma/common/stream_flags_decoder.c | 6 +- .../liblzma/common/stream_flags_encoder.c | 8 +- .../cmliblzma/liblzma/common/vli_decoder.c | 2 +- .../cmliblzma/liblzma/delta/delta_decoder.c | 2 +- .../cmliblzma/liblzma/lz/lz_decoder.c | 17 +- .../cmliblzma/liblzma/lz/lz_encoder_hash.h | 2 +- .../cmliblzma/liblzma/lz/lz_encoder_mf.c | 2 +- .../cmliblzma/liblzma/lzma/fastpos.h | 2 +- .../cmliblzma/liblzma/lzma/fastpos_tablegen.c | 1 - .../cmliblzma/liblzma/lzma/lzma2_decoder.c | 8 +- .../cmliblzma/liblzma/lzma/lzma_common.h | 3 +- .../cmliblzma/liblzma/lzma/lzma_decoder.c | 18 +- .../cmliblzma/liblzma/lzma/lzma_encoder.c | 2 +- .../lzma/lzma_encoder_optimum_normal.c | 16 +- .../liblzma/lzma/lzma_encoder_private.h | 3 +- .../cmliblzma/liblzma/simple/arm.c | 6 +- .../cmliblzma/liblzma/simple/armthumb.c | 8 +- .../cmliblzma/liblzma/simple/ia64.c | 2 +- .../cmliblzma/liblzma/simple/powerpc.c | 9 +- .../cmliblzma/liblzma/simple/simple_coder.c | 10 +- .../cmliblzma/liblzma/simple/simple_decoder.c | 2 +- .../cmliblzma/liblzma/simple/simple_encoder.c | 2 +- .../build/autoconf/config.sub | 1801 --- .../libarchive-3.5.2/build/version | 1 - .../doc/pdf/archive_entry.3.pdf | Bin 28974 -> 0 bytes .../doc/pdf/archive_entry_acl.3.pdf | Bin 38581 -> 0 bytes .../doc/pdf/archive_entry_linkify.3.pdf | Bin 28261 -> 0 bytes .../doc/pdf/archive_entry_misc.3.pdf | Bin 21711 -> 0 bytes .../doc/pdf/archive_entry_paths.3.pdf | Bin 25125 -> 0 bytes .../doc/pdf/archive_entry_perms.3.pdf | Bin 29724 -> 0 bytes .../doc/pdf/archive_entry_stat.3.pdf | Bin 33264 -> 0 bytes .../doc/pdf/archive_entry_time.3.pdf | Bin 23334 -> 0 bytes .../doc/pdf/archive_read.3.pdf | Bin 32863 -> 0 bytes .../doc/pdf/archive_read_add_passphrase.3.pdf | Bin 22201 -> 0 bytes .../doc/pdf/archive_read_data.3.pdf | Bin 26233 -> 0 bytes .../doc/pdf/archive_read_disk.3.pdf | Bin 40240 -> 0 bytes .../doc/pdf/archive_read_extract.3.pdf | Bin 28535 -> 0 bytes .../doc/pdf/archive_read_filter.3.pdf | Bin 26171 -> 0 bytes .../doc/pdf/archive_read_format.3.pdf | Bin 27209 -> 0 bytes .../doc/pdf/archive_read_free.3.pdf | Bin 22789 -> 0 bytes .../doc/pdf/archive_read_header.3.pdf | Bin 22973 -> 0 bytes .../doc/pdf/archive_read_new.3.pdf | Bin 20202 -> 0 bytes .../doc/pdf/archive_read_open.3.pdf | Bin 30177 -> 0 bytes .../doc/pdf/archive_read_set_options.3.pdf | Bin 28187 -> 0 bytes .../doc/pdf/archive_util.3.pdf | Bin 28970 -> 0 bytes .../doc/pdf/archive_write.3.pdf | Bin 37778 -> 0 bytes .../doc/pdf/archive_write_blocksize.3.pdf | Bin 25921 -> 0 bytes .../doc/pdf/archive_write_data.3.pdf | Bin 23135 -> 0 bytes .../doc/pdf/archive_write_disk.3.pdf | Bin 40567 -> 0 bytes .../doc/pdf/archive_write_filter.3.pdf | Bin 24996 -> 0 bytes .../doc/pdf/archive_write_finish_entry.3.pdf | Bin 23833 -> 0 bytes .../doc/pdf/archive_write_format.3.pdf | Bin 27360 -> 0 bytes .../doc/pdf/archive_write_free.3.pdf | Bin 22624 -> 0 bytes .../doc/pdf/archive_write_header.3.pdf | Bin 22488 -> 0 bytes .../doc/pdf/archive_write_new.3.pdf | Bin 20177 -> 0 bytes .../doc/pdf/archive_write_open.3.pdf | Bin 33883 -> 0 bytes .../doc/pdf/archive_write_set_options.3.pdf | Bin 47200 -> 0 bytes .../pdf/archive_write_set_passphrase.3.pdf | Bin 22456 -> 0 bytes .../libarchive-3.5.2/doc/pdf/bsdcpio.1.pdf | Bin 39464 -> 0 bytes .../libarchive-3.5.2/doc/pdf/bsdtar.1.pdf | Bin 73931 -> 0 bytes .../libarchive-3.5.2/doc/pdf/cpio.5.pdf | Bin 39944 -> 0 bytes .../doc/pdf/libarchive-formats.5.pdf | Bin 42891 -> 0 bytes .../libarchive-3.5.2/doc/pdf/libarchive.3.pdf | Bin 31661 -> 0 bytes .../doc/pdf/libarchive_changes.3.pdf | Bin 35697 -> 0 bytes .../doc/pdf/libarchive_internals.3.pdf | Bin 39907 -> 0 bytes .../libarchive-3.5.2/doc/pdf/mtree.5.pdf | Bin 32505 -> 0 bytes .../libarchive-3.5.2/doc/pdf/tar.5.pdf | Bin 69196 -> 0 bytes .../libarchive-3.5.2/test_utils/test_utils.c | 124 - .../CMakeLists.txt | 105 +- .../COPYING | 0 .../INSTALL | 0 .../Makefile.am | 22 +- .../Makefile.in | 185 +- .../NEWS | 8 + .../README.md | 5 + .../aclocal.m4 | 102 +- .../build/autoconf/ax_append_compile_flags.m4 | 0 .../build/autoconf/ax_append_flag.m4 | 0 .../build/autoconf/ax_check_compile_flag.m4 | 0 .../build/autoconf/ax_require_defined.m4 | 0 .../build/autoconf/check_stdcall_func.m4 | 0 .../build/autoconf/compile | 6 +- .../build/autoconf/config.guess | 1500 +- .../build/autoconf/config.rpath | 0 .../build/autoconf/config.sub | 1890 +++ .../build/autoconf/depcomp | 2 +- .../build/autoconf/iconv.m4 | 0 .../build/autoconf/install-sh | 157 +- .../build/autoconf/la_uid_t.m4 | 0 .../build/autoconf/lib-ld.m4 | 0 .../build/autoconf/lib-link.m4 | 0 .../build/autoconf/lib-prefix.m4 | 0 .../build/autoconf/ltmain.sh | 4 +- .../autoconf/m4_ax_compile_check_sizeof.m4 | 115 + .../build/autoconf/missing | 2 +- .../build/autoconf/test-driver | 19 +- .../build/autogen.sh | 0 .../build/bump-version.sh | 0 .../build/clean.sh | 0 .../build/cmake/CheckFileOffsetBits.c | 0 .../build/cmake/CheckFileOffsetBits.cmake | 0 .../build/cmake/CheckFuncs.cmake | 0 .../build/cmake/CheckFuncs_stub.c.in | 0 .../build/cmake/CheckHeaderDirent.cmake | 0 .../build/cmake/CheckTypeExists.cmake | 0 .../build/cmake/CreatePkgConfigFile.cmake | 0 .../build/cmake/FindLIBGCC.cmake} | 0 .../build/cmake/FindMbedTLS.cmake | 0 .../build/cmake/FindNettle.cmake | 0 .../build/cmake/FindPCREPOSIX.cmake | 0 .../build/cmake/LibarchiveCodeCoverage.cmake | 0 .../build/cmake/config.h.in | 96 +- .../build/pkgconfig/libarchive.pc.in | 1 + .../libarchive-3.6.2/build/version | 1 + .../cat/CMakeLists.txt | 0 .../cat/bsdcat.1 | 0 .../cat/bsdcat.c | 0 .../cat/bsdcat.h | 0 .../cat/bsdcat_platform.h | 0 .../cat/cmdline.c | 0 .../cat/test/CMakeLists.txt | 0 .../cat/test/list.h | 2 +- .../cat/test/test.h | 0 .../cat/test/test_0.c | 0 .../cat/test/test_empty.gz.uu | 0 .../cat/test/test_empty.lz4.uu | 0 .../cat/test/test_empty.xz.uu | 0 .../cat/test/test_empty.zst.uu | 0 .../cat/test/test_empty_gz.c | 0 .../cat/test/test_empty_lz4.c | 0 .../cat/test/test_empty_xz.c | 0 .../cat/test/test_empty_zstd.c | 0 .../cat/test/test_error.c | 0 .../cat/test/test_error_mixed.c | 0 .../cat/test/test_expand.Z.uu | 0 .../cat/test/test_expand.bz2.uu | 0 .../cat/test/test_expand.gz.uu | 0 .../cat/test/test_expand.lz4.uu | 0 .../cat/test/test_expand.plain.uu | 0 .../cat/test/test_expand.xz.uu | 0 .../cat/test/test_expand.zst.uu | 0 .../cat/test/test_expand_Z.c | 0 .../cat/test/test_expand_bz2.c | 0 .../cat/test/test_expand_gz.c | 0 .../cat/test/test_expand_lz4.c | 0 .../cat/test/test_expand_mixed.c | 0 .../cat/test/test_expand_plain.c | 0 .../cat/test/test_expand_xz.c | 0 .../cat/test/test_expand_zstd.c | 0 .../cat/test/test_help.c | 0 .../cat/test/test_stdin.c | 0 .../cat/test/test_version.c | 0 .../config.h.in | 123 +- .../configure | 11981 +++++++++------- .../configure.ac | 66 +- .../contrib/README | 0 .../contrib/android/Android.mk | 0 .../contrib/android/config/android.h | 0 .../contrib/android/config/linux_host.h | 0 .../contrib/android/config/windows_host.h | 0 .../contrib/android/include/Bcrypt.h | 0 .../contrib/android/include/Windows.h | 0 .../contrib/android/include/android_lf.h | 0 .../contrib/archivetest.c | 0 .../contrib/libarchive.1aix53.spec | 0 .../contrib/libarchive.spec | 0 .../libarchive_autodetect-st_lib_archive.m4 | 0 .../contrib/oss-fuzz/corpus.zip | Bin .../contrib/oss-fuzz/libarchive_fuzzer.cc | 0 .../contrib/oss-fuzz/oss-fuzz-build.sh | 0 .../contrib/psota-benchmark/results.txt | 0 .../contrib/psota-benchmark/tcp.sh | 0 .../contrib/shar/shar.1 | 0 .../contrib/shar/shar.c | 0 .../contrib/shar/tree.c | 0 .../contrib/shar/tree.h | 0 .../contrib/shar/tree_config.h | 0 .../contrib/untar.c | 12 + .../cpio/CMakeLists.txt | 0 .../cpio/bsdcpio.1 | 0 .../cpio/cmdline.c | 0 .../cpio/config_freebsd.h | 0 .../cpio/cpio.c | 0 .../cpio/cpio.h | 0 .../cpio/cpio_platform.h | 0 .../cpio/cpio_windows.c | 0 .../cpio/cpio_windows.h | 0 .../cpio/test/CMakeLists.txt | 0 .../cpio/test/list.h | 14 +- .../cpio/test/test.h | 0 .../cpio/test/test_0.c | 0 .../cpio/test/test_basic.c | 0 .../cpio/test/test_cmdline.c | 0 .../cpio/test/test_extract.cpio.Z.uu | 0 .../cpio/test/test_extract.cpio.bz2.uu | 0 .../cpio/test/test_extract.cpio.grz.uu | 0 .../cpio/test/test_extract.cpio.gz.uu | 0 .../cpio/test/test_extract.cpio.lrz.uu | 0 .../cpio/test/test_extract.cpio.lz.uu | 0 .../cpio/test/test_extract.cpio.lz4.uu | 0 .../cpio/test/test_extract.cpio.lzma.uu | 0 .../cpio/test/test_extract.cpio.lzo.uu | 0 .../cpio/test/test_extract.cpio.xz.uu | 0 .../cpio/test/test_extract.cpio.zst.uu | 0 .../cpio/test/test_extract_cpio_Z.c | 0 .../cpio/test/test_extract_cpio_bz2.c | 0 .../cpio/test/test_extract_cpio_grz.c | 0 .../cpio/test/test_extract_cpio_gz.c | 0 .../cpio/test/test_extract_cpio_lrz.c | 0 .../cpio/test/test_extract_cpio_lz.c | 0 .../cpio/test/test_extract_cpio_lz4.c | 0 .../cpio/test/test_extract_cpio_lzma.c | 0 .../cpio/test/test_extract_cpio_lzo.c | 0 .../cpio/test/test_extract_cpio_xz.c | 0 .../cpio/test/test_extract_cpio_zstd.c | 0 .../cpio/test/test_format_newc.c | 0 .../cpio/test/test_gcpio_compat.c | 0 .../cpio/test/test_gcpio_compat_ref.bin.uu | 0 .../cpio/test/test_gcpio_compat_ref.crc.uu | 0 .../cpio/test/test_gcpio_compat_ref.newc.uu | 0 .../cpio/test/test_gcpio_compat_ref.ustar.uu | 0 .../test/test_gcpio_compat_ref_nosym.bin.uu | 0 .../test/test_gcpio_compat_ref_nosym.crc.uu | 0 .../test/test_gcpio_compat_ref_nosym.newc.uu | 0 .../test/test_gcpio_compat_ref_nosym.ustar.uu | 0 .../cpio/test/test_missing_file.c | 0 .../cpio/test/test_option_0.c | 0 .../cpio/test/test_option_B_upper.c | 0 .../cpio/test/test_option_C_upper.c | 0 .../cpio/test/test_option_J_upper.c | 0 .../cpio/test/test_option_L_upper.c | 0 .../cpio/test/test_option_Z_upper.c | 0 .../cpio/test/test_option_a.c | 0 .../cpio/test/test_option_b64encode.c | 0 .../cpio/test/test_option_c.c | 0 .../cpio/test/test_option_d.c | 0 .../cpio/test/test_option_f.c | 0 .../cpio/test/test_option_f.cpio.uu | 0 .../cpio/test/test_option_grzip.c | 0 .../cpio/test/test_option_help.c | 0 .../cpio/test/test_option_l.c | 0 .../cpio/test/test_option_lrzip.c | 0 .../cpio/test/test_option_lz4.c | 0 .../cpio/test/test_option_lzma.c | 0 .../cpio/test/test_option_lzop.c | 0 .../cpio/test/test_option_m.c | 0 .../cpio/test/test_option_m.cpio.uu | 0 .../cpio/test/test_option_passphrase.c | 0 .../cpio/test/test_option_passphrase.zip.uu | 0 .../cpio/test/test_option_t.c | 24 +- .../cpio/test/test_option_t.cpio.uu | 0 .../cpio/test/test_option_t.stdout.uu | 0 .../cpio/test/test_option_tv.stdout.uu | 0 .../cpio/test/test_option_u.c | 0 .../cpio/test/test_option_uuencode.c | 0 .../cpio/test/test_option_version.c | 0 .../cpio/test/test_option_xz.c | 0 .../cpio/test/test_option_y.c | 0 .../cpio/test/test_option_z.c | 0 .../cpio/test/test_option_zstd.c | 0 .../cpio/test/test_owner_parse.c | 0 .../cpio/test/test_passthrough_dotdot.c | 0 .../cpio/test/test_passthrough_reverse.c | 0 .../doc/html/.ignore_me | 0 .../doc/html/Makefile | 8 +- .../doc/html/archive_entry.3.html | 2 +- .../doc/html/archive_entry_acl.3.html | 2 +- .../doc/html/archive_entry_linkify.3.html | 2 +- .../doc/html/archive_entry_misc.3.html | 2 +- .../doc/html/archive_entry_paths.3.html | 2 +- .../doc/html/archive_entry_perms.3.html | 2 +- .../doc/html/archive_entry_stat.3.html | 2 +- .../doc/html/archive_entry_time.3.html | 2 +- .../doc/html/archive_read.3.html | 2 +- .../html/archive_read_add_passphrase.3.html | 2 +- .../doc/html/archive_read_data.3.html | 2 +- .../doc/html/archive_read_disk.3.html | 146 +- .../doc/html/archive_read_extract.3.html | 2 +- .../doc/html/archive_read_filter.3.html | 2 +- .../doc/html/archive_read_format.3.html | 2 +- .../doc/html/archive_read_free.3.html | 2 +- .../doc/html/archive_read_header.3.html | 2 +- .../doc/html/archive_read_new.3.html | 2 +- .../doc/html/archive_read_open.3.html | 2 +- .../doc/html/archive_read_set_options.3.html | 2 +- .../doc/html/archive_util.3.html | 2 +- .../doc/html/archive_write.3.html | 2 +- .../doc/html/archive_write_blocksize.3.html | 2 +- .../doc/html/archive_write_data.3.html | 2 +- .../doc/html/archive_write_disk.3.html | 12 +- .../doc/html/archive_write_filter.3.html | 2 +- .../html/archive_write_finish_entry.3.html | 2 +- .../doc/html/archive_write_format.3.html | 2 +- .../doc/html/archive_write_free.3.html | 2 +- .../doc/html/archive_write_header.3.html | 2 +- .../doc/html/archive_write_new.3.html | 2 +- .../doc/html/archive_write_open.3.html | 4 +- .../doc/html/archive_write_set_options.3.html | 2 +- .../html/archive_write_set_passphrase.3.html | 2 +- .../doc/html/bsdcpio.1.html | 2 +- .../doc/html/bsdtar.1.html | 38 +- .../doc/html/cpio.5.html | 4 +- .../doc/html/libarchive-formats.5.html | 2 +- .../doc/html/libarchive.3.html | 57 +- .../doc/html/libarchive_changes.3.html | 2 +- .../doc/html/libarchive_internals.3.html | 2 +- .../doc/html/mtree.5.html | 2 +- .../doc/html/tar.5.html | 2 +- .../doc/man/.ignore_me | 0 .../doc/man/Makefile | 8 +- .../doc/man/archive_entry.3 | 0 .../doc/man/archive_entry_acl.3 | 0 .../doc/man/archive_entry_linkify.3 | 0 .../doc/man/archive_entry_misc.3 | 0 .../doc/man/archive_entry_paths.3 | 0 .../doc/man/archive_entry_perms.3 | 0 .../doc/man/archive_entry_stat.3 | 0 .../doc/man/archive_entry_time.3 | 0 .../doc/man/archive_read.3 | 0 .../doc/man/archive_read_add_passphrase.3 | 0 .../doc/man/archive_read_data.3 | 0 .../doc/man/archive_read_disk.3 | 99 +- .../doc/man/archive_read_extract.3 | 0 .../doc/man/archive_read_filter.3 | 0 .../doc/man/archive_read_format.3 | 0 .../doc/man/archive_read_free.3 | 0 .../doc/man/archive_read_header.3 | 0 .../doc/man/archive_read_new.3 | 0 .../doc/man/archive_read_open.3 | 0 .../doc/man/archive_read_set_options.3 | 0 .../doc/man/archive_util.3 | 0 .../doc/man/archive_write.3 | 0 .../doc/man/archive_write_blocksize.3 | 0 .../doc/man/archive_write_data.3 | 0 .../doc/man/archive_write_disk.3 | 8 +- .../doc/man/archive_write_filter.3 | 0 .../doc/man/archive_write_finish_entry.3 | 0 .../doc/man/archive_write_format.3 | 0 .../doc/man/archive_write_free.3 | 0 .../doc/man/archive_write_header.3 | 0 .../doc/man/archive_write_new.3 | 0 .../doc/man/archive_write_open.3 | 1 + .../doc/man/archive_write_set_options.3 | 0 .../doc/man/archive_write_set_passphrase.3 | 0 .../doc/man/bsdcpio.1 | 0 .../doc/man/bsdtar.1 | 25 + .../doc/man/cpio.5 | 2 +- .../doc/man/libarchive-formats.5 | 0 .../doc/man/libarchive.3 | 40 +- .../doc/man/libarchive_changes.3 | 0 .../doc/man/libarchive_internals.3 | 0 .../doc/man/mtree.5 | 0 .../doc/man/tar.5 | 0 .../doc/mdoc2man.awk | 0 .../doc/mdoc2wiki.awk | 0 .../doc/pdf/.ignore_me | 0 .../doc/pdf/Makefile | 8 +- .../doc/pdf/archive_entry.3.pdf | Bin 0 -> 28602 bytes .../doc/pdf/archive_entry_acl.3.pdf | Bin 0 -> 37988 bytes .../doc/pdf/archive_entry_linkify.3.pdf | Bin 0 -> 27891 bytes .../doc/pdf/archive_entry_misc.3.pdf | Bin 0 -> 21418 bytes .../doc/pdf/archive_entry_paths.3.pdf | Bin 0 -> 24688 bytes .../doc/pdf/archive_entry_perms.3.pdf | Bin 0 -> 29281 bytes .../doc/pdf/archive_entry_stat.3.pdf | Bin 0 -> 32753 bytes .../doc/pdf/archive_entry_time.3.pdf | Bin 0 -> 22970 bytes .../doc/pdf/archive_read.3.pdf | Bin 0 -> 32422 bytes .../doc/pdf/archive_read_add_passphrase.3.pdf | Bin 0 -> 21913 bytes .../doc/pdf/archive_read_data.3.pdf | Bin 0 -> 25866 bytes .../doc/pdf/archive_read_disk.3.pdf | Bin 0 -> 43365 bytes .../doc/pdf/archive_read_extract.3.pdf | Bin 0 -> 28166 bytes .../doc/pdf/archive_read_filter.3.pdf | Bin 0 -> 25802 bytes .../doc/pdf/archive_read_format.3.pdf | Bin 0 -> 26771 bytes .../doc/pdf/archive_read_free.3.pdf | Bin 0 -> 22491 bytes .../doc/pdf/archive_read_header.3.pdf | Bin 0 -> 22674 bytes .../doc/pdf/archive_read_new.3.pdf | Bin 0 -> 19906 bytes .../doc/pdf/archive_read_open.3.pdf | Bin 0 -> 29739 bytes .../doc/pdf/archive_read_set_options.3.pdf | Bin 0 -> 27745 bytes .../doc/pdf/archive_util.3.pdf | Bin 0 -> 28536 bytes .../doc/pdf/archive_write.3.pdf | Bin 0 -> 37273 bytes .../doc/pdf/archive_write_blocksize.3.pdf | Bin 0 -> 25554 bytes .../doc/pdf/archive_write_data.3.pdf | Bin 0 -> 22838 bytes .../doc/pdf/archive_write_disk.3.pdf | Bin 0 -> 40021 bytes .../doc/pdf/archive_write_filter.3.pdf | Bin 0 -> 24625 bytes .../doc/pdf/archive_write_finish_entry.3.pdf | Bin 0 -> 23534 bytes .../doc/pdf/archive_write_format.3.pdf | Bin 0 -> 26916 bytes .../doc/pdf/archive_write_free.3.pdf | Bin 0 -> 22324 bytes .../doc/pdf/archive_write_header.3.pdf | Bin 0 -> 22191 bytes .../doc/pdf/archive_write_new.3.pdf | Bin 0 -> 19881 bytes .../doc/pdf/archive_write_open.3.pdf | Bin 0 -> 33480 bytes .../doc/pdf/archive_write_set_options.3.pdf | Bin 0 -> 46418 bytes .../pdf/archive_write_set_passphrase.3.pdf | Bin 0 -> 22157 bytes .../libarchive-3.6.2/doc/pdf/bsdcpio.1.pdf | Bin 0 -> 38885 bytes .../libarchive-3.6.2/doc/pdf/bsdtar.1.pdf | Bin 0 -> 73277 bytes .../libarchive-3.6.2/doc/pdf/cpio.5.pdf | Bin 0 -> 39349 bytes .../doc/pdf/libarchive-formats.5.pdf | Bin 0 -> 42297 bytes .../libarchive-3.6.2/doc/pdf/libarchive.3.pdf | Bin 0 -> 31392 bytes .../doc/pdf/libarchive_changes.3.pdf | Bin 0 -> 35099 bytes .../doc/pdf/libarchive_internals.3.pdf | Bin 0 -> 39385 bytes .../libarchive-3.6.2/doc/pdf/mtree.5.pdf | Bin 0 -> 32064 bytes .../libarchive-3.6.2/doc/pdf/tar.5.pdf | Bin 0 -> 68242 bytes .../doc/text/.ignore_me | 0 .../doc/text/Makefile | 8 +- .../doc/text/archive_entry.3.txt | 4 +- .../doc/text/archive_entry_acl.3.txt | 8 +- .../doc/text/archive_entry_linkify.3.txt | 30 +- .../doc/text/archive_entry_misc.3.txt | 0 .../doc/text/archive_entry_paths.3.txt | 6 +- .../doc/text/archive_entry_perms.3.txt | 4 +- .../doc/text/archive_entry_stat.3.txt | 8 +- .../doc/text/archive_entry_time.3.txt | 4 +- .../doc/text/archive_read.3.txt | 6 +- .../text/archive_read_add_passphrase.3.txt | 0 .../doc/text/archive_read_data.3.txt | 2 +- .../doc/text/archive_read_disk.3.txt | 103 +- .../doc/text/archive_read_extract.3.txt | 4 +- .../doc/text/archive_read_filter.3.txt | 0 .../doc/text/archive_read_format.3.txt | 2 +- .../doc/text/archive_read_free.3.txt | 2 +- .../doc/text/archive_read_header.3.txt | 2 +- .../doc/text/archive_read_new.3.txt | 2 +- .../doc/text/archive_read_open.3.txt | 4 +- .../doc/text/archive_read_set_options.3.txt | 10 +- .../doc/text/archive_util.3.txt | 6 +- .../doc/text/archive_write.3.txt | 6 +- .../doc/text/archive_write_blocksize.3.txt | 6 +- .../doc/text/archive_write_data.3.txt | 4 +- .../doc/text/archive_write_disk.3.txt | 31 +- .../doc/text/archive_write_filter.3.txt | 4 +- .../doc/text/archive_write_finish_entry.3.txt | 0 .../doc/text/archive_write_format.3.txt | 4 +- .../doc/text/archive_write_free.3.txt | 2 +- .../doc/text/archive_write_header.3.txt | 4 +- .../doc/text/archive_write_new.3.txt | 2 +- .../doc/text/archive_write_open.3.txt | 12 +- .../doc/text/archive_write_set_options.3.txt | 18 +- .../text/archive_write_set_passphrase.3.txt | 2 +- .../doc/text/bsdcpio.1.txt | 50 +- .../doc/text/bsdtar.1.txt | 98 +- .../doc/text/cpio.5.txt | 86 +- .../doc/text/libarchive-formats.5.txt | 24 +- .../doc/text/libarchive.3.txt | 36 +- .../doc/text/libarchive_changes.3.txt | 0 .../doc/text/libarchive_internals.3.txt | 20 +- .../doc/text/mtree.5.txt | 14 +- .../doc/text/tar.5.txt | 32 +- .../doc/update.sh | 0 .../doc/wiki/.ignore_me | 0 .../doc/wiki/Makefile | 8 +- .../doc/wiki/ManPageArchiveEntry3.wiki | 0 .../doc/wiki/ManPageArchiveEntryAcl3.wiki | 0 .../doc/wiki/ManPageArchiveEntryLinkify3.wiki | 0 .../doc/wiki/ManPageArchiveEntryMisc3.wiki | 0 .../doc/wiki/ManPageArchiveEntryPaths3.wiki | 0 .../doc/wiki/ManPageArchiveEntryPerms3.wiki | 0 .../doc/wiki/ManPageArchiveEntryStat3.wiki | 0 .../doc/wiki/ManPageArchiveEntryTime3.wiki | 0 .../doc/wiki/ManPageArchiveRead3.wiki | 0 .../ManPageArchiveReadAddPassphrase3.wiki | 0 .../doc/wiki/ManPageArchiveReadData3.wiki | 0 .../doc/wiki/ManPageArchiveReadDisk3.wiki | 89 +- .../doc/wiki/ManPageArchiveReadExtract3.wiki | 0 .../doc/wiki/ManPageArchiveReadFilter3.wiki | 0 .../doc/wiki/ManPageArchiveReadFormat3.wiki | 0 .../doc/wiki/ManPageArchiveReadFree3.wiki | 0 .../doc/wiki/ManPageArchiveReadHeader3.wiki | 0 .../doc/wiki/ManPageArchiveReadNew3.wiki | 0 .../doc/wiki/ManPageArchiveReadOpen3.wiki | 0 .../wiki/ManPageArchiveReadSetOptions3.wiki | 0 .../doc/wiki/ManPageArchiveUtil3.wiki | 0 .../doc/wiki/ManPageArchiveWrite3.wiki | 0 .../wiki/ManPageArchiveWriteBlocksize3.wiki | 0 .../doc/wiki/ManPageArchiveWriteData3.wiki | 0 .../doc/wiki/ManPageArchiveWriteDisk3.wiki | 8 +- .../doc/wiki/ManPageArchiveWriteFilter3.wiki | 0 .../wiki/ManPageArchiveWriteFinishEntry3.wiki | 0 .../doc/wiki/ManPageArchiveWriteFormat3.wiki | 0 .../doc/wiki/ManPageArchiveWriteFree3.wiki | 0 .../doc/wiki/ManPageArchiveWriteHeader3.wiki | 0 .../doc/wiki/ManPageArchiveWriteNew3.wiki | 0 .../doc/wiki/ManPageArchiveWriteOpen3.wiki | 1 + .../wiki/ManPageArchiveWriteSetOptions3.wiki | 0 .../ManPageArchiveWriteSetPassphrase3.wiki | 0 .../doc/wiki/ManPageBsdcpio1.wiki | 0 .../doc/wiki/ManPageBsdtar1.wiki | 21 + .../doc/wiki/ManPageCpio5.wiki | 2 +- .../doc/wiki/ManPageLibarchive3.wiki | 40 +- .../doc/wiki/ManPageLibarchiveChanges3.wiki | 0 .../doc/wiki/ManPageLibarchiveFormats5.wiki | 0 .../doc/wiki/ManPageLibarchiveInternals3.wiki | 0 .../doc/wiki/ManPageMtree5.wiki | 0 .../doc/wiki/ManPageTar5.wiki | 0 .../examples/minitar/README | 0 .../examples/minitar/minitar.c | 0 .../examples/tarfilter.c | 0 .../examples/untar.c | 0 .../libarchive/CMakeLists.txt | 15 +- .../libarchive/archive.h | 10 +- .../libarchive/archive_acl.c | 0 .../libarchive/archive_acl_private.h | 0 .../libarchive/archive_blake2.h | 4 +- .../libarchive/archive_blake2_impl.h | 2 +- .../libarchive/archive_blake2s_ref.c | 2 + .../libarchive/archive_blake2sp_ref.c | 2 + .../libarchive/archive_check_magic.c | 0 .../libarchive/archive_cmdline.c | 0 .../libarchive/archive_cmdline_private.h | 0 .../libarchive/archive_crc32.h | 0 .../libarchive/archive_cryptor.c | 8 - .../libarchive/archive_cryptor_private.h | 0 .../libarchive/archive_digest.c | 34 +- .../libarchive/archive_digest_private.h | 0 .../libarchive/archive_disk_acl_darwin.c | 0 .../libarchive/archive_disk_acl_freebsd.c | 0 .../libarchive/archive_disk_acl_linux.c | 0 .../libarchive/archive_disk_acl_sunos.c | 0 .../libarchive/archive_endian.h | 0 .../libarchive/archive_entry.3 | 0 .../libarchive/archive_entry.c | 14 + .../libarchive/archive_entry.h | 6 +- .../libarchive/archive_entry_acl.3 | 0 .../libarchive/archive_entry_copy_bhfi.c | 0 .../libarchive/archive_entry_copy_stat.c | 0 .../libarchive/archive_entry_link_resolver.c | 0 .../libarchive/archive_entry_linkify.3 | 0 .../libarchive/archive_entry_locale.h | 0 .../libarchive/archive_entry_misc.3 | 0 .../libarchive/archive_entry_paths.3 | 0 .../libarchive/archive_entry_perms.3 | 0 .../libarchive/archive_entry_private.h | 0 .../libarchive/archive_entry_sparse.c | 0 .../libarchive/archive_entry_stat.3 | 0 .../libarchive/archive_entry_stat.c | 0 .../libarchive/archive_entry_strmode.c | 0 .../libarchive/archive_entry_time.3 | 0 .../libarchive/archive_entry_xattr.c | 0 .../libarchive/archive_getdate.c | 2 +- .../libarchive/archive_getdate.h | 0 .../libarchive/archive_hmac.c | 29 + .../libarchive/archive_hmac_private.h | 7 + .../libarchive/archive_match.c | 0 .../libarchive/archive_openssl_evp_private.h | 0 .../libarchive/archive_openssl_hmac_private.h | 0 .../libarchive/archive_options.c | 0 .../libarchive/archive_options_private.h | 0 .../libarchive/archive_pack_dev.c | 3 +- .../libarchive/archive_pack_dev.h | 0 .../libarchive/archive_pathmatch.c | 0 .../libarchive/archive_pathmatch.h | 0 .../libarchive/archive_platform.h | 33 +- .../libarchive/archive_platform_acl.h | 0 .../libarchive/archive_platform_xattr.h | 0 .../libarchive/archive_ppmd7.c | 0 .../libarchive/archive_ppmd7_private.h | 0 .../libarchive/archive_ppmd8.c | 0 .../libarchive/archive_ppmd8_private.h | 0 .../libarchive/archive_ppmd_private.h | 0 .../libarchive/archive_private.h | 5 +- .../libarchive/archive_random.c | 0 .../libarchive/archive_random_private.h | 0 .../libarchive/archive_rb.c | 0 .../libarchive/archive_rb.h | 0 .../libarchive/archive_read.3 | 0 .../libarchive/archive_read.c | 150 +- .../libarchive/archive_read_add_passphrase.3 | 0 .../libarchive/archive_read_add_passphrase.c | 0 .../libarchive/archive_read_append_filter.c | 4 +- .../libarchive/archive_read_data.3 | 0 .../libarchive/archive_read_data_into_fd.c | 0 .../libarchive/archive_read_disk.3 | 80 +- .../archive_read_disk_entry_from_file.c | 8 +- .../libarchive/archive_read_disk_posix.c | 42 +- .../libarchive/archive_read_disk_private.h | 0 .../archive_read_disk_set_standard_lookup.c | 0 .../libarchive/archive_read_disk_windows.c | 62 +- .../libarchive/archive_read_extract.3 | 0 .../libarchive/archive_read_extract.c | 0 .../libarchive/archive_read_extract2.c | 0 .../libarchive/archive_read_filter.3 | 0 .../libarchive/archive_read_format.3 | 0 .../libarchive/archive_read_free.3 | 0 .../libarchive/archive_read_header.3 | 0 .../libarchive/archive_read_new.3 | 0 .../libarchive/archive_read_open.3 | 0 .../libarchive/archive_read_open_fd.c | 0 .../libarchive/archive_read_open_file.c | 0 .../libarchive/archive_read_open_filename.c | 0 .../libarchive/archive_read_open_memory.c | 0 .../libarchive/archive_read_private.h | 53 +- .../libarchive/archive_read_set_format.c | 0 .../libarchive/archive_read_set_options.3 | 0 .../libarchive/archive_read_set_options.c | 32 +- .../archive_read_support_filter_all.c | 0 .../archive_read_support_filter_by_code.c | 0 .../archive_read_support_filter_bzip2.c | 36 +- .../archive_read_support_filter_compress.c | 43 +- .../archive_read_support_filter_grzip.c | 23 +- .../archive_read_support_filter_gzip.c | 35 +- .../archive_read_support_filter_lrzip.c | 24 +- .../archive_read_support_filter_lz4.c | 42 +- .../archive_read_support_filter_lzop.c | 31 +- .../archive_read_support_filter_none.c | 0 .../archive_read_support_filter_program.c | 63 +- .../archive_read_support_filter_rpm.c | 32 +- .../archive_read_support_filter_uu.c | 32 +- .../archive_read_support_filter_xz.c | 77 +- .../archive_read_support_filter_zstd.c | 29 +- .../archive_read_support_format_7zip.c | 37 +- .../archive_read_support_format_all.c | 0 .../archive_read_support_format_ar.c | 0 .../archive_read_support_format_by_code.c | 0 .../archive_read_support_format_cab.c | 6 +- .../archive_read_support_format_cpio.c | 0 .../archive_read_support_format_empty.c | 0 .../archive_read_support_format_iso9660.c | 5 +- .../archive_read_support_format_lha.c | 6 +- .../archive_read_support_format_mtree.c | 146 +- .../archive_read_support_format_rar.c | 866 +- .../archive_read_support_format_rar5.c | 256 +- .../archive_read_support_format_raw.c | 0 .../archive_read_support_format_tar.c | 36 +- .../archive_read_support_format_warc.c | 0 .../archive_read_support_format_xar.c | 4 + .../archive_read_support_format_zip.c | 161 +- .../libarchive/archive_string.c | 8 +- .../libarchive/archive_string.h | 0 .../libarchive/archive_string_composition.h | 0 .../libarchive/archive_string_sprintf.c | 0 .../libarchive/archive_util.3 | 0 .../libarchive/archive_util.c | 0 .../libarchive/archive_version_details.c | 0 .../libarchive/archive_virtual.c | 0 .../libarchive/archive_windows.c | 0 .../libarchive/archive_windows.h | 0 .../libarchive/archive_write.3 | 0 .../libarchive/archive_write.c | 44 +- .../libarchive/archive_write_add_filter.c | 0 .../archive_write_add_filter_b64encode.c | 0 .../archive_write_add_filter_by_name.c | 0 .../archive_write_add_filter_bzip2.c | 0 .../archive_write_add_filter_compress.c | 0 .../archive_write_add_filter_grzip.c | 0 .../archive_write_add_filter_gzip.c | 0 .../archive_write_add_filter_lrzip.c | 0 .../libarchive/archive_write_add_filter_lz4.c | 0 .../archive_write_add_filter_lzop.c | 0 .../archive_write_add_filter_none.c | 0 .../archive_write_add_filter_program.c | 0 .../archive_write_add_filter_uuencode.c | 0 .../libarchive/archive_write_add_filter_xz.c | 4 +- .../archive_write_add_filter_zstd.c | 42 +- .../libarchive/archive_write_blocksize.3 | 0 .../libarchive/archive_write_data.3 | 0 .../libarchive/archive_write_disk.3 | 8 +- .../libarchive/archive_write_disk_posix.c | 166 +- .../libarchive/archive_write_disk_private.h | 0 .../archive_write_disk_set_standard_lookup.c | 0 .../libarchive/archive_write_disk_windows.c | 70 +- .../libarchive/archive_write_filter.3 | 0 .../libarchive/archive_write_finish_entry.3 | 0 .../libarchive/archive_write_format.3 | 0 .../libarchive/archive_write_free.3 | 0 .../libarchive/archive_write_header.3 | 0 .../libarchive/archive_write_new.3 | 0 .../libarchive/archive_write_open.3 | 1 + .../libarchive/archive_write_open_fd.c | 0 .../libarchive/archive_write_open_file.c | 0 .../libarchive/archive_write_open_filename.c | 0 .../libarchive/archive_write_open_memory.c | 0 .../libarchive/archive_write_private.h | 0 .../libarchive/archive_write_set_format.c | 0 .../archive_write_set_format_7zip.c | 0 .../libarchive/archive_write_set_format_ar.c | 0 .../archive_write_set_format_by_name.c | 0 .../archive_write_set_format_cpio.c | 1 + .../archive_write_set_format_cpio_binary.c | 32 +- .../archive_write_set_format_cpio_newc.c | 0 .../archive_write_set_format_cpio_odc.c | 0 .../archive_write_set_format_filter_by_ext.c | 0 .../archive_write_set_format_gnutar.c | 0 .../archive_write_set_format_iso9660.c | 2 + .../archive_write_set_format_mtree.c | 0 .../libarchive/archive_write_set_format_pax.c | 12 +- .../archive_write_set_format_private.h | 0 .../libarchive/archive_write_set_format_raw.c | 0 .../archive_write_set_format_shar.c | 0 .../archive_write_set_format_ustar.c | 0 .../archive_write_set_format_v7tar.c | 0 .../archive_write_set_format_warc.c | 0 .../libarchive/archive_write_set_format_xar.c | 0 .../libarchive/archive_write_set_format_zip.c | 14 +- .../libarchive/archive_write_set_options.3 | 0 .../libarchive/archive_write_set_options.c | 0 .../libarchive/archive_write_set_passphrase.3 | 0 .../libarchive/archive_write_set_passphrase.c | 0 .../libarchive/archive_xxhash.h | 0 .../libarchive/config_freebsd.h | 8 + .../libarchive/cpio.5 | 2 +- .../libarchive/filter_fork.h | 0 .../libarchive/filter_fork_posix.c | 2 +- .../libarchive/filter_fork_windows.c | 39 +- .../libarchive/libarchive-formats.5 | 0 .../libarchive/libarchive.3 | 40 +- .../libarchive/libarchive_changes.3 | 0 .../libarchive/libarchive_internals.3 | 0 .../libarchive/mtree.5 | 0 .../libarchive/tar.5 | 0 .../libarchive/test/CMakeLists.txt | 4 + .../libarchive/test/README | 0 .../libarchive/test/list.h | 84 +- .../libarchive/test/read_open_memory.c | 0 .../libarchive/test/test.h | 0 .../libarchive/test/test_acl_nfs4.c | 0 .../libarchive/test/test_acl_pax.c | 0 .../libarchive/test/test_acl_pax_nfs4.tar.uu | 0 .../test/test_acl_pax_posix1e.tar.uu | 0 .../libarchive/test/test_acl_platform_nfs4.c | 4 +- .../test/test_acl_platform_posix1e.c | 0 .../libarchive/test/test_acl_posix1e.c | 0 .../libarchive/test/test_acl_text.c | 0 .../test/test_archive_api_feature.c | 2 +- .../test/test_archive_clear_error.c | 0 .../libarchive/test/test_archive_cmdline.c | 0 .../libarchive/test/test_archive_digest.c | 0 .../libarchive/test/test_archive_getdate.c | 0 .../test/test_archive_match_owner.c | 0 .../libarchive/test/test_archive_match_path.c | 0 .../libarchive/test/test_archive_match_time.c | 30 + .../libarchive/test/test_archive_pathmatch.c | 0 .../test/test_archive_read_add_passphrase.c | 0 .../test/test_archive_read_close_twice.c | 0 .../test_archive_read_close_twice_open_fd.c | 0 ...t_archive_read_close_twice_open_filename.c | 0 .../test_archive_read_multiple_data_objects.c | 0 .../test_archive_read_next_header_empty.c | 0 .../test/test_archive_read_next_header_raw.c | 0 .../libarchive/test/test_archive_read_open2.c | 0 .../test_archive_read_set_filter_option.c | 0 .../test_archive_read_set_format_option.c | 0 .../test/test_archive_read_set_option.c | 0 .../test/test_archive_read_set_options.c | 0 .../test/test_archive_read_support.c | 0 .../libarchive/test/test_archive_set_error.c | 0 .../libarchive/test/test_archive_string.c | 0 .../test/test_archive_string_conversion.c | 1 + .../test_archive_string_conversion.txt.Z.uu | 0 .../test_archive_write_add_filter_by_name.c | 12 +- .../test_archive_write_set_filter_option.c | 0 .../test_archive_write_set_format_by_name.c | 0 ...t_archive_write_set_format_filter_by_ext.c | 0 .../test_archive_write_set_format_option.c | 0 .../test/test_archive_write_set_option.c | 0 .../test/test_archive_write_set_options.c | 0 .../test/test_archive_write_set_passphrase.c | 0 .../libarchive/test/test_bad_fd.c | 0 .../libarchive/test/test_compat_bzip2.c | 0 .../test/test_compat_bzip2_1.tbz.uu | 0 .../test/test_compat_bzip2_2.tbz.uu | 0 .../libarchive/test/test_compat_cpio.c | 0 .../test/test_compat_cpio_1.cpio.uu | 0 .../libarchive/test/test_compat_gtar.c | 0 .../libarchive/test/test_compat_gtar_1.tar.uu | 0 .../libarchive/test/test_compat_gtar_2.tar.uu | 0 .../libarchive/test/test_compat_gzip.c | 0 .../libarchive/test/test_compat_gzip_1.tgz.uu | 0 .../libarchive/test/test_compat_gzip_2.tgz.uu | 0 .../libarchive/test/test_compat_lz4.c | 0 .../test/test_compat_lz4_1.tar.lz4.uu | 0 .../test/test_compat_lz4_2.tar.lz4.uu | 0 .../test/test_compat_lz4_3.tar.lz4.uu | 0 .../test/test_compat_lz4_B4.tar.lz4.uu | 0 .../test/test_compat_lz4_B4BD.tar.lz4.uu | 0 .../test/test_compat_lz4_B4BDBX.tar.lz4.uu | 0 .../test/test_compat_lz4_B5.tar.lz4.uu | 0 .../test/test_compat_lz4_B5BD.tar.lz4.uu | 0 .../test/test_compat_lz4_B6.tar.lz4.uu | 0 .../test/test_compat_lz4_B6BD.tar.lz4.uu | 0 .../test/test_compat_lz4_B7.tar.lz4.uu | 0 .../test/test_compat_lz4_B7BD.tar.lz4.uu | 0 .../libarchive/test/test_compat_lzip.c | 0 .../libarchive/test/test_compat_lzip_1.tlz.uu | 0 .../libarchive/test/test_compat_lzip_2.tlz.uu | 0 .../libarchive/test/test_compat_lzma.c | 0 .../libarchive/test/test_compat_lzma_1.tlz.uu | 0 .../libarchive/test/test_compat_lzma_2.tlz.uu | 0 .../libarchive/test/test_compat_lzma_3.tlz.uu | 0 .../libarchive/test/test_compat_lzop.c | 0 .../test/test_compat_lzop_1.tar.lzo.uu | 0 .../test/test_compat_lzop_2.tar.lzo.uu | 0 .../test/test_compat_lzop_3.tar.lzo.uu | 0 .../test/test_compat_mac-1.tar.Z.uu | 0 .../test/test_compat_mac-2.tar.Z.uu | 0 .../libarchive/test/test_compat_mac.c | 0 .../test/test_compat_perl_archive_tar.c | 0 .../test/test_compat_perl_archive_tar.tar.uu | 0 .../test/test_compat_plexus_archiver_tar.c | 0 .../test_compat_plexus_archiver_tar.tar.uu | 0 .../test/test_compat_solaris_pax_sparse.c | 0 .../test_compat_solaris_pax_sparse_1.pax.Z.uu | 0 .../test_compat_solaris_pax_sparse_2.pax.Z.uu | 0 .../test/test_compat_solaris_tar_acl.c | 0 .../test/test_compat_solaris_tar_acl.tar.uu | 0 .../libarchive/test/test_compat_star_acl.c | 0 .../test/test_compat_star_acl_nfs4.tar.uu | 0 .../test/test_compat_star_acl_posix1e.tar.uu | 0 .../test/test_compat_tar_directory.c | 77 + .../test/test_compat_tar_directory_1.tar.uu | 50 + .../test/test_compat_tar_hardlink.c | 0 .../test/test_compat_tar_hardlink_1.tar.uu | 0 .../libarchive/test/test_compat_uudecode.c | 0 .../test/test_compat_uudecode_large.c | 0 .../test/test_compat_uudecode_large.tar.Z.uu | 0 .../libarchive/test/test_compat_xz.c | 0 .../libarchive/test/test_compat_xz_1.txz.uu | 0 .../libarchive/test/test_compat_zip.c | 0 .../libarchive/test/test_compat_zip_1.zip.uu | 0 .../libarchive/test/test_compat_zip_2.zip.uu | 0 .../libarchive/test/test_compat_zip_3.zip.uu | 0 .../libarchive/test/test_compat_zip_4.zip.uu | 0 .../libarchive/test/test_compat_zip_5.zip.uu | 0 .../libarchive/test/test_compat_zip_6.zip.uu | 0 .../libarchive/test/test_compat_zip_7.xps.uu | 0 .../libarchive/test/test_compat_zip_8.zip.uu | 0 .../libarchive/test/test_compat_zstd.c | 0 .../test/test_compat_zstd_1.tar.zst.uu | 0 .../test/test_compat_zstd_2.tar.zst.uu | 0 .../libarchive/test/test_empty_write.c | 0 .../libarchive/test/test_entry.c | 0 .../libarchive/test/test_entry_strmode.c | 0 .../libarchive/test/test_extattr_freebsd.c | 0 .../libarchive/test/test_filter_count.c | 0 .../libarchive/test/test_fuzz.c | 5 + .../libarchive/test/test_fuzz.cab.uu | 0 .../libarchive/test/test_fuzz.lzh.uu | 0 .../libarchive/test/test_fuzz_1.iso.Z.uu | 0 .../test/test_gnutar_filename_encoding.c | 0 .../libarchive/test/test_link_resolver.c | 0 .../libarchive/test/test_open_failure.c | 0 .../libarchive/test/test_open_fd.c | 0 .../libarchive/test/test_open_file.c | 0 .../libarchive/test/test_open_filename.c | 0 .../test/test_pax_filename_encoding.c | 0 .../test/test_pax_filename_encoding.tar.uu | 0 .../libarchive/test/test_pax_xattr_header.c | 0 .../test/test_pax_xattr_header_all.tar.uu | 0 .../test_pax_xattr_header_libarchive.tar.uu | 0 .../test/test_pax_xattr_header_schily.tar.uu | 0 ...ar_multivolume_multiple_files.part1.rar.uu | 0 ...ar_multivolume_multiple_files.part2.rar.uu | 0 ...ar_multivolume_multiple_files.part3.rar.uu | 0 ...ar_multivolume_multiple_files.part4.rar.uu | 0 ...ar_multivolume_multiple_files.part5.rar.uu | 0 ...ar_multivolume_multiple_files.part6.rar.uu | 0 ...t_rar_multivolume_single_file.part1.rar.uu | 0 ...t_rar_multivolume_single_file.part2.rar.uu | 0 ...t_rar_multivolume_single_file.part3.rar.uu | 0 ...ltivolume_uncompressed_files.part01.rar.uu | 0 ...ltivolume_uncompressed_files.part02.rar.uu | 0 ...ltivolume_uncompressed_files.part03.rar.uu | 0 ...ltivolume_uncompressed_files.part04.rar.uu | 0 ...ltivolume_uncompressed_files.part05.rar.uu | 0 ...ltivolume_uncompressed_files.part06.rar.uu | 0 ...ltivolume_uncompressed_files.part07.rar.uu | 0 ...ltivolume_uncompressed_files.part08.rar.uu | 0 ...ltivolume_uncompressed_files.part09.rar.uu | 0 ...ltivolume_uncompressed_files.part10.rar.uu | 0 .../libarchive/test/test_read_data_large.c | 4 +- .../libarchive/test/test_read_disk.c | 0 .../test_read_disk_directory_traversals.c | 0 .../test/test_read_disk_entry_from_file.c | 0 .../libarchive/test/test_read_extract.c | 3 +- .../test/test_read_file_nonexistent.c | 0 .../test/test_read_filter_compress.c | 0 .../libarchive/test/test_read_filter_grzip.c | 0 .../test/test_read_filter_grzip.tar.grz.uu | 0 .../libarchive/test/test_read_filter_lrzip.c | 0 .../test/test_read_filter_lrzip.tar.lrz.uu | 0 .../libarchive/test/test_read_filter_lzop.c | 0 .../test/test_read_filter_lzop.tar.lzo.uu | 0 .../test_read_filter_lzop_multiple_parts.c | 0 ...read_filter_lzop_multiple_parts.tar.lzo.uu | 0 .../test/test_read_filter_program.c | 0 .../test/test_read_filter_program_signature.c | 0 .../test/test_read_filter_uudecode.c | 0 .../libarchive/test/test_read_format_7zip.c | 0 .../test_read_format_7zip_bcj2_bzip2.7z.uu | 0 .../test_read_format_7zip_bcj2_copy_1.7z.uu | 0 .../test_read_format_7zip_bcj2_copy_2.7z.uu | 0 ...test_read_format_7zip_bcj2_copy_lzma.7z.uu | 0 .../test_read_format_7zip_bcj2_deflate.7z.uu | 0 .../test_read_format_7zip_bcj2_lzma1_1.7z.uu | 0 .../test_read_format_7zip_bcj2_lzma1_2.7z.uu | 0 .../test_read_format_7zip_bcj2_lzma2_1.7z.uu | 0 .../test_read_format_7zip_bcj2_lzma2_2.7z.uu | 0 .../test_read_format_7zip_bcj_bzip2.7z.uu | 0 .../test/test_read_format_7zip_bcj_copy.7z.uu | 0 .../test_read_format_7zip_bcj_deflate.7z.uu | 0 .../test_read_format_7zip_bcj_lzma1.7z.uu | 0 .../test_read_format_7zip_bcj_lzma2.7z.uu | 0 .../test/test_read_format_7zip_bzip2.7z.uu | 0 .../test/test_read_format_7zip_copy.7z.uu | 0 .../test/test_read_format_7zip_copy_2.7z.uu | 0 .../test/test_read_format_7zip_deflate.7z.uu | 0 .../test_read_format_7zip_delta4_lzma1.7z.uu | 0 .../test_read_format_7zip_delta4_lzma2.7z.uu | 0 .../test_read_format_7zip_delta_lzma1.7z.uu | 0 .../test_read_format_7zip_delta_lzma2.7z.uu | 0 .../test_read_format_7zip_empty_archive.7z.uu | 0 .../test_read_format_7zip_empty_file.7z.uu | 0 .../test_read_format_7zip_encryption.7z.uu | 0 .../test_read_format_7zip_encryption_data.c | 0 ...t_read_format_7zip_encryption_header.7z.uu | 0 .../test_read_format_7zip_encryption_header.c | 0 ...ead_format_7zip_encryption_partially.7z.uu | 0 ...st_read_format_7zip_encryption_partially.c | 0 .../test/test_read_format_7zip_lzma1.7z.uu | 0 .../test/test_read_format_7zip_lzma1_2.7z.uu | 0 .../test_read_format_7zip_lzma1_lzma2.7z.uu | 0 .../test/test_read_format_7zip_lzma2.7z.uu | 0 .../test_read_format_7zip_malformed.7z.uu | 0 .../test/test_read_format_7zip_malformed.c | 0 .../test_read_format_7zip_malformed2.7z.uu | 0 ...st_read_format_7zip_packinfo_digests.7z.uu | 0 .../test_read_format_7zip_packinfo_digests.c | 0 .../test/test_read_format_7zip_ppmd.7z.uu | 0 .../test_read_format_7zip_symbolic_name.7z.uu | 0 .../libarchive/test/test_read_format_ar.ar.uu | 0 .../libarchive/test/test_read_format_ar.c | 0 .../libarchive/test/test_read_format_cab.c | 0 .../test/test_read_format_cab_1.cab.uu | 0 .../test/test_read_format_cab_2.cab.uu | 0 .../test/test_read_format_cab_3.cab.uu | 0 .../test/test_read_format_cab_filename.c | 0 ...test_read_format_cab_filename_cp932.cab.uu | 0 .../test/test_read_format_cpio_afio.c | 0 .../test/test_read_format_cpio_bin.c | 0 .../test/test_read_format_cpio_bin_Z.c | 0 .../test/test_read_format_cpio_bin_be.c | 0 .../test/test_read_format_cpio_bin_be.cpio.uu | 0 .../test/test_read_format_cpio_bin_bz2.c | 0 .../test/test_read_format_cpio_bin_gz.c | 0 .../test/test_read_format_cpio_bin_le.c | 0 .../test/test_read_format_cpio_bin_le.cpio.uu | 0 .../test/test_read_format_cpio_bin_lzip.c | 0 .../test/test_read_format_cpio_bin_lzma.c | 0 .../test/test_read_format_cpio_bin_xz.c | 0 .../test/test_read_format_cpio_filename.c | 0 ...st_read_format_cpio_filename_cp866.cpio.uu | 0 ...st_read_format_cpio_filename_eucjp.cpio.uu | 0 ...st_read_format_cpio_filename_koi8r.cpio.uu | 0 ..._read_format_cpio_filename_utf8_jp.cpio.uu | 0 ..._read_format_cpio_filename_utf8_ru.cpio.uu | 0 .../test/test_read_format_cpio_odc.c | 0 .../test_read_format_cpio_svr4_bzip2_rpm.c | 0 ...est_read_format_cpio_svr4_bzip2_rpm.rpm.uu | 0 .../test/test_read_format_cpio_svr4_gzip.c | 0 .../test_read_format_cpio_svr4_gzip_rpm.c | 0 ...test_read_format_cpio_svr4_gzip_rpm.rpm.uu | 0 .../test/test_read_format_cpio_svr4c_Z.c | 0 .../libarchive/test/test_read_format_empty.c | 0 .../test/test_read_format_gtar_filename.c | 0 ...t_read_format_gtar_filename_cp866.tar.Z.uu | 0 ...t_read_format_gtar_filename_eucjp.tar.Z.uu | 0 ...t_read_format_gtar_filename_koi8r.tar.Z.uu | 0 .../test/test_read_format_gtar_gz.c | 0 .../test/test_read_format_gtar_lzma.c | 0 .../test/test_read_format_gtar_sparse.c | 0 .../test_read_format_gtar_sparse_1_13.tar.uu | 0 .../test_read_format_gtar_sparse_1_17.tar.uu | 0 ...ead_format_gtar_sparse_1_17_posix00.tar.uu | 0 ...ead_format_gtar_sparse_1_17_posix01.tar.uu | 0 ...ead_format_gtar_sparse_1_17_posix10.tar.uu | 0 ...t_gtar_sparse_1_17_posix10_modified.tar.uu | 0 .../test_read_format_gtar_sparse_skip_entry.c | 0 ...ead_format_gtar_sparse_skip_entry.tar.Z.uu | 0 .../test/test_read_format_iso.iso.Z.uu | 0 .../test/test_read_format_iso_2.iso.Z.uu | 0 .../libarchive/test/test_read_format_iso_Z.c | 0 .../test/test_read_format_iso_joliet.iso.Z.uu | 0 ...st_read_format_iso_joliet_by_nero.iso.Z.uu | 0 .../test_read_format_iso_joliet_long.iso.Z.uu | 0 ..._read_format_iso_joliet_rockridge.iso.Z.uu | 0 .../test/test_read_format_iso_multi_extent.c | 0 ...test_read_format_iso_multi_extent.iso.Z.uu | 0 .../test_read_format_iso_rockridge.iso.Z.uu | 0 ...test_read_format_iso_rockridge_ce.iso.Z.uu | 0 ...est_read_format_iso_rockridge_new.iso.Z.uu | 0 ...ead_format_iso_rockridge_rr_moved.iso.Z.uu | 0 .../test/test_read_format_iso_xorriso.c | 0 .../test_read_format_iso_xorriso.iso.Z.uu | 0 .../test/test_read_format_iso_zisofs.iso.Z.uu | 0 .../test/test_read_format_isojoliet_bz2.c | 0 .../test/test_read_format_isojoliet_long.c | 0 .../test/test_read_format_isojoliet_rr.c | 0 .../test_read_format_isojoliet_versioned.c | 0 .../test/test_read_format_isorr_bz2.c | 0 .../test/test_read_format_isorr_ce.c | 0 .../test/test_read_format_isorr_new_bz2.c | 0 .../test/test_read_format_isorr_rr_moved.c | 0 .../test/test_read_format_isozisofs_bz2.c | 0 .../libarchive/test/test_read_format_lha.c | 0 .../test/test_read_format_lha_bugfix_0.c | 0 .../test/test_read_format_lha_bugfix_0.lzh.uu | 0 .../test/test_read_format_lha_filename.c | 0 ...test_read_format_lha_filename_cp932.lzh.uu | 0 .../test_read_format_lha_filename_utf16.c | 0 ...test_read_format_lha_filename_utf16.lzh.uu | 0 .../test/test_read_format_lha_header0.lzh.uu | 0 .../test/test_read_format_lha_header1.lzh.uu | 0 .../test/test_read_format_lha_header2.lzh.uu | 0 .../test/test_read_format_lha_header3.lzh.uu | 0 .../test/test_read_format_lha_lh0.lzh.uu | 0 .../test/test_read_format_lha_lh6.lzh.uu | 0 .../test/test_read_format_lha_lh7.lzh.uu | 0 .../test/test_read_format_lha_withjunk.lzh.uu | 0 .../libarchive/test/test_read_format_mtree.c | 30 + .../test/test_read_format_mtree.mtree.uu | 0 .../test/test_read_format_mtree_crash747.c | 0 ...st_read_format_mtree_crash747.mtree.bz2.uu | 0 .../test_read_format_mtree_nomagic.mtree.uu | 0 .../test_read_format_mtree_nomagic2.mtree.uu | 0 .../test_read_format_mtree_nomagic3.mtree.uu | 0 .../test_read_format_mtree_noprint.mtree.uu | 0 .../test/test_read_format_pax_bz2.c | 0 .../libarchive/test/test_read_format_rar.c | 0 .../test/test_read_format_rar.rar.uu | 0 .../libarchive/test/test_read_format_rar5.c | 117 +- .../test/test_read_format_rar5_arm.rar.uu | 0 ..._rar5_arm_filter_on_window_boundary.rar.uu | 0 ...t_rar5_bad_window_sz_in_mltarc_file.rar.uu | 7 + .../test/test_read_format_rar5_blake2.rar.uu | 0 ...format_rar5_block_size_is_too_small.rar.uu | 0 .../test_read_format_rar5_compressed.rar.uu | 0 ...r5_decode_number_out_of_bounds_read.rar.uu | 10 + ...at_rar5_different_solid_window_size.rar.uu | 0 ...d_format_rar5_different_window_size.rar.uu | 0 ...mat_rar5_different_winsize_on_merge.rar.uu | 0 ..._read_format_rar5_distance_overflow.rar.uu | 0 ...ead_format_rar5_extra_field_version.rar.uu | 0 .../test_read_format_rar5_fileattr.rar.uu | 0 .../test_read_format_rar5_hardlink.rar.uu | 0 ..._format_rar5_invalid_dict_reference.rar.uu | 0 .../test_read_format_rar5_leftshift1.rar.uu | 0 .../test_read_format_rar5_leftshift2.rar.uu | 0 ...ead_format_rar5_multiarchive.part01.rar.uu | 0 ...ead_format_rar5_multiarchive.part02.rar.uu | 0 ...ead_format_rar5_multiarchive.part03.rar.uu | 0 ...ead_format_rar5_multiarchive.part04.rar.uu | 0 ...ead_format_rar5_multiarchive.part05.rar.uu | 0 ...ead_format_rar5_multiarchive.part06.rar.uu | 0 ...ead_format_rar5_multiarchive.part07.rar.uu | 0 ...ead_format_rar5_multiarchive.part08.rar.uu | 0 ...rmat_rar5_multiarchive_solid.part01.rar.uu | 0 ...rmat_rar5_multiarchive_solid.part02.rar.uu | 0 ...rmat_rar5_multiarchive_solid.part03.rar.uu | 0 ...rmat_rar5_multiarchive_solid.part04.rar.uu | 0 ...est_read_format_rar5_multiple_files.rar.uu | 0 ...ad_format_rar5_multiple_files_solid.rar.uu | 0 ...ead_format_rar5_nonempty_dir_stream.rar.uu | 0 .../test/test_read_format_rar5_owner.rar.uu | 0 ...ead_format_rar5_readtables_overflow.rar.uu | 0 .../test/test_read_format_rar5_sfx.exe.uu | 7048 +++++++++ .../test/test_read_format_rar5_solid.rar.uu | 0 .../test/test_read_format_rar5_stored.rar.uu | 0 ...t_read_format_rar5_stored_manyfiles.rar.uu | 0 .../test/test_read_format_rar5_symlink.rar.uu | 0 ...est_read_format_rar5_truncated_huff.rar.uu | 0 .../test/test_read_format_rar5_win32.rar.uu | 0 ...mat_rar5_window_buf_and_size_desync.rar.uu | 11 + .../test_read_format_rar_binary_data.rar.uu | 0 .../test_read_format_rar_compress_best.rar.uu | 0 ...est_read_format_rar_compress_normal.rar.uu | 0 .../test_read_format_rar_encryption_data.c | 0 ...est_read_format_rar_encryption_data.rar.uu | 0 .../test_read_format_rar_encryption_header.c | 0 ...t_read_format_rar_encryption_header.rar.uu | 0 ...est_read_format_rar_encryption_partially.c | 0 ...ead_format_rar_encryption_partially.rar.uu | 0 .../test/test_read_format_rar_filter.c | 57 + .../test/test_read_format_rar_filter.rar.uu | 2099 +++ .../test/test_read_format_rar_invalid1.c | 0 .../test/test_read_format_rar_invalid1.rar.uu | 0 ...t_read_format_rar_multi_lzss_blocks.rar.uu | 0 ...ead_format_rar_multivolume.part0001.rar.uu | 0 ...ead_format_rar_multivolume.part0002.rar.uu | 0 ...ead_format_rar_multivolume.part0003.rar.uu | 0 ...ead_format_rar_multivolume.part0004.rar.uu | 0 .../test/test_read_format_rar_noeof.rar.uu | 0 ...ead_format_rar_ppmd_lzss_conversion.rar.uu | 0 ...read_format_rar_ppmd_use_after_free.rar.uu | 0 ...ead_format_rar_ppmd_use_after_free2.rar.uu | 0 .../test/test_read_format_rar_sfx.exe.uu | 0 .../test/test_read_format_rar_subblock.rar.uu | 0 .../test/test_read_format_rar_unicode.rar.uu | 0 .../test/test_read_format_rar_windows.rar.uu | 0 .../test/test_read_format_raw.bufr.uu | 0 .../libarchive/test/test_read_format_raw.c | 0 .../test/test_read_format_raw.data.Z.uu | 0 .../test/test_read_format_raw.data.gz.uu | 0 .../test/test_read_format_raw.data.uu | 0 .../libarchive/test/test_read_format_tar.c | 0 .../test/test_read_format_tar_concatenated.c | 0 .../test_read_format_tar_concatenated.tar.uu | 0 .../test_read_format_tar_empty_filename.c | 0 ...test_read_format_tar_empty_filename.tar.uu | 0 .../test/test_read_format_tar_empty_pax.c | 0 .../test_read_format_tar_empty_pax.tar.Z.uu | 0 ...test_read_format_tar_empty_with_gnulabel.c | 0 ...read_format_tar_empty_with_gnulabel.tar.uu | 0 .../test/test_read_format_tar_filename.c | 0 ...st_read_format_tar_filename_koi8r.tar.Z.uu | 0 .../test_read_format_tar_invalid_pax_size.c | 53 + ...st_read_format_tar_invalid_pax_size.tar.uu | 38 + .../libarchive/test/test_read_format_tbz.c | 0 .../libarchive/test/test_read_format_tgz.c | 0 .../libarchive/test/test_read_format_tlz.c | 0 .../libarchive/test/test_read_format_txz.c | 0 .../libarchive/test/test_read_format_tz.c | 0 .../test/test_read_format_ustar_filename.c | 0 ..._read_format_ustar_filename_cp866.tar.Z.uu | 0 ..._read_format_ustar_filename_eucjp.tar.Z.uu | 0 ..._read_format_ustar_filename_koi8r.tar.Z.uu | 0 .../libarchive/test/test_read_format_warc.c | 0 .../test/test_read_format_warc.warc.uu | 0 .../libarchive/test/test_read_format_xar.c | 0 .../libarchive/test/test_read_format_zip.c | 155 +- .../test/test_read_format_zip.zip.uu | 0 .../test_read_format_zip_7075_utf8_paths.c | 0 ...est_read_format_zip_7075_utf8_paths.zip.uu | 0 .../test_read_format_zip_7z_deflate.zip.uu | 0 .../test/test_read_format_zip_7z_lzma.zip.uu | 0 .../test/test_read_format_zip_bz2_hang.zip.uu | 0 .../test/test_read_format_zip_bzip2.zipx.uu | 0 .../test_read_format_zip_bzip2_multi.zipx.uu | 0 .../test_read_format_zip_comment_stored.c | 0 ...st_read_format_zip_comment_stored_1.zip.uu | 0 ...st_read_format_zip_comment_stored_2.zip.uu | 0 .../test_read_format_zip_encryption_data.c | 0 ...est_read_format_zip_encryption_data.zip.uu | 0 .../test_read_format_zip_encryption_header.c | 0 ...t_read_format_zip_encryption_header.zip.uu | 0 ...est_read_format_zip_encryption_partially.c | 0 ...ead_format_zip_encryption_partially.zip.uu | 0 .../test/test_read_format_zip_extra_padding.c | 0 .../test_read_format_zip_extra_padding.zip.uu | 0 .../test/test_read_format_zip_filename.c | 0 ...test_read_format_zip_filename_cp866.zip.uu | 0 ...test_read_format_zip_filename_cp932.zip.uu | 0 ...test_read_format_zip_filename_koi8r.zip.uu | 0 ...st_read_format_zip_filename_utf8_jp.zip.uu | 0 ...st_read_format_zip_filename_utf8_ru.zip.uu | 0 ...t_read_format_zip_filename_utf8_ru2.zip.uu | 0 .../test_read_format_zip_high_compression.c | 0 ...st_read_format_zip_high_compression.zip.uu | 0 .../test/test_read_format_zip_jar.c | 0 .../test/test_read_format_zip_jar.jar.uu | 0 .../test_read_format_zip_length_at_end.zip.uu | 0 .../test/test_read_format_zip_lzma.zipx.uu | 0 ...st_read_format_zip_lzma_alone_leak.zipx.uu | 0 .../test_read_format_zip_lzma_multi.zipx.uu | 0 ...st_read_format_zip_lzma_stream_end.zipx.uu | 0 .../test/test_read_format_zip_mac_metadata.c | 0 .../test_read_format_zip_mac_metadata.zip.uu | 0 .../test/test_read_format_zip_malformed.c | 0 .../test_read_format_zip_malformed1.zip.uu | 0 .../test/test_read_format_zip_msdos.c | 0 .../test/test_read_format_zip_msdos.zip.uu | 0 .../test/test_read_format_zip_nested.c | 0 .../test/test_read_format_zip_nested.zip.uu | 0 .../test/test_read_format_zip_nofiletype.c | 0 .../test_read_format_zip_nofiletype.zip.uu | 0 .../test/test_read_format_zip_padded.c | 0 .../test/test_read_format_zip_padded1.zip.uu | 0 .../test/test_read_format_zip_padded2.zip.uu | 0 .../test/test_read_format_zip_padded3.zip.uu | 0 .../test/test_read_format_zip_ppmd8.zipx.uu | 0 ...test_read_format_zip_ppmd8_crash_1.zipx.uu | 0 ...test_read_format_zip_ppmd8_crash_2.zipx.uu | 0 .../test_read_format_zip_ppmd8_multi.zipx.uu | 0 .../test/test_read_format_zip_sfx.c | 0 .../test/test_read_format_zip_sfx.uu | 0 .../test/test_read_format_zip_symlink.zip.uu | 0 ...d_format_zip_traditional_encryption_data.c | 0 ...mat_zip_traditional_encryption_data.zip.uu | 0 .../test/test_read_format_zip_ux.zip.uu | 0 .../test/test_read_format_zip_winzip_aes.c | 2 +- .../test_read_format_zip_winzip_aes128.zip.uu | 0 .../test_read_format_zip_winzip_aes256.zip.uu | 0 ...read_format_zip_winzip_aes256_large.zip.uu | 0 ...ead_format_zip_winzip_aes256_stored.zip.uu | 0 .../test_read_format_zip_winzip_aes_large.c | 8 +- ...format_zip_with_invalid_traditional_eocd.c | 0 ...t_zip_with_invalid_traditional_eocd.zip.uu | 0 .../test_read_format_zip_xz_multi.zipx.uu | 0 .../test/test_read_format_zip_zip64.c | 0 .../test/test_read_format_zip_zip64a.zip.uu | 0 .../test/test_read_format_zip_zip64b.zip.uu | 0 .../test/test_read_format_zip_zstd.zipx.uu | 18 + .../test_read_format_zip_zstd_multi.zipx.uu | 94 + .../libarchive/test/test_read_large.c | 4 +- .../test/test_read_large_splitted_rar_aa.uu | 0 .../test/test_read_large_splitted_rar_ab.uu | 0 .../test/test_read_large_splitted_rar_ac.uu | 0 .../test/test_read_large_splitted_rar_ad.uu | 0 .../test/test_read_large_splitted_rar_ae.uu | 0 .../libarchive/test/test_read_pax_truncated.c | 4 +- ...test_read_pax_xattr_rht_security_selinux.c | 0 ...read_pax_xattr_rht_security_selinux.tar.uu | 0 .../test/test_read_pax_xattr_schily.c | 0 .../test/test_read_pax_xattr_schily.tar.uu | 0 .../libarchive/test/test_read_position.c | 0 .../libarchive/test/test_read_set_format.c | 0 .../test/test_read_splitted_rar_aa.uu | 0 .../test/test_read_splitted_rar_ab.uu | 0 .../test/test_read_splitted_rar_ac.uu | 0 .../test/test_read_splitted_rar_ad.uu | 0 .../test/test_read_too_many_filters.c | 0 .../test/test_read_too_many_filters.gz.uu | 0 .../libarchive/test/test_read_truncated.c | 3 +- .../test/test_read_truncated_filter.c | 26 +- .../libarchive/test/test_short_writes.c | 0 .../libarchive/test/test_sparse_basic.c | 41 +- .../test/test_splitted_rar_seek_support_aa.uu | 0 .../test/test_splitted_rar_seek_support_ab.uu | 0 .../test/test_splitted_rar_seek_support_ac.uu | 0 .../libarchive/test/test_tar_filenames.c | 0 .../libarchive/test/test_tar_large.c | 4 +- .../test/test_ustar_filename_encoding.c | 0 .../libarchive/test/test_ustar_filenames.c | 0 .../test/test_warn_missing_hardlink_target.c | 0 .../libarchive/test/test_write_disk.c | 0 .../test/test_write_disk_appledouble.c | 0 .../test_write_disk_appledouble.cpio.gz.uu | 0 .../test/test_write_disk_failures.c | 0 .../libarchive/test/test_write_disk_fixup.c | 44 +- .../test/test_write_disk_hardlink.c | 0 .../test/test_write_disk_hfs_compression.c | 0 .../test_write_disk_hfs_compression.tgz.uu | 0 .../libarchive/test/test_write_disk_lookup.c | 0 .../test/test_write_disk_mac_metadata.c | 0 .../test_write_disk_mac_metadata.tar.gz.uu | 0 .../test/test_write_disk_no_hfs_compression.c | 0 .../test_write_disk_no_hfs_compression.tgz.uu | 0 .../libarchive/test/test_write_disk_perms.c | 0 .../libarchive/test/test_write_disk_secure.c | 0 .../test/test_write_disk_secure744.c | 2 +- .../test/test_write_disk_secure745.c | 0 .../test/test_write_disk_secure746.c | 4 - .../libarchive/test/test_write_disk_sparse.c | 0 .../libarchive/test/test_write_disk_symlink.c | 0 .../libarchive/test/test_write_disk_times.c | 0 .../test/test_write_filter_b64encode.c | 8 +- .../libarchive/test/test_write_filter_bzip2.c | 12 +- .../test/test_write_filter_compress.c | 4 +- .../libarchive/test/test_write_filter_gzip.c | 12 +- .../test/test_write_filter_gzip_timestamp.c | 0 .../libarchive/test/test_write_filter_lrzip.c | 4 +- .../libarchive/test/test_write_filter_lz4.c | 16 +- .../libarchive/test/test_write_filter_lzip.c | 12 +- .../libarchive/test/test_write_filter_lzma.c | 12 +- .../libarchive/test/test_write_filter_lzop.c | 12 +- .../test/test_write_filter_program.c | 0 .../test/test_write_filter_uuencode.c | 8 +- .../libarchive/test/test_write_filter_xz.c | 12 +- .../libarchive/test/test_write_filter_zstd.c | 16 +- .../libarchive/test/test_write_format_7zip.c | 0 .../test/test_write_format_7zip_empty.c | 0 .../test/test_write_format_7zip_large.c | 6 +- .../libarchive/test/test_write_format_ar.c | 0 .../libarchive/test/test_write_format_cpio.c | 0 .../test/test_write_format_cpio_empty.c | 0 .../test/test_write_format_cpio_newc.c | 0 .../test/test_write_format_cpio_odc.c | 0 .../test/test_write_format_gnutar.c | 0 .../test/test_write_format_gnutar_filenames.c | 0 .../test/test_write_format_iso9660.c | 0 .../test/test_write_format_iso9660_boot.c | 0 .../test/test_write_format_iso9660_empty.c | 0 .../test/test_write_format_iso9660_filename.c | 0 .../test/test_write_format_iso9660_zisofs.c | 0 .../libarchive/test/test_write_format_mtree.c | 0 .../test_write_format_mtree_absolute_path.c | 0 .../test/test_write_format_mtree_classic.c | 0 .../test_write_format_mtree_classic_indent.c | 0 .../test/test_write_format_mtree_fflags.c | 0 .../test_write_format_mtree_no_separator.c | 0 .../test_write_format_mtree_quoted_filename.c | 0 .../libarchive/test/test_write_format_pax.c | 0 .../libarchive/test/test_write_format_raw.c | 0 .../test/test_write_format_raw_b64.c | 0 .../test/test_write_format_shar_empty.c | 0 .../libarchive/test/test_write_format_tar.c | 0 .../test/test_write_format_tar_empty.c | 0 .../test/test_write_format_tar_sparse.c | 0 .../test/test_write_format_tar_ustar.c | 0 .../test/test_write_format_tar_v7tar.c | 0 .../libarchive/test/test_write_format_warc.c | 0 .../test/test_write_format_warc_empty.c | 0 .../libarchive/test/test_write_format_xar.c | 0 .../test/test_write_format_xar_empty.c | 0 .../libarchive/test/test_write_format_zip.c | 0 .../test_write_format_zip_compression_store.c | 23 +- .../test/test_write_format_zip_empty.c | 0 .../test/test_write_format_zip_empty_zip64.c | 0 .../test_write_format_zip_entry_size_unset.c | 321 + .../test/test_write_format_zip_file.c | 21 +- .../test/test_write_format_zip_file_zip64.c | 21 +- .../test/test_write_format_zip_large.c | 4 +- .../test/test_write_format_zip_zip64.c | 0 .../libarchive/test/test_write_open_memory.c | 0 .../test/test_write_read_format_zip.c | 0 .../libarchive/test/test_xattr_platform.c | 0 .../test/test_zip_filename_encoding.c | 0 .../libarchive/xxhash.c | 0 .../libarchive_fe/err.c | 0 .../libarchive_fe/err.h | 0 .../libarchive_fe/lafe_platform.h | 0 .../libarchive_fe/line_reader.c | 0 .../libarchive_fe/line_reader.h | 0 .../libarchive_fe/passphrase.c | 0 .../libarchive_fe/passphrase.h | 0 .../tar/CMakeLists.txt | 0 .../tar/bsdtar.1 | 23 +- .../tar/bsdtar.c | 61 +- .../tar/bsdtar.h | 4 + .../tar/bsdtar_platform.h | 0 .../tar/bsdtar_windows.c | 0 .../tar/bsdtar_windows.h | 0 .../tar/cmdline.c | 2 + .../tar/config_freebsd.h | 0 .../tar/creation_set.c | 2 +- .../tar/read.c | 7 +- .../tar/subst.c | 1 + .../tar/test/CMakeLists.txt | 1 + .../tar/test/list.h | 31 +- .../tar/test/test.h | 0 .../tar/test/test_0.c | 0 .../tar/test/test_basic.c | 0 .../tar/test/test_copy.c | 20 +- .../tar/test/test_empty_mtree.c | 0 .../tar/test/test_extract.tar.Z.uu | 0 .../tar/test/test_extract.tar.bz2.uu | 0 .../tar/test/test_extract.tar.grz.uu | 0 .../tar/test/test_extract.tar.gz.uu | 0 .../tar/test/test_extract.tar.lrz.uu | 0 .../tar/test/test_extract.tar.lz.uu | 0 .../tar/test/test_extract.tar.lz4.uu | 0 .../tar/test/test_extract.tar.lzma.uu | 0 .../tar/test/test_extract.tar.lzo.uu | 0 .../tar/test/test_extract.tar.xz.uu | 0 .../tar/test/test_extract.tar.zst.uu | 0 .../tar/test/test_extract_tar_Z.c | 0 .../tar/test/test_extract_tar_bz2.c | 0 .../tar/test/test_extract_tar_grz.c | 0 .../tar/test/test_extract_tar_gz.c | 0 .../tar/test/test_extract_tar_lrz.c | 0 .../tar/test/test_extract_tar_lz.c | 0 .../tar/test/test_extract_tar_lz4.c | 0 .../tar/test/test_extract_tar_lzma.c | 0 .../tar/test/test_extract_tar_lzo.c | 0 .../tar/test/test_extract_tar_xz.c | 0 .../tar/test/test_extract_tar_zstd.c | 0 .../tar/test/test_format_newc.c | 0 .../tar/test/test_help.c | 0 .../tar/test/test_leading_slash.c | 0 .../tar/test/test_leading_slash.tar.uu | 0 .../tar/test/test_missing_file.c | 0 .../tar/test/test_option_C_mtree.c | 0 .../tar/test/test_option_C_upper.c | 0 .../tar/test/test_option_H_upper.c | 0 .../tar/test/test_option_L_upper.c | 0 .../tar/test/test_option_O_upper.c | 0 .../tar/test/test_option_T_upper.c | 0 .../tar/test/test_option_U_upper.c | 0 .../tar/test/test_option_X_upper.c | 0 .../tar/test/test_option_a.c | 0 .../tar/test/test_option_acls.c | 0 .../tar/test/test_option_b.c | 8 +- .../tar/test/test_option_b64encode.c | 0 .../tar/test/test_option_exclude.c | 0 .../tar/test/test_option_exclude_vcs.c | 0 .../tar/test/test_option_fflags.c | 0 .../tar/test/test_option_gid_gname.c | 0 .../tar/test/test_option_grzip.c | 0 .../tar/test/test_option_ignore_zeros.c | 147 + .../tar/test/test_option_j.c | 0 .../tar/test/test_option_k.c | 0 .../tar/test/test_option_keep_newer_files.c | 0 .../test_option_keep_newer_files.tar.Z.uu | 0 .../tar/test/test_option_lrzip.c | 0 .../tar/test/test_option_lz4.c | 0 .../tar/test/test_option_lzma.c | 0 .../tar/test/test_option_lzop.c | 0 .../tar/test/test_option_n.c | 0 .../tar/test/test_option_newer_than.c | 0 .../tar/test/test_option_nodump.c | 0 .../tar/test/test_option_older_than.c | 0 .../tar/test/test_option_passphrase.c | 0 .../tar/test/test_option_passphrase.zip.uu | 0 .../tar/test/test_option_q.c | 0 .../tar/test/test_option_r.c | 0 .../tar/test/test_option_s.c | 0 .../tar/test/test_option_s.tar.Z.uu | 0 .../tar/test/test_option_safe_writes.c | 0 .../tar/test/test_option_uid_uname.c | 0 .../tar/test/test_option_uuencode.c | 0 .../tar/test/test_option_xattrs.c | 0 .../tar/test/test_option_xz.c | 0 .../tar/test/test_option_z.c | 0 .../tar/test/test_option_zstd.c | 0 .../tar/test/test_patterns.c | 0 .../tar/test/test_patterns_2.tar.uu | 0 .../tar/test/test_patterns_3.tar.uu | 0 .../tar/test/test_patterns_4.tar.uu | 0 .../tar/test/test_print_longpath.c | 0 .../tar/test/test_print_longpath.tar.Z.uu | 0 .../tar/test/test_stdio.c | 0 .../tar/test/test_strip_components.c | 0 .../tar/test/test_symlink_dir.c | 0 .../tar/test/test_version.c | 0 .../tar/test/test_windows.c | 0 .../tar/util.c | 21 +- .../tar/write.c | 4 + .../test_utils/test_common.h | 2 + .../test_utils/test_main.c | 191 +- .../libarchive-3.6.2/test_utils/test_utils.c | 111 + .../test_utils/test_utils.h | 11 +- .../zlib-1.2.11/contrib/amd64/amd64-match.S | 452 - .../zlib-1.2.11/contrib/asm686/README.686 | 51 - .../zlib-1.2.11/contrib/asm686/match.S | 357 - .../zlib-1.2.11/contrib/inflate86/inffas86.c | 1157 -- .../zlib-1.2.11/contrib/inflate86/inffast.S | 1368 -- .../zlib-1.2.11/contrib/masmx64/bld_ml64.bat | 2 - .../zlib-1.2.11/contrib/masmx64/gvmat64.asm | 553 - .../zlib-1.2.11/contrib/masmx64/inffas8664.c | 186 - .../zlib-1.2.11/contrib/masmx64/inffasx64.asm | 396 - .../zlib-1.2.11/contrib/masmx64/readme.txt | 31 - .../zlib-1.2.11/contrib/masmx86/bld_ml32.bat | 2 - .../zlib-1.2.11/contrib/masmx86/inffas32.asm | 1080 -- .../zlib-1.2.11/contrib/masmx86/match686.asm | 479 - .../zlib-1.2.11/contrib/masmx86/readme.txt | 27 - .../zlib-1.2.11/contrib/vstudio/vc9/zlib.rc | 32 - .../contrib/vstudio/vc9/zlibvc.def | 153 - src/dependencies/zlib-1.2.11/crc32.c | 442 - src/dependencies/zlib-1.2.11/crc32.h | 441 - .../zlib-1.2.11/examples/enough.c | 572 - src/dependencies/zlib-1.2.11/zlib.3.pdf | Bin 19318 -> 0 bytes .../CMakeLists.txt | 83 +- .../{zlib-1.2.11 => zlib-1.2.13}/ChangeLog | 185 +- .../{zlib-1.2.11 => zlib-1.2.13}/FAQ | 0 .../{zlib-1.2.11 => zlib-1.2.13}/INDEX | 0 src/dependencies/zlib-1.2.13/LICENSE | 22 + .../{zlib-1.2.11 => zlib-1.2.13}/Makefile | 0 .../{zlib-1.2.11 => zlib-1.2.13}/Makefile.in | 36 +- .../{zlib-1.2.11 => zlib-1.2.13}/README | 11 +- .../{zlib-1.2.11 => zlib-1.2.13}/adler32.c | 0 .../amiga/Makefile.pup | 0 .../amiga/Makefile.sas | 0 .../{zlib-1.2.11 => zlib-1.2.13}/compress.c | 6 +- .../{zlib-1.2.11 => zlib-1.2.13}/configure | 143 +- .../contrib/README.contrib | 23 +- .../contrib/ada/buffer_demo.adb | 0 .../contrib/ada/mtest.adb | 0 .../contrib/ada/read.adb | 0 .../contrib/ada/readme.txt | 0 .../contrib/ada/test.adb | 0 .../contrib/ada/zlib-streams.adb | 0 .../contrib/ada/zlib-streams.ads | 0 .../contrib/ada/zlib-thin.adb | 0 .../contrib/ada/zlib-thin.ads | 0 .../contrib/ada/zlib.adb | 0 .../contrib/ada/zlib.ads | 0 .../contrib/ada/zlib.gpr | 0 .../contrib/blast/Makefile | 0 .../contrib/blast/README | 0 .../contrib/blast/blast.c | 0 .../contrib/blast/blast.h | 2 +- .../contrib/blast/test.pk | Bin .../contrib/blast/test.txt | 0 .../contrib/delphi/ZLib.pas | 2 +- .../contrib/delphi/ZLibConst.pas | 0 .../contrib/delphi/readme.txt | 0 .../contrib/delphi/zlibd32.mak | 0 .../contrib/dotzlib/DotZLib.build | 0 .../zlib-1.2.13/contrib/dotzlib/DotZLib.chm | Bin 0 -> 72726 bytes .../contrib/dotzlib/DotZLib.sln | 0 .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 0 .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 0 .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 0 .../contrib/dotzlib/DotZLib/CodecBase.cs | 0 .../contrib/dotzlib/DotZLib/Deflater.cs | 0 .../contrib/dotzlib/DotZLib/DotZLib.cs | 0 .../contrib/dotzlib/DotZLib/DotZLib.csproj | 0 .../contrib/dotzlib/DotZLib/GZipStream.cs | 0 .../contrib/dotzlib/DotZLib/Inflater.cs | 0 .../contrib/dotzlib/DotZLib/UnitTests.cs | 2 +- .../contrib/dotzlib/LICENSE_1_0.txt | 0 .../contrib/dotzlib/readme.txt | 0 .../contrib/gcc_gvmat64/gvmat64.S | 0 .../contrib/infback9/README | 0 .../contrib/infback9/infback9.c | 0 .../contrib/infback9/infback9.h | 0 .../contrib/infback9/inffix9.h | 0 .../contrib/infback9/inflate9.h | 0 .../contrib/infback9/inftree9.c | 6 +- .../contrib/infback9/inftree9.h | 2 +- .../contrib/iostream/test.cpp | 0 .../contrib/iostream/zfstream.cpp | 0 .../contrib/iostream/zfstream.h | 0 .../contrib/iostream2/zstream.h | 0 .../contrib/iostream2/zstream_test.cpp | 0 .../contrib/iostream3/README | 0 .../contrib/iostream3/TODO | 0 .../contrib/iostream3/test.cc | 0 .../contrib/iostream3/zfstream.cc | 0 .../contrib/iostream3/zfstream.h | 0 .../contrib/minizip/Makefile | 12 +- .../contrib/minizip/Makefile.am | 0 .../contrib/minizip/MiniZip64_Changes.txt | 0 .../contrib/minizip/MiniZip64_info.txt | 0 .../contrib/minizip/configure.ac | 2 +- .../contrib/minizip/crypt.h | 19 +- .../contrib/minizip/ioapi.c | 18 +- .../contrib/minizip/ioapi.h | 10 +- .../contrib/minizip/iowin32.c | 5 + .../contrib/minizip/iowin32.h | 0 .../contrib/minizip/make_vms.com | 0 .../contrib/minizip/miniunz.c | 37 +- .../contrib/minizip/miniunzip.1 | 0 .../contrib/minizip/minizip.1 | 0 .../contrib/minizip/minizip.c | 47 +- .../contrib/minizip/minizip.pc.in | 0 .../contrib/minizip/mztools.c | 0 .../contrib/minizip/mztools.h | 0 .../contrib/minizip/unzip.c | 35 +- .../contrib/minizip/unzip.h | 12 +- .../contrib/minizip/zip.c | 43 +- .../contrib/minizip/zip.h | 17 +- .../contrib/pascal/example.pas | 0 .../contrib/pascal/readme.txt | 0 .../contrib/pascal/zlibd32.mak | 0 .../contrib/pascal/zlibpas.pas | 2 +- .../contrib/puff/Makefile | 0 .../contrib/puff/README | 2 +- .../contrib/puff/puff.c | 4 +- .../contrib/puff/puff.h | 0 .../contrib/puff/pufftest.c | 2 +- .../contrib/puff/zeros.raw | Bin .../contrib/testzlib/testzlib.c | 0 .../contrib/testzlib/testzlib.txt | 0 .../contrib/untgz/Makefile | 0 .../contrib/untgz/Makefile.msc | 0 .../contrib/untgz/untgz.c | 0 .../contrib/vstudio/readme.txt | 5 +- .../contrib/vstudio/vc10/miniunz.vcxproj | 0 .../vstudio/vc10/miniunz.vcxproj.filters | 2 +- .../contrib/vstudio/vc10/minizip.vcxproj | 0 .../vstudio/vc10/minizip.vcxproj.filters | 2 +- .../contrib/vstudio/vc10/testzlib.vcxproj | 24 +- .../vstudio/vc10/testzlib.vcxproj.filters | 5 +- .../contrib/vstudio/vc10/testzlibdll.vcxproj | 0 .../vstudio/vc10/testzlibdll.vcxproj.filters | 2 +- .../contrib/vstudio/vc10/zlib.rc | 8 +- .../contrib/vstudio/vc10/zlibstat.vcxproj | 50 +- .../vstudio/vc10/zlibstat.vcxproj.filters | 3 - .../contrib/vstudio/vc10}/zlibvc.def | 5 + .../contrib/vstudio/vc10/zlibvc.sln | 0 .../contrib/vstudio/vc10/zlibvc.vcxproj | 58 +- .../vstudio/vc10/zlibvc.vcxproj.filters | 3 - .../contrib/vstudio/vc11/miniunz.vcxproj | 0 .../contrib/vstudio/vc11/minizip.vcxproj | 0 .../contrib/vstudio/vc11/testzlib.vcxproj | 24 +- .../contrib/vstudio/vc11/testzlibdll.vcxproj | 0 .../contrib/vstudio/vc11/zlib.rc | 8 +- .../contrib/vstudio/vc11/zlibstat.vcxproj | 34 +- .../contrib/vstudio/vc11}/zlibvc.def | 5 + .../contrib/vstudio/vc11/zlibvc.sln | 0 .../contrib/vstudio/vc11/zlibvc.vcxproj | 58 +- .../contrib/vstudio/vc12/miniunz.vcxproj | 0 .../contrib/vstudio/vc12/minizip.vcxproj | 0 .../contrib/vstudio/vc12/testzlib.vcxproj | 24 +- .../contrib/vstudio/vc12/testzlibdll.vcxproj | 0 .../contrib/vstudio/vc12/zlib.rc | 8 +- .../contrib/vstudio/vc12/zlibstat.vcxproj | 34 +- .../contrib/vstudio/vc12}/zlibvc.def | 5 + .../contrib/vstudio/vc12/zlibvc.sln | 0 .../contrib/vstudio/vc12/zlibvc.vcxproj | 58 +- .../contrib/vstudio/vc14/miniunz.vcxproj | 0 .../contrib/vstudio/vc14/minizip.vcxproj | 0 .../contrib/vstudio/vc14/testzlib.vcxproj | 24 +- .../contrib/vstudio/vc14/testzlibdll.vcxproj | 0 .../contrib/vstudio/vc14/zlib.rc | 8 +- .../contrib/vstudio/vc14/zlibstat.vcxproj | 34 +- .../contrib/vstudio/vc14}/zlibvc.def | 5 + .../contrib/vstudio/vc14/zlibvc.sln | 0 .../contrib/vstudio/vc14/zlibvc.vcxproj | 58 +- .../contrib/vstudio/vc9/miniunz.vcproj | 2 +- .../contrib/vstudio/vc9/minizip.vcproj | 2 +- .../contrib/vstudio/vc9/testzlib.vcproj | 66 +- .../contrib/vstudio/vc9/testzlibdll.vcproj | 2 +- .../zlib-1.2.13/contrib/vstudio/vc9/zlib.rc | 32 + .../contrib/vstudio/vc9/zlibstat.vcproj | 76 +- .../contrib/vstudio/vc9/zlibvc.def | 158 + .../contrib/vstudio/vc9/zlibvc.sln | 0 .../contrib/vstudio/vc9/zlibvc.vcproj | 82 +- src/dependencies/zlib-1.2.13/crc32.c | 1125 ++ src/dependencies/zlib-1.2.13/crc32.h | 9446 ++++++++++++ .../{zlib-1.2.11 => zlib-1.2.13}/deflate.c | 312 +- .../{zlib-1.2.11 => zlib-1.2.13}/deflate.h | 27 +- .../doc/algorithm.txt | 0 .../zlib-1.2.13/doc/crc-doc.1.0.pdf | Bin 0 -> 776142 bytes .../doc/rfc1950.txt | 0 .../doc/rfc1951.txt | 0 .../doc/rfc1952.txt | 0 .../doc/txtvsbin.txt | 12 +- .../examples/README.examples | 5 + .../zlib-1.2.13/examples/enough.c | 597 + .../examples/fitblk.c | 4 +- .../examples/gun.c | 2 +- .../examples/gzappend.c | 6 +- .../examples/gzjoin.c | 0 .../examples/gzlog.c | 6 +- .../examples/gzlog.h | 2 +- .../zlib-1.2.13/examples/gznorm.c | 470 + .../examples/zlib_how.html | 0 .../examples/zpipe.c | 0 .../examples/zran.c | 258 +- src/dependencies/zlib-1.2.13/examples/zran.h | 40 + .../{zlib-1.2.11 => zlib-1.2.13}/gzclose.c | 0 .../{zlib-1.2.11 => zlib-1.2.13}/gzguts.h | 5 +- .../{zlib-1.2.11 => zlib-1.2.13}/gzlib.c | 10 +- .../{zlib-1.2.11 => zlib-1.2.13}/gzread.c | 20 +- .../{zlib-1.2.11 => zlib-1.2.13}/gzwrite.c | 40 +- .../{zlib-1.2.11 => zlib-1.2.13}/infback.c | 20 +- .../{zlib-1.2.11 => zlib-1.2.13}/inffast.c | 28 +- .../{zlib-1.2.11 => zlib-1.2.13}/inffast.h | 0 .../{zlib-1.2.11 => zlib-1.2.13}/inffixed.h | 0 .../{zlib-1.2.11 => zlib-1.2.13}/inflate.c | 54 +- .../{zlib-1.2.11 => zlib-1.2.13}/inflate.h | 5 +- .../{zlib-1.2.11 => zlib-1.2.13}/inftrees.c | 6 +- .../{zlib-1.2.11 => zlib-1.2.13}/inftrees.h | 2 +- .../{zlib-1.2.11 => zlib-1.2.13}/make_vms.com | 4 +- .../msdos/Makefile.bor | 0 .../msdos/Makefile.dj2 | 0 .../msdos/Makefile.emx | 0 .../msdos/Makefile.msc | 0 .../msdos/Makefile.tc | 0 .../nintendods/Makefile | 0 .../nintendods/README | 0 .../old/Makefile.emx | 0 .../old/Makefile.riscos | 0 .../{zlib-1.2.11 => zlib-1.2.13}/old/README | 0 .../old/descrip.mms | 0 .../old/os2/Makefile.os2 | 0 .../old/os2/zlib.def | 0 .../old/visual-basic.txt | 0 .../os400/README400 | 6 +- .../{zlib-1.2.11 => zlib-1.2.13}/os400/bndsrc | 8 + .../os400/make.sh | 0 .../os400/zlib.inc | 6 +- .../qnx/package.qpg | 10 +- .../test/example.c | 8 +- .../test/infcover.c | 0 .../test/minigzip.c | 2 +- .../treebuild.xml | 4 +- .../{zlib-1.2.11 => zlib-1.2.13}/trees.c | 192 +- .../{zlib-1.2.11 => zlib-1.2.13}/trees.h | 0 .../{zlib-1.2.11 => zlib-1.2.13}/uncompr.c | 4 +- .../watcom/watcom_f.mak | 0 .../watcom/watcom_l.mak | 0 .../win32/DLL_FAQ.txt | 0 .../win32/Makefile.bor | 1 - .../win32/Makefile.gcc | 5 - .../win32/Makefile.msc | 4 - .../win32/README-WIN32.txt | 4 +- .../win32/VisualC.txt | 0 .../win32/zlib.def | 3 + .../win32/zlib1.rc | 2 +- .../zconf.h.included => zlib-1.2.13/zconf.h} | 19 +- .../zconf.h.cmakein | 19 +- .../{zlib-1.2.11 => zlib-1.2.13}/zconf.h.in | 19 +- .../{zlib-1.2.11 => zlib-1.2.13}/zlib.3 | 6 +- src/dependencies/zlib-1.2.13/zlib.3.pdf | Bin 0 -> 19366 bytes .../{zlib-1.2.11 => zlib-1.2.13}/zlib.h | 235 +- .../{zlib-1.2.11 => zlib-1.2.13}/zlib.map | 6 + .../zlib.pc.cmakein | 0 .../{zlib-1.2.11 => zlib-1.2.13}/zlib.pc.in | 0 .../{zlib-1.2.11 => zlib-1.2.13}/zlib2ansi | 4 +- .../{zlib-1.2.11 => zlib-1.2.13}/zutil.c | 20 +- .../{zlib-1.2.11 => zlib-1.2.13}/zutil.h | 22 +- .../.github/workflows/generic-dev.yml | 225 - .../.github/workflows/generic-release.yml | 59 - .../.github/workflows/linux-kernel.yml | 13 - .../zstd-1.5.0/.github/workflows/main.yml | 30 - src/dependencies/zstd-1.5.0/.travis.yml | 160 - src/dependencies/zstd-1.5.0/appveyor.yml | 327 - .../create_single_file_decoder.sh | 14 - .../create_single_file_library.sh | 14 - .../zstd-1.5.0/contrib/largeNbDicts/README.md | 25 - .../zstd-1.5.0/doc/images/zstd_logo86.png | Bin 5963 -> 0 bytes .../zstd-1.5.0/lib/common/error_private.h | 80 - src/dependencies/zstd-1.5.0/lib/common/huf.h | 362 - .../zstd-1.5.0/lib/common/threading.c | 122 - .../zstd-1.5.0/lib/common/xxhash.c | 824 -- .../zstd-1.5.0/lib/common/xxhash.h | 285 - .../lib/compress/zstd_compress_literals.c | 158 - .../zstd-1.5.0/lib/compress/zstd_fast.c | 496 - .../lib/decompress/huf_decompress.c | 1351 -- src/dependencies/zstd-1.5.0/programs/timefn.c | 169 - .../zstd-1.5.0/programs/zstdgrep.1 | 23 - .../zstd-1.5.0/programs/zstdgrep.1.md | 26 - src/dependencies/zstd-1.5.0/programs/zstdless | 2 - .../zstd-1.5.0/programs/zstdless.1 | 14 - .../tests/fuzz/sequence_compression_api.c | 303 - .../{zstd-1.5.0 => zstd-1.5.4}/.buckconfig | 0 .../{zstd-1.5.0 => zstd-1.5.4}/.buckversion | 0 .../.circleci/config.yml | 44 +- .../.circleci/images/primary/Dockerfile | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/.cirrus.yml | 3 +- .../{zstd-1.5.0 => zstd-1.5.4}/.gitattributes | 0 .../.github/ISSUE_TEMPLATE/bug_report.md | 4 +- .../.github/ISSUE_TEMPLATE/feature_request.md | 0 .../zstd-1.5.4/.github/dependabot.yml | 6 + .../.github/workflows/dev-long-tests.yml | 271 + .../.github/workflows/dev-short-tests.yml | 583 + .../workflows/publish-release-artifacts.yml | 13 +- .../.github/workflows/scorecards.yml | 64 + .../{zstd-1.5.0 => zstd-1.5.4}/.gitignore | 1 + src/dependencies/zstd-1.5.4/.travis.yml | 128 + .../{zstd-1.5.0 => zstd-1.5.4}/CHANGELOG | 83 + .../CODE_OF_CONDUCT.md | 0 .../CONTRIBUTING.md | 133 +- .../{zstd-1.5.0 => zstd-1.5.4}/COPYING | 0 .../{zstd-1.5.0 => zstd-1.5.4}/LICENSE | 8 +- .../{zstd-1.5.0 => zstd-1.5.4}/Makefile | 47 +- src/dependencies/zstd-1.5.4/Package.swift | 36 + .../{zstd-1.5.0 => zstd-1.5.4}/README.md | 71 +- .../{zstd-1.5.0 => zstd-1.5.4}/TESTING.md | 2 +- src/dependencies/zstd-1.5.4/appveyor.yml | 205 + .../build/.gitignore | 0 .../{zstd-1.5.0 => zstd-1.5.4}/build/LICENSE | 0 .../build/README.md | 0 .../build/VS2008/fullbench/fullbench.vcproj | 0 .../build/VS2008/fuzzer/fuzzer.vcproj | 0 .../build/VS2008/zstd.sln | 0 .../build/VS2008/zstd/zstd.vcproj | 4 + .../build/VS2008/zstdlib/zstdlib.vcproj | 0 .../build/VS2010/CompileAsCpp.props | 0 .../build/VS2010/datagen/datagen.vcxproj | 0 .../fullbench-dll/fullbench-dll.vcxproj | 0 .../build/VS2010/fullbench/fullbench.vcxproj | 0 .../build/VS2010/fuzzer/fuzzer.vcxproj | 0 .../build/VS2010/libzstd-dll/libzstd-dll.rc | 4 +- .../VS2010/libzstd-dll/libzstd-dll.vcxproj | 0 .../build/VS2010/libzstd/libzstd.vcxproj | 0 .../build/VS2010/zstd.sln | 0 .../build/VS2010/zstd/zstd.rc | 4 +- .../build/VS2010/zstd/zstd.vcxproj | 1 + .../build/VS_scripts/README.md | 0 .../build/VS_scripts/build.VS2010.cmd | 0 .../build/VS_scripts/build.VS2012.cmd | 0 .../build/VS_scripts/build.VS2013.cmd | 0 .../build/VS_scripts/build.VS2015.cmd | 0 .../build/VS_scripts/build.VS2017.cmd | 0 .../VS_scripts/build.VS2017Community.cmd | 0 .../VS_scripts/build.VS2017Enterprise.cmd | 0 .../VS_scripts/build.VS2017Professional.cmd | 0 .../build/VS_scripts/build.generic.cmd | 14 +- .../build/cmake/.gitignore | 0 .../build/cmake/CMakeLists.txt | 37 +- .../AddZstdCompilationFlags.cmake | 54 +- .../build/cmake/CMakeModules/FindLibLZ4.cmake | 0 .../CMakeModules/GetZstdLibraryVersion.cmake | 0 .../build/cmake/CMakeModules/JoinPaths.cmake | 23 + .../build/cmake/README.md | 6 +- .../build/cmake/contrib/CMakeLists.txt | 2 +- .../cmake/contrib/gen_html/CMakeLists.txt | 2 +- .../build/cmake/contrib/pzstd/CMakeLists.txt | 10 +- .../build/cmake/lib/.gitignore | 0 .../build/cmake/lib/CMakeLists.txt | 53 +- .../build/cmake/lib/cmake_uninstall.cmake.in | 0 .../build/cmake/programs/.gitignore | 0 .../build/cmake/programs/CMakeLists.txt | 10 +- .../build/cmake/tests/.gitignore | 0 .../build/cmake/tests/CMakeLists.txt | 23 +- .../build/cmake/zstdConfig.cmake | 0 .../build/meson/GetZstdLibraryVersion.py | 0 .../build/meson/InstallSymlink.py | 0 .../build/meson/README.md | 0 .../build/meson/contrib/gen_html/meson.build | 0 .../build/meson/contrib/meson.build | 0 .../build/meson/contrib/pzstd/meson.build | 3 +- .../build/meson/lib/meson.build | 44 +- .../build/meson/meson.build | 35 +- .../build/meson/meson_options.txt | 4 +- .../build/meson/programs/meson.build | 23 +- .../build/meson/tests/meson.build | 125 +- .../build/meson/tests/valgrindTest.py | 10 +- .../build/single_file_libs/.gitignore | 0 .../build/single_file_libs/README.md | 4 +- .../single_file_libs/build_decoder_test.sh | 2 +- .../single_file_libs/build_library_test.sh | 4 +- .../build/single_file_libs/combine.py | 234 + .../build/single_file_libs/combine.sh | 62 +- .../create_single_file_decoder.sh | 19 + .../create_single_file_library.sh | 19 + .../build/single_file_libs/examples/README.md | 0 .../single_file_libs/examples/emscripten.c | 0 .../single_file_libs/examples/roundtrip.c | 0 .../single_file_libs/examples/shell.html | 0 .../build/single_file_libs/examples/simple.c | 0 .../examples/testcard-dxt1.inl | 0 .../examples/testcard-zstd.inl | 0 .../single_file_libs/examples/testcard.png | Bin .../build/single_file_libs/zstd-in.c | 12 +- .../build/single_file_libs/zstddeclib-in.c | 12 +- .../contrib/VS2005/README.md | 0 .../contrib/VS2005/fullbench/fullbench.vcproj | 0 .../contrib/VS2005/fuzzer/fuzzer.vcproj | 0 .../contrib/VS2005/zstd.sln | 0 .../contrib/VS2005/zstd/zstd.vcproj | 4 + .../contrib/VS2005/zstdlib/zstdlib.vcproj | 0 .../contrib/cleanTabs | 0 .../contrib/diagnose_corruption/.gitignore | 0 .../contrib/diagnose_corruption/Makefile | 2 +- .../diagnose_corruption/check_flipped_bits.c | 2 +- .../contrib/docker/Dockerfile | 0 .../contrib/docker/README.md | 0 .../externalSequenceProducer/.gitignore | 2 + .../contrib/externalSequenceProducer/Makefile | 40 + .../externalSequenceProducer/README.md | 14 + .../contrib/externalSequenceProducer/main.c | 107 + .../sequence_producer.c | 80 + .../sequence_producer.h | 26 + .../contrib/freestanding_lib/freestanding.py | 37 +- .../contrib/gen_html/.gitignore | 0 .../contrib/gen_html/Makefile | 2 +- .../contrib/gen_html/README.md | 0 .../contrib/gen_html/gen-zstd-manual.sh | 0 .../contrib/gen_html/gen_html.cpp | 2 +- .../contrib/largeNbDicts/.gitignore | 0 .../contrib/largeNbDicts/Makefile | 2 +- .../zstd-1.5.4/contrib/largeNbDicts/README.md | 33 + .../contrib/largeNbDicts/largeNbDicts.c | 187 +- .../contrib/linux-kernel/.gitignore | 0 .../contrib/linux-kernel/Makefile | 29 +- .../contrib/linux-kernel/README.md | 0 .../contrib/linux-kernel/btrfs-benchmark.sh | 0 .../linux-kernel/btrfs-extract-benchmark.sh | 0 .../contrib/linux-kernel/decompress_sources.h | 10 +- .../contrib/linux-kernel/linux.mk | 23 +- .../contrib/linux-kernel/linux_zstd.h | 4 +- .../contrib/linux-kernel/mem.h | 6 +- .../linux-kernel/squashfs-benchmark.sh | 0 .../contrib/linux-kernel/test/Makefile | 11 +- .../linux-kernel/test/include/asm/unaligned.h | 1 + .../test/include/linux/compiler.h | 4 +- .../linux-kernel/test/include/linux/errno.h | 2 +- .../linux-kernel/test/include/linux/kernel.h | 2 +- .../linux-kernel/test/include/linux/limits.h | 2 +- .../linux-kernel/test/include/linux/math64.h | 2 +- .../linux-kernel/test/include/linux/module.h | 4 +- .../linux-kernel/test/include/linux/printk.h | 2 +- .../linux-kernel/test/include/linux/stddef.h | 2 +- .../linux-kernel/test/include/linux/swab.h | 2 +- .../linux-kernel/test/include/linux/types.h | 2 +- .../linux-kernel/test/include/linux/xxhash.h | 13 +- .../contrib/linux-kernel/test/macro-test.sh | 2 +- .../contrib/linux-kernel/test/static_test.c | 14 +- .../contrib/linux-kernel/test/test.c | 68 +- .../contrib/linux-kernel/zstd_common_module.c | 32 + .../linux-kernel/zstd_compress_module.c | 54 +- .../linux-kernel/zstd_decompress_module.c | 4 +- .../contrib/linux-kernel/zstd_deps.h | 4 +- .../contrib/match_finders/README.md | 8 +- .../contrib/match_finders/zstd_edist.c | 24 +- .../contrib/match_finders/zstd_edist.h | 10 +- .../contrib/premake/premake4.lua | 0 .../contrib/premake/zstd.lua | 0 .../contrib/pzstd/.gitignore | 0 .../contrib/pzstd/BUCK | 0 .../contrib/pzstd/ErrorHolder.h | 2 +- .../contrib/pzstd/Logging.h | 2 +- .../contrib/pzstd/Makefile | 18 +- .../contrib/pzstd/Options.cpp | 4 +- .../contrib/pzstd/Options.h | 2 +- .../contrib/pzstd/Pzstd.cpp | 11 +- .../contrib/pzstd/Pzstd.h | 2 +- .../contrib/pzstd/README.md | 2 +- .../contrib/pzstd/SkippableFrame.cpp | 2 +- .../contrib/pzstd/SkippableFrame.h | 2 +- .../contrib/pzstd/images/Cspeed.png | Bin .../contrib/pzstd/images/Dspeed.png | Bin .../contrib/pzstd/main.cpp | 2 +- .../contrib/pzstd/test/BUCK | 0 .../contrib/pzstd/test/OptionsTest.cpp | 2 +- .../contrib/pzstd/test/PzstdTest.cpp | 2 +- .../contrib/pzstd/test/RoundTrip.h | 2 +- .../contrib/pzstd/test/RoundTripTest.cpp | 2 +- .../contrib/pzstd/utils/BUCK | 0 .../contrib/pzstd/utils/Buffer.h | 4 +- .../contrib/pzstd/utils/FileSystem.h | 22 +- .../contrib/pzstd/utils/Likely.h | 2 +- .../contrib/pzstd/utils/Portability.h | 16 + .../contrib/pzstd/utils/Range.h | 10 +- .../contrib/pzstd/utils/ResourcePool.h | 2 +- .../contrib/pzstd/utils/ScopeGuard.h | 4 +- .../contrib/pzstd/utils/ThreadPool.h | 2 +- .../contrib/pzstd/utils/WorkQueue.h | 2 +- .../contrib/pzstd/utils/test/BUCK | 0 .../contrib/pzstd/utils/test/BufferTest.cpp | 2 +- .../contrib/pzstd/utils/test/RangeTest.cpp | 2 +- .../pzstd/utils/test/ResourcePoolTest.cpp | 2 +- .../pzstd/utils/test/ScopeGuardTest.cpp | 2 +- .../pzstd/utils/test/ThreadPoolTest.cpp | 2 +- .../pzstd/utils/test/WorkQueueTest.cpp | 2 +- .../contrib/recovery/Makefile | 2 +- .../contrib/recovery/recover_directory.c | 2 +- .../seekable_format/examples/.gitignore | 0 .../contrib/seekable_format/examples/Makefile | 2 +- .../examples/parallel_compression.c | 2 +- .../examples/parallel_processing.c | 2 +- .../examples/seekable_compression.c | 2 +- .../examples/seekable_decompression.c | 2 +- .../examples/seekable_decompression_mem.c | 2 +- .../contrib/seekable_format/tests/.gitignore | 0 .../contrib/seekable_format/tests/Makefile | 2 +- .../seekable_format/tests/seekable_tests.c | 34 + .../contrib/seekable_format/zstd_seekable.h | 0 .../zstd_seekable_compression_format.md | 2 +- .../seekable_format/zstdseek_compress.c | 4 +- .../seekable_format/zstdseek_decompress.c | 59 +- .../zstd-1.5.4/contrib/seqBench/Makefile | 58 + .../zstd-1.5.4/contrib/seqBench/seqBench.c | 53 + .../contrib/snap/snapcraft.yaml | 0 .../{zstd-1.5.0 => zstd-1.5.4}/doc/README.md | 5 +- .../zstd-1.5.4/doc/decompressor_errata.md | 84 + .../doc/educational_decoder/.gitignore | 0 .../doc/educational_decoder/Makefile | 2 +- .../doc/educational_decoder/README.md | 0 .../doc/educational_decoder/harness.c | 2 +- .../doc/educational_decoder/zstd_decompress.c | 6 +- .../doc/educational_decoder/zstd_decompress.h | 2 +- .../doc/images/CSpeed2.png | Bin .../doc/images/DCspeed5.png | Bin .../doc/images/DSpeed3.png | Bin .../doc/images/cdict_v136.png | Bin .../doc/images/dict-cr.png | Bin .../doc/images/dict-cs.png | Bin .../doc/images/dict-ds.png | Bin .../doc/images/zstd_cdict_v1_3_5.png | Bin .../zstd-1.5.4/doc/images/zstd_logo86.png | Bin 0 -> 13069 bytes .../doc/zstd_compression_format.md | 50 +- .../doc/zstd_manual.html | 431 +- .../examples/.gitignore | 0 .../examples/Makefile | 2 +- .../examples/README.md | 0 .../examples/common.h | 34 +- .../examples/dictionary_compression.c | 16 +- .../examples/dictionary_decompression.c | 2 +- .../examples/multiple_simple_compression.c | 2 +- .../examples/multiple_streaming_compression.c | 2 +- .../examples/simple_compression.c | 2 +- .../examples/simple_decompression.c | 2 +- .../examples/streaming_compression.c | 32 +- .../streaming_compression_thread_pool.c | 10 +- .../examples/streaming_decompression.c | 2 +- .../examples/streaming_memory_usage.c | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/lib/.gitignore | 0 .../{zstd-1.5.0 => zstd-1.5.4}/lib/BUCK | 0 .../{zstd-1.5.0 => zstd-1.5.4}/lib/Makefile | 231 +- .../{zstd-1.5.0 => zstd-1.5.4}/lib/README.md | 17 +- src/dependencies/zstd-1.5.4/lib/common/bits.h | 175 + .../lib/common/bitstream.h | 90 +- .../lib/common/compiler.h | 163 +- .../lib/common/cpu.h | 2 +- .../lib/common/debug.c | 2 +- .../lib/common/debug.h | 2 +- .../lib/common/entropy_common.c | 52 +- .../lib/common/error_private.c | 11 +- .../zstd-1.5.4/lib/common/error_private.h | 159 + .../lib/common/fse.h | 91 +- .../lib/common/fse_decompress.c | 108 +- src/dependencies/zstd-1.5.4/lib/common/huf.h | 273 + .../lib/common/mem.h | 103 +- .../lib/common/pool.c | 53 +- .../lib/common/pool.h | 12 +- .../lib/common/portability_macros.h | 156 + .../zstd-1.5.4/lib/common/threading.c | 176 + .../lib/common/threading.h | 15 +- .../zstd-1.5.4/lib/common/xxhash.c | 24 + .../zstd-1.5.4/lib/common/xxhash.h | 5686 ++++++++ .../lib/common/zstd_common.c | 2 +- .../lib/common/zstd_deps.h | 2 +- .../lib/common/zstd_internal.h | 187 +- .../lib/common/zstd_trace.h | 17 +- .../zstd-1.5.4/lib/compress/clevels.h | 134 + .../lib/compress/fse_compress.c | 219 +- .../lib/compress/hist.c | 2 +- .../lib/compress/hist.h | 2 +- .../lib/compress/huf_compress.c | 980 +- .../lib/compress/zstd_compress.c | 2058 ++- .../lib/compress/zstd_compress_internal.h | 455 +- .../lib/compress/zstd_compress_literals.c | 235 + .../lib/compress/zstd_compress_literals.h | 22 +- .../lib/compress/zstd_compress_sequences.c | 35 +- .../lib/compress/zstd_compress_sequences.h | 2 +- .../lib/compress/zstd_compress_superblock.c | 51 +- .../lib/compress/zstd_compress_superblock.h | 2 +- .../lib/compress/zstd_cwksp.h | 76 +- .../lib/compress/zstd_double_fast.c | 669 +- .../lib/compress/zstd_double_fast.h | 5 +- .../zstd-1.5.4/lib/compress/zstd_fast.c | 960 ++ .../lib/compress/zstd_fast.h | 5 +- .../lib/compress/zstd_lazy.c | 1161 +- .../lib/compress/zstd_lazy.h | 6 +- .../lib/compress/zstd_ldm.c | 24 +- .../lib/compress/zstd_ldm.h | 4 +- .../lib/compress/zstd_ldm_geartab.h | 7 +- .../lib/compress/zstd_opt.c | 517 +- .../lib/compress/zstd_opt.h | 2 +- .../lib/compress/zstdmt_compress.c | 123 +- .../lib/compress/zstdmt_compress.h | 7 +- .../lib/decompress/huf_decompress.c | 1882 +++ .../lib/decompress/huf_decompress_amd64.S | 576 + .../lib/decompress/zstd_ddict.c | 7 +- .../lib/decompress/zstd_ddict.h | 2 +- .../lib/decompress/zstd_decompress.c | 311 +- .../lib/decompress/zstd_decompress_block.c | 1197 +- .../lib/decompress/zstd_decompress_block.h | 12 +- .../lib/decompress/zstd_decompress_internal.h | 43 +- .../lib/deprecated/zbuff.h | 2 +- .../lib/deprecated/zbuff_common.c | 2 +- .../lib/deprecated/zbuff_compress.c | 28 +- .../lib/deprecated/zbuff_decompress.c | 4 +- .../lib/dictBuilder/cover.c | 45 +- .../lib/dictBuilder/cover.h | 2 +- .../lib/dictBuilder/divsufsort.c | 0 .../lib/dictBuilder/divsufsort.h | 0 .../lib/dictBuilder/fastcover.c | 19 +- .../lib/dictBuilder/zdict.c | 155 +- .../lib/dll/example/Makefile | 2 +- .../lib/dll/example/README.md | 2 +- .../lib/dll/example/build_package.bat | 0 .../lib/dll/example/fullbench-dll.sln | 0 .../lib/dll/example/fullbench-dll.vcxproj | 0 .../lib/legacy/zstd_legacy.h | 9 +- .../lib/legacy/zstd_v01.c | 69 +- .../lib/legacy/zstd_v01.h | 2 +- .../lib/legacy/zstd_v02.c | 93 +- .../lib/legacy/zstd_v02.h | 2 +- .../lib/legacy/zstd_v03.c | 97 +- .../lib/legacy/zstd_v03.h | 2 +- .../lib/legacy/zstd_v04.c | 92 +- .../lib/legacy/zstd_v04.h | 2 +- .../lib/legacy/zstd_v05.c | 112 +- .../lib/legacy/zstd_v05.h | 2 +- .../lib/legacy/zstd_v06.c | 121 +- .../lib/legacy/zstd_v06.h | 2 +- .../lib/legacy/zstd_v07.c | 109 +- .../lib/legacy/zstd_v07.h | 2 +- src/dependencies/zstd-1.5.4/lib/libzstd.mk | 214 + .../lib/libzstd.pc.in | 7 +- .../zstd-1.5.4/lib/module.modulemap | 35 + .../{zstd-1.5.0 => zstd-1.5.4}/lib/zdict.h | 92 +- .../{zstd-1.5.0 => zstd-1.5.4}/lib/zstd.h | 870 +- .../lib/zstd_errors.h | 35 +- .../programs/.gitignore | 0 .../{zstd-1.5.0 => zstd-1.5.4}/programs/BUCK | 0 .../programs/Makefile | 193 +- .../programs/README.md | 8 +- .../programs/benchfn.c | 8 +- .../programs/benchfn.h | 4 +- .../programs/benchzstd.c | 81 +- .../programs/benchzstd.h | 4 +- .../programs/datagen.c | 2 +- .../programs/datagen.h | 2 +- .../programs/dibio.c | 252 +- .../programs/dibio.h | 8 +- .../programs/fileio.c | 1644 ++- .../programs/fileio.h | 25 +- .../zstd-1.5.4/programs/fileio_asyncio.c | 663 + .../zstd-1.5.4/programs/fileio_asyncio.h | 203 + .../zstd-1.5.4/programs/fileio_common.h | 125 + .../zstd-1.5.4/programs/fileio_types.h | 74 + .../programs/platform.h | 14 +- src/dependencies/zstd-1.5.4/programs/timefn.c | 168 + .../programs/timefn.h | 63 +- .../programs/util.c | 503 +- .../programs/util.h | 62 +- .../programs/windres/verrsrc.h | 2 +- .../programs/windres/zstd.rc | 4 +- .../programs/windres/zstd32.res | Bin .../programs/windres/zstd64.res | Bin .../programs/zstd.1 | 402 +- .../programs/zstd.1.md | 294 +- .../programs/zstdcli.c | 588 +- .../programs/zstdcli_trace.c | 2 +- .../programs/zstdcli_trace.h | 2 +- .../programs/zstdgrep | 0 .../zstd-1.5.4/programs/zstdgrep.1 | 17 + .../zstd-1.5.4/programs/zstdgrep.1.md | 30 + src/dependencies/zstd-1.5.4/programs/zstdless | 8 + .../zstd-1.5.4/programs/zstdless.1 | 9 + .../programs/zstdless.1.md | 6 +- .../tests/.gitignore | 1 + .../tests/DEPRECATED-test-zstd-speed.py | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/tests/Makefile | 138 +- .../tests/README.md | 8 +- .../tests/automated_benchmarking.py | 16 +- .../tests/bigdict.c | 2 +- .../tests/checkTag.c | 2 +- .../zstd-1.5.4/tests/check_size.py | 31 + .../zstd-1.5.4/tests/cli-tests/.gitignore | 6 + .../zstd-1.5.4/tests/cli-tests/README.md | 258 + .../zstd-1.5.4/tests/cli-tests/basic/help.sh | 10 + .../tests/cli-tests/basic/help.sh.stdout.glob | 34 + .../tests/cli-tests/basic/memlimit.sh | 40 + .../cli-tests/basic/memlimit.sh.stderr.exact | 13 + .../cli-tests/basic/memlimit.sh.stdout.exact | 13 + .../tests/cli-tests/basic/output_dir.sh | 7 + .../basic/output_dir.sh.stderr.exact | 2 + .../basic/output_dir.sh.stdout.exact | 2 + .../tests/cli-tests/basic/version.sh | 6 + .../cli-tests/basic/version.sh.stdout.glob | 2 + .../zstd-1.5.4/tests/cli-tests/bin/cmp_size | 44 + .../zstd-1.5.4/tests/cli-tests/bin/datagen | 3 + .../zstd-1.5.4/tests/cli-tests/bin/die | 4 + .../zstd-1.5.4/tests/cli-tests/bin/println | 2 + .../zstd-1.5.4/tests/cli-tests/bin/unzstd | 9 + .../zstd-1.5.4/tests/cli-tests/bin/zstd | 9 + .../zstd-1.5.4/tests/cli-tests/bin/zstdcat | 9 + .../zstd-1.5.4/tests/cli-tests/bin/zstdgrep | 2 + .../zstd-1.5.4/tests/cli-tests/bin/zstdless | 2 + .../zstd-1.5.4/tests/cli-tests/cltools/setup | 6 + .../tests/cli-tests/cltools/zstdgrep.sh | 8 + .../tests/cli-tests/cltools/zstdgrep.sh.exit | 1 + .../cltools/zstdgrep.sh.stderr.exact | 1 + .../cli-tests/cltools/zstdgrep.sh.stdout.glob | 4 + .../tests/cli-tests/cltools/zstdless.sh | 10 + .../cltools/zstdless.sh.stderr.exact | 2 + .../cli-tests/cltools/zstdless.sh.stdout.glob | 5 + .../tests/cli-tests/common/format.sh | 19 + .../tests/cli-tests/common/mtime.sh | 13 + .../tests/cli-tests/common/permissions.sh | 18 + .../tests/cli-tests/common/platform.sh | 37 + .../tests/cli-tests/compression/adapt.sh | 14 + .../tests/cli-tests/compression/basic.sh | 34 + .../compression/compress-literals.sh | 10 + .../tests/cli-tests/compression/format.sh | 16 + .../tests/cli-tests/compression/golden.sh | 12 + .../cli-tests/compression/gzip-compat.sh | 15 + .../tests/cli-tests/compression/levels.sh | 62 + .../compression/levels.sh.stderr.exact | 69 + .../compression/long-distance-matcher.sh | 7 + .../cli-tests/compression/multi-threaded.sh | 15 + .../multi-threaded.sh.stderr.exact | 11 + .../cli-tests/compression/multiple-files.sh | 21 + .../multiple-files.sh.stdout.exact | 12 + .../cli-tests/compression/row-match-finder.sh | 7 + .../tests/cli-tests/compression/setup | 7 + .../cli-tests/compression/stream-size.sh | 7 + .../cli-tests/compression/verbose-wlog.sh | 11 + .../compression/verbose-wlog.sh.stderr.glob | 5 + .../compression/verbose-wlog.sh.stdout.glob | 5 + .../cli-tests/compression/window-resize.sh | 9 + .../window-resize.sh.stderr.ignore | 0 .../compression/window-resize.sh.stdout.glob | 3 + .../tests/cli-tests/decompression/golden.sh | 7 + .../cli-tests/decompression/pass-through.sh | 57 + .../pass-through.sh.stderr.exact | 11 + .../pass-through.sh.stdout.exact | 25 + .../cli-tests/dict-builder/empty-input.sh | 9 + .../dict-builder/empty-input.sh.stderr.exact | 1 + .../tests/cli-tests/dict-builder/no-inputs.sh | 3 + .../cli-tests/dict-builder/no-inputs.sh.exit | 1 + .../dict-builder/no-inputs.sh.stderr.exact | 5 + .../dictionaries/dictionary-mismatch.sh | 29 + .../dictionary-mismatch.sh.stderr.exact | 7 + .../tests/cli-tests/dictionaries/golden.sh | 9 + .../tests/cli-tests/dictionaries/setup | 6 + .../tests/cli-tests/dictionaries/setup_once | 24 + .../file-stat/compress-file-to-file.sh | 9 + .../compress-file-to-file.sh.stderr.exact | 42 + .../file-stat/compress-file-to-stdout.sh | 8 + .../compress-file-to-stdout.sh.stderr.exact | 24 + .../file-stat/compress-stdin-to-file.sh | 8 + .../compress-stdin-to-file.sh.stderr.exact | 24 + .../file-stat/compress-stdin-to-stdout.sh | 8 + .../compress-stdin-to-stdout.sh.stderr.exact | 18 + .../file-stat/decompress-file-to-file.sh | 8 + .../decompress-file-to-file.sh.stderr.exact | 38 + .../file-stat/decompress-file-to-stdout.sh | 7 + .../decompress-file-to-stdout.sh.stderr.exact | 18 + .../file-stat/decompress-stdin-to-file.sh | 7 + .../decompress-stdin-to-file.sh.stderr.exact | 20 + .../file-stat/decompress-stdin-to-stdout.sh | 7 + ...decompress-stdin-to-stdout.sh.stderr.exact | 14 + .../tests/cli-tests/progress/no-progress.sh | 46 + .../progress/no-progress.sh.stderr.glob | 96 + .../tests/cli-tests/progress/progress.sh | 41 + .../progress/progress.sh.stderr.glob | 62 + .../zstd-1.5.4/tests/cli-tests/run.py | 738 + .../tests/cli-tests/zstd-symlinks/setup | 6 + .../tests/cli-tests/zstd-symlinks/zstdcat.sh | 12 + .../zstd-symlinks/zstdcat.sh.stdout.exact | 8 + .../tests/datagencli.c | 4 +- .../tests/decodecorpus.c | 99 +- .../tests/dict-files/zero-weight-dict | Bin .../zstd-1.5.4/tests/external_matchfinder.c | 140 + .../zstd-1.5.4/tests/external_matchfinder.h | 39 + .../tests/fullbench.c | 61 +- .../tests/fuzz/.gitignore | 2 + .../tests/fuzz/Makefile | 68 +- .../tests/fuzz/README.md | 14 + .../tests/fuzz/block_decompress.c | 2 +- .../tests/fuzz/block_round_trip.c | 2 +- .../tests/fuzz/decompress_dstSize_tooSmall.c | 2 +- .../tests/fuzz/dictionary_decompress.c | 2 +- .../tests/fuzz/dictionary_loader.c | 2 +- .../tests/fuzz/dictionary_round_trip.c | 36 +- .../tests/fuzz/dictionary_stream_round_trip.c | 2 +- .../tests/fuzz/fse_read_ncount.c | 2 +- .../tests/fuzz/fuzz.h | 5 +- .../tests/fuzz/fuzz.py | 6 +- .../tests/fuzz/fuzz_data_producer.c | 8 +- .../tests/fuzz/fuzz_data_producer.h | 5 +- .../tests/fuzz/fuzz_helpers.c | 2 +- .../tests/fuzz/fuzz_helpers.h | 2 +- .../zstd-1.5.4/tests/fuzz/huf_decompress.c | 68 + .../zstd-1.5.4/tests/fuzz/huf_round_trip.c | 137 + .../tests/fuzz/raw_dictionary_round_trip.c | 2 +- .../tests/fuzz/regression_driver.c | 2 +- .../tests/fuzz/seekable_roundtrip.c | 2 +- .../tests/fuzz/sequence_compression_api.c | 377 + .../tests/fuzz/simple_compress.c | 4 +- .../tests/fuzz/simple_decompress.c | 2 +- .../tests/fuzz/simple_round_trip.c | 72 +- .../tests/fuzz/stream_decompress.c | 10 +- .../tests/fuzz/stream_round_trip.c | 20 +- .../tests/fuzz/zstd_frame_info.c | 2 +- .../tests/fuzz/zstd_helpers.c | 48 +- .../tests/fuzz/zstd_helpers.h | 3 +- .../{zstd-1.5.0 => zstd-1.5.4}/tests/fuzzer.c | 831 +- .../tests/golden-compression/http | 0 .../huffman-compressed-larger | Bin .../large-literal-and-match-lengths | Bin 0 -> 199998 bytes .../http-dict-missing-symbols | Bin .../tests/gzip/Makefile | 2 +- .../tests/gzip/gzip-env.sh | 2 +- .../tests/gzip/helin-segv.sh | 2 +- .../tests/gzip/help-version.sh | 2 +- .../tests/gzip/hufts-segv.gz | Bin .../tests/gzip/hufts.sh | 2 +- .../tests/gzip/init.cfg | 0 .../tests/gzip/init.sh | 2 +- .../tests/gzip/keep.sh | 2 +- .../tests/gzip/list.sh | 2 +- .../tests/gzip/memcpy-abuse.sh | 2 +- .../tests/gzip/mixed.sh | 2 +- .../tests/gzip/null-suffix-clobber.sh | 2 +- .../tests/gzip/stdin.sh | 2 +- .../tests/gzip/test-driver.sh | 2 +- .../tests/gzip/trailing-nul.sh | 2 +- .../tests/gzip/unpack-invalid.sh | 2 +- .../tests/gzip/z-suffix.sh | 2 +- .../tests/gzip/zdiff.sh | 2 +- .../tests/gzip/zgrep-context.sh | 2 +- .../tests/gzip/zgrep-f.sh | 2 +- .../tests/gzip/zgrep-signal.sh | 2 +- .../tests/gzip/znew-k.sh | 2 +- .../tests/invalidDictionaries.c | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/tests/legacy.c | 2 +- .../tests/libzstd_builds.sh} | 9 +- .../tests/longmatch.c | 35 +- .../tests/paramgrill.c | 50 +- .../tests/playTests.sh | 276 +- .../tests/poolTests.c | 2 +- .../tests/rateLimiter.py | 2 +- .../tests/regression/.gitignore | 1 + .../tests/regression/Makefile | 5 +- .../tests/regression/README.md | 0 .../tests/regression/config.c | 14 +- .../tests/regression/config.h | 2 +- .../tests/regression/data.c | 2 +- .../tests/regression/data.h | 2 +- .../tests/regression/levels.h | 14 +- .../tests/regression/method.c | 2 +- .../tests/regression/method.h | 2 +- .../tests/regression/result.c | 2 +- .../tests/regression/result.h | 2 +- .../tests/regression/results.csv | 2052 +-- .../tests/regression/test.c | 2 +- .../tests/roundTripCrash.c | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/tests/seqgen.c | 2 +- .../{zstd-1.5.0 => zstd-1.5.4}/tests/seqgen.h | 2 +- .../tests/test-license.py | 7 +- .../zstd-1.5.4/tests/test-variants.sh | 115 + .../tests/test-zstd-versions.py | 183 +- .../tests/zstreamtest.c | 720 +- .../zlibWrapper/.gitignore | 0 .../zlibWrapper/BUCK | 0 .../zlibWrapper/Makefile | 7 +- .../zlibWrapper/README.md | 4 +- .../zlibWrapper/examples/example.c | 26 +- .../zlibWrapper/examples/example_original.c | 26 +- .../zlibWrapper/examples/fitblk.c | 2 +- .../zlibWrapper/examples/fitblk_original.c | 2 +- .../zlibWrapper/examples/minigzip.c | 36 +- .../zlibWrapper/examples/zwrapbench.c | 20 +- .../zlibWrapper/gzclose.c | 2 +- .../zlibWrapper/gzcompatibility.h | 16 +- .../zlibWrapper/gzguts.h | 20 +- .../zlibWrapper/gzlib.c | 6 +- .../zlibWrapper/gzread.c | 20 +- .../zlibWrapper/gzwrite.c | 10 +- .../zlibWrapper/zstd_zlibwrapper.c | 95 +- .../zlibWrapper/zstd_zlibwrapper.h | 5 +- 2353 files changed, 70571 insertions(+), 33209 deletions(-) create mode 100644 src/dependencies/cmliblzma/.gitattributes create mode 100644 src/dependencies/cmliblzma/common/mythread.h create mode 100644 src/dependencies/cmliblzma/common/tuklib_common.h create mode 100644 src/dependencies/cmliblzma/common/tuklib_config.h create mode 100644 src/dependencies/cmliblzma/common/tuklib_cpucores.c create mode 100644 src/dependencies/cmliblzma/common/tuklib_cpucores.h delete mode 100755 src/dependencies/libarchive-3.5.2/build/autoconf/config.sub delete mode 100644 src/dependencies/libarchive-3.5.2/build/version delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_acl.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_linkify.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_misc.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_paths.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_perms.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_stat.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_time.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_add_passphrase.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_data.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_disk.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_extract.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_filter.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_format.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_free.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_header.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_new.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_open.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_set_options.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_util.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_blocksize.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_data.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_disk.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_filter.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_finish_entry.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_format.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_free.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_header.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_new.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_open.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_set_options.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_set_passphrase.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/bsdcpio.1.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/bsdtar.1.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/cpio.5.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/libarchive-formats.5.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/libarchive.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/libarchive_changes.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/libarchive_internals.3.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/mtree.5.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/doc/pdf/tar.5.pdf delete mode 100644 src/dependencies/libarchive-3.5.2/test_utils/test_utils.c rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/CMakeLists.txt (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/COPYING (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/INSTALL (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/Makefile.am (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/Makefile.in (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/NEWS (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/README.md (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/aclocal.m4 (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/ax_append_compile_flags.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/ax_append_flag.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/ax_check_compile_flag.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/ax_require_defined.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/check_stdcall_func.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/compile (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/config.guess (54%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/config.rpath (100%) create mode 100755 src/dependencies/libarchive-3.6.2/build/autoconf/config.sub rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/depcomp (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/iconv.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/install-sh (79%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/la_uid_t.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/lib-ld.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/lib-link.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/lib-prefix.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/ltmain.sh (99%) mode change 100644 => 100755 create mode 100644 src/dependencies/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/missing (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autoconf/test-driver (88%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/autogen.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/bump-version.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/clean.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckFileOffsetBits.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckFileOffsetBits.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckFuncs.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckFuncs_stub.c.in (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckHeaderDirent.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CheckTypeExists.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/CreatePkgConfigFile.cmake (100%) rename src/dependencies/{libarchive-3.5.2/build/cmake/FindLibGCC.cmake => libarchive-3.6.2/build/cmake/FindLIBGCC.cmake} (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/FindMbedTLS.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/FindNettle.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/FindPCREPOSIX.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/LibarchiveCodeCoverage.cmake (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/cmake/config.h.in (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/build/pkgconfig/libarchive.pc.in (90%) create mode 100644 src/dependencies/libarchive-3.6.2/build/version rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/CMakeLists.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/bsdcat.1 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/bsdcat.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/bsdcat.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/bsdcat_platform.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/cmdline.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/CMakeLists.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/list.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_0.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty.xz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_empty_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_error.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_error_mixed.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.bz2.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.plain.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.xz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_mixed.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_plain.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_expand_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_help.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_stdin.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cat/test/test_version.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/config.h.in (93%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/configure (68%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/configure.ac (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/README (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/Android.mk (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/config/android.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/config/linux_host.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/config/windows_host.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/include/Bcrypt.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/include/Windows.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/android/include/android_lf.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/archivetest.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/libarchive.1aix53.spec (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/libarchive.spec (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/libarchive_autodetect-st_lib_archive.m4 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/oss-fuzz/corpus.zip (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/oss-fuzz/libarchive_fuzzer.cc (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/oss-fuzz/oss-fuzz-build.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/psota-benchmark/results.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/psota-benchmark/tcp.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/shar/shar.1 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/shar/shar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/shar/tree.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/shar/tree.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/shar/tree_config.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/contrib/untar.c (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/CMakeLists.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/bsdcpio.1 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cmdline.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/config_freebsd.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cpio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cpio.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cpio_platform.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cpio_windows.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/cpio_windows.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/CMakeLists.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/list.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_0.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_basic.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_cmdline.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.bz2.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.grz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.lrz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.lz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.lzma.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.xz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract.cpio.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_grz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_lrz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_lz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_lzo.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_extract_cpio_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_format_newc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref.bin.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref.crc.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref.newc.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref.ustar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref_nosym.bin.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref_nosym.crc.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref_nosym.newc.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_missing_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_0.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_B_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_C_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_J_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_L_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_Z_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_a.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_b64encode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_c.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_d.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_f.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_f.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_grzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_help.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_l.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_lrzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_lzop.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_m.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_m.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_passphrase.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_t.c (86%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_t.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_t.stdout.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_tv.stdout.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_u.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_uuencode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_version.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_y.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_option_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_owner_parse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_passthrough_dotdot.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/cpio/test/test_passthrough_reverse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/.ignore_me (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/Makefile (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_acl.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_linkify.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_misc.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_paths.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_perms.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_stat.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_entry_time.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_add_passphrase.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_data.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_disk.3.html (71%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_extract.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_filter.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_format.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_free.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_header.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_new.3.html (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_open.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_read_set_options.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_util.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_blocksize.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_data.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_disk.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_filter.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_finish_entry.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_format.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_free.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_header.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_new.3.html (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_open.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_set_options.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/archive_write_set_passphrase.3.html (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/bsdcpio.1.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/bsdtar.1.html (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/cpio.5.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/libarchive-formats.5.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/libarchive.3.html (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/libarchive_changes.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/libarchive_internals.3.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/mtree.5.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/html/tar.5.html (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/.ignore_me (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/Makefile (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_acl.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_linkify.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_misc.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_paths.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_perms.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_stat.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_entry_time.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_add_passphrase.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_data.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_disk.3 (71%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_extract.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_filter.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_format.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_free.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_header.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_new.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_open.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_read_set_options.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_util.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_blocksize.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_data.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_disk.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_filter.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_finish_entry.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_format.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_free.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_header.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_new.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_open.3 (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_set_options.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/archive_write_set_passphrase.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/bsdcpio.1 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/bsdtar.1 (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/cpio.5 (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/libarchive-formats.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/libarchive.3 (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/libarchive_changes.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/libarchive_internals.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/mtree.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/man/tar.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/mdoc2man.awk (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/mdoc2wiki.awk (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/pdf/.ignore_me (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/pdf/Makefile (99%) create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_acl.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_linkify.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_misc.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_paths.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_perms.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_stat.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_time.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_add_passphrase.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_data.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_disk.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_extract.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_filter.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_format.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_free.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_header.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_new.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_open.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_set_options.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_util.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_blocksize.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_data.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_disk.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_filter.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_finish_entry.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_format.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_free.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_header.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_new.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_open.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_set_options.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_set_passphrase.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/bsdcpio.1.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/bsdtar.1.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/cpio.5.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/libarchive-formats.5.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/libarchive.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/libarchive_changes.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/libarchive_internals.3.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/mtree.5.pdf create mode 100644 src/dependencies/libarchive-3.6.2/doc/pdf/tar.5.pdf rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/.ignore_me (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/Makefile (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_acl.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_linkify.3.txt (82%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_misc.3.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_paths.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_perms.3.txt (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_stat.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_entry_time.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_add_passphrase.3.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_data.3.txt (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_disk.3.txt (69%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_extract.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_filter.3.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_format.3.txt (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_free.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_header.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_new.3.txt (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_open.3.txt (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_read_set_options.3.txt (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_util.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write.3.txt (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_blocksize.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_data.3.txt (93%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_disk.3.txt (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_filter.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_finish_entry.3.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_format.3.txt (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_free.3.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_header.3.txt (91%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_new.3.txt (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_open.3.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_set_options.3.txt (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/archive_write_set_passphrase.3.txt (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/bsdcpio.1.txt (87%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/bsdtar.1.txt (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/cpio.5.txt (85%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/libarchive-formats.5.txt (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/libarchive.3.txt (89%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/libarchive_changes.3.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/libarchive_internals.3.txt (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/mtree.5.txt (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/text/tar.5.txt (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/update.sh (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/.ignore_me (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/Makefile (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntry3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryAcl3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryLinkify3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryMisc3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryPaths3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryPerms3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryStat3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveEntryTime3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveRead3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadAddPassphrase3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadData3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadDisk3.wiki (73%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadExtract3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadFilter3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadFormat3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadFree3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadHeader3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadNew3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadOpen3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveReadSetOptions3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveUtil3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWrite3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteBlocksize3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteData3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteDisk3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteFilter3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteFinishEntry3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteFormat3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteFree3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteHeader3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteNew3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteOpen3.wiki (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteSetOptions3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageArchiveWriteSetPassphrase3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageBsdcpio1.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageBsdtar1.wiki (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageCpio5.wiki (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageLibarchive3.wiki (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageLibarchiveChanges3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageLibarchiveFormats5.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageLibarchiveInternals3.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageMtree5.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/doc/wiki/ManPageTar5.wiki (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/examples/minitar/README (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/examples/minitar/minitar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/examples/tarfilter.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/examples/untar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/CMakeLists.txt (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive.h (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_acl.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_acl_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_blake2.h (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_blake2_impl.h (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_blake2s_ref.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_blake2sp_ref.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_check_magic.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_cmdline.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_cmdline_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_crc32.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_cryptor.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_cryptor_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_digest.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_digest_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_disk_acl_darwin.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_disk_acl_freebsd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_disk_acl_linux.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_disk_acl_sunos.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_endian.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry.h (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_acl.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_copy_bhfi.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_copy_stat.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_link_resolver.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_linkify.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_locale.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_misc.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_paths.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_perms.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_sparse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_stat.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_stat.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_strmode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_time.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_entry_xattr.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_getdate.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_getdate.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_hmac.c (91%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_hmac_private.h (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_match.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_openssl_evp_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_openssl_hmac_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_options.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_options_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_pack_dev.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_pack_dev.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_pathmatch.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_pathmatch.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_platform.h (85%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_platform_acl.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_platform_xattr.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_ppmd7.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_ppmd7_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_ppmd8.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_ppmd8_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_ppmd_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_private.h (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_random.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_random_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_rb.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_rb.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_add_passphrase.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_add_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_append_filter.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_data.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_data_into_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk.3 (75%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk_entry_from_file.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk_posix.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk_set_standard_lookup.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_disk_windows.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_extract.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_extract.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_extract2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_filter.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_format.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_free.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_header.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_new.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_open.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_open_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_open_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_open_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_open_memory.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_private.h (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_set_format.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_set_options.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_set_options.c (85%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_all.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_by_code.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_bzip2.c (93%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_compress.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_grzip.c (86%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_gzip.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_lrzip.c (86%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_lz4.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_lzop.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_none.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_program.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_rpm.c (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_uu.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_xz.c (93%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_filter_zstd.c (93%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_7zip.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_all.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_ar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_by_code.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_cab.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_cpio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_iso9660.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_lha.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_mtree.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_rar.c (79%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_rar5.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_raw.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_tar.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_warc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_xar.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_read_support_format_zip.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_string.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_string.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_string_composition.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_string_sprintf.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_util.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_util.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_version_details.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_virtual.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_windows.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_windows.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_b64encode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_by_name.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_bzip2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_compress.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_grzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_gzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_lrzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_lzop.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_none.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_program.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_uuencode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_xz.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_add_filter_zstd.c (91%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_blocksize.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_data.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_disk.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_disk_posix.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_disk_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_disk_set_standard_lookup.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_disk_windows.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_filter.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_finish_entry.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_format.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_free.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_header.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_new.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_open.3 (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_open_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_open_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_open_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_open_memory.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_7zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_ar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_by_name.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_cpio.c (86%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_cpio_binary.c (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_cpio_newc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_cpio_odc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_filter_by_ext.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_gnutar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_iso9660.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_mtree.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_pax.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_private.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_raw.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_shar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_ustar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_v7tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_warc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_xar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_format_zip.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_options.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_options.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_passphrase.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_write_set_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/archive_xxhash.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/config_freebsd.h (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/cpio.5 (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/filter_fork.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/filter_fork_posix.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/filter_fork_windows.c (87%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/libarchive-formats.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/libarchive.3 (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/libarchive_changes.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/libarchive_internals.3 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/mtree.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/tar.5 (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/CMakeLists.txt (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/README (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/list.h (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/read_open_memory.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_nfs4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_pax.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_pax_nfs4.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_pax_posix1e.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_platform_nfs4.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_platform_posix1e.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_posix1e.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_acl_text.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_api_feature.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_clear_error.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_cmdline.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_digest.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_getdate.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_match_owner.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_match_path.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_match_time.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_pathmatch.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_add_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_close_twice.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_close_twice_open_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_close_twice_open_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_multiple_data_objects.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_next_header_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_next_header_raw.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_open2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_set_filter_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_set_format_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_set_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_set_options.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_read_support.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_set_error.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_string.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_string_conversion.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_string_conversion.txt.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_add_filter_by_name.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_filter_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_format_by_name.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_format_filter_by_ext.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_format_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_option.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_options.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_archive_write_set_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_bad_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_bzip2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_bzip2_1.tbz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_bzip2_2.tbz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_cpio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_cpio_1.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gtar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gtar_1.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gtar_2.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gzip_1.tgz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_gzip_2.tgz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_1.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_2.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_3.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B4.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B4BD.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B4BDBX.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B5.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B5BD.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B6.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B6BD.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B7.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzip_1.tlz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzip_2.tlz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzma_1.tlz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzma_2.tlz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzma_3.tlz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzop.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzop_1.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzop_2.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_lzop_3.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_mac-1.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_mac-2.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_mac.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_perl_archive_tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_perl_archive_tar.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_plexus_archiver_tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_plexus_archiver_tar.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_solaris_pax_sparse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_solaris_tar_acl.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_solaris_tar_acl.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_star_acl.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_star_acl_nfs4.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_star_acl_posix1e.tar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory.c create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory_1.tar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_tar_hardlink.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_tar_hardlink_1.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_uudecode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_uudecode_large.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_uudecode_large.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_xz_1.txz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_1.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_2.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_3.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_4.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_5.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_6.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_7.xps.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zip_8.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zstd_1.tar.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_compat_zstd_2.tar.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_empty_write.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_entry.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_entry_strmode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_extattr_freebsd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_filter_count.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_fuzz.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_fuzz.cab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_fuzz.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_fuzz_1.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_gnutar_filename_encoding.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_link_resolver.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_open_failure.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_open_fd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_open_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_open_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_filename_encoding.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_filename_encoding.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_xattr_header.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_xattr_header_all.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_xattr_header_libarchive.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_pax_xattr_header_schily.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part1.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part2.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part3.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part4.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part5.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_multiple_files.part6.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_single_file.part2.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_single_file.part3.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part02.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part03.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part04.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part05.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part06.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part07.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part08.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part09.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_data_large.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_disk.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_disk_directory_traversals.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_disk_entry_from_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_extract.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_file_nonexistent.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_compress.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_grzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_grzip.tar.grz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lrzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lrzip.tar.lrz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lzop.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lzop.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lzop_multiple_parts.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_lzop_multiple_parts.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_program.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_program_signature.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_filter_uudecode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_bzip2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_copy_1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_copy_2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_copy_lzma.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_deflate.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_lzma1_1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_lzma1_2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_lzma2_1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj2_lzma2_2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj_bzip2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj_copy.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj_deflate.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj_lzma1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bcj_lzma2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_bzip2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_copy.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_copy_2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_deflate.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_delta4_lzma1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_delta4_lzma2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_delta_lzma1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_delta_lzma2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_empty_archive.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_empty_file.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption_data.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption_header.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption_header.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption_partially.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_encryption_partially.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_lzma1.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_lzma1_2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_lzma1_lzma2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_lzma2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_malformed.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_malformed.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_malformed2.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_packinfo_digests.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_packinfo_digests.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_ppmd.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_7zip_symbolic_name.7z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ar.ar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab_1.cab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab_2.cab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab_3.cab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cab_filename_cp932.cab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_afio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_be.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_be.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_le.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_le.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_lzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_bin_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_odc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.rpm.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4_gzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.rpm.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_cpio_svr4c_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_skip_entry.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_2.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_joliet.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_joliet_by_nero.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_multi_extent.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_xorriso.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_xorriso.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isojoliet_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isojoliet_long.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isojoliet_rr.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isojoliet_versioned.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isorr_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isorr_ce.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isorr_new_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isorr_rr_moved.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_isozisofs_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_bugfix_0.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_bugfix_0.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_filename_utf16.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_header0.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_header1.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_header2.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_header3.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_lh0.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_lh6.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_lh7.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_lha_withjunk.lzh.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree.mtree.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_crash747.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_crash747.mtree.bz2.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_nomagic.mtree.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_nomagic2.mtree.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_nomagic3.mtree.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_mtree_noprint.mtree.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_pax_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5.c (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_arm.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_arm_filter_on_window_boundary.rar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_blake2.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_block_size_is_too_small.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_compressed.rar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_decode_number_out_of_bounds_read.rar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_different_solid_window_size.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_different_window_size.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_fileattr.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_hardlink.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_leftshift1.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_leftshift2.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive_solid.part01.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive_solid.part02.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive_solid.part03.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiarchive_solid.part04.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiple_files.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_owner.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_sfx.exe.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_solid.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_stored.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_symlink.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar5_win32.rar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_binary_data.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_compress_best.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_compress_normal.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_data.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_data.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_header.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_header.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_partially.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_encryption_partially.rar.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.c create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.rar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_invalid1.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_invalid1.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_noeof.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_ppmd_use_after_free2.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_sfx.exe.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_subblock.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_unicode.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_rar_windows.rar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_raw.bufr.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_raw.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_raw.data.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_raw.data.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_raw.data.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_concatenated.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_concatenated.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_filename.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_pax.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_with_gnulabel.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.c create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tbz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tgz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tlz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_txz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_tz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ustar_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_warc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_warc.warc.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_xar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip.c (87%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_7075_utf8_paths.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_7075_utf8_paths.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_7z_deflate.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_7z_lzma.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_bz2_hang.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_bzip2.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_bzip2_multi.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_comment_stored.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_comment_stored_1.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_comment_stored_2.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_data.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_data.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_header.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_header.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_partially.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_encryption_partially.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_extra_padding.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_extra_padding.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_cp866.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_cp932.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_high_compression.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_high_compression.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_jar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_jar.jar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_length_at_end.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_lzma.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_lzma_alone_leak.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_lzma_multi.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_lzma_stream_end.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_mac_metadata.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_mac_metadata.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_malformed.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_malformed1.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_msdos.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_msdos.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_nested.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_nested.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_nofiletype.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_nofiletype.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_padded.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_padded1.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_padded2.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_padded3.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_ppmd8.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_ppmd8_crash_1.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_ppmd8_crash_2.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_ppmd8_multi.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_sfx.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_sfx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_symlink.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_traditional_encryption_data.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_traditional_encryption_data.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_ux.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes256_large.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes256_stored.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_winzip_aes_large.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_xz_multi.zipx.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_zip64.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_zip64a.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_format_zip_zip64b.zip.uu (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_zip_zstd.zipx.uu create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_zip_zstd_multi.zipx.uu rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large_splitted_rar_aa.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large_splitted_rar_ab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large_splitted_rar_ac.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large_splitted_rar_ad.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_large_splitted_rar_ae.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_pax_truncated.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_pax_xattr_rht_security_selinux.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_pax_xattr_schily.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_pax_xattr_schily.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_position.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_set_format.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_splitted_rar_aa.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_splitted_rar_ab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_splitted_rar_ac.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_splitted_rar_ad.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_too_many_filters.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_too_many_filters.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_truncated.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_read_truncated_filter.c (89%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_short_writes.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_sparse_basic.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_splitted_rar_seek_support_aa.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_splitted_rar_seek_support_ab.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_splitted_rar_seek_support_ac.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_tar_filenames.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_tar_large.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_ustar_filename_encoding.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_ustar_filenames.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_warn_missing_hardlink_target.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_appledouble.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_appledouble.cpio.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_failures.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_fixup.c (66%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_hardlink.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_hfs_compression.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_hfs_compression.tgz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_lookup.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_mac_metadata.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_mac_metadata.tar.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_no_hfs_compression.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_no_hfs_compression.tgz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_perms.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_secure.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_secure744.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_secure745.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_secure746.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_sparse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_symlink.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_disk_times.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_b64encode.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_bzip2.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_compress.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_gzip.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_gzip_timestamp.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_lrzip.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_lz4.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_lzip.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_lzma.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_lzop.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_program.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_uuencode.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_xz.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_filter_zstd.c (95%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_7zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_7zip_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_7zip_large.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_ar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_cpio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_cpio_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_cpio_newc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_cpio_odc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_gnutar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_gnutar_filenames.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_iso9660.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_iso9660_boot.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_iso9660_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_iso9660_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_iso9660_zisofs.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_absolute_path.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_classic.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_classic_indent.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_fflags.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_no_separator.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_mtree_quoted_filename.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_pax.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_raw.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_raw_b64.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_shar_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_tar_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_tar_sparse.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_tar_ustar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_tar_v7tar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_warc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_warc_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_xar.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_xar_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_compression_store.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_empty.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_empty_zip64.c (100%) create mode 100644 src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_entry_size_unset.c rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_file.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_file_zip64.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_large.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_format_zip_zip64.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_open_memory.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_write_read_format_zip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_xattr_platform.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/test/test_zip_filename_encoding.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive/xxhash.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/err.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/err.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/lafe_platform.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/line_reader.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/line_reader.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/libarchive_fe/passphrase.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/CMakeLists.txt (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar.1 (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar.c (96%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar.h (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar_platform.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar_windows.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/bsdtar_windows.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/cmdline.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/config_freebsd.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/creation_set.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/read.c (98%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/subst.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/CMakeLists.txt (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/list.h (89%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test.h (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_0.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_basic.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_copy.c (94%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_empty_mtree.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.bz2.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.grz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.gz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.lrz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.lz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.lz4.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.lzma.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.lzo.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.xz.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract.tar.zst.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_Z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_bz2.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_grz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_gz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_lrz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_lz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_lzo.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_extract_tar_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_format_newc.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_help.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_leading_slash.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_leading_slash.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_missing_file.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_C_mtree.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_C_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_H_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_L_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_O_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_T_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_U_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_X_upper.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_a.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_acls.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_b.c (92%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_b64encode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_exclude.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_exclude_vcs.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_fflags.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_gid_gname.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_grzip.c (100%) create mode 100644 src/dependencies/libarchive-3.6.2/tar/test/test_option_ignore_zeros.c rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_j.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_k.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_keep_newer_files.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_keep_newer_files.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_lrzip.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_lz4.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_lzma.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_lzop.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_n.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_newer_than.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_nodump.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_older_than.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_passphrase.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_passphrase.zip.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_q.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_r.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_s.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_s.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_safe_writes.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_uid_uname.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_uuencode.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_xattrs.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_xz.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_z.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_option_zstd.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_patterns.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_patterns_2.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_patterns_3.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_patterns_4.tar.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_print_longpath.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_print_longpath.tar.Z.uu (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_stdio.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_strip_components.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_symlink_dir.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_version.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/test/test_windows.c (100%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/util.c (97%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/tar/write.c (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/test_utils/test_common.h (99%) rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/test_utils/test_main.c (96%) create mode 100644 src/dependencies/libarchive-3.6.2/test_utils/test_utils.c rename src/dependencies/{libarchive-3.5.2 => libarchive-3.6.2}/test_utils/test_utils.h (90%) delete mode 100644 src/dependencies/zlib-1.2.11/contrib/amd64/amd64-match.S delete mode 100644 src/dependencies/zlib-1.2.11/contrib/asm686/README.686 delete mode 100644 src/dependencies/zlib-1.2.11/contrib/asm686/match.S delete mode 100644 src/dependencies/zlib-1.2.11/contrib/inflate86/inffas86.c delete mode 100644 src/dependencies/zlib-1.2.11/contrib/inflate86/inffast.S delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx64/bld_ml64.bat delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx64/gvmat64.asm delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx64/inffas8664.c delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx64/inffasx64.asm delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx64/readme.txt delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx86/bld_ml32.bat delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx86/inffas32.asm delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx86/match686.asm delete mode 100644 src/dependencies/zlib-1.2.11/contrib/masmx86/readme.txt delete mode 100644 src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc delete mode 100644 src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def delete mode 100644 src/dependencies/zlib-1.2.11/crc32.c delete mode 100644 src/dependencies/zlib-1.2.11/crc32.h delete mode 100644 src/dependencies/zlib-1.2.11/examples/enough.c delete mode 100644 src/dependencies/zlib-1.2.11/zlib.3.pdf rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/CMakeLists.txt (76%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/ChangeLog (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/FAQ (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/INDEX (100%) create mode 100644 src/dependencies/zlib-1.2.13/LICENSE rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/Makefile (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/Makefile.in (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/README (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/adler32.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/amiga/Makefile.pup (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/amiga/Makefile.sas (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/compress.c (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/configure (90%) mode change 100644 => 100755 rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/README.contrib (68%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/buffer_demo.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/mtest.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/read.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/readme.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/test.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib-streams.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib-streams.ads (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib-thin.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib-thin.ads (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib.adb (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib.ads (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/ada/zlib.gpr (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/Makefile (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/README (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/blast.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/blast.h (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/test.pk (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/blast/test.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/delphi/ZLib.pas (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/delphi/ZLibConst.pas (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/delphi/readme.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/delphi/zlibd32.mak (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib.build (100%) create mode 100644 src/dependencies/zlib-1.2.13/contrib/dotzlib/DotZLib.chm rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/AssemblyInfo.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/ChecksumImpl.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/CircularBuffer.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/CodecBase.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/Deflater.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/DotZLib.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/DotZLib.csproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/GZipStream.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/Inflater.cs (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/DotZLib/UnitTests.cs (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/LICENSE_1_0.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/dotzlib/readme.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/gcc_gvmat64/gvmat64.S (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/README (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/infback9.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/infback9.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/inffix9.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/inflate9.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/inftree9.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/infback9/inftree9.h (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream/test.cpp (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream/zfstream.cpp (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream/zfstream.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream2/zstream.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream2/zstream_test.cpp (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream3/README (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream3/TODO (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream3/test.cc (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream3/zfstream.cc (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/iostream3/zfstream.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/Makefile (62%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/Makefile.am (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/MiniZip64_Changes.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/MiniZip64_info.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/configure.ac (93%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/crypt.h (88%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/ioapi.c (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/ioapi.h (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/iowin32.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/iowin32.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/make_vms.com (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/miniunz.c (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/miniunzip.1 (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/minizip.1 (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/minizip.c (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/minizip.pc.in (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/mztools.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/mztools.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/unzip.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/unzip.h (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/zip.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/minizip/zip.h (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/pascal/example.pas (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/pascal/readme.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/pascal/zlibd32.mak (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/pascal/zlibpas.pas (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/Makefile (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/README (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/puff.c (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/puff.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/pufftest.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/puff/zeros.raw (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/testzlib/testzlib.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/testzlib/testzlib.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/untgz/Makefile (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/untgz/Makefile.msc (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/untgz/untgz.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/readme.txt (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/miniunz.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/miniunz.vcxproj.filters (89%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/minizip.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/minizip.vcxproj.filters (89%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/testzlib.vcxproj (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/testzlib.vcxproj.filters (88%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/testzlibdll.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/testzlibdll.vcxproj.filters (89%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlib.rc (80%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlibstat.vcxproj (88%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlibstat.vcxproj.filters (92%) rename src/dependencies/{zlib-1.2.11/contrib/vstudio/vc14 => zlib-1.2.13/contrib/vstudio/vc10}/zlibvc.def (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlibvc.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlibvc.vcxproj (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc10/zlibvc.vcxproj.filters (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/miniunz.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/minizip.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/testzlib.vcxproj (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/testzlibdll.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/zlib.rc (80%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/zlibstat.vcxproj (89%) rename src/dependencies/{zlib-1.2.11/contrib/vstudio/vc10 => zlib-1.2.13/contrib/vstudio/vc11}/zlibvc.def (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/zlibvc.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc11/zlibvc.vcxproj (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/miniunz.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/minizip.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/testzlib.vcxproj (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/testzlibdll.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/zlib.rc (82%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/zlibstat.vcxproj (91%) rename src/dependencies/{zlib-1.2.11/contrib/vstudio/vc11 => zlib-1.2.13/contrib/vstudio/vc12}/zlibvc.def (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/zlibvc.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc12/zlibvc.vcxproj (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/miniunz.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/minizip.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/testzlib.vcxproj (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/testzlibdll.vcxproj (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/zlib.rc (82%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/zlibstat.vcxproj (91%) rename src/dependencies/{zlib-1.2.11/contrib/vstudio/vc12 => zlib-1.2.13/contrib/vstudio/vc14}/zlibvc.def (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/zlibvc.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc14/zlibvc.vcxproj (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/miniunz.vcproj (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/minizip.vcproj (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/testzlib.vcproj (84%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/testzlibdll.vcproj (95%) create mode 100644 src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlib.rc rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/zlibstat.vcproj (86%) create mode 100644 src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.def rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/zlibvc.sln (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/contrib/vstudio/vc9/zlibvc.vcproj (88%) create mode 100644 src/dependencies/zlib-1.2.13/crc32.c create mode 100644 src/dependencies/zlib-1.2.13/crc32.h rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/deflate.c (87%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/deflate.h (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/doc/algorithm.txt (100%) create mode 100644 src/dependencies/zlib-1.2.13/doc/crc-doc.1.0.pdf rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/doc/rfc1950.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/doc/rfc1951.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/doc/rfc1952.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/doc/txtvsbin.txt (93%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/README.examples (92%) create mode 100644 src/dependencies/zlib-1.2.13/examples/enough.c rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/fitblk.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/gun.c (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/gzappend.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/gzjoin.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/gzlog.c (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/gzlog.h (98%) create mode 100644 src/dependencies/zlib-1.2.13/examples/gznorm.c rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/zlib_how.html (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/zpipe.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/examples/zran.c (60%) create mode 100644 src/dependencies/zlib-1.2.13/examples/zran.h rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/gzclose.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/gzguts.h (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/gzlib.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/gzread.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/gzwrite.c (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/infback.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inffast.c (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inffast.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inffixed.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inflate.c (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inflate.h (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inftrees.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/inftrees.h (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/make_vms.com (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/msdos/Makefile.bor (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/msdos/Makefile.dj2 (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/msdos/Makefile.emx (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/msdos/Makefile.msc (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/msdos/Makefile.tc (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/nintendods/Makefile (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/nintendods/README (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/Makefile.emx (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/Makefile.riscos (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/README (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/descrip.mms (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/os2/Makefile.os2 (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/os2/zlib.def (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/old/visual-basic.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/os400/README400 (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/os400/bndsrc (92%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/os400/make.sh (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/os400/zlib.inc (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/qnx/package.qpg (95%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/test/example.c (98%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/test/infcover.c (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/test/minigzip.c (99%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/treebuild.xml (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/trees.c (88%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/trees.h (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/uncompr.c (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/watcom/watcom_f.mak (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/watcom/watcom_l.mak (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/DLL_FAQ.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/Makefile.bor (96%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/Makefile.gcc (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/Makefile.msc (94%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/README-WIN32.txt (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/VisualC.txt (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/zlib.def (90%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/win32/zlib1.rc (94%) rename src/dependencies/{zlib-1.2.11/zconf.h.included => zlib-1.2.13/zconf.h} (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zconf.h.cmakein (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zconf.h.in (97%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib.3 (97%) create mode 100644 src/dependencies/zlib-1.2.13/zlib.3.pdf rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib.h (91%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib.map (87%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib.pc.cmakein (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib.pc.in (100%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zlib2ansi (97%) mode change 100644 => 100755 rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zutil.c (93%) rename src/dependencies/{zlib-1.2.11 => zlib-1.2.13}/zutil.h (94%) delete mode 100644 src/dependencies/zstd-1.5.0/.github/workflows/generic-dev.yml delete mode 100644 src/dependencies/zstd-1.5.0/.github/workflows/generic-release.yml delete mode 100644 src/dependencies/zstd-1.5.0/.github/workflows/linux-kernel.yml delete mode 100644 src/dependencies/zstd-1.5.0/.github/workflows/main.yml delete mode 100644 src/dependencies/zstd-1.5.0/.travis.yml delete mode 100644 src/dependencies/zstd-1.5.0/appveyor.yml delete mode 100755 src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_decoder.sh delete mode 100755 src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_library.sh delete mode 100644 src/dependencies/zstd-1.5.0/contrib/largeNbDicts/README.md delete mode 100644 src/dependencies/zstd-1.5.0/doc/images/zstd_logo86.png delete mode 100644 src/dependencies/zstd-1.5.0/lib/common/error_private.h delete mode 100644 src/dependencies/zstd-1.5.0/lib/common/huf.h delete mode 100644 src/dependencies/zstd-1.5.0/lib/common/threading.c delete mode 100644 src/dependencies/zstd-1.5.0/lib/common/xxhash.c delete mode 100644 src/dependencies/zstd-1.5.0/lib/common/xxhash.h delete mode 100644 src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.c delete mode 100644 src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.c delete mode 100644 src/dependencies/zstd-1.5.0/lib/decompress/huf_decompress.c delete mode 100644 src/dependencies/zstd-1.5.0/programs/timefn.c delete mode 100644 src/dependencies/zstd-1.5.0/programs/zstdgrep.1 delete mode 100644 src/dependencies/zstd-1.5.0/programs/zstdgrep.1.md delete mode 100755 src/dependencies/zstd-1.5.0/programs/zstdless delete mode 100644 src/dependencies/zstd-1.5.0/programs/zstdless.1 delete mode 100644 src/dependencies/zstd-1.5.0/tests/fuzz/sequence_compression_api.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.buckconfig (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.buckversion (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.circleci/config.yml (80%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.circleci/images/primary/Dockerfile (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.cirrus.yml (64%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.gitattributes (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.github/ISSUE_TEMPLATE/bug_report.md (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.github/ISSUE_TEMPLATE/feature_request.md (100%) create mode 100644 src/dependencies/zstd-1.5.4/.github/dependabot.yml create mode 100644 src/dependencies/zstd-1.5.4/.github/workflows/dev-long-tests.yml create mode 100644 src/dependencies/zstd-1.5.4/.github/workflows/dev-short-tests.yml rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.github/workflows/publish-release-artifacts.yml (86%) create mode 100644 src/dependencies/zstd-1.5.4/.github/workflows/scorecards.yml rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/.gitignore (94%) create mode 100644 src/dependencies/zstd-1.5.4/.travis.yml rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/CHANGELOG (86%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/CODE_OF_CONDUCT.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/CONTRIBUTING.md (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/COPYING (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/LICENSE (82%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/Makefile (89%) create mode 100644 src/dependencies/zstd-1.5.4/Package.swift rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/README.md (73%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/TESTING.md (95%) create mode 100644 src/dependencies/zstd-1.5.4/appveyor.yml rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/LICENSE (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2008/fullbench/fullbench.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2008/fuzzer/fuzzer.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2008/zstd.sln (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2008/zstd/zstd.vcproj (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2008/zstdlib/zstdlib.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/CompileAsCpp.props (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/datagen/datagen.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/fullbench-dll/fullbench-dll.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/fullbench/fullbench.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/fuzzer/fuzzer.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/libzstd-dll/libzstd-dll.rc (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/libzstd-dll/libzstd-dll.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/libzstd/libzstd.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/zstd.sln (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/zstd/zstd.rc (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS2010/zstd/zstd.vcxproj (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2010.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2012.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2013.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2015.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2017.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2017Community.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2017Enterprise.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.VS2017Professional.cmd (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/VS_scripts/build.generic.cmd (77%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/CMakeLists.txt (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake (57%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/CMakeModules/FindLibLZ4.cmake (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake (100%) create mode 100644 src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/JoinPaths.cmake rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/README.md (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/contrib/CMakeLists.txt (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/contrib/gen_html/CMakeLists.txt (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/contrib/pzstd/CMakeLists.txt (84%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/lib/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/lib/CMakeLists.txt (80%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/lib/cmake_uninstall.cmake.in (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/programs/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/programs/CMakeLists.txt (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/tests/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/tests/CMakeLists.txt (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/cmake/zstdConfig.cmake (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/GetZstdLibraryVersion.py (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/InstallSymlink.py (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/contrib/gen_html/meson.build (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/contrib/meson.build (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/contrib/pzstd/meson.build (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/lib/meson.build (75%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/meson.build (84%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/meson_options.txt (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/programs/meson.build (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/tests/meson.build (65%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/meson/tests/valgrindTest.py (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/README.md (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/build_decoder_test.sh (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/build_library_test.sh (96%) create mode 100755 src/dependencies/zstd-1.5.4/build/single_file_libs/combine.py rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/combine.sh (76%) create mode 100755 src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_decoder.sh create mode 100755 src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_library.sh rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/emscripten.c (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/roundtrip.c (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/shell.html (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/simple.c (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/testcard-dxt1.inl (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/testcard-zstd.inl (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/examples/testcard.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/zstd-in.c (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/build/single_file_libs/zstddeclib-in.c (79%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/fullbench/fullbench.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/fuzzer/fuzzer.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/zstd.sln (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/zstd/zstd.vcproj (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/VS2005/zstdlib/zstdlib.vcproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/cleanTabs (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/diagnose_corruption/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/diagnose_corruption/Makefile (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/diagnose_corruption/check_flipped_bits.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/docker/Dockerfile (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/docker/README.md (100%) create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/.gitignore create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/Makefile create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/README.md create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/main.c create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.c create mode 100644 src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/freestanding_lib/freestanding.py (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/gen_html/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/gen_html/Makefile (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/gen_html/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/gen_html/gen-zstd-manual.sh (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/gen_html/gen_html.cpp (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/largeNbDicts/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/largeNbDicts/Makefile (96%) create mode 100644 src/dependencies/zstd-1.5.4/contrib/largeNbDicts/README.md rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/largeNbDicts/largeNbDicts.c (82%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/Makefile (77%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/btrfs-benchmark.sh (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/btrfs-extract-benchmark.sh (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/decompress_sources.h (79%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/linux.mk (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/linux_zstd.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/mem.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/squashfs-benchmark.sh (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/Makefile (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/asm/unaligned.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/compiler.h (82%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/errno.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/kernel.h (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/limits.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/math64.h (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/module.h (77%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/printk.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/stddef.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/swab.h (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/types.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/include/linux/xxhash.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/macro-test.sh (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/static_test.c (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/test/test.c (84%) create mode 100644 src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_common_module.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/zstd_compress_module.c (58%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/zstd_decompress_module.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/linux-kernel/zstd_deps.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/match_finders/README.md (86%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/match_finders/zstd_edist.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/match_finders/zstd_edist.h (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/premake/premake4.lua (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/premake/zstd.lua (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/ErrorHolder.h (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Logging.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Makefile (90%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Options.cpp (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Options.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Pzstd.cpp (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/Pzstd.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/README.md (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/SkippableFrame.cpp (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/SkippableFrame.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/images/Cspeed.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/images/Dspeed.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/main.cpp (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/test/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/test/OptionsTest.cpp (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/test/PzstdTest.cpp (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/test/RoundTrip.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/test/RoundTripTest.cpp (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/Buffer.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/FileSystem.h (76%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/Likely.h (92%) create mode 100644 src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Portability.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/Range.h (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/ResourcePool.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/ScopeGuard.h (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/ThreadPool.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/WorkQueue.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/BufferTest.cpp (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/RangeTest.cpp (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/ResourcePoolTest.cpp (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/ScopeGuardTest.cpp (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/ThreadPoolTest.cpp (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/pzstd/utils/test/WorkQueueTest.cpp (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/recovery/Makefile (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/recovery/recover_directory.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/Makefile (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/parallel_compression.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/parallel_processing.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/seekable_compression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/seekable_decompression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/examples/seekable_decompression_mem.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/tests/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/tests/Makefile (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/tests/seekable_tests.c (82%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/zstd_seekable.h (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/zstd_seekable_compression_format.md (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/zstdseek_compress.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/seekable_format/zstdseek_decompress.c (87%) create mode 100644 src/dependencies/zstd-1.5.4/contrib/seqBench/Makefile create mode 100644 src/dependencies/zstd-1.5.4/contrib/seqBench/seqBench.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/contrib/snap/snapcraft.yaml (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/README.md (78%) create mode 100644 src/dependencies/zstd-1.5.4/doc/decompressor_errata.md rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/Makefile (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/harness.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/zstd_decompress.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/educational_decoder/zstd_decompress.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/CSpeed2.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/DCspeed5.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/DSpeed3.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/cdict_v136.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/dict-cr.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/dict-cs.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/dict-ds.png (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/images/zstd_cdict_v1_3_5.png (100%) create mode 100644 src/dependencies/zstd-1.5.4/doc/images/zstd_logo86.png rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/zstd_compression_format.md (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/doc/zstd_manual.html (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/Makefile (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/common.h (86%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/dictionary_compression.c (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/dictionary_decompression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/multiple_simple_compression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/multiple_streaming_compression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/simple_compression.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/simple_decompression.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/streaming_compression.c (84%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/streaming_compression_thread_pool.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/streaming_decompression.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/examples/streaming_memory_usage.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/Makefile (63%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/README.md (91%) create mode 100644 src/dependencies/zstd-1.5.4/lib/common/bits.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/bitstream.h (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/compiler.h (67%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/cpu.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/debug.c (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/debug.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/entropy_common.c (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/error_private.c (76%) create mode 100644 src/dependencies/zstd-1.5.4/lib/common/error_private.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/fse.h (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/fse_decompress.c (76%) create mode 100644 src/dependencies/zstd-1.5.4/lib/common/huf.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/mem.h (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/pool.c (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/pool.h (89%) create mode 100644 src/dependencies/zstd-1.5.4/lib/common/portability_macros.h create mode 100644 src/dependencies/zstd-1.5.4/lib/common/threading.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/threading.h (92%) create mode 100644 src/dependencies/zstd-1.5.4/lib/common/xxhash.c create mode 100644 src/dependencies/zstd-1.5.4/lib/common/xxhash.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/zstd_common.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/zstd_deps.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/zstd_internal.h (70%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/common/zstd_trace.h (88%) create mode 100644 src/dependencies/zstd-1.5.4/lib/compress/clevels.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/fse_compress.c (76%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/hist.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/hist.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/huf_compress.c (50%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress.c (78%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_internal.h (78%) create mode 100644 src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_literals.h (61%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_sequences.c (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_sequences.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_superblock.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_compress_superblock.h (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_cwksp.h (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_double_fast.c (51%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_double_fast.h (90%) create mode 100644 src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_fast.h (90%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_lazy.c (70%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_lazy.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_ldm.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_ldm.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_ldm_geartab.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_opt.c (75%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstd_opt.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstdmt_compress.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/compress/zstdmt_compress.h (92%) create mode 100644 src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress.c create mode 100644 src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress_amd64.S rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_ddict.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_ddict.h (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_decompress.c (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_decompress_block.c (52%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_decompress_block.h (86%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/decompress/zstd_decompress_internal.h (84%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/deprecated/zbuff.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/deprecated/zbuff_common.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/deprecated/zbuff_compress.c (75%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/deprecated/zbuff_decompress.c (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/cover.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/cover.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/divsufsort.c (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/divsufsort.h (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/fastcover.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dictBuilder/zdict.c (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dll/example/Makefile (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dll/example/README.md (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dll/example/build_package.bat (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dll/example/fullbench-dll.sln (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/dll/example/fullbench-dll.vcxproj (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_legacy.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v01.c (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v01.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v02.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v02.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v03.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v03.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v04.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v04.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v05.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v05.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v06.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v06.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v07.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/legacy/zstd_v07.h (99%) create mode 100644 src/dependencies/zstd-1.5.4/lib/libzstd.mk rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/libzstd.pc.in (57%) create mode 100644 src/dependencies/zstd-1.5.4/lib/module.modulemap rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/zdict.h (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/zstd.h (77%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/lib/zstd_errors.h (74%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/Makefile (68%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/README.md (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/benchfn.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/benchfn.h (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/benchzstd.c (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/benchzstd.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/datagen.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/datagen.h (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/dibio.c (58%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/dibio.h (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/fileio.c (65%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/fileio.h (90%) create mode 100644 src/dependencies/zstd-1.5.4/programs/fileio_asyncio.c create mode 100644 src/dependencies/zstd-1.5.4/programs/fileio_asyncio.h create mode 100644 src/dependencies/zstd-1.5.4/programs/fileio_common.h create mode 100644 src/dependencies/zstd-1.5.4/programs/fileio_types.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/platform.h (93%) create mode 100644 src/dependencies/zstd-1.5.4/programs/timefn.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/timefn.h (54%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/util.c (73%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/util.h (85%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/windres/verrsrc.h (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/windres/zstd.rc (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/windres/zstd32.res (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/windres/zstd64.res (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstd.1 (51%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstd.1.md (66%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstdcli.c (67%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstdcli_trace.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstdcli_trace.h (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstdgrep (100%) create mode 100644 src/dependencies/zstd-1.5.4/programs/zstdgrep.1 create mode 100644 src/dependencies/zstd-1.5.4/programs/zstdgrep.1.md create mode 100755 src/dependencies/zstd-1.5.4/programs/zstdless create mode 100644 src/dependencies/zstd-1.5.4/programs/zstdless.1 rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/programs/zstdless.1.md (53%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/.gitignore (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/DEPRECATED-test-zstd-speed.py (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/Makefile (80%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/README.md (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/automated_benchmarking.py (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/bigdict.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/checkTag.c (97%) create mode 100755 src/dependencies/zstd-1.5.4/tests/check_size.py create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/.gitignore create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/README.md create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh.stdout.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stderr.exact create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stdout.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stderr.exact create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stdout.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh.stdout.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/cmp_size create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/datagen create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/die create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/println create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/unzstd create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstd create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdcat create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdgrep create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdless create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/setup create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.exit create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stderr.exact create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stdout.glob create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/common/format.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/common/mtime.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/common/permissions.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/common/platform.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/adapt.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/basic.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/compress-literals.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/format.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/golden.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/gzip-compat.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/long-distance-matcher.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh.stdout.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/row-match-finder.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/setup create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/stream-size.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stderr.ignore create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stdout.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/golden.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stderr.exact create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stdout.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.exit create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/golden.sh create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup_once create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh.stderr.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh.stderr.glob create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/run.py create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/setup create mode 100755 src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh create mode 100644 src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/datagencli.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/decodecorpus.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/dict-files/zero-weight-dict (100%) create mode 100644 src/dependencies/zstd-1.5.4/tests/external_matchfinder.c create mode 100644 src/dependencies/zstd-1.5.4/tests/external_matchfinder.h rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fullbench.c (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/.gitignore (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/Makefile (80%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/README.md (83%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/block_decompress.c (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/block_round_trip.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/decompress_dstSize_tooSmall.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/dictionary_decompress.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/dictionary_loader.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/dictionary_round_trip.c (74%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/dictionary_stream_round_trip.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fse_read_ncount.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz.h (90%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz.py (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz_data_producer.c (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz_data_producer.h (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz_helpers.c (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/fuzz_helpers.h (97%) create mode 100644 src/dependencies/zstd-1.5.4/tests/fuzz/huf_decompress.c create mode 100644 src/dependencies/zstd-1.5.4/tests/fuzz/huf_round_trip.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/raw_dictionary_round_trip.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/regression_driver.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/seekable_roundtrip.c (98%) create mode 100644 src/dependencies/zstd-1.5.4/tests/fuzz/sequence_compression_api.c rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/simple_compress.c (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/simple_decompress.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/simple_round_trip.c (59%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/stream_decompress.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/stream_round_trip.c (87%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/zstd_frame_info.c (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/zstd_helpers.c (75%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzz/zstd_helpers.h (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/fuzzer.c (84%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/golden-compression/http (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/golden-compression/huffman-compressed-larger (100%) create mode 100644 src/dependencies/zstd-1.5.4/tests/golden-compression/large-literal-and-match-lengths rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/golden-dictionaries/http-dict-missing-symbols (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/Makefile (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/gzip-env.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/helin-segv.sh (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/help-version.sh (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/hufts-segv.gz (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/hufts.sh (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/init.cfg (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/init.sh (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/keep.sh (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/list.sh (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/memcpy-abuse.sh (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/mixed.sh (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/null-suffix-clobber.sh (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/stdin.sh (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/test-driver.sh (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/trailing-nul.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/unpack-invalid.sh (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/z-suffix.sh (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/zdiff.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/zgrep-context.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/zgrep-f.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/zgrep-signal.sh (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/gzip/znew-k.sh (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/invalidDictionaries.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/legacy.c (99%) rename src/dependencies/{zstd-1.5.0/tests/libzstd_partial_builds.sh => zstd-1.5.4/tests/libzstd_builds.sh} (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/longmatch.c (77%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/paramgrill.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/playTests.sh (86%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/poolTests.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/rateLimiter.py (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/.gitignore (88%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/Makefile (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/README.md (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/config.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/config.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/data.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/data.h (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/levels.h (75%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/method.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/method.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/result.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/result.h (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/results.csv (67%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/regression/test.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/roundTripCrash.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/seqgen.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/seqgen.h (96%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/test-license.py (96%) create mode 100755 src/dependencies/zstd-1.5.4/tests/test-variants.sh rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/test-zstd-versions.py (56%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/tests/zstreamtest.c (78%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/.gitignore (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/BUCK (100%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/Makefile (93%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/README.md (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/example.c (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/example_original.c (95%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/fitblk.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/fitblk_original.c (99%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/minigzip.c (94%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/examples/zwrapbench.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzclose.c (89%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzcompatibility.h (73%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzguts.h (91%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzlib.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzread.c (97%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/gzwrite.c (98%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/zstd_zlibwrapper.c (92%) rename src/dependencies/{zstd-1.5.0 => zstd-1.5.4}/zlibWrapper/zstd_zlibwrapper.h (97%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 011e485..48dfc79 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,10 +12,7 @@ set(IMAGER_VERSION_STR "${IMAGER_VERSION_MAJOR}.${IMAGER_VERSION_MINOR}.4.1") set(IMAGER_VERSION_CSV "${IMAGER_VERSION_MAJOR},${IMAGER_VERSION_MINOR},4,1") add_definitions(-DIMAGER_VERSION_STR="${IMAGER_VERSION_STR}") add_definitions(-DIMAGER_VERSION_CSV=${IMAGER_VERSION_CSV}) - set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) # Adding headers explicity so they are displayed in Qt Creator set(HEADERS config.h imagewriter.h networkaccessmanagerfactory.h nan.h drivelistitem.h drivelistmodel.h drivelistmodelpollthread.h driveformatthread.h powersaveblocker.h cli.h @@ -109,7 +106,7 @@ endif() if (${QT}Widgets_FOUND) set(EXTRALIBS ${EXTRALIBS} ${QT}::Widgets) endif() -if(${QT}DBus_FOUND) +if(${QT}DBus_FOUND AND UNIX AND NOT APPLE) set(DEPENDENCIES ${DEPENDENCIES} linux/udisks2api.cpp linux/udisks2api.h) set(EXTRALIBS ${EXTRALIBS} ${QT}::DBus) message("udisks2 support enabled") @@ -134,6 +131,9 @@ else() add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${DEPENDENCIES}) endif() +set_property(TARGET ${PROJECT_NAME} PROPERTY AUTOMOC ON) +set_property(TARGET ${PROJECT_NAME} PROPERTY AUTORCC ON) + # Enable link time optimization if available include(CheckIPOSupported) check_ipo_supported(RESULT iposupported OUTPUT ipoerror) @@ -165,9 +165,9 @@ if (WIN32) find_package(OpenSSL REQUIRED) # Bundled zlib - add_subdirectory(dependencies/zlib-1.2.11) + add_subdirectory(dependencies/zlib-1.2.13) set(ZLIB_LIBRARY zlibstatic) - set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib-1.2.11) + set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib-1.2.13) # Bundled libcurl set(CMAKE_CURL_INCLUDES) @@ -186,8 +186,8 @@ if (WIN32) # Bundled zstd set(ZSTD_BUILD_PROGRAMS OFF) set(ZSTD_BUILD_SHARED OFF) - add_subdirectory(dependencies/zstd-1.5.0/build/cmake) - set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zstd-1.5.0/lib) + add_subdirectory(dependencies/zstd-1.5.4/build/cmake) + set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zstd-1.5.4/lib) set(ZSTD_LIBRARY libzstd_static) # Bundled libarchive @@ -195,9 +195,11 @@ if (WIN32) set(ENABLE_TAR OFF CACHE BOOL "") set(ENABLE_CPIO OFF CACHE BOOL "") set(ENABLE_CAT OFF CACHE BOOL "") - add_subdirectory(dependencies/libarchive-3.5.2) + add_subdirectory(dependencies/libarchive-3.6.2) + # Disable shared libarchive (we only want static) + set_target_properties(archive PROPERTIES EXCLUDE_FROM_ALL 1) set(LibArchive_LIBRARIES archive_static) - set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.5.2/libarchive) + set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.6.2/libarchive) # Bundled fat32format add_subdirectory(dependencies/fat32format) @@ -209,7 +211,9 @@ if (WIN32) COMMAND ${CMAKE_STRIP} "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe") # Code signing - find_program(SIGNTOOL "signtool.exe" PATHS "c:/Program Files (x86)/Microsoft SDKs/ClickOnce/SignTool") + find_program(SIGNTOOL "signtool.exe" PATHS + "c:/Program Files (x86)/Microsoft SDKs/ClickOnce/SignTool" + "c:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64") if (NOT SIGNTOOL) message(FATAL_ERROR "Unable to locate signtool.exe used for code signing") endif() @@ -275,8 +279,8 @@ elseif(APPLE) # Bundled zstd set(ZSTD_BUILD_PROGRAMS OFF) set(ZSTD_BUILD_SHARED OFF) - add_subdirectory(dependencies/zstd-1.5.0/build/cmake) - set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zstd-1.5.0/lib) + add_subdirectory(dependencies/zstd-1.5.4/build/cmake) + set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zstd-1.5.4/lib) set(ZSTD_LIBRARY libzstd_static) # Bundled libarchive @@ -284,9 +288,11 @@ elseif(APPLE) set(ENABLE_TAR OFF CACHE BOOL "") set(ENABLE_CPIO OFF CACHE BOOL "") set(ENABLE_CAT OFF CACHE BOOL "") - add_subdirectory(dependencies/libarchive-3.5.2) + add_subdirectory(dependencies/libarchive-3.6.2) + # Disable shared libarchive (we only want static) + set_target_properties(archive PROPERTIES EXCLUDE_FROM_ALL 1) set(LibArchive_LIBRARIES archive_static) - set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.5.2/libarchive) + set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.6.2/libarchive) find_library(Cocoa Cocoa) find_library(CoreFoundation CoreFoundation) diff --git a/src/dependencies/cmliblzma/.gitattributes b/src/dependencies/cmliblzma/.gitattributes new file mode 100644 index 0000000..562b12e --- /dev/null +++ b/src/dependencies/cmliblzma/.gitattributes @@ -0,0 +1 @@ +* -whitespace diff --git a/src/dependencies/cmliblzma/CMakeLists.txt b/src/dependencies/cmliblzma/CMakeLists.txt index b443fd6..74866e1 100644 --- a/src/dependencies/cmliblzma/CMakeLists.txt +++ b/src/dependencies/cmliblzma/CMakeLists.txt @@ -63,12 +63,10 @@ set(HAVE_MF_HC4 1) CHECK_TYPE_SIZE(int16_t INT16_T) CHECK_TYPE_SIZE(int32_t INT32_T) CHECK_TYPE_SIZE(int64_t INT64_T) -CHECK_TYPE_SIZE(intmax_t INTMAX_T) CHECK_TYPE_SIZE(uint8_t UINT8_T) CHECK_TYPE_SIZE(uint16_t UINT16_T) CHECK_TYPE_SIZE(uint32_t UINT32_T) CHECK_TYPE_SIZE(uint64_t UINT64_T) -CHECK_TYPE_SIZE(uintmax_t UINTMAX_T) CHECK_TYPE_SIZE("short" SIZE_OF_SHORT) CHECK_TYPE_SIZE("int" SIZE_OF_INT) diff --git a/src/dependencies/cmliblzma/common/mythread.h b/src/dependencies/cmliblzma/common/mythread.h new file mode 100644 index 0000000..be22654 --- /dev/null +++ b/src/dependencies/cmliblzma/common/mythread.h @@ -0,0 +1,521 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file mythread.h +/// \brief Some threading related helper macros and functions +// +// Author: Lasse Collin +// +// This file has been put into the public domain. +// You can do whatever you want with this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef MYTHREAD_H +#define MYTHREAD_H + +#include "sysdefs.h" + +// If any type of threading is enabled, #define MYTHREAD_ENABLED. +#if defined(MYTHREAD_POSIX) || defined(MYTHREAD_WIN95) \ + || defined(MYTHREAD_VISTA) +# define MYTHREAD_ENABLED 1 +#endif + + +#ifdef MYTHREAD_ENABLED + +//////////////////////////////////////// +// Shared between all threading types // +//////////////////////////////////////// + +// Locks a mutex for a duration of a block. +// +// Perform mythread_mutex_lock(&mutex) in the beginning of a block +// and mythread_mutex_unlock(&mutex) at the end of the block. "break" +// may be used to unlock the mutex and jump out of the block. +// mythread_sync blocks may be nested. +// +// Example: +// +// mythread_sync(mutex) { +// foo(); +// if (some_error) +// break; // Skips bar() +// bar(); +// } +// +// At least GCC optimizes the loops completely away so it doesn't slow +// things down at all compared to plain mythread_mutex_lock(&mutex) +// and mythread_mutex_unlock(&mutex) calls. +// +#define mythread_sync(mutex) mythread_sync_helper1(mutex, __LINE__) +#define mythread_sync_helper1(mutex, line) mythread_sync_helper2(mutex, line) +#define mythread_sync_helper2(mutex, line) \ + for (unsigned int mythread_i_ ## line = 0; \ + mythread_i_ ## line \ + ? (mythread_mutex_unlock(&(mutex)), 0) \ + : (mythread_mutex_lock(&(mutex)), 1); \ + mythread_i_ ## line = 1) \ + for (unsigned int mythread_j_ ## line = 0; \ + !mythread_j_ ## line; \ + mythread_j_ ## line = 1) +#endif + + +#if !defined(MYTHREAD_ENABLED) + +////////////////// +// No threading // +////////////////// + +// Calls the given function once. This isn't thread safe. +#define mythread_once(func) \ +do { \ + static bool once_ = false; \ + if (!once_) { \ + func(); \ + once_ = true; \ + } \ +} while (0) + + +#if !(defined(_WIN32) && !defined(__CYGWIN__)) +// Use sigprocmask() to set the signal mask in single-threaded programs. +#include + +static inline void +mythread_sigmask(int how, const sigset_t *restrict set, + sigset_t *restrict oset) +{ + int ret = sigprocmask(how, set, oset); + assert(ret == 0); + (void)ret; +} +#endif + + +#elif defined(MYTHREAD_POSIX) + +//////////////////// +// Using pthreads // +//////////////////// + +#include +#include +#include +#include +#include + +#define MYTHREAD_RET_TYPE void * +#define MYTHREAD_RET_VALUE NULL + +typedef pthread_t mythread; +typedef pthread_mutex_t mythread_mutex; + +typedef struct { + pthread_cond_t cond; +#ifdef HAVE_CLOCK_GETTIME + // Clock ID (CLOCK_REALTIME or CLOCK_MONOTONIC) associated with + // the condition variable. + clockid_t clk_id; +#endif +} mythread_cond; + +typedef struct timespec mythread_condtime; + + +// Calls the given function once in a thread-safe way. +#define mythread_once(func) \ + do { \ + static pthread_once_t once_ = PTHREAD_ONCE_INIT; \ + pthread_once(&once_, &func); \ + } while (0) + + +// Use pthread_sigmask() to set the signal mask in multi-threaded programs. +// Do nothing on OpenVMS since it lacks pthread_sigmask(). +static inline void +mythread_sigmask(int how, const sigset_t *restrict set, + sigset_t *restrict oset) +{ +#ifdef __VMS + (void)how; + (void)set; + (void)oset; +#else + int ret = pthread_sigmask(how, set, oset); + assert(ret == 0); + (void)ret; +#endif +} + + +// Creates a new thread with all signals blocked. Returns zero on success +// and non-zero on error. +static inline int +mythread_create(mythread *thread, void *(*func)(void *arg), void *arg) +{ + sigset_t old; + sigset_t all; + sigfillset(&all); + + mythread_sigmask(SIG_SETMASK, &all, &old); + const int ret = pthread_create(thread, NULL, func, arg); + mythread_sigmask(SIG_SETMASK, &old, NULL); + + return ret; +} + +// Joins a thread. Returns zero on success and non-zero on error. +static inline int +mythread_join(mythread thread) +{ + return pthread_join(thread, NULL); +} + + +// Initiatlizes a mutex. Returns zero on success and non-zero on error. +static inline int +mythread_mutex_init(mythread_mutex *mutex) +{ + return pthread_mutex_init(mutex, NULL); +} + +static inline void +mythread_mutex_destroy(mythread_mutex *mutex) +{ + int ret = pthread_mutex_destroy(mutex); + assert(ret == 0); + (void)ret; +} + +static inline void +mythread_mutex_lock(mythread_mutex *mutex) +{ + int ret = pthread_mutex_lock(mutex); + assert(ret == 0); + (void)ret; +} + +static inline void +mythread_mutex_unlock(mythread_mutex *mutex) +{ + int ret = pthread_mutex_unlock(mutex); + assert(ret == 0); + (void)ret; +} + + +// Initializes a condition variable. +// +// Using CLOCK_MONOTONIC instead of the default CLOCK_REALTIME makes the +// timeout in pthread_cond_timedwait() work correctly also if system time +// is suddenly changed. Unfortunately CLOCK_MONOTONIC isn't available +// everywhere while the default CLOCK_REALTIME is, so the default is +// used if CLOCK_MONOTONIC isn't available. +// +// If clock_gettime() isn't available at all, gettimeofday() will be used. +static inline int +mythread_cond_init(mythread_cond *mycond) +{ +#ifdef HAVE_CLOCK_GETTIME + // NOTE: HAVE_DECL_CLOCK_MONOTONIC is always defined to 0 or 1. +# if defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && HAVE_DECL_CLOCK_MONOTONIC + struct timespec ts; + pthread_condattr_t condattr; + + // POSIX doesn't seem to *require* that pthread_condattr_setclock() + // will fail if given an unsupported clock ID. Test that + // CLOCK_MONOTONIC really is supported using clock_gettime(). + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0 + && pthread_condattr_init(&condattr) == 0) { + int ret = pthread_condattr_setclock( + &condattr, CLOCK_MONOTONIC); + if (ret == 0) + ret = pthread_cond_init(&mycond->cond, &condattr); + + pthread_condattr_destroy(&condattr); + + if (ret == 0) { + mycond->clk_id = CLOCK_MONOTONIC; + return 0; + } + } + + // If anything above fails, fall back to the default CLOCK_REALTIME. + // POSIX requires that all implementations of clock_gettime() must + // support at least CLOCK_REALTIME. +# endif + + mycond->clk_id = CLOCK_REALTIME; +#endif + + return pthread_cond_init(&mycond->cond, NULL); +} + +static inline void +mythread_cond_destroy(mythread_cond *cond) +{ + int ret = pthread_cond_destroy(&cond->cond); + assert(ret == 0); + (void)ret; +} + +static inline void +mythread_cond_signal(mythread_cond *cond) +{ + int ret = pthread_cond_signal(&cond->cond); + assert(ret == 0); + (void)ret; +} + +static inline void +mythread_cond_wait(mythread_cond *cond, mythread_mutex *mutex) +{ + int ret = pthread_cond_wait(&cond->cond, mutex); + assert(ret == 0); + (void)ret; +} + +// Waits on a condition or until a timeout expires. If the timeout expires, +// non-zero is returned, otherwise zero is returned. +static inline int +mythread_cond_timedwait(mythread_cond *cond, mythread_mutex *mutex, + const mythread_condtime *condtime) +{ + int ret = pthread_cond_timedwait(&cond->cond, mutex, condtime); + assert(ret == 0 || ret == ETIMEDOUT); + return ret; +} + +// Sets condtime to the absolute time that is timeout_ms milliseconds +// in the future. The type of the clock to use is taken from cond. +static inline void +mythread_condtime_set(mythread_condtime *condtime, const mythread_cond *cond, + uint32_t timeout_ms) +{ + condtime->tv_sec = timeout_ms / 1000; + condtime->tv_nsec = (timeout_ms % 1000) * 1000000; + +#ifdef HAVE_CLOCK_GETTIME + struct timespec now; + int ret = clock_gettime(cond->clk_id, &now); + assert(ret == 0); + (void)ret; + + condtime->tv_sec += now.tv_sec; + condtime->tv_nsec += now.tv_nsec; +#else + (void)cond; + + struct timeval now; + gettimeofday(&now, NULL); + + condtime->tv_sec += now.tv_sec; + condtime->tv_nsec += now.tv_usec * 1000L; +#endif + + // tv_nsec must stay in the range [0, 999_999_999]. + if (condtime->tv_nsec >= 1000000000L) { + condtime->tv_nsec -= 1000000000L; + ++condtime->tv_sec; + } +} + + +#elif defined(MYTHREAD_WIN95) || defined(MYTHREAD_VISTA) + +///////////////////// +// Windows threads // +///////////////////// + +#define WIN32_LEAN_AND_MEAN +#ifdef MYTHREAD_VISTA +# undef _WIN32_WINNT +# define _WIN32_WINNT 0x0600 +#endif +#include +#include + +#define MYTHREAD_RET_TYPE unsigned int __stdcall +#define MYTHREAD_RET_VALUE 0 + +typedef HANDLE mythread; +typedef CRITICAL_SECTION mythread_mutex; + +#ifdef MYTHREAD_WIN95 +typedef HANDLE mythread_cond; +#else +typedef CONDITION_VARIABLE mythread_cond; +#endif + +typedef struct { + // Tick count (milliseconds) in the beginning of the timeout. + // NOTE: This is 32 bits so it wraps around after 49.7 days. + // Multi-day timeouts may not work as expected. + DWORD start; + + // Length of the timeout in milliseconds. The timeout expires + // when the current tick count minus "start" is equal or greater + // than "timeout". + DWORD timeout; +} mythread_condtime; + + +// mythread_once() is only available with Vista threads. +#ifdef MYTHREAD_VISTA +#define mythread_once(func) \ + do { \ + static INIT_ONCE once_ = INIT_ONCE_STATIC_INIT; \ + BOOL pending_; \ + if (!InitOnceBeginInitialize(&once_, 0, &pending_, NULL)) \ + abort(); \ + if (pending_) \ + func(); \ + if (!InitOnceComplete(&once, 0, NULL)) \ + abort(); \ + } while (0) +#endif + + +// mythread_sigmask() isn't available on Windows. Even a dummy version would +// make no sense because the other POSIX signal functions are missing anyway. + + +static inline int +mythread_create(mythread *thread, + unsigned int (__stdcall *func)(void *arg), void *arg) +{ + uintptr_t ret = _beginthreadex(NULL, 0, func, arg, 0, NULL); + if (ret == 0) + return -1; + + *thread = (HANDLE)ret; + return 0; +} + +static inline int +mythread_join(mythread thread) +{ + int ret = 0; + + if (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0) + ret = -1; + + if (!CloseHandle(thread)) + ret = -1; + + return ret; +} + + +static inline int +mythread_mutex_init(mythread_mutex *mutex) +{ + InitializeCriticalSection(mutex); + return 0; +} + +static inline void +mythread_mutex_destroy(mythread_mutex *mutex) +{ + DeleteCriticalSection(mutex); +} + +static inline void +mythread_mutex_lock(mythread_mutex *mutex) +{ + EnterCriticalSection(mutex); +} + +static inline void +mythread_mutex_unlock(mythread_mutex *mutex) +{ + LeaveCriticalSection(mutex); +} + + +static inline int +mythread_cond_init(mythread_cond *cond) +{ +#ifdef MYTHREAD_WIN95 + *cond = CreateEvent(NULL, FALSE, FALSE, NULL); + return *cond == NULL ? -1 : 0; +#else + InitializeConditionVariable(cond); + return 0; +#endif +} + +static inline void +mythread_cond_destroy(mythread_cond *cond) +{ +#ifdef MYTHREAD_WIN95 + CloseHandle(*cond); +#else + (void)cond; +#endif +} + +static inline void +mythread_cond_signal(mythread_cond *cond) +{ +#ifdef MYTHREAD_WIN95 + SetEvent(*cond); +#else + WakeConditionVariable(cond); +#endif +} + +static inline void +mythread_cond_wait(mythread_cond *cond, mythread_mutex *mutex) +{ +#ifdef MYTHREAD_WIN95 + LeaveCriticalSection(mutex); + WaitForSingleObject(*cond, INFINITE); + EnterCriticalSection(mutex); +#else + BOOL ret = SleepConditionVariableCS(cond, mutex, INFINITE); + assert(ret); + (void)ret; +#endif +} + +static inline int +mythread_cond_timedwait(mythread_cond *cond, mythread_mutex *mutex, + const mythread_condtime *condtime) +{ +#ifdef MYTHREAD_WIN95 + LeaveCriticalSection(mutex); +#endif + + DWORD elapsed = GetTickCount() - condtime->start; + DWORD timeout = elapsed >= condtime->timeout + ? 0 : condtime->timeout - elapsed; + +#ifdef MYTHREAD_WIN95 + DWORD ret = WaitForSingleObject(*cond, timeout); + assert(ret == WAIT_OBJECT_0 || ret == WAIT_TIMEOUT); + + EnterCriticalSection(mutex); + + return ret == WAIT_TIMEOUT; +#else + BOOL ret = SleepConditionVariableCS(cond, mutex, timeout); + assert(ret || GetLastError() == ERROR_TIMEOUT); + return !ret; +#endif +} + +static inline void +mythread_condtime_set(mythread_condtime *condtime, const mythread_cond *cond, + uint32_t timeout) +{ + (void)cond; + condtime->start = GetTickCount(); + condtime->timeout = timeout; +} + +#endif + +#endif diff --git a/src/dependencies/cmliblzma/common/sysdefs.h b/src/dependencies/cmliblzma/common/sysdefs.h index 22f487b..86c5da0 100644 --- a/src/dependencies/cmliblzma/common/sysdefs.h +++ b/src/dependencies/cmliblzma/common/sysdefs.h @@ -49,9 +49,7 @@ // Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The // limits are also used to figure out some macros missing from pre-C99 systems. -#ifdef HAVE_LIMITS_H -# include -#endif +#include #if defined(_MSC_VER) && (_MSC_VER < 1310) @@ -164,9 +162,7 @@ typedef unsigned char _Bool; // string.h should be enough but let's include strings.h and memory.h too if // they exists, since that shouldn't do any harm, but may improve portability. -#ifdef HAVE_STRING_H -# include -#endif +#include #ifdef HAVE_STRINGS_H # include @@ -204,7 +200,8 @@ typedef unsigned char _Bool; # define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) #endif -#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 +#if defined(__GNUC__) \ + && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4) # define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x))) #else # define lzma_attr_alloc_size(x) diff --git a/src/dependencies/cmliblzma/common/tuklib_common.h b/src/dependencies/cmliblzma/common/tuklib_common.h new file mode 100644 index 0000000..31fbab5 --- /dev/null +++ b/src/dependencies/cmliblzma/common/tuklib_common.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file tuklib_common.h +/// \brief Common definitions for tuklib modules +// +// Author: Lasse Collin +// +// This file has been put into the public domain. +// You can do whatever you want with this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef TUKLIB_COMMON_H +#define TUKLIB_COMMON_H + +// The config file may be replaced by a package-specific file. +// It should include at least stddef.h, inttypes.h, and limits.h. +#include "tuklib_config.h" + +// TUKLIB_SYMBOL_PREFIX is prefixed to all symbols exported by +// the tuklib modules. If you use a tuklib module in a library, +// you should use TUKLIB_SYMBOL_PREFIX to make sure that there +// are no symbol conflicts in case someone links your library +// into application that also uses the same tuklib module. +#ifndef TUKLIB_SYMBOL_PREFIX +# define TUKLIB_SYMBOL_PREFIX +#endif + +#define TUKLIB_CAT_X(a, b) a ## b +#define TUKLIB_CAT(a, b) TUKLIB_CAT_X(a, b) + +#ifndef TUKLIB_SYMBOL +# define TUKLIB_SYMBOL(sym) TUKLIB_CAT(TUKLIB_SYMBOL_PREFIX, sym) +#endif + +#ifndef TUKLIB_DECLS_BEGIN +# ifdef __cplusplus +# define TUKLIB_DECLS_BEGIN extern "C" { +# else +# define TUKLIB_DECLS_BEGIN +# endif +#endif + +#ifndef TUKLIB_DECLS_END +# ifdef __cplusplus +# define TUKLIB_DECLS_END } +# else +# define TUKLIB_DECLS_END +# endif +#endif + +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define TUKLIB_GNUC_REQ(major, minor) \ + ((__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) \ + || __GNUC__ > (major)) +#else +# define TUKLIB_GNUC_REQ(major, minor) 0 +#endif + +#if TUKLIB_GNUC_REQ(2, 5) +# define tuklib_attr_noreturn __attribute__((__noreturn__)) +#else +# define tuklib_attr_noreturn +#endif + +#if (defined(_WIN32) && !defined(__CYGWIN__)) \ + || defined(__OS2__) || defined(__MSDOS__) +# define TUKLIB_DOSLIKE 1 +#endif + +#endif diff --git a/src/dependencies/cmliblzma/common/tuklib_config.h b/src/dependencies/cmliblzma/common/tuklib_config.h new file mode 100644 index 0000000..549cb24 --- /dev/null +++ b/src/dependencies/cmliblzma/common/tuklib_config.h @@ -0,0 +1,7 @@ +#ifdef HAVE_CONFIG_H +# include "sysdefs.h" +#else +# include +# include +# include +#endif diff --git a/src/dependencies/cmliblzma/common/tuklib_cpucores.c b/src/dependencies/cmliblzma/common/tuklib_cpucores.c new file mode 100644 index 0000000..cc968dd --- /dev/null +++ b/src/dependencies/cmliblzma/common/tuklib_cpucores.c @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file tuklib_cpucores.c +/// \brief Get the number of CPU cores online +// +// Author: Lasse Collin +// +// This file has been put into the public domain. +// You can do whatever you want with this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#include "tuklib_cpucores.h" + +#if defined(_WIN32) || defined(__CYGWIN__) +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0500 +# endif +# include + +// glibc >= 2.9 +#elif defined(TUKLIB_CPUCORES_SCHED_GETAFFINITY) +# include + +// FreeBSD +#elif defined(TUKLIB_CPUCORES_CPUSET) +# include +# include + +#elif defined(TUKLIB_CPUCORES_SYSCTL) +# ifdef HAVE_SYS_PARAM_H +# include +# endif +# include + +#elif defined(TUKLIB_CPUCORES_SYSCONF) +# include + +// HP-UX +#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) +# include +# include +#endif + + +extern uint32_t +tuklib_cpucores(void) +{ + uint32_t ret = 0; + +#if defined(_WIN32) || defined(__CYGWIN__) + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + ret = sysinfo.dwNumberOfProcessors; + +#elif defined(TUKLIB_CPUCORES_SCHED_GETAFFINITY) + cpu_set_t cpu_mask; + if (sched_getaffinity(0, sizeof(cpu_mask), &cpu_mask) == 0) + ret = (uint32_t)CPU_COUNT(&cpu_mask); + +#elif defined(TUKLIB_CPUCORES_CPUSET) + cpuset_t set; + if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, + sizeof(set), &set) == 0) { +# ifdef CPU_COUNT + ret = (uint32_t)CPU_COUNT(&set); +# else + for (unsigned i = 0; i < CPU_SETSIZE; ++i) + if (CPU_ISSET(i, &set)) + ++ret; +# endif + } + +#elif defined(TUKLIB_CPUCORES_SYSCTL) + int name[2] = { CTL_HW, HW_NCPU }; + int cpus; + size_t cpus_size = sizeof(cpus); + if (sysctl(name, 2, &cpus, &cpus_size, NULL, 0) != -1 + && cpus_size == sizeof(cpus) && cpus > 0) + ret = (uint32_t)cpus; + +#elif defined(TUKLIB_CPUCORES_SYSCONF) +# ifdef _SC_NPROCESSORS_ONLN + // Most systems + const long cpus = sysconf(_SC_NPROCESSORS_ONLN); +# else + // IRIX + const long cpus = sysconf(_SC_NPROC_ONLN); +# endif + if (cpus > 0) + ret = (uint32_t)cpus; + +#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) + struct pst_dynamic pst; + if (pstat_getdynamic(&pst, sizeof(pst), 1, 0) != -1) + ret = (uint32_t)pst.psd_proc_cnt; +#endif + + return ret; +} diff --git a/src/dependencies/cmliblzma/common/tuklib_cpucores.h b/src/dependencies/cmliblzma/common/tuklib_cpucores.h new file mode 100644 index 0000000..be1ce1c --- /dev/null +++ b/src/dependencies/cmliblzma/common/tuklib_cpucores.h @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file tuklib_cpucores.h +/// \brief Get the number of CPU cores online +// +// Author: Lasse Collin +// +// This file has been put into the public domain. +// You can do whatever you want with this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef TUKLIB_CPUCORES_H +#define TUKLIB_CPUCORES_H + +#include "tuklib_common.h" +TUKLIB_DECLS_BEGIN + +#define tuklib_cpucores TUKLIB_SYMBOL(tuklib_cpucores) +extern uint32_t tuklib_cpucores(void); + +TUKLIB_DECLS_END +#endif diff --git a/src/dependencies/cmliblzma/common/tuklib_integer.h b/src/dependencies/cmliblzma/common/tuklib_integer.h index 5d82685..4e61357 100644 --- a/src/dependencies/cmliblzma/common/tuklib_integer.h +++ b/src/dependencies/cmliblzma/common/tuklib_integer.h @@ -6,22 +6,26 @@ /// This file provides macros or functions to do some basic integer and bit /// operations. /// -/// Endianness related integer operations (XX = 16, 32, or 64; Y = b or l): +/// Native endian inline functions (XX = 16, 32, or 64): +/// - Unaligned native endian reads: readXXne(ptr) +/// - Unaligned native endian writes: writeXXne(ptr, num) +/// - Aligned native endian reads: aligned_readXXne(ptr) +/// - Aligned native endian writes: aligned_writeXXne(ptr, num) +/// +/// Endianness-converting integer operations (these can be macros!) +/// (XX = 16, 32, or 64; Y = b or l): /// - Byte swapping: bswapXX(num) -/// - Byte order conversions to/from native: convXXYe(num) -/// - Aligned reads: readXXYe(ptr) -/// - Aligned writes: writeXXYe(ptr, num) -/// - Unaligned reads (16/32-bit only): unaligned_readXXYe(ptr) -/// - Unaligned writes (16/32-bit only): unaligned_writeXXYe(ptr, num) +/// - Byte order conversions to/from native (byteswaps if Y isn't +/// the native endianness): convXXYe(num) +/// - Unaligned reads (16/32-bit only): readXXYe(ptr) +/// - Unaligned writes (16/32-bit only): writeXXYe(ptr, num) +/// - Aligned reads: aligned_readXXYe(ptr) +/// - Aligned writes: aligned_writeXXYe(ptr, num) /// -/// Since they can macros, the arguments should have no side effects since -/// they may be evaluated more than once. +/// Since the above can macros, the arguments should have no side effects +/// because they may be evaluated more than once. /// -/// \todo PowerPC and possibly some other architectures support -/// byte swapping load and store instructions. This file -/// doesn't take advantage of those instructions. -/// -/// Bit scan operations for non-zero 32-bit integers: +/// Bit scan operations for non-zero 32-bit integers (inline functions): /// - Bit scan reverse (find highest non-zero bit): bsr32(num) /// - Count leading zeros: clz32(num) /// - Count trailing zeros: ctz32(num) @@ -41,22 +45,27 @@ #ifndef TUKLIB_INTEGER_H #define TUKLIB_INTEGER_H -#include "sysdefs.h" +#include "tuklib_common.h" +#include -#if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define TUKLIB_GNUC_REQ(major, minor) \ - ((__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) \ - || __GNUC__ > (major)) -#else -# define TUKLIB_GNUC_REQ(major, minor) 0 +// Newer Intel C compilers require immintrin.h for _bit_scan_reverse() +// and such functions. +#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) +# include #endif -//////////////////////////////////////// -// Operating system specific features // -//////////////////////////////////////// +/////////////////// +// Byte swapping // +/////////////////// -#if defined(HAVE_BYTESWAP_H) +#if defined(HAVE___BUILTIN_BSWAPXX) + // GCC >= 4.8 and Clang +# define bswap16(n) __builtin_bswap16(n) +# define bswap32(n) __builtin_bswap32(n) +# define bswap64(n) __builtin_bswap64(n) + +#elif defined(HAVE_BYTESWAP_H) // glibc, uClibc, dietlibc # include # ifdef HAVE_BSWAP_16 @@ -105,45 +114,33 @@ # endif #endif - -//////////////////////////////// -// Compiler-specific features // -//////////////////////////////// - -// Newer Intel C compilers require immintrin.h for _bit_scan_reverse() -// and such functions. -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) -# include -#endif - - -/////////////////// -// Byte swapping // -/////////////////// - #ifndef bswap16 -# define bswap16(num) \ - (((uint16_t)(num) << 8) | ((uint16_t)(num) >> 8)) +# define bswap16(n) (uint16_t)( \ + (((n) & 0x00FFU) << 8) \ + | (((n) & 0xFF00U) >> 8) \ + ) #endif #ifndef bswap32 -# define bswap32(num) \ - ( (((uint32_t)(num) << 24) ) \ - | (((uint32_t)(num) << 8) & UINT32_C(0x00FF0000)) \ - | (((uint32_t)(num) >> 8) & UINT32_C(0x0000FF00)) \ - | (((uint32_t)(num) >> 24) ) ) +# define bswap32(n) (uint32_t)( \ + (((n) & UINT32_C(0x000000FF)) << 24) \ + | (((n) & UINT32_C(0x0000FF00)) << 8) \ + | (((n) & UINT32_C(0x00FF0000)) >> 8) \ + | (((n) & UINT32_C(0xFF000000)) >> 24) \ + ) #endif #ifndef bswap64 -# define bswap64(num) \ - ( (((uint64_t)(num) << 56) ) \ - | (((uint64_t)(num) << 40) & UINT64_C(0x00FF000000000000)) \ - | (((uint64_t)(num) << 24) & UINT64_C(0x0000FF0000000000)) \ - | (((uint64_t)(num) << 8) & UINT64_C(0x000000FF00000000)) \ - | (((uint64_t)(num) >> 8) & UINT64_C(0x00000000FF000000)) \ - | (((uint64_t)(num) >> 24) & UINT64_C(0x0000000000FF0000)) \ - | (((uint64_t)(num) >> 40) & UINT64_C(0x000000000000FF00)) \ - | (((uint64_t)(num) >> 56) ) ) +# define bswap64(n) (uint64_t)( \ + (((n) & UINT64_C(0x00000000000000FF)) << 56) \ + | (((n) & UINT64_C(0x000000000000FF00)) << 40) \ + | (((n) & UINT64_C(0x0000000000FF0000)) << 24) \ + | (((n) & UINT64_C(0x00000000FF000000)) << 8) \ + | (((n) & UINT64_C(0x000000FF00000000)) >> 8) \ + | (((n) & UINT64_C(0x0000FF0000000000)) >> 24) \ + | (((n) & UINT64_C(0x00FF000000000000)) >> 40) \ + | (((n) & UINT64_C(0xFF00000000000000)) >> 56) \ + ) #endif // Define conversion macros using the basic byte swapping macros. @@ -188,76 +185,76 @@ #endif -////////////////////////////// -// Aligned reads and writes // -////////////////////////////// +//////////////////////////////// +// Unaligned reads and writes // +//////////////////////////////// + +// The traditional way of casting e.g. *(const uint16_t *)uint8_pointer +// is bad even if the uint8_pointer is properly aligned because this kind +// of casts break strict aliasing rules and result in undefined behavior. +// With unaligned pointers it's even worse: compilers may emit vector +// instructions that require aligned pointers even if non-vector +// instructions work with unaligned pointers. +// +// Using memcpy() is the standard compliant way to do unaligned access. +// Many modern compilers inline it so there is no function call overhead. +// For those compilers that don't handle the memcpy() method well, the +// old casting method (that violates strict aliasing) can be requested at +// build time. A third method, casting to a packed struct, would also be +// an option but isn't provided to keep things simpler (it's already a mess). +// Hopefully this is flexible enough in practice. static inline uint16_t -read16be(const uint8_t *buf) +read16ne(const uint8_t *buf) { - uint16_t num = *(const uint16_t *)buf; - return conv16be(num); -} - - -static inline uint16_t -read16le(const uint8_t *buf) -{ - uint16_t num = *(const uint16_t *)buf; - return conv16le(num); +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) + return *(const uint16_t *)buf; +#else + uint16_t num; + memcpy(&num, buf, sizeof(num)); + return num; +#endif } static inline uint32_t -read32be(const uint8_t *buf) +read32ne(const uint8_t *buf) { - uint32_t num = *(const uint32_t *)buf; - return conv32be(num); -} - - -static inline uint32_t -read32le(const uint8_t *buf) -{ - uint32_t num = *(const uint32_t *)buf; - return conv32le(num); +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) + return *(const uint32_t *)buf; +#else + uint32_t num; + memcpy(&num, buf, sizeof(num)); + return num; +#endif } static inline uint64_t -read64be(const uint8_t *buf) +read64ne(const uint8_t *buf) { - uint64_t num = *(const uint64_t *)buf; - return conv64be(num); +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) + return *(const uint64_t *)buf; +#else + uint64_t num; + memcpy(&num, buf, sizeof(num)); + return num; +#endif } -static inline uint64_t -read64le(const uint8_t *buf) -{ - uint64_t num = *(const uint64_t *)buf; - return conv64le(num); -} - - -// NOTE: Possible byte swapping must be done in a macro to allow GCC -// to optimize byte swapping of constants when using glibc's or *BSD's -// byte swapping macros. The actual write is done in an inline function -// to make type checking of the buf pointer possible similarly to readXXYe() -// functions. - -#define write16be(buf, num) write16ne((buf), conv16be(num)) -#define write16le(buf, num) write16ne((buf), conv16le(num)) -#define write32be(buf, num) write32ne((buf), conv32be(num)) -#define write32le(buf, num) write32ne((buf), conv32le(num)) -#define write64be(buf, num) write64ne((buf), conv64be(num)) -#define write64le(buf, num) write64ne((buf), conv64le(num)) - - static inline void write16ne(uint8_t *buf, uint16_t num) { +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) *(uint16_t *)buf = num; +#else + memcpy(buf, &num, sizeof(num)); +#endif return; } @@ -265,7 +262,12 @@ write16ne(uint8_t *buf, uint16_t num) static inline void write32ne(uint8_t *buf, uint32_t num) { +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) *(uint32_t *)buf = num; +#else + memcpy(buf, &num, sizeof(num)); +#endif return; } @@ -273,90 +275,114 @@ write32ne(uint8_t *buf, uint32_t num) static inline void write64ne(uint8_t *buf, uint64_t num) { +#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ + && defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) *(uint64_t *)buf = num; +#else + memcpy(buf, &num, sizeof(num)); +#endif return; } -//////////////////////////////// -// Unaligned reads and writes // -//////////////////////////////// - -// NOTE: TUKLIB_FAST_UNALIGNED_ACCESS indicates only support for 16-bit and -// 32-bit unaligned integer loads and stores. It's possible that 64-bit -// unaligned access doesn't work or is slower than byte-by-byte access. -// Since unaligned 64-bit is probably not needed as often as 16-bit or -// 32-bit, we simply don't support 64-bit unaligned access for now. -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define unaligned_read16be read16be -# define unaligned_read16le read16le -# define unaligned_read32be read32be -# define unaligned_read32le read32le -# define unaligned_write16be write16be -# define unaligned_write16le write16le -# define unaligned_write32be write32be -# define unaligned_write32le write32le - -#else - static inline uint16_t -unaligned_read16be(const uint8_t *buf) +read16be(const uint8_t *buf) { +#if defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) + uint16_t num = read16ne(buf); + return conv16be(num); +#else uint16_t num = ((uint16_t)buf[0] << 8) | (uint16_t)buf[1]; return num; +#endif } static inline uint16_t -unaligned_read16le(const uint8_t *buf) +read16le(const uint8_t *buf) { +#if !defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) + uint16_t num = read16ne(buf); + return conv16le(num); +#else uint16_t num = ((uint16_t)buf[0]) | ((uint16_t)buf[1] << 8); return num; +#endif } static inline uint32_t -unaligned_read32be(const uint8_t *buf) +read32be(const uint8_t *buf) { +#if defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) + uint32_t num = read32ne(buf); + return conv32be(num); +#else uint32_t num = (uint32_t)buf[0] << 24; num |= (uint32_t)buf[1] << 16; num |= (uint32_t)buf[2] << 8; num |= (uint32_t)buf[3]; return num; +#endif } static inline uint32_t -unaligned_read32le(const uint8_t *buf) +read32le(const uint8_t *buf) { +#if !defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) + uint32_t num = read32ne(buf); + return conv32le(num); +#else uint32_t num = (uint32_t)buf[0]; num |= (uint32_t)buf[1] << 8; num |= (uint32_t)buf[2] << 16; num |= (uint32_t)buf[3] << 24; return num; +#endif } +// NOTE: Possible byte swapping must be done in a macro to allow the compiler +// to optimize byte swapping of constants when using glibc's or *BSD's +// byte swapping macros. The actual write is done in an inline function +// to make type checking of the buf pointer possible. +#if defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) +# define write16be(buf, num) write16ne(buf, conv16be(num)) +# define write32be(buf, num) write32ne(buf, conv32be(num)) +#endif + +#if !defined(WORDS_BIGENDIAN) || defined(TUKLIB_FAST_UNALIGNED_ACCESS) +# define write16le(buf, num) write16ne(buf, conv16le(num)) +# define write32le(buf, num) write32ne(buf, conv32le(num)) +#endif + + +#ifndef write16be static inline void -unaligned_write16be(uint8_t *buf, uint16_t num) +write16be(uint8_t *buf, uint16_t num) { buf[0] = (uint8_t)(num >> 8); buf[1] = (uint8_t)num; return; } +#endif +#ifndef write16le static inline void -unaligned_write16le(uint8_t *buf, uint16_t num) +write16le(uint8_t *buf, uint16_t num) { buf[0] = (uint8_t)num; buf[1] = (uint8_t)(num >> 8); return; } +#endif +#ifndef write32be static inline void -unaligned_write32be(uint8_t *buf, uint32_t num) +write32be(uint8_t *buf, uint32_t num) { buf[0] = (uint8_t)(num >> 24); buf[1] = (uint8_t)(num >> 16); @@ -364,10 +390,12 @@ unaligned_write32be(uint8_t *buf, uint32_t num) buf[3] = (uint8_t)num; return; } +#endif +#ifndef write32le static inline void -unaligned_write32le(uint8_t *buf, uint32_t num) +write32le(uint8_t *buf, uint32_t num) { buf[0] = (uint8_t)num; buf[1] = (uint8_t)(num >> 8); @@ -375,10 +403,184 @@ unaligned_write32le(uint8_t *buf, uint32_t num) buf[3] = (uint8_t)(num >> 24); return; } - #endif +////////////////////////////// +// Aligned reads and writes // +////////////////////////////// + +// Separate functions for aligned reads and writes are provided since on +// strict-align archs aligned access is much faster than unaligned access. +// +// Just like in the unaligned case, memcpy() is needed to avoid +// strict aliasing violations. However, on archs that don't support +// unaligned access the compiler cannot know that the pointers given +// to memcpy() are aligned which results in slow code. As of C11 there is +// no standard way to tell the compiler that we know that the address is +// aligned but some compilers have language extensions to do that. With +// such language extensions the memcpy() method gives excellent results. +// +// What to do on a strict-align system when no known language extentensions +// are available? Falling back to byte-by-byte access would be safe but ruin +// optimizations that have been made specifically with aligned access in mind. +// As a compromise, aligned reads will fall back to non-compliant type punning +// but aligned writes will be byte-by-byte, that is, fast reads are preferred +// over fast writes. This obviously isn't great but hopefully it's a working +// compromise for now. +// +// __builtin_assume_aligned is support by GCC >= 4.7 and clang >= 3.6. +#ifdef HAVE___BUILTIN_ASSUME_ALIGNED +# define tuklib_memcpy_aligned(dest, src, size) \ + memcpy(dest, __builtin_assume_aligned(src, size), size) +#else +# define tuklib_memcpy_aligned(dest, src, size) \ + memcpy(dest, src, size) +# ifndef TUKLIB_FAST_UNALIGNED_ACCESS +# define TUKLIB_USE_UNSAFE_ALIGNED_READS 1 +# endif +#endif + + +static inline uint16_t +aligned_read16ne(const uint8_t *buf) +{ +#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ + || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) + return *(const uint16_t *)buf; +#else + uint16_t num; + tuklib_memcpy_aligned(&num, buf, sizeof(num)); + return num; +#endif +} + + +static inline uint32_t +aligned_read32ne(const uint8_t *buf) +{ +#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ + || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) + return *(const uint32_t *)buf; +#else + uint32_t num; + tuklib_memcpy_aligned(&num, buf, sizeof(num)); + return num; +#endif +} + + +static inline uint64_t +aligned_read64ne(const uint8_t *buf) +{ +#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ + || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) + return *(const uint64_t *)buf; +#else + uint64_t num; + tuklib_memcpy_aligned(&num, buf, sizeof(num)); + return num; +#endif +} + + +static inline void +aligned_write16ne(uint8_t *buf, uint16_t num) +{ +#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING + *(uint16_t *)buf = num; +#else + tuklib_memcpy_aligned(buf, &num, sizeof(num)); +#endif + return; +} + + +static inline void +aligned_write32ne(uint8_t *buf, uint32_t num) +{ +#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING + *(uint32_t *)buf = num; +#else + tuklib_memcpy_aligned(buf, &num, sizeof(num)); +#endif + return; +} + + +static inline void +aligned_write64ne(uint8_t *buf, uint64_t num) +{ +#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING + *(uint64_t *)buf = num; +#else + tuklib_memcpy_aligned(buf, &num, sizeof(num)); +#endif + return; +} + + +static inline uint16_t +aligned_read16be(const uint8_t *buf) +{ + uint16_t num = aligned_read16ne(buf); + return conv16be(num); +} + + +static inline uint16_t +aligned_read16le(const uint8_t *buf) +{ + uint16_t num = aligned_read16ne(buf); + return conv16le(num); +} + + +static inline uint32_t +aligned_read32be(const uint8_t *buf) +{ + uint32_t num = aligned_read32ne(buf); + return conv32be(num); +} + + +static inline uint32_t +aligned_read32le(const uint8_t *buf) +{ + uint32_t num = aligned_read32ne(buf); + return conv32le(num); +} + + +static inline uint64_t +aligned_read64be(const uint8_t *buf) +{ + uint64_t num = aligned_read64ne(buf); + return conv64be(num); +} + + +static inline uint64_t +aligned_read64le(const uint8_t *buf) +{ + uint64_t num = aligned_read64ne(buf); + return conv64le(num); +} + + +// These need to be macros like in the unaligned case. +#define aligned_write16be(buf, num) aligned_write16ne((buf), conv16be(num)) +#define aligned_write16le(buf, num) aligned_write16ne((buf), conv16le(num)) +#define aligned_write32be(buf, num) aligned_write32ne((buf), conv32be(num)) +#define aligned_write32le(buf, num) aligned_write32ne((buf), conv32le(num)) +#define aligned_write64be(buf, num) aligned_write64ne((buf), conv64be(num)) +#define aligned_write64le(buf, num) aligned_write64ne((buf), conv64le(num)) + + +//////////////////// +// Bit operations // +//////////////////// + static inline uint32_t bsr32(uint32_t n) { @@ -391,7 +593,7 @@ bsr32(uint32_t n) // multiple architectures. On x86, __builtin_clz() ^ 31U becomes // either plain BSR (so the XOR gets optimized away) or LZCNT and // XOR (if -march indicates that SSE4a instructions are supported). - return __builtin_clz(n) ^ 31U; + return (uint32_t)__builtin_clz(n) ^ 31U; #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) uint32_t i; @@ -401,27 +603,27 @@ bsr32(uint32_t n) #else uint32_t i = 31; - if ((n & UINT32_C(0xFFFF0000)) == 0) { + if ((n & 0xFFFF0000) == 0) { n <<= 16; i = 15; } - if ((n & UINT32_C(0xFF000000)) == 0) { + if ((n & 0xFF000000) == 0) { n <<= 8; i -= 8; } - if ((n & UINT32_C(0xF0000000)) == 0) { + if ((n & 0xF0000000) == 0) { n <<= 4; i -= 4; } - if ((n & UINT32_C(0xC0000000)) == 0) { + if ((n & 0xC0000000) == 0) { n <<= 2; i -= 2; } - if ((n & UINT32_C(0x80000000)) == 0) + if ((n & 0x80000000) == 0) --i; return i; @@ -436,7 +638,7 @@ clz32(uint32_t n) return _bit_scan_reverse(n) ^ 31U; #elif TUKLIB_GNUC_REQ(3, 4) && UINT_MAX == UINT32_MAX - return __builtin_clz(n); + return (uint32_t)__builtin_clz(n); #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) uint32_t i; @@ -448,27 +650,27 @@ clz32(uint32_t n) #else uint32_t i = 0; - if ((n & UINT32_C(0xFFFF0000)) == 0) { + if ((n & 0xFFFF0000) == 0) { n <<= 16; i = 16; } - if ((n & UINT32_C(0xFF000000)) == 0) { + if ((n & 0xFF000000) == 0) { n <<= 8; i += 8; } - if ((n & UINT32_C(0xF0000000)) == 0) { + if ((n & 0xF0000000) == 0) { n <<= 4; i += 4; } - if ((n & UINT32_C(0xC0000000)) == 0) { + if ((n & 0xC0000000) == 0) { n <<= 2; i += 2; } - if ((n & UINT32_C(0x80000000)) == 0) + if ((n & 0x80000000) == 0) ++i; return i; @@ -483,7 +685,7 @@ ctz32(uint32_t n) return _bit_scan_forward(n); #elif TUKLIB_GNUC_REQ(3, 4) && UINT_MAX >= UINT32_MAX - return __builtin_ctz(n); + return (uint32_t)__builtin_ctz(n); #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) uint32_t i; @@ -493,27 +695,27 @@ ctz32(uint32_t n) #else uint32_t i = 0; - if ((n & UINT32_C(0x0000FFFF)) == 0) { + if ((n & 0x0000FFFF) == 0) { n >>= 16; i = 16; } - if ((n & UINT32_C(0x000000FF)) == 0) { + if ((n & 0x000000FF) == 0) { n >>= 8; i += 8; } - if ((n & UINT32_C(0x0000000F)) == 0) { + if ((n & 0x0000000F) == 0) { n >>= 4; i += 4; } - if ((n & UINT32_C(0x00000003)) == 0) { + if ((n & 0x00000003) == 0) { n >>= 2; i += 2; } - if ((n & UINT32_C(0x00000001)) == 0) + if ((n & 0x00000001) == 0) ++i; return i; diff --git a/src/dependencies/cmliblzma/config.h.in b/src/dependencies/cmliblzma/config.h.in index 06f7fcb..50c3840 100644 --- a/src/dependencies/cmliblzma/config.h.in +++ b/src/dependencies/cmliblzma/config.h.in @@ -7,13 +7,11 @@ #cmakedefine HAVE_INT16_T #cmakedefine HAVE_INT32_T #cmakedefine HAVE_INT64_T -#cmakedefine HAVE_INTMAX_T #cmakedefine HAVE_UINT8_T #cmakedefine HAVE_UINT16_T #cmakedefine HAVE_UINT32_T #cmakedefine HAVE_UINT64_T -#cmakedefine HAVE_UINTMAX_T /* We might have the types we want under other spellings. */ #cmakedefine HAVE___INT64 @@ -166,18 +164,6 @@ typedef unsigned char uint8_t; #error No 8-bit unsigned integer type was found. #endif -/* Define intmax_t and uintmax_t if they are not already defined. */ -#if !defined(HAVE_INTMAX_T) -typedef int64_t intmax_t; -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#endif - -#if !defined(HAVE_UINTMAX_T) -typedef uint64_t uintmax_t; -#endif - - #cmakedefine uintptr_t @uintptr_t@ #cmakedefine WORDS_BIGENDIAN 1 diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma.h b/src/dependencies/cmliblzma/liblzma/api/lzma.h index aa88e42..122dab8 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma.h @@ -224,7 +224,8 @@ # else # define lzma_nothrow throw() # endif -# elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) +# elif defined(__GNUC__) && (__GNUC__ > 3 \ + || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) # define lzma_nothrow __attribute__((__nothrow__)) # else # define lzma_nothrow @@ -241,7 +242,7 @@ * break anything if these are sometimes enabled and sometimes not, only * affects warnings and optimizations. */ -#if __GNUC__ >= 3 +#if defined(__GNUC__) && __GNUC__ >= 3 # ifndef lzma_attribute # define lzma_attribute(attr) __attribute__(attr) # endif diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/block.h b/src/dependencies/cmliblzma/liblzma/api/lzma/block.h index 7bdcfd7..962f387 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/block.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/block.h @@ -448,7 +448,7 @@ extern LZMA_API(lzma_vli) lzma_block_total_size(const lzma_block *block) * - LZMA_MEM_ERROR * - LZMA_OPTIONS_ERROR * - LZMA_UNSUPPORTED_CHECK: block->check specifies a Check ID - * that is not supported by this buid of liblzma. Initializing + * that is not supported by this build of liblzma. Initializing * the encoder failed. * - LZMA_PROG_ERROR */ diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/filter.h b/src/dependencies/cmliblzma/liblzma/api/lzma/filter.h index 4e78752..8c85931 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/filter.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/filter.h @@ -341,9 +341,10 @@ extern LZMA_API(lzma_ret) lzma_properties_encode( * \param filter filter->id must have been set to the correct * Filter ID. filter->options doesn't need to be * initialized (it's not freed by this function). The - * decoded options will be stored to filter->options. - * filter->options is set to NULL if there are no - * properties or if an error occurs. + * decoded options will be stored in filter->options; + * it's application's responsibility to free it when + * appropriate. filter->options is set to NULL if + * there are no properties or if an error occurs. * \param allocator Custom memory allocator used to allocate the * options. Set to NULL to use the default malloc(), * and in case of an error, also free(). diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/hardware.h b/src/dependencies/cmliblzma/liblzma/api/lzma/hardware.h index 5321d9a..47481f2 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/hardware.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/hardware.h @@ -6,7 +6,7 @@ * ways to limit the resource usage. Applications linking against liblzma * need to do the actual decisions how much resources to let liblzma to use. * To ease making these decisions, liblzma provides functions to find out - * the relevant capabilities of the underlaying hardware. Currently there + * the relevant capabilities of the underlying hardware. Currently there * is only a function to find out the amount of RAM, but in the future there * will be also a function to detect how many concurrent threads the system * can run. diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/lzma12.h b/src/dependencies/cmliblzma/liblzma/api/lzma/lzma12.h index 4e32fa3..df5f23b 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/lzma12.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/lzma12.h @@ -301,7 +301,7 @@ typedef struct { * (2^ pb =2^2=4), which is often a good choice when there's * no better guess. * - * When the aligment is known, setting pb accordingly may reduce + * When the alignment is known, setting pb accordingly may reduce * the file size a little. E.g. with text files having one-byte * alignment (US-ASCII, ISO-8859-*, UTF-8), setting pb=0 can * improve compression slightly. For UTF-16 text, pb=1 is a good diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/version.h b/src/dependencies/cmliblzma/liblzma/api/lzma/version.h index 143c7de..2bf3eae 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/version.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/version.h @@ -22,7 +22,7 @@ */ #define LZMA_VERSION_MAJOR 5 #define LZMA_VERSION_MINOR 2 -#define LZMA_VERSION_PATCH 4 +#define LZMA_VERSION_PATCH 5 #define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE #ifndef LZMA_VERSION_COMMIT diff --git a/src/dependencies/cmliblzma/liblzma/api/lzma/vli.h b/src/dependencies/cmliblzma/liblzma/api/lzma/vli.h index 9ad13f2..1b7a952 100644 --- a/src/dependencies/cmliblzma/liblzma/api/lzma/vli.h +++ b/src/dependencies/cmliblzma/liblzma/api/lzma/vli.h @@ -54,7 +54,7 @@ * * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the - * underlaying integer type. + * underlying integer type. * * lzma_vli will be uint64_t for the foreseeable future. If a bigger size * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will diff --git a/src/dependencies/cmliblzma/liblzma/check/crc32_fast.c b/src/dependencies/cmliblzma/liblzma/check/crc32_fast.c index 3de0263..eed7350 100644 --- a/src/dependencies/cmliblzma/liblzma/check/crc32_fast.c +++ b/src/dependencies/cmliblzma/liblzma/check/crc32_fast.c @@ -49,7 +49,7 @@ lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) // Calculate the CRC32 using the slice-by-eight algorithm. while (buf < limit) { - crc ^= *(const uint32_t *)(buf); + crc ^= aligned_read32ne(buf); buf += 4; crc = lzma_crc32_table[7][A(crc)] @@ -57,7 +57,7 @@ lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) ^ lzma_crc32_table[5][C(crc)] ^ lzma_crc32_table[4][D(crc)]; - const uint32_t tmp = *(const uint32_t *)(buf); + const uint32_t tmp = aligned_read32ne(buf); buf += 4; // At least with some compilers, it is critical for diff --git a/src/dependencies/cmliblzma/liblzma/check/crc32_table.c b/src/dependencies/cmliblzma/liblzma/check/crc32_table.c index 368874e..b11762a 100644 --- a/src/dependencies/cmliblzma/liblzma/check/crc32_table.c +++ b/src/dependencies/cmliblzma/liblzma/check/crc32_table.c @@ -12,6 +12,9 @@ #include "common.h" +// Having the declaration here silences clang -Wmissing-variable-declarations. +extern const uint32_t lzma_crc32_table[8][256]; + #ifdef WORDS_BIGENDIAN # include "crc32_table_be.h" #else diff --git a/src/dependencies/cmliblzma/liblzma/check/crc64_fast.c b/src/dependencies/cmliblzma/liblzma/check/crc64_fast.c index 52af29e..8af54cd 100644 --- a/src/dependencies/cmliblzma/liblzma/check/crc64_fast.c +++ b/src/dependencies/cmliblzma/liblzma/check/crc64_fast.c @@ -47,9 +47,9 @@ lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc) while (buf < limit) { #ifdef WORDS_BIGENDIAN const uint32_t tmp = (crc >> 32) - ^ *(const uint32_t *)(buf); + ^ aligned_read32ne(buf); #else - const uint32_t tmp = crc ^ *(const uint32_t *)(buf); + const uint32_t tmp = crc ^ aligned_read32ne(buf); #endif buf += 4; diff --git a/src/dependencies/cmliblzma/liblzma/check/crc64_table.c b/src/dependencies/cmliblzma/liblzma/check/crc64_table.c index 1fbcd94..7560eb0 100644 --- a/src/dependencies/cmliblzma/liblzma/check/crc64_table.c +++ b/src/dependencies/cmliblzma/liblzma/check/crc64_table.c @@ -12,6 +12,9 @@ #include "common.h" +// Having the declaration here silences clang -Wmissing-variable-declarations. +extern const uint64_t lzma_crc64_table[4][256]; + #ifdef WORDS_BIGENDIAN # include "crc64_table_be.h" #else diff --git a/src/dependencies/cmliblzma/liblzma/common/alone_decoder.c b/src/dependencies/cmliblzma/liblzma/common/alone_decoder.c index 77d0a9b..239b230 100644 --- a/src/dependencies/cmliblzma/liblzma/common/alone_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/alone_decoder.c @@ -50,8 +50,7 @@ typedef struct { static lzma_ret -alone_decode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), +alone_decode(void *coder_ptr, const lzma_allocator *allocator, const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, diff --git a/src/dependencies/cmliblzma/liblzma/common/alone_encoder.c b/src/dependencies/cmliblzma/liblzma/common/alone_encoder.c index 4853cfd..96c1db7 100644 --- a/src/dependencies/cmliblzma/liblzma/common/alone_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/alone_encoder.c @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////////////////// // -/// \file alone_decoder.c -/// \brief Decoder for LZMA_Alone files +/// \file alone_encoder.c +/// \brief Encoder for LZMA_Alone files // // Author: Lasse Collin // @@ -31,8 +31,7 @@ typedef struct { static lzma_ret -alone_encode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), +alone_encode(void *coder_ptr, const lzma_allocator *allocator, const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, @@ -122,7 +121,7 @@ alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, if (d != UINT32_MAX) ++d; - unaligned_write32le(coder->header + 1, d); + write32le(coder->header + 1, d); // - Uncompressed size (always unknown and using EOPM) memset(coder->header + 1 + 4, 0xFF, 8); diff --git a/src/dependencies/cmliblzma/liblzma/common/block_header_decoder.c b/src/dependencies/cmliblzma/liblzma/common/block_header_decoder.c index 1dd982f..2e1135d 100644 --- a/src/dependencies/cmliblzma/liblzma/common/block_header_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/block_header_decoder.c @@ -67,7 +67,7 @@ lzma_block_header_decode(lzma_block *block, const size_t in_size = block->header_size - 4; // Verify CRC32 - if (lzma_crc32(in, in_size, 0) != unaligned_read32le(in + in_size)) + if (lzma_crc32(in, in_size, 0) != read32le(in + in_size)) return LZMA_DATA_ERROR; // Check for unsupported flags. @@ -98,7 +98,7 @@ lzma_block_header_decode(lzma_block *block, block->uncompressed_size = LZMA_VLI_UNKNOWN; // Filter Flags - const size_t filter_count = (in[1] & 3) + 1; + const size_t filter_count = (in[1] & 3U) + 1; for (size_t i = 0; i < filter_count; ++i) { const lzma_ret ret = lzma_filter_flags_decode( &block->filters[i], allocator, diff --git a/src/dependencies/cmliblzma/liblzma/common/block_header_encoder.c b/src/dependencies/cmliblzma/liblzma/common/block_header_encoder.c index 5c5f542..160425d 100644 --- a/src/dependencies/cmliblzma/liblzma/common/block_header_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/block_header_encoder.c @@ -126,7 +126,7 @@ lzma_block_header_encode(const lzma_block *block, uint8_t *out) memzero(out + out_pos, out_size - out_pos); // CRC32 - unaligned_write32le(out + out_size, lzma_crc32(out, out_size, 0)); + write32le(out + out_size, lzma_crc32(out, out_size, 0)); return LZMA_OK; } diff --git a/src/dependencies/cmliblzma/liblzma/common/block_util.c b/src/dependencies/cmliblzma/liblzma/common/block_util.c index 00c7fe8..acb3111 100644 --- a/src/dependencies/cmliblzma/liblzma/common/block_util.c +++ b/src/dependencies/cmliblzma/liblzma/common/block_util.c @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // -/// \file block_header.c +/// \file block_util.c /// \brief Utility functions to handle lzma_block // // Author: Lasse Collin diff --git a/src/dependencies/cmliblzma/liblzma/common/common.c b/src/dependencies/cmliblzma/liblzma/common/common.c index 57e3f8e..cf714e5 100644 --- a/src/dependencies/cmliblzma/liblzma/common/common.c +++ b/src/dependencies/cmliblzma/liblzma/common/common.c @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // -/// \file common.h +/// \file common.c /// \brief Common functions needed in many places in liblzma // // Author: Lasse Collin @@ -99,7 +99,11 @@ lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, const size_t out_avail = out_size - *out_pos; const size_t copy_size = my_min(in_avail, out_avail); - memcpy(out + *out_pos, in + *in_pos, copy_size); + // Call memcpy() only if there is something to copy. If there is + // nothing to copy, in or out might be NULL and then the memcpy() + // call would trigger undefined behavior. + if (copy_size > 0) + memcpy(out + *out_pos, in + *in_pos, copy_size); *in_pos += copy_size; *out_pos += copy_size; diff --git a/src/dependencies/cmliblzma/liblzma/common/common.h b/src/dependencies/cmliblzma/liblzma/common/common.h index dde3ae0..b3d3b7a 100644 --- a/src/dependencies/cmliblzma/liblzma/common/common.h +++ b/src/dependencies/cmliblzma/liblzma/common/common.h @@ -14,6 +14,7 @@ #define LZMA_COMMON_H #include "sysdefs.h" +#include "mythread.h" #include "tuklib_integer.h" #if defined(_WIN32) || defined(__CYGWIN__) diff --git a/src/dependencies/cmliblzma/liblzma/common/filter_common.h b/src/dependencies/cmliblzma/liblzma/common/filter_common.h index 42a26a2..9390305 100644 --- a/src/dependencies/cmliblzma/liblzma/common/filter_common.h +++ b/src/dependencies/cmliblzma/liblzma/common/filter_common.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // -/// \file filter_common.c +/// \file filter_common.h /// \brief Filter-specific stuff common for both encoder and decoder // // Author: Lasse Collin diff --git a/src/dependencies/cmliblzma/liblzma/common/filter_decoder.h b/src/dependencies/cmliblzma/liblzma/common/filter_decoder.h index a2e255f..2dac602 100644 --- a/src/dependencies/cmliblzma/liblzma/common/filter_decoder.h +++ b/src/dependencies/cmliblzma/liblzma/common/filter_decoder.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // -/// \file filter_decoder.c +/// \file filter_decoder.h /// \brief Filter ID mapping to filter-specific functions // // Author: Lasse Collin diff --git a/src/dependencies/cmliblzma/liblzma/common/filter_flags_encoder.c b/src/dependencies/cmliblzma/liblzma/common/filter_flags_encoder.c index d110566..b57b9fd 100644 --- a/src/dependencies/cmliblzma/liblzma/common/filter_flags_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/filter_flags_encoder.c @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////////////////// // /// \file filter_flags_encoder.c -/// \brief Decodes a Filter Flags field +/// \brief Encodes a Filter Flags field // // Author: Lasse Collin // diff --git a/src/dependencies/cmliblzma/liblzma/common/hardware_physmem.c b/src/dependencies/cmliblzma/liblzma/common/hardware_physmem.c index 7405b65..a2bbbe2 100644 --- a/src/dependencies/cmliblzma/liblzma/common/hardware_physmem.c +++ b/src/dependencies/cmliblzma/liblzma/common/hardware_physmem.c @@ -19,7 +19,7 @@ extern LZMA_API(uint64_t) lzma_physmem(void) { // It is simpler to make lzma_physmem() a wrapper for - // tuklib_physmem() than to hack appropriate symbol visiblity + // tuklib_physmem() than to hack appropriate symbol visibility // support for the tuklib modules. return tuklib_physmem(); } diff --git a/src/dependencies/cmliblzma/liblzma/common/index.c b/src/dependencies/cmliblzma/liblzma/common/index.c index 26e4e51..a41e8f3 100644 --- a/src/dependencies/cmliblzma/liblzma/common/index.c +++ b/src/dependencies/cmliblzma/liblzma/common/index.c @@ -105,7 +105,7 @@ typedef struct { typedef struct { - /// Every index_stream is a node in the tree of Sreams. + /// Every index_stream is a node in the tree of Streams. index_tree_node node; /// Number of this Stream (first one is 1) @@ -166,7 +166,7 @@ struct lzma_index_s { lzma_vli index_list_size; /// How many Records to allocate at once in lzma_index_append(). - /// This defaults to INDEX_GROUP_SIZE but can be overriden with + /// This defaults to INDEX_GROUP_SIZE but can be overridden with /// lzma_index_prealloc(). size_t prealloc; @@ -825,8 +825,8 @@ lzma_index_cat(lzma_index *restrict dest, lzma_index *restrict src, s->groups.root = &newg->node; } - if (s->groups.rightmost == &g->node) - s->groups.rightmost = &newg->node; + assert(s->groups.rightmost == &g->node); + s->groups.rightmost = &newg->node; lzma_free(g, allocator); diff --git a/src/dependencies/cmliblzma/liblzma/common/memcmplen.h b/src/dependencies/cmliblzma/liblzma/common/memcmplen.h index c1efc9e..dcfd8d6 100644 --- a/src/dependencies/cmliblzma/liblzma/common/memcmplen.h +++ b/src/dependencies/cmliblzma/liblzma/common/memcmplen.h @@ -61,8 +61,7 @@ lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, // to __builtin_clzll(). #define LZMA_MEMCMPLEN_EXTRA 8 while (len < limit) { - const uint64_t x = *(const uint64_t *)(buf1 + len) - - *(const uint64_t *)(buf2 + len); + const uint64_t x = read64ne(buf1 + len) - read64ne(buf2 + len); if (x != 0) { # if defined(_M_X64) // MSVC or Intel C compiler on Windows unsigned long tmp; @@ -99,15 +98,7 @@ lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, _mm_loadu_si128((const __m128i *)(buf2 + len)))); if (x != 0) { -# if defined(__INTEL_COMPILER) - len += _bit_scan_forward(x); -# elif defined(_MSC_VER) - unsigned long tmp; - _BitScanForward(&tmp, x); - len += tmp; -# else - len += __builtin_ctz(x); -# endif + len += ctz32(x); return my_min(len, limit); } @@ -120,8 +111,7 @@ lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, // Generic 32-bit little endian method # define LZMA_MEMCMPLEN_EXTRA 4 while (len < limit) { - uint32_t x = *(const uint32_t *)(buf1 + len) - - *(const uint32_t *)(buf2 + len); + uint32_t x = read32ne(buf1 + len) - read32ne(buf2 + len); if (x != 0) { if ((x & 0xFFFF) == 0) { len += 2; @@ -143,8 +133,7 @@ lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, // Generic 32-bit big endian method # define LZMA_MEMCMPLEN_EXTRA 4 while (len < limit) { - uint32_t x = *(const uint32_t *)(buf1 + len) - ^ *(const uint32_t *)(buf2 + len); + uint32_t x = read32ne(buf1 + len) ^ read32ne(buf2 + len); if (x != 0) { if ((x & 0xFFFF0000) == 0) { len += 2; diff --git a/src/dependencies/cmliblzma/liblzma/common/stream_encoder_mt.c b/src/dependencies/cmliblzma/liblzma/common/stream_encoder_mt.c index 2efe44c..01e4033 100644 --- a/src/dependencies/cmliblzma/liblzma/common/stream_encoder_mt.c +++ b/src/dependencies/cmliblzma/liblzma/common/stream_encoder_mt.c @@ -700,7 +700,7 @@ stream_encode_mt(void *coder_ptr, const lzma_allocator *allocator, ret = coder->thread_error; if (ret != LZMA_OK) { assert(ret != LZMA_STREAM_END); - break; + break; // Break out of mythread_sync. } // Try to read compressed data to out[]. @@ -958,7 +958,7 @@ stream_encoder_mt_init(lzma_next_coder *next, const lzma_allocator *allocator, // Validate the filter chain so that we can give an error in this // function instead of delaying it to the first call to lzma_code(). // The memory usage calculation verifies the filter chain as - // a side effect so we take advatange of that. + // a side effect so we take advantage of that. if (lzma_raw_encoder_memusage(filters) == UINT64_MAX) return LZMA_OPTIONS_ERROR; diff --git a/src/dependencies/cmliblzma/liblzma/common/stream_flags_decoder.c b/src/dependencies/cmliblzma/liblzma/common/stream_flags_decoder.c index 1bc2f97..4e43e35 100644 --- a/src/dependencies/cmliblzma/liblzma/common/stream_flags_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/stream_flags_decoder.c @@ -38,7 +38,7 @@ lzma_stream_header_decode(lzma_stream_flags *options, const uint8_t *in) // and unsupported files. const uint32_t crc = lzma_crc32(in + sizeof(lzma_header_magic), LZMA_STREAM_FLAGS_SIZE, 0); - if (crc != unaligned_read32le(in + sizeof(lzma_header_magic) + if (crc != read32le(in + sizeof(lzma_header_magic) + LZMA_STREAM_FLAGS_SIZE)) return LZMA_DATA_ERROR; @@ -67,7 +67,7 @@ lzma_stream_footer_decode(lzma_stream_flags *options, const uint8_t *in) // CRC32 const uint32_t crc = lzma_crc32(in + sizeof(uint32_t), sizeof(uint32_t) + LZMA_STREAM_FLAGS_SIZE, 0); - if (crc != unaligned_read32le(in)) + if (crc != read32le(in)) return LZMA_DATA_ERROR; // Stream Flags @@ -75,7 +75,7 @@ lzma_stream_footer_decode(lzma_stream_flags *options, const uint8_t *in) return LZMA_OPTIONS_ERROR; // Backward Size - options->backward_size = unaligned_read32le(in + sizeof(uint32_t)); + options->backward_size = read32le(in + sizeof(uint32_t)); options->backward_size = (options->backward_size + 1) * 4; return LZMA_OK; diff --git a/src/dependencies/cmliblzma/liblzma/common/stream_flags_encoder.c b/src/dependencies/cmliblzma/liblzma/common/stream_flags_encoder.c index 4e71715..b98ab17 100644 --- a/src/dependencies/cmliblzma/liblzma/common/stream_flags_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/stream_flags_encoder.c @@ -46,8 +46,8 @@ lzma_stream_header_encode(const lzma_stream_flags *options, uint8_t *out) const uint32_t crc = lzma_crc32(out + sizeof(lzma_header_magic), LZMA_STREAM_FLAGS_SIZE, 0); - unaligned_write32le(out + sizeof(lzma_header_magic) - + LZMA_STREAM_FLAGS_SIZE, crc); + write32le(out + sizeof(lzma_header_magic) + LZMA_STREAM_FLAGS_SIZE, + crc); return LZMA_OK; } @@ -66,7 +66,7 @@ lzma_stream_footer_encode(const lzma_stream_flags *options, uint8_t *out) if (!is_backward_size_valid(options)) return LZMA_PROG_ERROR; - unaligned_write32le(out + 4, options->backward_size / 4 - 1); + write32le(out + 4, options->backward_size / 4 - 1); // Stream Flags if (stream_flags_encode(options, out + 2 * 4)) @@ -76,7 +76,7 @@ lzma_stream_footer_encode(const lzma_stream_flags *options, uint8_t *out) const uint32_t crc = lzma_crc32( out + 4, 4 + LZMA_STREAM_FLAGS_SIZE, 0); - unaligned_write32le(out, crc); + write32le(out, crc); // Magic memcpy(out + 2 * 4 + LZMA_STREAM_FLAGS_SIZE, diff --git a/src/dependencies/cmliblzma/liblzma/common/vli_decoder.c b/src/dependencies/cmliblzma/liblzma/common/vli_decoder.c index c181828..af2799d 100644 --- a/src/dependencies/cmliblzma/liblzma/common/vli_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/common/vli_decoder.c @@ -72,7 +72,7 @@ lzma_vli_decode(lzma_vli *restrict vli, size_t *vli_pos, // corrupt. // // If we need bigger integers in future, old versions liblzma - // will confusingly indicate the file being corrupt istead of + // will confusingly indicate the file being corrupt instead of // unsupported. I suppose it's still better this way, because // in the foreseeable future (writing this in 2008) the only // reason why files would appear having over 63-bit integers diff --git a/src/dependencies/cmliblzma/liblzma/delta/delta_decoder.c b/src/dependencies/cmliblzma/liblzma/delta/delta_decoder.c index 6859afa..13d8a28 100644 --- a/src/dependencies/cmliblzma/liblzma/delta/delta_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/delta/delta_decoder.c @@ -70,7 +70,7 @@ lzma_delta_props_decode(void **options, const lzma_allocator *allocator, return LZMA_MEM_ERROR; opt->type = LZMA_DELTA_TYPE_BYTE; - opt->dist = props[0] + 1; + opt->dist = props[0] + 1U; *options = opt; diff --git a/src/dependencies/cmliblzma/liblzma/lz/lz_decoder.c b/src/dependencies/cmliblzma/liblzma/lz/lz_decoder.c index c708644..09b5743 100644 --- a/src/dependencies/cmliblzma/liblzma/lz/lz_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/lz/lz_decoder.c @@ -91,11 +91,17 @@ decode_buffer(lzma_coder *coder, in, in_pos, in_size); // Copy the decoded data from the dictionary to the out[] - // buffer. + // buffer. Do it conditionally because out can be NULL + // (in which case copy_size is always 0). Calling memcpy() + // with a null-pointer is undefined even if the third + // argument is 0. const size_t copy_size = coder->dict.pos - dict_start; assert(copy_size <= out_size - *out_pos); - memcpy(out + *out_pos, coder->dict.buf + dict_start, - copy_size); + + if (copy_size > 0) + memcpy(out + *out_pos, coder->dict.buf + dict_start, + copy_size); + *out_pos += copy_size; // Reset the dictionary if so requested by coder->lz.code(). @@ -125,8 +131,7 @@ decode_buffer(lzma_coder *coder, static lzma_ret -lz_decode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), +lz_decode(void *coder_ptr, const lzma_allocator *allocator, const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, @@ -241,7 +246,7 @@ lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, if (lz_options.dict_size < 4096) lz_options.dict_size = 4096; - // Make dictionary size a multipe of 16. Some LZ-based decoders like + // Make dictionary size a multiple of 16. Some LZ-based decoders like // LZMA use the lowest bits lzma_dict.pos to know the alignment of the // data. Aligned buffer is also good when memcpying from the // dictionary to the output buffer, since applications are diff --git a/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_hash.h b/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_hash.h index 342a333..fb15c58 100644 --- a/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_hash.h +++ b/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_hash.h @@ -39,7 +39,7 @@ // Endianness doesn't matter in hash_2_calc() (no effect on the output). #ifdef TUKLIB_FAST_UNALIGNED_ACCESS # define hash_2_calc() \ - const uint32_t hash_value = *(const uint16_t *)(cur) + const uint32_t hash_value = read16ne(cur) #else # define hash_2_calc() \ const uint32_t hash_value \ diff --git a/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_mf.c b/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_mf.c index 7852077..d03657a 100644 --- a/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_mf.c +++ b/src/dependencies/cmliblzma/liblzma/lz/lz_encoder_mf.c @@ -113,7 +113,7 @@ normalize(lzma_mf *mf) // may be match finders that use larger resolution than one byte. const uint32_t subvalue = (MUST_NORMALIZE_POS - mf->cyclic_size); - // & (~(UINT32_C(1) << 10) - 1); + // & ~((UINT32_C(1) << 10) - 1); for (uint32_t i = 0; i < mf->hash_count; ++i) { // If the distance is greater than the dictionary size, diff --git a/src/dependencies/cmliblzma/liblzma/lzma/fastpos.h b/src/dependencies/cmliblzma/liblzma/lzma/fastpos.h index a3feea5..cba442c 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/fastpos.h +++ b/src/dependencies/cmliblzma/liblzma/lzma/fastpos.h @@ -101,7 +101,7 @@ extern const uint8_t lzma_fastpos[1 << FASTPOS_BITS]; (UINT32_C(1) << (FASTPOS_BITS + fastpos_shift(extra, n))) #define fastpos_result(dist, extra, n) \ - lzma_fastpos[(dist) >> fastpos_shift(extra, n)] \ + (uint32_t)(lzma_fastpos[(dist) >> fastpos_shift(extra, n)]) \ + 2 * fastpos_shift(extra, n) diff --git a/src/dependencies/cmliblzma/liblzma/lzma/fastpos_tablegen.c b/src/dependencies/cmliblzma/liblzma/lzma/fastpos_tablegen.c index c97e6f4..d4484c8 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/fastpos_tablegen.c +++ b/src/dependencies/cmliblzma/liblzma/lzma/fastpos_tablegen.c @@ -11,7 +11,6 @@ // /////////////////////////////////////////////////////////////////////////////// -#include #include #include #include "fastpos.h" diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma2_decoder.c b/src/dependencies/cmliblzma/liblzma/lzma/lzma2_decoder.c index 878c870..cf1b511 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma2_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma2_decoder.c @@ -136,7 +136,7 @@ lzma2_decode(void *coder_ptr, lzma_dict *restrict dict, break; case SEQ_UNCOMPRESSED_2: - coder->uncompressed_size += in[(*in_pos)++] + 1; + coder->uncompressed_size += in[(*in_pos)++] + 1U; coder->sequence = SEQ_COMPRESSED_0; coder->lzma.set_uncompressed(coder->lzma.coder, coder->uncompressed_size); @@ -148,7 +148,7 @@ lzma2_decode(void *coder_ptr, lzma_dict *restrict dict, break; case SEQ_COMPRESSED_1: - coder->compressed_size += in[(*in_pos)++] + 1; + coder->compressed_size += in[(*in_pos)++] + 1U; coder->sequence = coder->next_sequence; break; @@ -297,8 +297,8 @@ lzma_lzma2_props_decode(void **options, const lzma_allocator *allocator, if (props[0] == 40) { opt->dict_size = UINT32_MAX; } else { - opt->dict_size = 2 | (props[0] & 1); - opt->dict_size <<= props[0] / 2 + 11; + opt->dict_size = 2 | (props[0] & 1U); + opt->dict_size <<= props[0] / 2U + 11; } opt->preset_dict = NULL; diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma_common.h b/src/dependencies/cmliblzma/liblzma/lzma/lzma_common.h index 09efd38..9d040d9 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma_common.h +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma_common.h @@ -122,7 +122,8 @@ typedef enum { /// byte; and /// - the highest literal_context_bits bits of the previous byte. #define literal_subcoder(probs, lc, lp_mask, pos, prev_byte) \ - ((probs)[(((pos) & lp_mask) << lc) + ((prev_byte) >> (8 - lc))]) + ((probs)[(((pos) & (lp_mask)) << (lc)) \ + + ((uint32_t)(prev_byte) >> (8U - (lc)))]) static inline void diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma_decoder.c b/src/dependencies/cmliblzma/liblzma/lzma/lzma_decoder.c index d0f29b7..e605a0a 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma_decoder.c @@ -398,7 +398,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, // ("match byte") to "len" to minimize the // number of variables we need to store // between decoder calls. - len = dict_get(&dict, rep0) << 1; + len = (uint32_t)(dict_get(&dict, rep0)) << 1; // The usage of "offset" allows omitting some // branches, which should give tiny speed @@ -569,7 +569,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, #ifdef HAVE_SMALL do { rc_bit(probs[symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_DIST_MODEL); } while (++offset < limit); #else @@ -577,25 +577,25 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, case 5: assert(offset == 0); rc_bit(probs[symbol], , - rep0 += 1, + rep0 += 1U, SEQ_DIST_MODEL); ++offset; --limit; case 4: rc_bit(probs[symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_DIST_MODEL); ++offset; --limit; case 3: rc_bit(probs[symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_DIST_MODEL); ++offset; --limit; case 2: rc_bit(probs[symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_DIST_MODEL); ++offset; --limit; @@ -607,7 +607,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, // the unneeded updating of // "symbol". rc_bit_last(probs[symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_DIST_MODEL); } #endif @@ -635,7 +635,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, do { rc_bit(coder->pos_align[ symbol], , - rep0 += 1 << offset, + rep0 += 1U << offset, SEQ_ALIGN); } while (++offset < ALIGN_BITS); #else @@ -1049,7 +1049,7 @@ lzma_lzma_props_decode(void **options, const lzma_allocator *allocator, // All dictionary sizes are accepted, including zero. LZ decoder // will automatically use a dictionary at least a few KiB even if // a smaller dictionary is requested. - opt->dict_size = unaligned_read32le(props + 1); + opt->dict_size = read32le(props + 1); opt->preset_dict = NULL; opt->preset_dict_size = 0; diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder.c b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder.c index ba9ce69..07d2b87 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder.c @@ -663,7 +663,7 @@ lzma_lzma_props_encode(const void *options, uint8_t *out) if (lzma_lzma_lclppb_encode(opt, out)) return LZMA_PROG_ERROR; - unaligned_write32le(out + 1, opt->dict_size); + write32le(out + 1, opt->dict_size); return LZMA_OK; } diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_optimum_normal.c b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_optimum_normal.c index 59f7734..101c8d4 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_optimum_normal.c +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_optimum_normal.c @@ -636,9 +636,10 @@ helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf, uint32_t len_test_2 = len_test + 1; const uint32_t limit = my_min(buf_avail_full, len_test_2 + nice_len); - for (; len_test_2 < limit - && buf[len_test_2] == buf_back[len_test_2]; - ++len_test_2) ; + // NOTE: len_test_2 may be greater than limit so the call to + // lzma_memcmplen() must be done conditionally. + if (len_test_2 < limit) + len_test_2 = lzma_memcmplen(buf, buf_back, len_test_2, limit); len_test_2 -= len_test + 1; @@ -732,9 +733,12 @@ helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf, const uint32_t limit = my_min(buf_avail_full, len_test_2 + nice_len); - for (; len_test_2 < limit && - buf[len_test_2] == buf_back[len_test_2]; - ++len_test_2) ; + // NOTE: len_test_2 may be greater than limit + // so the call to lzma_memcmplen() must be + // done conditionally. + if (len_test_2 < limit) + len_test_2 = lzma_memcmplen(buf, buf_back, + len_test_2, limit); len_test_2 -= len_test + 1; diff --git a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_private.h b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_private.h index a2da969..2e34aac 100644 --- a/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_private.h +++ b/src/dependencies/cmliblzma/liblzma/lzma/lzma_encoder_private.h @@ -25,8 +25,7 @@ // MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no // reason to not use it when it is supported. #ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define not_equal_16(a, b) \ - (*(const uint16_t *)(a) != *(const uint16_t *)(b)) +# define not_equal_16(a, b) (read16ne(a) != read16ne(b)) #else # define not_equal_16(a, b) \ ((a)[0] != (b)[0] || (a)[1] != (b)[1]) diff --git a/src/dependencies/cmliblzma/liblzma/simple/arm.c b/src/dependencies/cmliblzma/liblzma/simple/arm.c index 181d0e3..ff5073a 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/arm.c +++ b/src/dependencies/cmliblzma/liblzma/simple/arm.c @@ -22,9 +22,9 @@ arm_code(void *simple lzma_attribute((__unused__)), size_t i; for (i = 0; i + 4 <= size; i += 4) { if (buffer[i + 3] == 0xEB) { - uint32_t src = (buffer[i + 2] << 16) - | (buffer[i + 1] << 8) - | (buffer[i + 0]); + uint32_t src = ((uint32_t)(buffer[i + 2]) << 16) + | ((uint32_t)(buffer[i + 1]) << 8) + | (uint32_t)(buffer[i + 0]); src <<= 2; uint32_t dest; diff --git a/src/dependencies/cmliblzma/liblzma/simple/armthumb.c b/src/dependencies/cmliblzma/liblzma/simple/armthumb.c index eab4862..a8da334 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/armthumb.c +++ b/src/dependencies/cmliblzma/liblzma/simple/armthumb.c @@ -23,10 +23,10 @@ armthumb_code(void *simple lzma_attribute((__unused__)), for (i = 0; i + 4 <= size; i += 2) { if ((buffer[i + 1] & 0xF8) == 0xF0 && (buffer[i + 3] & 0xF8) == 0xF8) { - uint32_t src = ((buffer[i + 1] & 0x7) << 19) - | (buffer[i + 0] << 11) - | ((buffer[i + 3] & 0x7) << 8) - | (buffer[i + 2]); + uint32_t src = (((uint32_t)(buffer[i + 1]) & 7) << 19) + | ((uint32_t)(buffer[i + 0]) << 11) + | (((uint32_t)(buffer[i + 3]) & 7) << 8) + | (uint32_t)(buffer[i + 2]); src <<= 1; diff --git a/src/dependencies/cmliblzma/liblzma/simple/ia64.c b/src/dependencies/cmliblzma/liblzma/simple/ia64.c index 580529e..6492d0a 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/ia64.c +++ b/src/dependencies/cmliblzma/liblzma/simple/ia64.c @@ -70,7 +70,7 @@ ia64_code(void *simple lzma_attribute((__unused__)), inst_norm |= (uint64_t)(dest & 0x100000) << (36 - 20); - instruction &= (1 << bit_res) - 1; + instruction &= (1U << bit_res) - 1; instruction |= (inst_norm << bit_res); for (size_t j = 0; j < 6; j++) diff --git a/src/dependencies/cmliblzma/liblzma/simple/powerpc.c b/src/dependencies/cmliblzma/liblzma/simple/powerpc.c index 54dfbf1..0b60e9b 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/powerpc.c +++ b/src/dependencies/cmliblzma/liblzma/simple/powerpc.c @@ -25,10 +25,11 @@ powerpc_code(void *simple lzma_attribute((__unused__)), if ((buffer[i] >> 2) == 0x12 && ((buffer[i + 3] & 3) == 1)) { - const uint32_t src = ((buffer[i + 0] & 3) << 24) - | (buffer[i + 1] << 16) - | (buffer[i + 2] << 8) - | (buffer[i + 3] & (~3)); + const uint32_t src + = (((uint32_t)(buffer[i + 0]) & 3) << 24) + | ((uint32_t)(buffer[i + 1]) << 16) + | ((uint32_t)(buffer[i + 2]) << 8) + | ((uint32_t)(buffer[i + 3]) & ~UINT32_C(3)); uint32_t dest; if (is_encoder) diff --git a/src/dependencies/cmliblzma/liblzma/simple/simple_coder.c b/src/dependencies/cmliblzma/liblzma/simple/simple_coder.c index 13ebabc..4f499be 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/simple_coder.c +++ b/src/dependencies/cmliblzma/liblzma/simple/simple_coder.c @@ -118,7 +118,15 @@ simple_code(void *coder_ptr, const lzma_allocator *allocator, // coder->pos and coder->size yet. This way the coder can be // restarted if the next filter in the chain returns e.g. // LZMA_MEM_ERROR. - memcpy(out + *out_pos, coder->buffer + coder->pos, buf_avail); + // + // Do the memcpy() conditionally because out can be NULL + // (in which case buf_avail is always 0). Calling memcpy() + // with a null-pointer is undefined even if the third + // argument is 0. + if (buf_avail > 0) + memcpy(out + *out_pos, coder->buffer + coder->pos, + buf_avail); + *out_pos += buf_avail; // Copy/Encode/Decode more data to out[]. diff --git a/src/dependencies/cmliblzma/liblzma/simple/simple_decoder.c b/src/dependencies/cmliblzma/liblzma/simple/simple_decoder.c index 1d864f2..dc4d241 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/simple_decoder.c +++ b/src/dependencies/cmliblzma/liblzma/simple/simple_decoder.c @@ -28,7 +28,7 @@ lzma_simple_props_decode(void **options, const lzma_allocator *allocator, if (opt == NULL) return LZMA_MEM_ERROR; - opt->start_offset = unaligned_read32le(props); + opt->start_offset = read32le(props); // Don't leave an options structure allocated if start_offset is zero. if (opt->start_offset == 0) diff --git a/src/dependencies/cmliblzma/liblzma/simple/simple_encoder.c b/src/dependencies/cmliblzma/liblzma/simple/simple_encoder.c index 8aa463b..d2cc03e 100644 --- a/src/dependencies/cmliblzma/liblzma/simple/simple_encoder.c +++ b/src/dependencies/cmliblzma/liblzma/simple/simple_encoder.c @@ -32,7 +32,7 @@ lzma_simple_props_encode(const void *options, uint8_t *out) if (opt == NULL || opt->start_offset == 0) return LZMA_OK; - unaligned_write32le(out, opt->start_offset); + write32le(out, opt->start_offset); return LZMA_OK; } diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/config.sub b/src/dependencies/libarchive-3.5.2/build/autoconf/config.sub deleted file mode 100755 index 1d8e98b..0000000 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/config.sub +++ /dev/null @@ -1,1801 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2018 Free Software Foundation, Inc. - -timestamp='2018-02-22' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS - -Canonicalize a configuration name. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2018 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo "$1" - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | cloudabi*-eabi* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo "$1" | sed 's/-[^-]*$//'` - if [ "$basic_machine" != "$1" ] - then os=`echo "$1" | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | ba \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pru \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | wasm32 \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - leon|leon[3-9]) - basic_machine=sparc-$basic_machine - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | ba-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pru-* \ - | pyramid-* \ - | riscv32-* | riscv64-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | wasm32-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-pc - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2*) - basic_machine=m68k-bull - os=-sysv3 - ;; - e500v[12]) - basic_machine=powerpc-unknown - os=$os"spe" - ;; - e500v[12]-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=$os"spe" - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - moxiebox) - basic_machine=moxie-unknown - os=-moxiebox - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i686-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - nsv-tandem) - basic_machine=nsv-tandem - ;; - nsx-tandem) - basic_machine=nsx-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - x64) - basic_machine=x86_64-pc - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases that might get confused - # with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # es1800 is here to avoid being matched by es* (a different OS) - -es1800*) - os=-ose - ;; - # Now accept the basic system types. - # The portable systems comes first. - # Each alternative MUST end in a * to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* | -plan9* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* | -cloudabi* | -sortix* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ - | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ - | -midnightbsd*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -xray | -os68k* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo "$os" | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo "$os" | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo "$os" | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4*) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -pikeos*) - # Until real need of OS specific support for - # particular features comes up, bare metal - # configurations are quite functional. - case $basic_machine in - arm*) - os=-eabi - ;; - *) - os=-elf - ;; - esac - ;; - -nacl*) - ;; - -ios) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - c8051-*) - os=-elf - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - pru-*) - os=-elf - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` - ;; -esac - -echo "$basic_machine$os" -exit - -# Local variables: -# eval: (add-hook 'write-file-functions 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/src/dependencies/libarchive-3.5.2/build/version b/src/dependencies/libarchive-3.5.2/build/version deleted file mode 100644 index 5fce0ed..0000000 --- a/src/dependencies/libarchive-3.5.2/build/version +++ /dev/null @@ -1 +0,0 @@ -3005002 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry.3.pdf deleted file mode 100644 index 0a159f20982e1bdc96fb3fdc49cbbfb9479b93ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28974 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�(z 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_acl.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_acl.3.pdf deleted file mode 100644 index a428f40fec9bac56f46cade4fb4306bcbdc20f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38581 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

Z+BKtje5(X-zRoPdkZX?nx&~O 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 DZns0g diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_paths.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_paths.3.pdf deleted file mode 100644 index 3165b31d4b0cbc931c3e42d039f84bdfdea25f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25125 zcmce-1z1+w)+j99-Q6Me(hbrj-Q6wCOAAPsf^d+l|VGr=pU!bG0`y0$SPI@sc_i0WAR*&ZLZr zjHHaFD#8-t%AmKXy)CH0%Gk=r3g{tg=4xgm0Gfc5(eYE7MpAHdmdkQ`G{vnvj~v zLG=)ed9GzqG|zmw@7HWxUAN^W7N;xBGbDVQ+N`02aUo`A2oV`0LuYqJIlOlx7ux~_ z$=V^&ce#_>g~sy{-z%it8Nu5DJ=tOqctY}%%Y>BO%QEDB!Ejb>cYDTGZaI%*9k6WM zB?0rE5z!r}CU5t+!jq7@Un8-}v`{gZ&*BVsFp`I>J*wbvi}<-6K(!X%7*p%ej*N*VkV zP3WBbCp(-r7?gBtvgNGEI`C^ZAGNpXHLm7g7$8+`)Z`t{scOB~8*8O3L~R&I*Mp(5 zWR3=eRYH{!BR9X@?T}(zmSykmN#ldEpH=rW7Qvd(^coOdXABUP-r=Zt!q>v;5dO(5 z>2-c5x0%-Nm=nx0DUmzi29U+?=3lai`Yqc6k6=W#(8m(T9mk)*0hp=2l)Jc0VI)K~|meF{w&d1S* z7f(ULpO%vP$t_*FE8XXfNko?P>{Barm}TW_Ry!?#1e2_iGz_CnTcJ%uW(`~H_7%Hp z4xn>^lYkH|b@1wdCGSbj6IpR3kOiK33+IC9m>8p{B5KgCEZ9$ITr^OJcdD>1^S z!*roj1saKM-YM@C2%c&j<@u6G+!^zsv`5u-2cSIL@Y3{n4R#?i<&9PZd1)+<+Zt{B zF2X~J$v$dDzH0OakGRgc>js^Ca){l0KBjt`U$aEqp@86|ueU0X zpXx5x6npPdRt9cKXG=01SOk}E+`F1~%ChLyR~S7MrKwyIts6WHAk)CKdZWJ+%5iP% zxwG&zfgX8YZ^xy_M}qJCgf)zjfLH$G$#wRHUKevNat61Phi9?r1VT>kGxv12g(X;Z zh?|m#Okub|UdF3pDu3zp^;;@s{nHn9j>A(o9QDN3NY(;G-ShVtIuxIJMZ;{*PmYqZ;dLBN9hj+qP`md4gnGY=0Kq*2TuY=AoQ>x~FDjqiFlcTfotDdlE%ra$=) z=<9)JJ#earHwz0pEBwzoR_4DkG**`Xilb?QI2t#q_l(A2nG;%7%Xa6!3IJ|i+;dKK zZiHM5w_1#AeqNbw0PgsLFPCyqdGWMK4gu4Lxs;5Z8~5N9i) z;gOgMitwti>tX%=K$Tb1nI)(EMVoRB6klD%TBp9J`<+#QN5HhzG8Rpq+$fKzO{mVC zMC9@SV(L;1>U3-*Y@S%`L*n$MVW7KgHWhJN1xVPZw`VgXt$Z{1IB`I2vUPi0GiR?N zuSwZ10BJ(&2pHl|?Jn-(PYc#6=?&&>ZXhZkS=37-L-rT`;1w&^(LcYbSK$4H<1$Hw z=wcRtK|-DM9L{IX7E$57+)%_0%3Fd;gY`(dluH9qCd}>7>p?)Y3WyHW4cd zyV?eQEF00m<~*Yjo37zpI9ij1e(Q2IuO;}|j@OQd=aAps`;w_RG|L?qe6N#?nQPsV zDjt%HFHUv$S*Ebkkh2%Rik&_ss*}Z!)ZXM$n?Li6$2p*8HF4ucTcl=7(r7R}f3wvd z8BSnA8s#I)+WGawS{~(J4$IyLdxdzSZ{Fy_f^!mJfgqu5UVmNIhQN8fu}YTHSE|5ha?%Ndw3H$+du{m z8k-qHmXWyxb_?!BuRsuRY-rAJnFXOwTiK)3X|pfafT4cU$%-|W-&oPb->NXQb%~#` zMk&K!>vhw?F zd?B!bkDX;HH5kZ?sgZ(dnKdr1Hk#=yH6U`qI+pqA)n2t?S&q#1Y$6-9SnS*8=W2dJ z;~x=$qJ^-F>rFnho?P;~+@3WDig4)FRi8;>JE@?t&Vvq(YpjoZI0{LwE%jTMj8xyn}Tq%-bN~#+d*yYPA$SIe7kIFoGDYB@E zz$K@q7vPz2j?GgPHy~=>zrY*KeN^>T=X79T00_C&^=dvs^6is$9qh<82*4zCnB6J1i_);_zH5 z=}d5$eO|_n-f_{4KDZ~SERwx7g}fC6U8sr)#dM=GVB>6Oa#`i?x|_#FRdLRof1 zM@voSi)$EbCEJ+uN<+ds0btSyczp!wbpuzj5D3w))6^ z*;v?rvtO>ivtRE2hW)0iF4)Zrp?Y6v4C}nXv_Jo{V={?OrRE7yB7;R&n}qb9!?j7j z@CN1fYvc?LX_;!#F~rIok26!(-4hwy@$>CxHR;Yg5r!&!n4F_1A#>!XBy-5+D*UJo zfJvHy9V1l7P;}uhkdx^rU-d`yKQDW~V=6e9nxjNq1Pn#RR&49^nFO*(vC$Y&!awa> z2JXGr*rvPU9KrRA7CWqpUEe@@FmAfz!&1;O6K`e z`^bl3S^ap9me>t_Y>csj4+=NFv0sEmk`C@ko{m`{o_$}rI_e*mYk>b|UBPz7FoJ!I zPsx8!=Wh^HoH}1fWU3aX22rgmTEu{9j;1N1ipqP)GmB4CAA?FvbEG(VCdEO9#!B>> zBVPSQ|8q!~q8eKtXcFkaYBETfK(m*Mm4fgn(t*xR7*TfRYUbhj98theNQ&=-iXER2 z*L+z@EvBJ=-;>o%Len_^8p0U;+Hz0Guf8w3TOEH~=98KSSfiC~$zV3v+|-t7c8^II1(jUaHXE<1yymmhJ5yT7(9z74}6wU-wqP>oLfyqbgo?aUNIl}1S} zI23RfEm4wPQ$36&fuL|J(y5ZCGw!l{cU+3yVca>v;Zr?aEmTy;3XRvP{;h5!sMV#W z#$cwnH^oM&6#UyVo~A}IlYv&}ZKT6ytf3}a4N=R^$;y#odS6+VlqT^CaDds{lU>ui zuMVUn?k#0&XqQ|!Vuj>#!O!pvsp?Ve2n$**04!+hntAz&R}5LoUoVXXXctd@H4nQ^ zL_tB(8*^VctfZ-Nz`;mG-*<^Nsr|Z#@N&`4r^R@5qUKxU6++7j%^`#V?;#dgxeP4v z#RA*wKqJe%u>zI%O&PvlM^B7CWQvw=b&Xj_9C4!qVj^&GlZ4!-71v9Mw+Sh73vf9t zu)oj3>7&lUM;x|Inl0+bb6MwIROfVxzrMeTrM!Z27<^ymm?0)mZ)qT_vV|eo1{QS~ zd;a%}^>ASxE*2N(?|a4m*R@jha4-WX8d;bDnS?fo2ZxpbpRlvl@y?A<_-jn6L$wn zsyq&5dAP=)ArkhW;Vh3A7#?K)0YpJ%(2UNc4`!qCL)A~Ui-iYN@c=Vu?*A76vOXZ> z7l5q4q4^8IM?LUQ2w8t=i~p}6e89*r2-zM8^a#x#5dOgNUpRaq(+?DaC;}of=_8e$ zNdeETOr1$};D2oS5!1@>kK0j(*CPc@=<-10KZ)^sqM!4K8Uc-L>@9vx`13r-nE{PV zK`o?gzX|-4ntw3yM`Hdy81MiEMLALyLBU^S|D&fe7yRRn{@T#v!TEV8lvz08S$?<{ zltJQx<#96rWfoR=7S;#cfIgYwSsu{@Q09hzgy^rC9?AV{roXN8NdI50tgP^?zh?YD zTJnz*{r9as67-*z{4e+O0O8N!B1X<;5BCfpC9A9`DNPTer<0YL)8pL}Gjld^vT^|0 zJCU+JQtij(dguN&CNjk5X1mMcZn4M zLYSG8mGcW*kZVrw4_N|{Y4@+)_)`s z{J*020mXm&c_hc*YX9o@f7lL!;O8OvccTAQ{!JN)&2+{fQA`(t+xeSYtg^v8AiHSQnY|BG3E z^ajoKj}-W8jeq@mDE)l?|DwbLVE@jao~wvR2+Px}TG^U8GyWqTemGhl@8rL;s6Xkz z&GU;x!LxGw1H%3~+W!@Dxj_7$laq_|;r;9T$EFAj;fo9O z{A_vL(~mtq5ci?=*O-S@e~kHSwST^wEX1{A zlEiZQnh@rD*C#q_AMV?FXS{g=f3b9V-_y_gOZH=K`#f9U#o}gz(8I)J-RsG@1UP2y z_{9&=;65;Qy3ddkQX$@Kh#;`KS(h}2y18vE^>}$xU9@I?#JHTuJk9JTpV<8xpD#U> zNF|F53yU~5s)%&+y7w$W7$-Qw!v~?`HzCX`@OPTWB%uDkNap@Ama}reG zrupg8WOB(1uT&}PLc_DMRVGw%H>6Fox>d2xluglZ_t1BoKA&OCI2-#`>E8q{OJxXW z6+&{rdglZRE`zsXSJ-7@@V1YyjtB-u1hnp1Wb|}%X%3jN zIlk4NQODQ6dhRC!y!zy`W_Cy0R!}Y7SfQ9Pw#EFOLFY>;4q1&)p&-HsA-63zh4?Cz z#6zpWOU>Snc5CT+_YUjHJN)UGb9YL**=#1JPl+5(GnE{nE%EW(NsJ>81jY_sxJQyk|n=PL>eyvo%_EF863$HP)72Xy)quuxX>a_9Pt|#Hl9Jewz zwY9wr;oQxmCZdBxLQ0NKPdZv#jT9jP(^Bn>x@?reM29WX4cp+{53N=2A`;uDwJLgH zyjC7ZkFB-bx}-C6y6E+d-KLnu$(z(Irx>@v`ll~GO1vwY`G((Eg8r#Nsf?b9k)D16 zH5X!AI(S3S$0!Vei`}%Aw$a?oxd(u?MUSFNOgq;$m%Dc%WexVgyB4Q@}nunhTKjGz4pG6u6B)Z`S9Uir5l8S2h{1uI8&% zlu)K7hTV5GoV}jFMrdgikQ=6{QBkbs;JP|uNFhKR1gEFb{C!HQ@+Jau#6~(t@321;!Pjp#W3sM%m77_b*}Ex=q!R= zd~Pi(HF2J{pr;>;5cwMHmyF)(S#oQ6C0Ug2B}?npQuZb_3xru5CgHJ6ajO#@tK3Yz z*h=NCKve>Sz55g2D?h|8u9c>>Rb-GQ8yQZCwM zXNaTBL%Hb&tI)CJP6wQ_tr%c*RL6ZwK?c}m`CyTOZQMjXl zY``ndk5VHYjPW+qf$S6=tBcyvrbJKbew@!+!Tz%cYuqg!_F-LUVC!4bviRMYc0P=Z z6}O{VIF&;werz#}S33|5=WFMg8tO0ThRmKOuZH8^LHO)PyJp{; z?4PWm6IqGlrvtM~EsAxGec>~rLofeqT@79}CxG$H%i5LmfKSsc?O8|aUW6Tn7I4mV zB2Ov}x$Q^;$`f^t2sc(2w@vxndO!et9>G;h1GSI1OW^yv)U`CS%qlDeZ$@Sad2XlC zdG=1V?U%AT6ZG7;l8cog3&=PK2)Un${S5gdm>gey{b-Kdl3t_}a7Y(QGi1l^ea&I{ z6kngZSqdjcAR!p+*;eapUnE*ptE;i|TU2(ji2$)tFEM%kg{({>INk3Y_l|hq3z@q= z!z4u`j|urk)%d7ZNhewPvs_mo7McY1l*#SvFRSke#$?}t`F(C`ez02qHPHBI*!?%+ zSmi(4i9f|M_fN6R$?|_$Ec5)|63c%HWjla9z~P6=Vrp#jD4m@hj7-cPWc0sEX}5oq z(~l0AKjicuhTZ>$oaX*lIj#0WQN;pZkc=n963<#Xz_i0zSz8aUDnhT=BpsU}uWWXM zE@*xsT-i`fge*`fbX|tj;Qc0eqtJWz7ZFlufVxxEx;&38$eKBmhp4O>_5F1$SgNnfuVxzkUYevCKkiQlOSKaX$K(c5h(+cNgh z)x~WHH;7=}r(Q&&;NkVJ6gw1xBoTx4TubN??>LgoyfrG+5{7kek*nARmW_-tN@+GQ zvB;?_>1e4d(c6+W$qKwTfb%C6+o%p7r1PlDHrLqO7wE||vwyw@M;_5n?G(yy3=^%; zB7=z<)P2$|{{@OX-936%!W6X#GHL}Q$~XlUY(hkLZR2<}DESKIgy6~mp&phgHgy2* zoAe<52kI8qMf`o(w*IBabvp>`(JKB?_ehkbMd~B-;%~3=>zB>HnnfxCvhk`zi3lcFRmK zTDG^Vs~nR?)?kwFC-=|XVEYENA`bT<@p?iaQ7f%gUTcnCHXDG!y#x<8g1jN32ycva z#XD;FKsPoo9|6BwkJ9a&ft_3GZQRPvlh`WgyM?{ZhF~*VDQ*+j4`aWUP0OlTmzaz^ zeg#w9^dYN!+3u^+%IggIsOJksriyef(EDWKlfEJo105<=`YY338|l}d%;`}*b>$o6 zX7sjz2NnV-P<-Q{=q}H-YbL7A-tudnZ7?wv zGsi&`3vk zmu81}DEQw$63Zo`7Y0I&wWi0#xSe*XKX1;9t*`Z0A14P|+9J7Vmt{vIgC|?$7*^Zo zSwbS4>_d}1Q>+yCA0ldh$MFV;MLux)mb9RV-_-t7%9#+wfMCPcK`re9OnGDPcR>f< zUEHWP1(VoDrRNb6#cp|@HhT7HiMW^jn!g${3Gu;QFnv}2oMo86N!BB$>aaag1J=st zlI}C-GXy7f^A1H!KyHIVC|trxfApo9PQdcLWUeG274&HI<|{NA`+aSy*F@NIBCBidlnGRJZU~eeaDQxC?7D zs^bBKH<)e?Oub^h06>@+48IZWD5{cJI{dQYOf9?amHwqJlzJi@)k{$hiTmi~&e6*) z6;wy+$q$g$n*As2L8g|+Q4TTut=)d`R^<`!`*ioyj9u*&4i?;1?{{z0-`S9gNhdu= zlL>7*N6#(SJwsMt&4GAFyn@YJiF=lBo*q2E866+7I(x5Ut;{q73vvr4M&Xdhp}F;BY=*%^Ux!>VmA7 zVbFbv0K;qzWlh7eDkB+CP*Ji|nf?K;Y~2z#0#VYyXZc38v9Vx@xoJm=tB2`A062(` zCX9Ly_8D3k{vULj2XD@QqtpB+2kZ}phMg0n(C~nqXrK>H4z_>tGjKeZ{lEPT9H5{k z;4eP|59fdKGk_ZYr+x;mKl}`uAWy>&mFCgU0Wb$xfO1$tPMF_*2OBeIXMiop{b1)} zYYg%{SXul~d>lZI8hg|K9ku7t5B-PQ^9PFmd$os^hl}-3_k_BYW~>JG9r^l@#_M{~ z6q#x2_rU3TyPo84mR5D&YPEHOvI`B(uwYSL(W~FSp&|qqIS*ol0~anMh%~GdEn5KE z*z(O6?D0>HniRO?Yg&9^Yu$c%m-L-VspDHzatKM_;t|-#Wf8nC(W5bfY`KJH=9snkc$`+wQMP;^u6|eRYuex+M zZL#I0qtQfm!D|P*r23ssPRBr4*kq+NkuYI8iIm zQbT9LB*PM6vB^lY!)V~pjwqo~e0NRqYF@@FQ|rB96&rgk*eP$CLE+4;!p*2kZsxmw zC3%Mt%Xc*};IuEYFTv!XlkZR<|E|f~+Q7la+5xd?JOu1hLujZ7UjX0`=dD_%{UoQ% z4yKwSlvC_tR@HPJfoBS>w(&}wU%s>s%?v1~7K3McfxufR%hG9f!LdEhnXZi7rTG&r z*x)PmXc~!|atxvLgR*6+Y~QYdqPO8EEgTft_J=MP!il4KwV~{`o+f5&LFhb(K4*&N zzJ6R?3D7!OLha9sfX4W8Jg^=EThy`~akOxJXd7vEO7{g(Vb z@W9(Of`}iyUF|6Yer!r(OJM1{L!p|*a*my3nCza@Z`{`&o)~-u*-fY#JPaaAS*+i4 z(}NhZ+wQ+#+c*ZO!lQ#Z({_g}t+1z@H!)yy0foM@L^rGyV}VU$8WKrBHnqR3Wt%f{M~JnU;F0t8}Y-$3$3vhL&>+HjZZ>0V3rsoh_xo7bwAMsz_Ma+HUNlnERI(RV{ z9OR=NBa+}>E{!pveE9+xP6$^7?o4mo-$R~lk%_n7kU@Ng{EBE8DN;LeQu_e1`197@ z!T4OsB6(Fsdp%6O=({gLabE2PqAausJz`J`0hA=Xsq+LQXXzi$W!?tV%j?AM3^VU_ zPZUs7R><&Y1ew!|<(w@cl{Yb^%OP18d%hUiEW_iB5-TJsbd(Z;hi}y`QX!~SlnLY6 zCQ=L8-NcSna~E^f9#Ul4Be7^BWWt-@z`|-|EiD-#7;zaXRu@mLCz^lSC%x5Qb*rsa zQJFKIf8s}=OI@;L%A%dgrCd$dE)t9D88M+IsLfR_K)xha@jV98AXeIbg8Rj=a{fKg zI$qvnd?j2R+exOf^q?J&jB_!?#}lXVX3F+!^u(B+zyWNO>+If2&NV%MPn`>Nnd+tb zNBJ|({-7Anx-y@N4#ad>={i3uy{cJk=Fo2T<*ZDsRESNdwD1r-HV`4DrMElGG}j$~MUSNIEyfW5_=p;(z0s2R_2 z^4vQnZR{`t_Zz!>P^}z!BVSsgXiC?He;Aa23{%f8v4Po!aIVQil5||PLDNtoc#gL! zz%N6OS7e4+wqlU4QQ6mDG5!&vES+fl*+eRK(5}Q3Ex}fSdTYEDH$`KJ4>{b35r8sw zd+sXqGZb}>M@73;J#g_Ny9aHmxLk!*DV*2Lp36th;7zl1aChu@kh+gAFRB-AwA8?O z9<1OUWQs_n`~H+7EVODsI7;wTY^S#)?Lpwg_q6p7WP9j$Tqtn^lb(l@l zbDa=$Gx)C59y#u=s}O|rI;ht6rtD-6fjL_{fO=ODF`Mk7iXiEVtasm}YmB6?S<80P zm|9VdnT+Z69;7ACGob3k#A!KqN{}lNtE)@rldgUNfDSL(bLkM9%DZ>AX`PI?{K1SS zn#-*P%4Mi|Ww zq-&eOEnZqsPQBX=rh<0hdqRLF4Y*As1wxFSDEyuDVaa!y)_7zVOr;i#5-xj#1bxGk zc-SEUnP-UppI0wD&(Dyx6-00=$3A@LZ-;*;F?7|(ZOKdI65x}dFI2NN_0khRr50A; z!m54AMdWMEY}&ZonTBWhM{Cg>nfJBXwPZvIU9R?X&2dM3A6{JUu1FrDwE$cTR94Z* z;dC2&L>5G1V_CXAP?)DraVsoVH<1K@ZmfrIa~=m`y1uf zYWxy9R?V{2D!w5h3G4!x+%Rgdc9wTI1)aq#Rw<$g(+KOyZp{o`%umwKMzs@*)gX++ z<(VC1g!zQgM;#+($L5z`>67<;x{0Q)FOWXDfIT36iHBBI_@sx)wA+>Fwx9b3y4o~t z7B@{IP{R_Ahz+c;|2=VY^GQ%2$66~3s1TUP+ z5LRR#>m7{IcvtgO{KC;af`}VOU0lV6KV!Oe`K6(=*c27}4p ze(TwgRiQh2-(0v(a&$o=sLK78F(#VlOZK9!??m)?3NMVD@fp@3o?h`8hjtxig)D2$ zVo|-Z-j~u2li8K3(S=3q7cfAPkWYD)pN#P%M9n)XVKWUri@^EK0#I2H=L`F=xnTB$;e(<{Q?;l?gM*|2oX9M0X*SxUs?4Ym6-y^{jyge7+1d~F2 zA30*9FqU;s9~sA?DzQXS{Zy+FFhB zW~n~|Uc=-vT4>KWOkC_Vz!>LQyG?1+IMcXj@ivs4rwtjBzlcK6yyc50iqZ@7q7xRW;PrU9dNoT3V%9+>8T1>ljoH$C-Y2aV4o)#$~)16&2-R=t_3J zdY}Jhm}B$GXMMwjr}uPzPu>Bc-ISRlDdn{zuUk+ZB4(zI>c^#J5sMzEhH;N`UdbE` zNWnu*xqWjJ-I4)If7h?73*qUAsbA3}B_IUyG_%T~ik_TG=#`Yup;{Cl6?(5gN=CFY zzK7cASz7k5R<#|(hJqc;6e%mQV(sSmipaYN$~YFU2u~@lhOvL&FN8==ZNS^Tp^yJX zo-Fhp{ODi__aAJkhxp`wV^jTeD#fEk#r$ATfugJ+|1i(*uq`JjR?Q8vhkizGA7Ze7 zSyZ5Y|6)=72ZIU}ZwAF`|BTLpvIPDxl!O5y08xM#KpY?qkOjyA9kdg* zs*DnEQ#qU_z_4&rA%E&_KaFIIbIbc3=+^>y2ojo^VF-HfV}cc34#ruY_5Gf< z5fptXBI@#6)Ts!|1Nov%SaYe$KuDO#QZX-4KLco_=b6S&G5V`h-S+n)=M$4#U6-29 zq_3T7gmpB53}3bgK8J<%b4lJ@Qj=?`6fsVVm!biR+4HWCS>Nny2G=uu*2If00t`)w zUsl~;boff%`gY+3Yo)xs^ig&i^s?H-pNYwk;iXc5aD&uOuuJe6C|kjFVC~is zT72uIHM?rw`m}{Vak}ZegH`+K>%eUu>%$St>=&gW-@1_A4&^Kn_3E=qTr0eJcemHB zii^uL*6c0bE%mzon%t|VYqOHK5{#JKfPQ-L9*hy8RviD!k`NOtU^GN91a}s;EgOFJ zgYJ1q$Bf~-09#aUlt~mh74fyf?2~!FI4}mCC%cWV8#^-@wwHk)N-`S|7jeqE63%aD zEkw?3A{ZOtLug1k%+|o#*^W`) z$QCV}`w?tmB0ljZ`VhAx2ZLK5SgGQINZN!etP$n-q zYx`@6P7LX{7=q4R)Np+>(!}I>%70O* zV2E)ll-+%X|8hY1X$u@YH~f|A(-do^Nd=@ui;=E``mR}x5T~IxTJV(!zHw3SzcY<_ z>$aFEJ5n#iOL0bj{gxC%SoUqaN)K{t_Sz!O2d59}uyU-23fVK>X(AS5Z!Y59Zo?-^ z4x@lW3w9{$qIdL5T4jLgBKY(4Pzv|N#`_fX6tv3q@TMqZe&{HAZiJ2Lpg5~8L*c~h zW(%VeBu1nyEdIimDDP3pZX}0t$y3^ojsqjD6W6G*WefKuhLho>x{ffZ+5_p1)= zHqtiOx9-8%$)0(3=P+$cS&ED^jy(&-&m&}x5vqq5U`G$x&}Edqi)!3c+~*!3eT^*4 zw{?u6SkO*gBrQ&sBm=}4OkS=QJ79B4>5H8lU)oLVe%I_5+C$MTZ$v(FrpXTR&O5DC zq{~Z(wk!AOm+4mWT<@>^*nK5xyrxt-weHH_F2Vv{a8PxM2qV9mp=>}?Z82|+-o4jB z5$)kOXL~^rESP~Elb<+*9LiX<*?7rxQfY#W@ZznFME|i~^gFD(!DxkRy$rXAODbq! z+k~EY49hL%#6b|`Q$}_NJ66-icVXVV>$A?C)O7Gi$f?vVMi{%4x$SM;s_^#izKjJ> z?BNp1Z*U8x@SjSE^GAf>M~>5KN;=0y8uLId=2s|ljErS6^kC*eAT%mo;~Bb(VEi2n@Vp_bg5j(L?paaEBp|BzXV=t(WAH8+A zZp?_=0lGuUQxe`I4WQ;uPLoaqLBq%A1)a{{@mY_*n(kvZQ<1Vd;S6UlpF^mF%HrD2 z8nxTk+V`Q8TWYX~B$y;Nkt2 zuU+m25>pssbj48d6tZoQ`5v0-mD~5fi~c{d#ee5N{!_x%e@F}bCHh%G=~|EJX`I}@ zeW?$Q(4T^z`(IqCoLr!$->y{9(ElX)Sy=u_^8e1u;{0bdKms8352}C~Kpmg~QV4$J zZ<*NJ*xLb2>}_q09&@>V_*j3WwSio%=2id;ke}7k!@<(b?q{0UgQwLVU~gvziY+@l z{DX>(nK|&s*JENF;HTg9uT;4oE?6^Ls~@ZVia`S{oy4pnxipsoOJRQ zPhcRW5cq&RIHVM*P$&ObPN)o#L$OOC#=N?9!3%qsA=}SOA$I#-_AuTR2TNYQ2T>OY zzLaUs=lWjWpRYePAV*XtOH^u>;@PcEbc7A*8RtNll(r?Zo@fr=SPiGzyfXH|QLw2q zyJUl94nQ)WRUO^hYp_Td4HT&8isOPMz`VWX=p;%=!q>CaK3 zUZIB?SHH3m4<+9bwwlF)u-s#y?4M)2mK|UcgB&CYLq)@sH1Fp3+`-aG)v)va<}*pj z?foYjSmUYlB%-QizO^)0s$F^6`P3Ew6$f)a&t7*&Y=}Qf2q7GjGn|`C1TgA2^j!Bt zr|(DWvlJ9;o7wkPM==-d2N>Nt-9}$*zra>SyN7VgFpw`(>4xRE%fw2&p z94L@QP8g~M8L@(P5_$zGCrhJGmK`<|I)aPY84OEJTq#yMG{q_Z!VF-MxG-EBR)<%I zRBKCv6T`FaVGZXJiJS?L^Y!+;JGH2AZ#zCz>(h8{KAeK~Y^`L*b2nlBA<<5Wq24onUTJRamvSs7_xkYsvO ziZg=Gnm~xh<au07^4@^YH4*5)*z_OK_ZymKmk)38)0%3xzQIoL84Bj5eig7; zsvmr5c~{djPCS2qNPsD{KX@>~AS}UPv3tyVN=<%yZpVkGJQYhGN+jO~A((g1>b}S1 z3*QlDg^k_9G5XFSU2{;lO2kQ1?;RAnAHO6WPELaoJPxBDTs5mW5A)%x#@b5pRG4r- zVbN5jlDGKE@iOmnf*g>Y*0PD>t^%VVtt%l1eA*qF4*CSW4xUftZ#Pm{wK0Ng5S+g1=8aS&%ot?S}E+#i02p`DLz5GtC zm0O&~E}2|lZ;FG~*LFKg6XO=h;_Xx>$AhktrgU{@FFy8duZrGC?ziqdA%EgYWqI3c zqR%3k_X5mYBplAPPe?aW!_!C!XJ^Zi^F-hVgC^lr?`z_#W%Vh?^#$HKXy6oTJJxhk zv6%K3DGgCa^ruU-(d8NwmQb>!9C98WNUwrV9Mb3_a&3_Go^N(G*wPRLt_$R`h&E5* zCtF(to6M~cWR;-{)#tP=G7ff% zhuc)9UW?MPn+%WwuT}73eB9yg9_^S(<~B>WUM=iu&N{#T8)e=%FZS1d5ru$hGxRly z7BmHYsygPK;=M7wfJnDZLqq$H)HK4&{Ib`o=1-lmguvFdwS1I~lzqrExtiVgfwnwH zc@>6~*#dR^Xkte<6eg{%Auexdj;1Dx(UlF-3VLXq4q2b%6wk|GiF@lsnl0z-P`Hg! z*Awrfl73m6b#g>1+&bf&LD9Dk*VG$n2pBmwGM7Nu8O0^QW+hH@Ba_1}0m|G>oK38< zkZaX<;!BrHrB5nzA9$57h# zrYmC2=EP>!hPnYu>dm)ic0_-iXc~FB{9T1l)9k55i5f{1ahv*%M}@>Qo;7dr)i8%R z7Od9&n7(A+;b`Qe^Vfx|>LFZ}uBhNv{Lq zj>aG7YjRN;PQR~vmc|hqsV!af?E{C?UI6+U22tce>D%jL6tK^9@nvImy);$Ksf-NN z#56c?-KNjWrI7=L%44?r6GcRSJPo`Dv(dr zkqtKZ;@sCYa?eL!K*aZ+Grfc>d)Wy#A)^(}E{vWS5B{}sw%$jWIIod)9ID_#exe}A z1u0SCCM;(fTKWsCH=8?)R{gfBp9Bm%*pf;d9&HjsPIfQ3V925)H_`{B z&$HJyM_D;W%SA6yQun8bx{&IejHueEimg#*r77wUz$6vgig`b%(KIJ-VV7jLPkq{) zxdZf+rQ`ea*KlO;?`eiSFswdxAst75ayNSQX{_UklfSVR9YQSl( zXf~~*NVuZ^bAF5nxfDT00MU4uh>?hxv&el}2ZF-{6qp^)L1Ha#_zNIEeYP9kf`s}W zZK?-C`IpOmcsU^0sm#_G>Df*YUxr&;e?SBj)IbmmRyJLGNeR1#!J><2Ym|ny<=gg! zXRau-VicomSZ}?H3rZUU3=C}TESqE(Ztv!Yz)g^tv1Tc6tVd!2VP9zKXwxU=$w|nr z#3P0CdwS~Plo^Lnd9&?@ZkmN?B((3|dtes$BU~HE9E5hNovR#?4u5h^`Otx36y+7&e77oCO zzuISrfq@&RqkB&^>HzMhU=39*Zl9%fF(Y!`!!)$b*#Slez+ob;7auBj5OS?oWx~ko z9Wr^+x_rxa30=$Me7|~?WkL+DTh97C|E&G|6NE1_bDuExs+B;ss+3PY1KKwB&$cb2(`;CDul}}Bb766N4>7@#)ji|F)tilE6d?;lihE4DHerwGf zq?=D1z`)+HBu+L}>!{9Hy2lSUk=e^yhV66fZ^N~8RMoB=ng~0}w?|9dH1Cj}CBh_< zP4r1dt$Zi!%BdeMS)nToW7Oiy<02YvbE}*u9kB7EB)Ic7hJb0zzM37lVzk%tSQcmg zax*ee;b?ymd{U)!`kiO9Xu-_yWbce<=n0WE8!Yq`FZtMab^y#*H3zXKz8*F<;kdVP znAn?%n_!U;ZQBAN3#+t9V(APr}E~E~ePlDLM9IPht|S zWcu(E;_*Z3+8llESA)dv^|5C!3G;PqF*!FcYQkAL`1DWHcZbX70Gf4p7f;T-@%Ib9 zscwAZJ;Z&fx@h2>m$ycD33)2r^aWo5vD8*GvPfCJQ&c|9v-Jbo#b}kKbiS@DuX9e(!z1Lokb>q3 z+>thI?#*+|Z0et8qwEhE<4z=)he_QLn=pInoYaAmmZ@jb6-k2FbOdqV!_M)Ye`gt& zKaie&soN2t{Ox1LPd+Mz8CAE`wN7l@!mrrYL zjTs_`vubu2?o%FiUu_ntW_u8F-PV}@vw*wTqnEua%V#e1%ye%=j(yaRd?8Ywe$H=i z=Ug2e?5l_5-vpvMW!Hx^>wK5$2YGe7SUzW(-(Is;aE0(z_+p?GG z;@!k$h>0_yoyi&_SM>ka%6UdLm2CkS9fcVXtUPIAz!Hi{?!74_fdEnjl>h=Nf-nS< zKqMp~MFKeJI4F)N7WB~(R8$b9hz=kKf)o+OQ9!}*frtu*u~DR0-U(KS>&<#=c~`R5 z&CV_-`<#9A&MdqiJCd81xk*^EVJe>(BPV#nLitW&B5 zJvwev{hM)*ZVA^+56R|PuMA|H9N&_uRh#Iz)#ni9g`SrNt$6RCU};e{ zZp^a=pQ-dy%NbJlwi)}Ak_@g^&dphn&}RK8$YoUk;&Y`e$h3bI!CpspYVDy1rio6O z&H5!J&V|Om>-uS_rJv~RP`Nwz*}Cw5sa;)@WxRGwBR$P1-(mK$-EsZ2S?ATsQ;sAT z-{xT2(mJW?&*@36O}Qt|+d9&sIDvfEps^=$0yQQrsG{Y1UazUnG$|L8RaBw9$_f{; zd{L`QKwm?fE88$lQs_TupFE-;BRi~bD5^ShY8w)?N2kxhYxfcuWX)M?w-Z(Ie9M;R4!2O9n+Yaeq#s?4vZzPv zEpsZ(YLZV$LztHurhK58YJJwNJ* z&jIgK4G&rCOd2bdHs!=NdEfS%?UvA7lN6HTwV*`J)jT35>447x{2=LQPEqGZ{Y&;s zj^8k*bJDJ5jxke+?xu-!!Qb6Wz2}b1OCC79U)>6ssk__Ky?v2OntZT~8xKaBg>}68+(_iX6 zIsz|0PcKaJ9A1iEWYv9Y*;rz7Orc}3HuabO+%W^`mB>q>10iNj-E$4z)C)q7*Jrz3 z{d*+4{Ew7iKoFf!*@kb?WOs%R=ZV=#y_{%vhj}jV)A`&^QpY;4+bvZeSF9y z6RzAdIMmwPexqMhA-I%Zb?@hS+70{SYDmNR#xeIq?>(+bthXYw1Sk)^f6v10s!bSL z>`#`oy6P4-)L zs&(g~#QUO-$fEfN1+_istqar_+T{IG=MotsYC5-cUh%E5w{M2{gF4|6#|mG+n$^J= zXfz7E?%0DWcHEcxv^?r`$JW=G!*e6ws$#hw7 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 T@0(G=f$f0;*MO?%snYyE%ipN1 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_stat.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_stat.3.pdf deleted file mode 100644 index 432760b4672a6aecf7d49c20bb4da4d70ad40913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33264 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 PfN=I~T3S(gF|7Xw7B6>M diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_time.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_entry_time.3.pdf deleted file mode 100644 index 29289ce084209a62d598e513f47ccf49282599d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23334 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_add_passphrase.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_add_passphrase.3.pdf deleted file mode 100644 index 4600a06e8971105c55313599bb9eed937829e194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22201 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 IpQmSk0na)I8UO$Q diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_data.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_data.3.pdf deleted file mode 100644 index ed8628f8eb4fa9f4548d61dac7bcff14522f6aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26233 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 BS4sc? diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_disk.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_disk.3.pdf deleted file mode 100644 index ff4845ee8d420381e31b639d86939dbd851aa7c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40240 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 Cr(aY6 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_filter.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_filter.3.pdf deleted file mode 100644 index 830ff89a35b09e5c0fd9cd40e7679b4baf1b36b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26171 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_format.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_format.3.pdf deleted file mode 100644 index 554df99236e5f232e660e29f26388c888339104f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27209 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 IX{5#ZAC!2a%>V!Z diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_free.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_free.3.pdf deleted file mode 100644 index 5c5c370aaaa6d8ff8c0e0dcfcc932b62199a7f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22789 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_new.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_new.3.pdf deleted file mode 100644 index 69eab908f60f7cec2b980bd476f06459d3258ee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20202 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_open.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_read_open.3.pdf deleted file mode 100644 index 3fad700ce0bc7e54e72e4c826d40d5f819a9165c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30177 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 KIC%{P^8W+iKB86t diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_util.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_util.3.pdf deleted file mode 100644 index 3cee5fe9b4bd099d4416e824411e4f27607a311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28970 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�>2(8?N{}wQ)xja!ayI!X&NS{sSgh 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write.3.pdf deleted file mode 100644 index 5c318d5d49cc145f75d114888a3a41011f40d2ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37778 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 !a1_z9C! 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 GApAdrFcQ%K diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_blocksize.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_blocksize.3.pdf deleted file mode 100644 index 99473f739a626cfed7d8ede26412bd60cee4b23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25921 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 EzZ_tG5C8xG diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_data.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_data.3.pdf deleted file mode 100644 index f40d11804ebc11bda1c077beed13d8129a624501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23135 zcmb@t1z26Xwl-XfyF+m(#bx1A+}+)aySo;5r??d>?(SOLrC4!yFAm?LyL;~*yZ8L} z`JcsNCL_s6@+NcUonwqeA}c6NLr=>DL(+E`l?_8eB4*`et*`4~YHjtN&_>t61Ym4W zNFz%_NMoSDCoCinyb4%b0t-y_Of5_uTqO;i3@x~T3J7Uzf7O$gk>yiT5CYcZ=Tj6A zC8V(z6jBxw5aO~iFmkptbua`<>>UiO9UZuMfJqrg2OCERVN(mkm+XJl6AUvU9ig?J z84M>UK+@34*ujL51t^gR0JS(6+7SYTEp#0W1r7DB4Gg)tVeB3340SDGT++5w7p)eB zkvwNrsK=?$5(kJC?-L>lnM2!zfYM>!+XBmG(y1E-V5&$s@M|V9w2Ya;;)(dq- zw;^W|!I@rwSrNxB>q-5(Yy3?{0k~~U$rMiGjcjhbCiMm-3(o#KBxAGb>dnQSAPfwZ zR8H6Y1ja+0F>`xu@1@>$<%lV61okYNjv(gY;uc;pq7BNCvKa1RU;bK4@w8SPwZ$+x zSmK}`6*U>GyAx2Lqx##0*U^jBaeHT%!S_kBJlJjD3eD5Da|6wleaJMn2F`rQ_`FR~ z!M5Lr8iO45vSQDY`6t=S=UdpDeDVos5PjRgxF zujk&_^U=%&-kU0e>d^7uA~bF#02k|TW>UuG<0Y%D|TyN-ztU@ft( ztk0*wxm~_FdLbaTh1{TVs5%d&fl_2fJ-aqMv5MFF`c>2WtXQn$+t+UDQ-=~ut5z&( ziR5deWWE8XQnQaL%Mp$OkvBGN(h^`FQ!mpK9JYg0ZQQF4g@`IXYp17KgQA=27hN&T zMsSRSN|O2_Nj z(~triH0Pz34T$RSVA=25N->kHO4N4kOP%mP@N4FGJAwCLs^md8em`+?m8*@K%FWh< ze~r;uSn@+i8T$>W3-Sbnh_?>b$d5&;{*P_^D)s0$hc>>+x{~PORpjUV$==JfZyC*b zOPk#Kgh#?>!9*fv-I&vCVpPt_Hf1G#@OG6fe9xvX@Al>_872xPi1{M2s>|n+Dp>|^ zzY_U6`&*ncP9Ow+bbsaec=-_Lw!V%{Uz=l^T6X8~po@aQ!Y#=wj@NHGR@#ENlg^%T zo-u}M4$&KSeDLc$G@Ia@r)giy1&G(1iPT2|i=qMX8F6?w)b(K^aZbeH&m~p8FMag`dGDpQbmkt-@IF_qOU0px` z;~OUB7`CF^CN#ONX_Ly*nH?eTb0Ek%((T%k)FW?gffYzXvE*|x;`Cj>#D)~iLV35+ zQ83#%#q98)UHS>DEZ2UMnIijJwpZz;dx=Z#Va=_kb_HmqQe7_9i6%LAua6iRLqe7E z7P^#3inrGl;RVteO`v93ocX_TcZPh-h`3kpvl;)6+^%wHwV<~%%Oh3u+E0{v3qc*s zgjn^x2~za{7+&UB#{Aa04SCsmcH*Ki#qQQbL4912Ij<+|?zus{k!hng?|#@~hE#i- zcOij!+gEZ)i?HwgrYoeku_N@?;M*f7tkR@bch~U%^*y(Q!^w=2DkIM8XVYtpxn+*D zxbl^!Ji*%^RvqNw7FkXDZ?;g|j^Fe8$IVl?y)6&*w6N=*el<_}2391Pk6;Rr+;Oa0 zgfF@6$Fq9DdTS#dW@u&b>$n7_UXIw8gZ1S~&&I$G^Gn9`_wlRfYGVkH)ipK*NEsTK z>hfE=5Ngl?i<#M(3E7w!v|s@8)(*hKn2-)w%g)fsfspa#qy~x&?X4Z{^bPHSXSl4L zwZ4L(g9ZRdMhF3lhAs}kc0w)=A__m7(zE~3MA#bGoZ&^gJPhzy2M7T3K#lfPX6z4 z{G8^WrSz;Y^gqi1^7Je)^nY+2d3q)o`kylaN*Q428D10slXNijKOq9hv%&lv+}}!n zD*2_9U)SF71yF#xny{*f7!?o-J5xhDz>7@K&|crp)W*Tuj*$MRil12gEP?@YEIWG# z0TW$2LUv|=r0%aYJp(;J#niyT#9o7tg^mt}?&beq-+!O_Tl%Xm%**v3rGMvsre5}i z6_D1MS{Vbov*NR|H~lNG;Hc;DvKwDk90>DYEBfaS25z*!CavIVsb_8R`?UU4L&)$4 zy#GPl&(dEI{@nY2w)?63ugpJ>P0-ZH$Pl>wf%_e}{TKj1*bMDV?aeKL3|s5BvHo^v z{XJH3NjX7*KNpBbM$f|3*3s}^7V76s@cWGZUMNO}-xrGE&xQI0_Y36z;R9U8KR$mi z%%76Ku7B0}OY)D}{+Du~=3krT@1_2=9e{fNhtyBKf0qCA^<^wT+5cs`yxd3se2*wA z3QCIny#)N$76$)<|Ia7Ge}O+e`@i7-GWvh_`6>U8`2Er9f3EXO>wnboM>$Z(uQhnl z_WSog<^GcYPpj~MLH}hy|BSwpg1VTD0+phvrJ+5|zs3ILsV)D%W6$CZ<2?u(H9h(7%lJr8YA&%RjV! zsST9>A3%HQ@1HS~5mOQplKX|3ytSpS)jx08pNH!Iju|}@-Cz6lUqNGJWF&m~z6}1Q z^d!1M=TfA;etWdp+d0^-Xu`~mV$ zIR66o1@d2de_erN0oG*#%3ntH`}IZdpCkQqOfUJD^vh!YD*HL3KW6x{xG$xDw)(l8 zzvla*`LCXTj_$AAFF8FOuqqG;W|rU98mJE_lL!2#W9MIJ#h<6(%Q5la9Xs@lYyd+` z16_L)Aa9@p7@7Wl@cg!iejaQ8NCSTE9cf)l!+*yX_<^KPg9gYgXn-7%kOjyXSb*F3 z#Rda39WgS(0Ql_nUx*)23gm3MHll{6#wNeAFHGa5?4>CTKnzH=O!fJ!j4gnC5eA^( zU}&jK$PO&vb29!(E?%BZFaRlCm)~=y_Vz$J@S8;SR}V}toxd;@Ah#q3=mPWr`T#?K z5x@js3a|iJ0;~Ym02_cEz#iZLaI`Wow6oW@wlf4c0h|G@6hEi@VwD1J=%0_5zfb9( z`Cm8O9~P(I4Nkyu|4u{%{_4MMB72n3|O)z^ObYf^!Ut?$`VWH zLTF}20v}BX7Q$IXh=^lv;1_%jQ?YtJZs;l|Ece||%{eh2K&MK;{vqCgP|sIP!!W+L zATRcdI;tGIl+4Mc2kxS^vkwUu*JIAkFahI=^Um`9{nCB2ieShRd5oxF&{n|(!{qtl z2^E-iOhu2B>b`b(j=%A*LNG5xVO3@lpx3H}( z|A>$_FRv$E_QsT!@Jl@K!FZqY66G&upW;{t9Zhes_U6S2&gGL5lH*e26SR=xV&aQN zRfKm8cE~qaC|JMb6*JavJ>E=jojr%~$)Uxi$E7Cf$g0-RDCLMRwhKJw@fY6u6NpPHDfnfJ%0(@5SY# z>v3J@5nE1RB8I>kub0oOk$F!U&IJg!<@~;3=tn4a2&%C1+6ZkK>07^FbW=-q!(4&6 zVRAV~g;c<_x|WzN@oiv0!Hh|TdQBj|GPu(2zDnP)N+YADy;AD7iJU%2qQu5IZsCx& zzdAPAQME2X6CU@Q&mV;K8yrTqrI-dj`v>K>?5Yzy6p!JRL9N-f+z9CmuQu|ufN8H@ z)sqqWu>&IY153qYpKVw#4cljZJw1He@b90FkI1NPy>nb#e1iDAH~`gMZ(ncHgPbEJ zpb~O3dOvJ!gruPLa8lRg8}aynO>g^W8zn=6$a>RSwLCo0iTGI@61h|i>z!V@d+)SY zlJJm{M(n%>4~tocw0e7mJVY_xq|)L?DbPsd%jQPhSwiER-0OlEs#q1d3JB0s6R zJcyvHL3m3Ea6H$wKh<4cl zQmC$<^+s`nt)J3(=0yo+Be}e zFkh%HG(Qd~StmJKuZ|{X>ztSwI@ejU3eT3C6)cytn1-t}I{S04tk~M$#C@L@2nEG% z9UY!f_N$Co8)`k8FdJ!gKW5(SSGt z9c((5E6P#)$|N>MPeF6);GJMhOVnEz_&i|48jAno99pE@TDY_@@;^|}=(DqOCk+R!r$4M7B4TG*USjexKF!yg@;=t}vF9Uq2 zY#zFM?S|w0j5|nTYeGY-gSZqM#`t}djw#2z=U`_SXYSg#MP|JOAF=#=wR1>x==ujq zS2nn0M#ZH0cM_^EOyF=PE?Vt6>eCrZXQ5U5gD_SAEu-lagqb5A6M0S3{cj)pC+e0< zN-b)bzNM+u$LCbe?$5u+0wx6cUg=1khTe=}y7 zoMA)DVsDNM-?-VU-&HB_SSX6KIk(ELzD^Rf{NBapwo3hhBMk3shmfnir zMz$b^>GPhRKC2$P*uIdz$|@i3E5FzbtQrX|3{oa$m0sgT~-2aA;R=EJ!EgXinuUdHoa;vJn*5lAa|=3O%suz0>Skup7Dvq#&t()tPzv z)LdB|vIT4s{ZJ6@13Oz^mWdf&^cN%_5dvHyTLD~ndM%PkxaUgPFHb6b@b4!~Ez5YO zZ7&78*^fDA^;V#o2ZZ~HaQH|ZmF`47DrLt6^F7Z^XOC#0DHNRe2|@%}4n)#>^>Itj zHZg&tSagFhV(-kuA%O&Am7|vpbyxOm_YhB`(2+sKa)3c=`+X^Vbse(syw=AKlW|t% zhD3H&G59n$yFnd0YR*_Uh@=)ZAB|^4AG1vT6oZkBu^i-YU+}GSZJIaVbhILV5k|6~&G?B8)kdw9W4r zN0tebNRL>2O>b+&Ny{2nId$}qwQIdqHpEc(Q@^@jzTxC@zs#tn*k3^~*Nu94iT_7? z6#Z|$pZ}4mDE#Nw=HD0#(3rx)!u~sBp=YG0r(^yvSqsn{^Y2*;kmUXUMO*X%20v+w z5zs>Ole?G$*~<%ed0{U0rY-<`8(n?F7Y_5!EXM60SjhmP5C(MxsRz408zzDZ8XPh@Y9n4zNqMA75~Ti(%ULn(p{;w3nqG*=MJ zwstP7o}v`;wY>V~!d{{tAyoR|zyvj-jxOS|Mt7HUJ-%Io+20S-Q05OC)a(tC zgt=9pDYOde`?$zfK@^;ro2^d4)Fg7v!<);jaC7d?5jvw0SlTM$h z_>cqzz4+v8#Z1+1Bh!_dtDJT=j|UdHjWfatzabY2Vpqn9lCdCT^%&`4Ri@1emk=tW z6bH`;GE@etO1wjYLl%Py79GYUdb=O8=(|OPDlpt-+hxfwU8C&~6i%cua8htSewLNW z54jg|DXA{=Y^(|O?1J+A#^w}+Z1oD$fBfs1F^25dd&T$}Wi1@{B=wNMe#s(LWI7kM zH$skV8l2Kn_Ux%bR{~39&fGQ#uf$kSce&!F0~%pIfx;Ki?=eP`QmzoFW z0G36xHoaWvP8Nw9nn{p2ZiNeDIR8v%euO=~vEMzF1q!D!{TDwz6{so|dkmDk=Rj(l5w zR|<>ne6;tTm>@V1c?^Pwr+`g!TMu@@UR^!~wdB<&HA-q2Oqv89IhY+AKBM-9a&>MSXduEzWhP|J%KRnq4G5%`bw0WVZM80?kZc>hLtigt@ z50io$p_$$p@-v-mg|_d|QFq1`gem>o0dzj8@41uFrOK9*ujAicb(M|ft}7BW9C6M* zWp!J1yF7UAn@d8}Dtfdyi0~_^U-qUw_NCZjjvSJh5U*wEnwq2z%~eYE+n@$Kga+S( z46rj9wcBxT3BB_gQ)y}v%OmCujVhNBr&YyES994l&`-xAYXbqqT7zXiQacrw%cUqb zh(xcXtjMj!5KQBP&USS8nD0D9K|Kh8pAJEpbdgAdY4BHeGO3V%^4rSEU0*|T-Rkpb zIi%mez;bBjV})IaD$)8jQmH1Hg5=PYX|xSlT1mmzoJ* zNZ2lk3So3()rIyU2Js0LRe5AA^k(NY{BC07cq@`+47aJ0(`NHdo^+S9v2~BIq_SfK=fIXs}m14m%N5FByZGhkV-I2aki;#M`fPD{8%PBF?W7?eu*n(j8sAb)@{>SH-vM zLPv~oG>T5F2U4SgSR``*;#z*6oEs^K8A5bpd)xCN(*w|7d z-cIjvN9#0a?_rIMNoe$UXqUrDL3_qcy86y^I%OXSynRuh>(=(Ob2pd7u;is)Pd&Q3 zo2NGCHXu+;+ngRa&j93u?VxFy)-} z-*C3S9ddsg9RGGQ{cTb{2pba%&`!h-By7M03p3-tGchs0SbY9AF}-B}HZigP zC$jcZ@P9QivHgpQ>4mKs1B`(&M?fFXUxdxV(B2-%+N>Nc^?-&ZQ{$h;C!i0=+Taf! z_a8XiKQOqTE{5M2+;6b{e_(LTEI{wr-*zZvcN+yI>~_=CRCD;IMQl^BILdH!G%#Hw zM?OU)2)A2iRqa@<0h zKPlQrU}D|kCXN@izi{5Hg0k{(X{E82W9mP~XuB0)~@!4mx>O6F?C}ja1ut}>{ zpFx;Gavp-$V=qWl88;_{hKv&&(G%B0s>fIv;1W6~&MCzy@Lil!+9nuoU7BAKYARL- zGT54JvZi@Tc&a|{W6~LaZ+qk8Cf6pDHHmd7gTiyup2@aU^0kq&f%1x`~ zCJW_^eTPIFB<#~))8`Z5Jwl$+a%)B-hgBDel!Alo^KKenX;K+}NKm0QFD?wHAnnmv zJ<8hP6OcW^IKUNlua4k9a6NT9*!Ah$pYyV&KlC?~5~BzpDq8Qy-boV#bBhbORbQt7 zsSaP;qOYf)4|XPK!sKbOmSq{#b6H`K02&Fwby}M3r?zPV%)ePAw>a!A4UF|ze6h_9 zx98^F+S_%}YxPEsvom4DS+r$=iB?dezilu{iouA5|4^}S6f4;(ywe}@?)$4i2@XdK zr{T9X!4Kz;F>^>a9W!gQ5HlG+Udj4-R(4i&&Z3~qUMjg$ePC5A!l!A;=-VMjjn5vw z6jbp=2}|L~#x!WH*1VTR*dX}fIbv2qC6qWgQ_FTtG>pi;HR zikm0jPa?#H?uY_(U@Si~OqzjOP6&W1byGptr=2z;uybW6Zth$uG|<65vs?|hJnk+h zHPAM!T=<)(4jD{26ye^{?q)w2zedg1o*udvT2n92LgYtsaPyF^UxI&RjAph)5Z8B2 z{A>!cz*KIk^Z9hZlSV%;aI>HKbu}QkVQg7nihbP*(^Gi(Yf8rp5pb zTg3E3!1a*a`vENKxLxE))&ys2mIKQrW^7j}+FjeuTVQSpv6I{Ykc?9Gf zYMtM;y%TH_<2aI(5>19ef%`xH$d)YUo18vTzHW1y!?R0n0`T%j5f9p zrG9^XaaIx+ENE7zS=3`$p98)rcqxKCnSHdG7$w7?CWKQn$dzpbTIy>gjuH>w^!Q`6 zVmEweZcU%J)m4xfdB`<1%j#88-^{F18P*ZokJue}W{c4muy^hT4fPO+?jd==gR|{p-N7ZLs(D zsd7u9_Tq)ztGatv+RYLYqppM!Pab(hPe{pJ%I;2r9JNqOIPJdv*37NS9_pGNO@!xf z&^oM?lKuH5&cTg!lkiP~2Oes@2^^*3O4=&bHC}&}Jt{ph4=oDP4Zd5AxX29M*4)57 z?&zU7e6ul_5o)wBZiE&ebls5AZKs;i9FDwmjh0S{nn~qVd}ZDMXYDR6qggyS2B?8$xXNA;FW6&t&|F-+}7ySoOyd9okac!2_g-6KJg(m6v&Ot&A`L8>|7 z^)jTZIU`6Szqq8(i>FJo4}m4C0%kpH%B+fv00^$!C*){09S=Sp`{YeF5 zNASFe%yYQ$<27GPkV|8k9X@q*S8#m0fiZj*N5ai~?}kjcYwp zhSjO4(&yZ9pzV7Yj5JlPMx4$w%Vy}yLswsh%a55bOn{^|#u&lsF0WbevkJ6^5s8Q2 zGvb^IWrT`NQrzZ7Y_Y1v^j*m96dRwyF66ZO+L z?fTDs1I0K`JxI-Ai$#=zg#*+PI{bndMZ#)BY9U&DE7f&v@gq!&$> zX!eYE``_W;G3TgtkG!jX&XRV3N}>+rRim));iv6rKc(Oj4ONDHI4+LbWx{hChf?ri zi0kHN!U-N}4K%cFj2Hp9(Nqm^fX|1&?HtRizVVr|~%1G_O&L>5QPoH{cXu=P0Ly z12U|->k%3yus(A&4Bh~DIKyC3FS4C`*Eqbcr|i~*p8UIkz#f8k;X0i(jZ|m39e(GB za_))?0Prl7Pr~Xsvufer+)~uyt0Q`f>#UBWsnv@Wv6*W`Wj1OdoTONa0~*7?QY#i2 zUMYGrm92_f^}8gjZ1NtEn39f}_0UWZl|&2%MmdX!2x-^E-m^4+Fs)?5H+}O;7s*%4 zDzkfH#vImdyeN%)bdX~aHtT@#&D0mt<}w?|IV?+O9Ua6Xt?C+DZOV?My2{15%OE*P zZwvD3l^s}KQ7GxK>Tc88oj3dpGQdt%iLJFyx6$Tq@8w5+(t^&WUPB! zD=)V;hWruw?D{ArQU=WTz_1_#4qSmvCqt*j$zEYMp~2FAXC$>St2Xki^IVHwOkyPxB`~Sj%1{eG>)!4%=^fHb2mjkAwib=Bx-( z{AIALrv3HCYih_9+vtp0c!Laiqm1Dyk;TeG`VX_K^J6-mRjZ(P3BKAhFqzX%*d-d3 zB0vX#3D#Kn@^9?@`s6#+_}gHpJ|7U`?0kHbIf{nRmd*ecdzz8QX^{^&><^ z>p?&jYy^p-vh{T)Of)Pb9|%RXWW1!JU#wRFdYO_l_P&$847>am=2xl?>L<13EfY`c zOZguu++Qm#>qM)9{p0<24hO{NYMt>q-6bu%#mhtU1#Qk`utJWk^3qJJR+=pN<4Suc zXOvW_yaFHym5PwwO1BgaHFZmuDnb3F`E| zTTBuDaQ2lN`%saMsMB5q%Eo!$ZHce-0SjmvRwcKc?eI=}`i$OIR+*@=aRyhTrB%a1 zT4+zFk#(nV#tQa8pR1$KB<=Q5Hk0LsXEKRD4l9C@=n>jx>5=slp}@Dwgm0AsY`kz@ zy4Vy4Drjlv!FMRBTMQVE1;^(TKjf&KCdt$tnt$}StId_M3Mw;-aPpyQHs&Ebk(IB# z&Jrxcs7g%SG}?Zb-*=FRihHmnI4txHxLe$p#d*voqX*U^;mzd5T5SF+&@1b%fHQ`@sW!}0MLH)@{fIkm4bDVda$%%*!pnjrWJMKLlC zgD|PvfE2`KW-wo~()0cD3YGQO0Q}W>) z_fH8H>^GYEaVC^fk$Ie7(JWu#D@MD+)3xNnA^F7gT%ScHT_<)?LTj9R=2x`r@y6XE z1ge5f?Q32M;OS&w-z9nYfQ+?^B~t7*I3reIl@wQ!VW_dZ3HvcU9cyQwjO8cvz`r~* zv2dTLjlQKPJ_YlG5=NqmDhJA|E%~Ow1?kP4n<|BEahe?$J@cnUlh>D!p3{34T+8m>~CDT){OA?{C;0YuQSpLKxyQ&7@{uI~i zcHi0CyZr-#taBw@EUj`mIz^#`dM;6^ak6XJHTmpjpCX;uCKy=`+)KewLNL7`MnD_? zeYB2Jp|KNyOVtBv=-BDqCes(`oTQ;DW+kVQf3Di5lobT}zx)TmseoP=M zfmBom3U8Iw4*$!vz6>ivIW?8ep=0*qf#8x*{p#v7f_2wTbkE~G=KYVQed4e0?7B>{ z&ddu|BxgkEv_P)Ox-RorB@t_Or;0G*;yoP*Vj4x9wB@w=TgnKCo%@e+{EP$d-MPtD z^nv~=g2jb$<~8W4X5$JFHlLV0bgS8l`DlS3vkAu%xeRwoNU3VqjyvY+!CXlW^BQ-h z@VTX<+I<~QMM8;`sR(SW0&zP*gcy|RH;&gz8jJl|tFKtJ9n5+7=V#*KV$t^*x3HGRlXP+e?`Nw zy;u(aHdV3$i~iz2z^4C+0MXO`I|B4q$Q#SQXG6jO(ZBf6A6!Topz60C!{^KZFHYz`Lg=im41r;EHZQ;K zurM@o_##R#F_Q9%>IL4%-dyF%~@<{_}noi1%fLFio|@@!oUz#Le}lrQTxxo?{)AA@*%I zu{=hJTJ2poI1v`Cb`-S@tW+dil*TE-Q!EBHY9w~*{7JHEO=+6+=#HfiPQM7y9{aGtN zof3J3L_zcDK~|=nl6?%)(O=;xU~nehkIQ>kEb%hh71AeAlR?Rtt&Z6 z+Je{!h1NgNhQtWD8XBXM_@;+bkDER@iN6PBDtP2Z7K-fcCzl?S>N06{9#ii}+GgK~ zG->w7xaycG;ig!~er+>?D`J|g_LLS2y92a*ib92^Wz}2ZP8=Q?E;=c?(mB^J_M4Z5 zQ!`U1BTy-FEE}`QGqgimbl1$Ek89HOqN?rpLBjtU`U+ar)`Y;`s%=3u5-N6<<<1UG&vG`=DXo|}p@5-6V| z#P*8J{&W1HmXS0a$!iLNcOmvIwKY%}@*8RuNw5@iuS};qY>m#n)7P~1Jh@*l3D2Qd z>-xuEG8(A!Lc%W=bTTS!EAwU+hs;w6W_>csq@Lo5O6X8f9$X=3H6NRx^Sk3dJ^!&m zzy8<^K1QCmEP_UH9dr8i(|~L)6^MgCOpi{m!>1n=oI`*pCwvX)_sMe2u$$rhSG&TZ zBetGu+$=#H*|c)IbrTyw6i0Q`^MRbWhbskSt6ql28X{qjaBsjK*E4o|=kCBR+Ny{o z3~i-Ij_&L&<7+oAHFs;=-dLi3Rz|tYDR1QQ1yKs}ck*;4$>ZMa&|Hmo+BXn)5EdQP z=Dn8)Q}?gvgAS$8Qu5+!EYs<;f5fVSulJZ822b_$OEfiw3(fXXo9ZxofJpG_4ul{L z4%;r#4g@oK8X_47Z+bYzLE~Q@Jei=@RpxZw+-JBXeJgV~??hShg-q%V&nH*R?>W!( zHXCiPPE;1g9wxhizt-!6>J3VTS70~IrKC|vK&bNRA*8=cyhq0e#p$?90u^z_hth%` ze}@gu$DM)*O1P8n11N)LpyYO1L~X`DUGmB2Dmd6}OtOCEkiE8?7#$c^4wsj{k6a_D zv0-_SJCURMrr1O`t-O&F+ouq)-Jl*$o&Y<8zR8kaqIypOucAzzv1;Cr zO9{MEktN0s8?N#x3yejRual$H$j_R9NfO*oIlsVp1;4Y##_VJ|kKL3o>}PG;izB!R zTFWlc-i@4WB$D7DLQA9fp2GO%_0EVJ$H5uYA{!26=_bCXQQ zGEa*MvAU#~L6QTkVR<+<{b6MMEN`$Kn9`m<`nSYQdgVr2D{W|+)yiqWPs$&GV)u4_ zolaa}D0C&(4lXZvW!WnvU~K->8>UOL-M5Wp6ubM4Whq(8e9B^GdPYu^t3hJ>)-bx)W7AYK zxQ9V_PT$%^*0$v8ELkk-VisWxjE+3913QNLAqC=Sp2I*>jBu{p{MjY<@X;`N=qFgF zsk1W*LeZO!n9hY0v#v8EBwumThY2tQVqtO|EJJ-~_LVv0RFS$nh!0q(W_kcAMOI)v zABI^KA;tn6 z=rQ8zE;0}x{{(i>OFFL>jqPZ1<%-kD2cVhZbPz22Xh6@yx_UDjR#5(gG*!xQ+r%m2 zAX)J&6>C+Nh>M{N}Mfl7rszL3OQS}x%SY!)JT;B-W6%5)^* zqAo9B<@h8+PoliAutsIeJVHHARw0)LjI^mOuV_cpGc9qIFd%_oxE}#VN-9y+VCfK|4jPAm^J7M$U3~M3tcZzXeRKat3NhPF0<%$ik z)b`koGIHN9W)EO8Qw>!pYtVp8y@#6@6GNT>8>~u+@{C&ECPJ|chLUZT(Lp;dkX8-|L*qSKhstT1Gq^{e5ffJ9tQl(j_KQ>T6IMfz#kVk9LP zb-f}dKRhNq$itOY`|Kj=)$t>%ZL(&8wbl8`Jk9B+e7!|!_^v2+vCT>$zL4Nli4&sw zU3<6%gp`oHOGN5~{99BKfR%q^q$}ph=W9;Mld8jE%~DDk3e8Y#WN=u;JmAZ_u#&2j zryHD1@Ta07nncV{qL3O+dtYgDMW&nh01)VYNp|wcn0I+0xvF+ml{bb-4Cjm>>C`AB zLd;}WOIQtHm^vuyC^v0+dASX}9nN%z+})-IGu*n2VXKr@9iyiPh`i+v&$#mK+D-RD zK|;vt)YPIh;l)TQAYNK|rFZ9})dvrrQ{4joUOs2dout^dnWf%`j9i8zc)oXL8Uj;F z3%A#%<)|4mV~XKbeO`{MXuR1ywp@b-m$;jNx9!6;F$cC)fIKGH>K+{2Skh`ajdPOt z6de;IXz+`^F*|WF)t>KL;rF^p1E3-XZ#t8d;%+-9n9S z7;PF;Ck`fToyBuH!C zzOeCz@s08+Z#pQEaYX3JT$Vo^|y^Fy_s-MJI@_guCk;EUaKl}{X{xc~XoEN1qrsi4 zqZTSeL)YMQ1zYCJiYu8BIkc*zp`a2kgsehDF2O`KSeaQ+P;d-Y!m)WAXY*Dr$>lAX zW^>3g(j!Telvy3crWHbvRi!)*+&Ri=aA18FBXbOq%Ib*vn;A=s56s^Kl4bUB<|NU& zH=L}qCcUSlt;A_INih0wP(fPtnis{do5mOAx_UNi9FjQ!iJ1vSvHBD;G%=adD{FCY zz`ION$b5J>-PE1kM8{_|mtQw^MCi9JULe1187NV`7gCG-@I0m(qVOu8WSu0{Y_X{2rQ;BZt^NznZ6d&n}9KF}o0 z?}4#h_-yuUCXG7kHVvXSob>#)aA6DbuL7sf>Oop|qa z%~X`JcYFIIdl`^>?L7BaLphmmmp#|AsX8B5Q9Sn?b|M(_h1QOIw|6Ids=DXq)=P65 zSa!K9A5Tc@o>AQB`x?!uS^?(fJ+B9Ml?lx|npo?la^JvSlm2+7&qntL+$jRzFc8FM%)Uv1n!qMDzz^=e!1(%3W-E@Oqox@;J(x00jYM0cAt>+{??aXPolQEE<)gS+vFlDrs7} z#-8k5EF*zx$_!eV7SZu09Jk}?zOdt29<_Xy{TrB+aFn0FR97o8_=vvVC^7g<)QjN( zLKC#y((A^C`hF(Sv#2wYP*mK}T*8hIqknWX)@Y4oI=QbT-|i~kz;+%V#jC{c0z)fi zbfO#G5FDy+ioDcWJ0tZ0Jzez~S65{;(2i=)DjL%qFg1LAW4JO**ND?w<4rk{?AS0| zk0xPzpD1eDnmY;Fc% z#|Hq7*#r(>$Y^%=k7?5EQQiE-dI+;VNEc-kQu^-FF>!GSTP(b4U2hkG5=`RprL&z~ zyttCwa@uOaMS*T7m|fT~sV@urZRbwB*D6A*58-)C_%Mz60+;e7pU9#UOl|zkb5rir zDMw%5i3@eP5y9j$1t|>@Q$EPH#EVah;A|<6j|35+rP=K-BoMcSh_rxVsk}XC?SPJs zuJz)143^(-6^gO5?$ZjqozW83k~8u~LYKuJqu!JAF0NjrdgG;Y;ti6x4!aM-F8XS( z2uz4GC8TYG2>(G_Ek>naV8>Xc$l^2Dv?8XCL&pb9IhC5P^OmXVtfv^Coi14zmDFN1 z5X38(X=xgwqX;H~3t-L6g?H?BnU}YD&A_Xnz1Z49^htDhiwjYz*2wCzVzXsJ@xFq( ztr$28&@|&<*e_-MAU&3Yx9c}r3b0^FyG3PXp`dtQ#!^_>SoWomy^>aWw*b23f|?Zb ztYN25$qT_t{GeBJUzM4McL>qKqzlCc4a_(&fZz;H2#q%mBxO2uw>l%;2QxOP6MS4{ zd4k)c5SI1Y1{>Z_r8B@Jk`NHXVF!_TCX0sM@Zo5o<72l1-8o#^B|lrtD}Ba_^bn8E zKn0_2VX8*(V2K((rVHZu91(YATe_@LW>O1y%CL76{D&$`$9j9pG!PoEqcZjR{NkQZ zV(n2IFOv$r`h8d0J}{o0N?9e)9|mi>N)Cyzzxxii)aEt+_=a=qx#ny@L&Q^FCJ;KC zm}Ek)UYxmnC-aEL8RT)sFv>ACs$8>PIM^wR7#EAt`Lz$i_M$oM>2me>y{i72-Oc}N z<=lgsIlRrrwj}qJ+~i*K012Qi(GGa=ju^Q!~vVy4{Re6?X0HL+mziDr7ysY4mQ zj-=f&x|i1fDdh9`Z{XXoAp6KiZ|!^T1Hp85{KqGoBdiy;mznneb&~q*p2>U1u``{oK~D$hS(TRP@Le%}Rdl zduO5jLfjVjs;RFEm1f?qI5xESsIUe9e(_ zXTm#AwzO5%ugjd?`_J=vB@e878+y#gvUW~BZ0=mSq&I%T;?@5-yR=LlQEqA%kQc8h z?|k}vSXp;{6nf9vGqY%UWp(e3T@5|oeTlY8zWFWW5~)~K(R*!2eM3%I)RIo+Z$7Hw z;h)(b?qV}$>}(m=XWu;MO83#?$ZZ+-eptGDa&^v~ZPlGj)ylq&lR1_7W^HKIPgA0g zEPj9Ao@Bw>UFG}LJD|DdO~kSBT2%xT)~cC ztT_})d>yvD&(ga|BbeWLPkU^0arf5KUv}RvSs8L8ZA1A9L!Cz2F@M6Wx$PgT{-9dd z9@ld7ptLprhEJ7xv}{~x-7?Sa9jzO#fAa49u+B#Z9-(8<5ZNoYnj(`EL!&BJW$Cxp zwY1%w^J2~ETl0Pmy*Rd{nvR)~DtjTSrsLbn>=>i=6?sPU{j=lc;zpbC40n51(;nl& z1qJCPU*KcI=i0_Pep%1-MQqD52`f9hD%-1j7M8E^;k0^I z#d-DZ#xGhg#kW6K)#wXTH2KWvKaanx8k6x(bZPK@f}apH&@JxYPku0KKtv}3ZT5=j#I)4pXkNj~daVvCAdC>N)naq9UIpqmVd0(^V<_TRahVlp zrsj3TWw%?*CSWg#7!e^Ps5r#P0Sv%n=gbHpqEQ%<(;L||pf~jo2!AQie3#3?VwlI{ z5qT()oy)@rhG8(A#7I&I8bap^n@j5z+MIL1pFa>&=AfC)De}i8f{h8xl!*}{9DCx3 z-zVYuL;$Hoc*j~D50gaQZj+wX5k?uUXADA0r(=W!VU!Aiw}14A5>MO# zkaA>y@CG=fAP;cI0-j3m&NXlfH0AYFBqiVOboKj37?A`=v4M|2T2aB=j2snA=s+6e zpu=hagJfKxhEwKB5+?~EE)$YuI!UoO#gasp92=$t^A1*t{&VTiuo|K?#LCX4!$MHz zadx8-Dd11BL;eX7Ns7e%&irNrT5^n^nISnD?JQ{>8qNRClhw*EWL}R|+jHGk08K1X z|3AxQv}abII~cIT%~||4p$8^~#lXkrgvli!Vtp=av~xg)f~s^l0EpqIv0|_iQKcN- zbeUWhgVJAd2^LrXjm5-Q5Npxe@)W37s5cn3Zi@?5X4w4N`u^Fln3VlDemm^xSR>4p zUj!8m(}oQ`FO&jgl&;Ym=;=cedW99JhkpbHbqx>cb$wFJu_G1pJlK=v3j|g+Um~$; zmM<+_Mv^3jQ&3enj=~Gnp!%MnF;ES$Bh|~iK@6OiGZ+CA18_b5G1Y%TcZ-CQAVy?B zMp8Tuj=vDwfD8f>0~01dhLa=>hxdlb2s}uJ^PraDdblh|kECR@DMkl~b+C)xza2*}}ZTb!cAK|UCYC)EYm;v^#hMoplMmhtGJKpAj(f_#t?anNUj zn1lSn|At^&F%KXL^dV+=24A2|O3*<$WoUYMUIIp zTN0O1L&kG)T0qut07gczH%x^FSXT%T80`Q#cN&(_G{`H4=KmUH)lMmA)szWvB-WGX5t8)sW%Lr0LU4G*cE zp`$s#3{1+Pz(C4iqAVmXrUdyFv9*R&fQ&#^AV)V@pfk{l4?=*H!T!&7a`Fm7s>))J zmcl|RB9f#GU{NtODG@O~I}=kE2aqEWas}*YV(a9{CjcqRJ2~1pIf{d%IO8#709QVz%!B>;qqBhY~qAZ}&o2owbx+nNCR`H{hn4nRX|WY@Gs z%>|n;{g|FJ>TFR#SukNcgtk%`f?w=0Y@1oJwIwU@9>Iv!yf{?IO~CbN$;23vC3Vh+Gk`mmi1Oqk_J*;pDlptXjre{9{Iafhm%a5 z&_&AB==Ak$0gE!ua&ag+!W+UW*cq+*nqL~dSJ+@#m?3@p;`$6ejFpav$*q%*P3v{U z<>0Hd!sxjbDv2IV0g{uFc|h!o8=Zq7HSQbEbcQa+XPbLpdK-ScvA?WtQ_VWb5JUHx zqy(Xka@iGs-Oo&oAVL2SQOR$qoo!Q@Cfa~J$mK~ox9jmV9{!`!n=pbSEo5n9vtBB# zYm-HtwwCl|IcUs*wDxP8>&PBXK5sbdmWJns;m^vL`({x;YCiMXn=b*6;?(#>hJJR0 zc6A=RT*_T&iSI5x9wUZ#F&7DwnChbc&_Hrk>FYgRwz43sFuyP3U>@fOj{^srb2gSc zvdnKzbRy=CW;(s-awPD&xv7;fw#IK)-JXDIN-KJqkYIK}AZfgEn5wcqSwk#YT~TW2 z!ww646+>${P>M^*}tIi=>`C%<-2hUYsdBu&wP@$D+lWX$g;bl>1!8 zjh2X1lUOq%>?TC?Vah5F=gam!Rm}G1*pd-cN_7TB!|~7@W5m2c@`8yv?Y!D7WV|cy z&?xQ$a;GukMYvMM&2?D0!-!+Vl1Ax6e|d*@7QJuL;Y}j7MOvrjw^ocg0(XfzS`EkB zy$6(hxt2LpI(~h>L!WM z>JuMIPMD-JkZAi-c&$~XC!feF?jr5=u{_R!<_ShdQpV=Wux+I9?XnWEOU)A<%g`yh z``B|ys3_)gmIRYXTNnPhx&Ue>KV#vzK#_O$gQD?)Q_JFQoR3Bk&kruaB}UWX6l-CD zm05c0nY||_6J&uUXerLo3%+BHVR5er`k$pfs^rU(VqFu;L;fI2E?z_{sT0LQ;pqaK zJ`i#6@st;)>l094jIs~iRixv~%Nc>eZ`-5hRM?jtm=*gC9r$K^7-wqazPl-KH_1X? z9D}e}t5AWBy$xQ)n%ig-R$Ku{;5_eODS297)s-1i*YtJ4qh0uHctIKZ*B&@;=5 zWzldbBc7@51zCLJnmo&nablLDcxn$Ga1tyM%G<)ZIYNB8^^aN|n>u`I zQc4+=++PJF;<%N>J}oCyxswgWQ$q)f66Q=^KE7oVb7AH{1ji|u4i)H$gEAGLj%{f% z7(8v6x_w10=22%aONpnn@wvvAk3TmI>dk&*Q>KRk=S(oP<*8=|r6wFAP860UA`{~m zrV#JWEk6?{z4($3=@KzDqXY{<&Cjr^3fEY4sEQcH@LuU#Lcc;ifI>yMp-l!OhpR7Q z)YcoU)o3CjM@YFAXTQ+Lm838*TYSXaGXlz54{jW^eo^OIucPYFu(%>yL`zZTcO4$a#1tnb-+5zxV1tqH}=yS8b=5|vKpQhgyn zHWGPk9w3z$x*W05cq_NQdla_tZNrGWtr?$amvT=hRYYz7BJYqZ6bm<9f}I_}x{Xok z|M^{xMksB~62FMjWsyRB9B%$m*A@v`*L2j=)Av5%D71Bqwrnm2qwQ==IZH(EIFsEP z0YOC@+z0A{%PYA2jeu1cxun}Y3mhE`Iqp(@VdX_fdQ^dWE!jI5fgdnlr3aQk8(}sudy)wEpA|8{+|R6@tO-t3;j5rThFf#lITC@*eqIRpfV$| z>NtF0Wi9BWlkR7kCY6bx47ws=`SE)CFw7)137h`Cpq>5&@Sx_xrj;oOWpj+=lwFtj z)`76HZ?oSpQbIq%|2ireuoIImS3#OhBD*Ew9%+zeVz_@oYdWzpKDHXYSFv+CZs6!~ zvAP!d^)|B(cjD`9Q`pC&eVdh~XC(4J__4COJaHEaSU-yu%hMdq0`C-P&I8lS2djsR zD-G498sv~$y1rx`pCx2AZzO7yg;$7#+@n>LjHK!)CJ)8V;lQB~!pYF09m@RZ>K{&DWtFdV6xZA(4=N`FrP z%d}Mrhj!)e>d_19xuTKcl$xg(<)M^$KsS%hPvkNdftl4@ueq(%G*i6gK>~}+Y>9Z< zj#qb5#Do{k{S)xon~^9yS^#kyPmWiS**=dHi9izw`cpyZo*3Ye%+z-D0UR8*bb(pM zDQEeUb|?SE3@d9~?FE!p5*JJ{-pbn6;Ojj@XIG3}rbsPO>#1D@c7}ko?Br_ebOBmd z#K#fRezg0_+gH3Ab(*k(V@Am1i_8MV*Fyb#WRD66IR-cTm?MqxMg2^4NiVefq=R0{ z5$&*I=_Csz)VuXY{&;zNASs=;2G{#lDggvA*=pE>hW0x0XnY5D@pOU>dm0yYa%Mw% z7-7g<>IYqcD+XZlPEOpjl{NnC)PShyG5@w`sY-YSQGhKoKg`XSbU#4*t{SO526Zat zlxI+(f`)c1Zc%ntzZwS~M<$>q>ZOf&hl306(OC9S^exDj2aWwhZrmo-Dqq$oGu8LU zG_W7j`963P?^8*+`bx*h4RKt%zi9DUn%dsKv*3N!LikD|2zp!EGv_=u*@zOa!NJb5 zy?$ukB%vBfo0HbaSUl5T(rzX}Ppg#Uw7LJ{kc~u!SSl7S3eT*7Fm|0Q_*IO+W5k+H zALT6PAHwP<^?-{RTOvnCq;7X2j0LiUk*emMuWjmI%0<6jZ{BT2el0cH>QcPORY(kP z+ju4OA{dU-2P$=A7~5kc>`lDtATf*DK~##JF|qS8zo-RbAa|Qr8JI~5^kvtNP1rCj zs8d=6rfBcY;zIt8kS>{2XjvG24eTXTB_SB{{y4Oy$yT52h}jYKe5J z(W?k^L9@h}YD~hUPA#D-=~R9$$12UO=#PEezY`Z|q1N5%t8}xb1LRxu28Bi*X5nF6 z9gKg!(ihlU?fZH#^?aUSdp*6}H{f7>5$%M9VVZTId;Jz(!|NpEj_PG}=9!ct7H+jb zfUw{SU$I|m5HY=bh!AxnaHKUSe#cP>QwX+{`nV*vT3XQ`C29*`FW^;3;rbG2H z$cbK&uq}OI!n5kPLAGfu+e1Ygc28!LCmjKFv&>=vW2T&N491jxoecAye1I2fl46U>%HaG}OZ4Zhu$wk;iu2 znie~jM|T~dLUmYzHiZAKBg0uNczUF!Q?a&2SmGUkk~-j7M4qKr5eoILz+1kBXV#_* z@Yo;Ay_EAd+*J3V2QNFKG!6jvt*-Z4s~a*`F7Omdar8pkT+$z@F^ z-CbuOU@vWqZ&0$pF(;Ju$rp)k8u9bJL)aQk(xV1aqQd3qha@i`H?kfUBmWZ*+LUgNXTD$r4TC#VnKNg3dct3{KnDup7hNjZ#g$DXeM_1D? zPy!fmYJ;E!)-o3CVV5Z^B2AYfU_-5>kP`|G`@x{YBeROJ8ER`bb4ipAkeiGz#hZDw z^yH_G+iyEz4zil~_O~Ne1a%By6mVUdB?!Os-KxlFsugXL0rX{a)-$|kFD2(6pBF#2 zXPJ`j57;)hJN_&nfH*YEH(?`L`q9dOuGo?fO~#3S8UfRVcQocgs^x~i6L#5Uzl5RT z>kHU$D{M!MIf|JYT1$u!l<3 z`;43DRSgwcojJB2eIW8TYrto z9u8(88Jnmut;*$JqUYq?eL^}mjR!g07(xwde=nw1GW&(+Ju?h1@r2_S z*HxdQw-!gmHpfvWm`;s82s(RI`5De4;qWS0?wP~v3f1-k+fWMpO%n-Wb_jsw!4&7P zQ9mXOXS_V4`YuUOp(fUGonuclwVBvml%ey-ckA!W*cth@(3sCqyv9YoHd>!(nrcfe ze3@Uh$;tNdR02h!3KP3{B4-{7&K(dNO@iwS-499+hSm<3eE=j*k>cwg0Ngbmpo^;B|?Qbv|JC> z=|&P-n?A)Ptf-$Y=Ofp;qDf}9y>A&PK)|sIQP9}c$~@7zr44&;<^w|Z=R(|%n{Z)f zbD>OOCGF&PtQ%*7#dOayQ9vgv_A^Amdf>fb)L?AGIs_l4NYibLj?w4U9Fv$clTw@m zeYh_~s_Ibih>&jzEVGmNIGjC~n4x*(3sUhL(Hl#NYrypR^ygEd+d_})0^CLlc7$Bi zHzh55r=M4$Jvy50K7HFvhWGI+Mmng$&}|v2(R}z;4uvmA#~=;JF-W%%Xis2q)S6h; z+e}!!*SLQsR5ymF7B`|9Asy0jru@=Lvq{Bslb}`BFAGO_3P1v42r{XJ@!mB-%p~cK(+L4s-491*^X~-pc zTOjeHH}eNH-l#_9-=gM+aQGo?=H%r16*hDJJ#6OspM=eMnwH>&-lw-^`W4H_&Z2Nl zt}Z<310gK-iDcW!BinDAF(}6SIxC)-VphaJ$2T5F-xGT_ z=IX*yBaZ+}tv{sNfP8PcQoq1ej&C99UVeP}L&?cgb-AM4a;_rZw7AH_AacrmI3ea> z*GW}i$aUr8(>w2l>X@hJ`}$!d^8T4C!6*J(SL$WA#~1L6c!i?@12Fuz>*p<>tvseV zORRw7GSkb0;R30BykD25ODs8J;>Bp1l%39W;1K0(!Z-LID?LrSYu!CI7_PMz!6mcd z%^%Djk{3(bxv3{f-V*pi?ap|HeGMnx;}w%XU1G|O5(_m=lktMbsfL9Q^_FYvg2}_p zNnKsv-fgtDQjC&AOjlaXI=|K~r%5(R zUHwFjEPyg21)Ehl>QR&l@n+jcmdOT-O)r6z{?R(hAc zY$|pC$6K_zuCop6=@*Qmb3XVw643qeud+^X5Ssy$PDlb{r!v%D z4XTAtiUSN!U;|!U_>rRN_8*2h_aN@1UzqBci;NRZ%>vBAdNxj}a5l4QSFPH;pEqTM z_UFFJUBdNu51>@A3Tw43&SUZI`#kzd!y~wUrz#3@PV<9*G6{|11&mfdLOL=U&iYs` znYtTd014F_0nKJZb9+Rvuct=14z@VhfT{XpQ;d>?;B4?$$FoCRhaDzSLxa|)3#AD@ z!^&MMNwOh%3f!-jM@An)K9FolJgX{l(Vsnkn=ZGHI3Cl`ug@uZ1uB&JK99|{J+CaZ zM!%iE`$nbjtFB_@WA*(+*s7fFNY=342Ep^a3DbfS{2_TCx6~46Bg?fd=+RfTEidN= z0k;($ANyB^@Y0?U5Pi+Ldc7119e3NA#;jT-D)(SKgz$ zMt*k^uUfU7wxPw!x#G54L?XuGi=NsP+FYIq6%(sEZyKzUBA2#xpX%u5V7=k@hjJV+ z-|b7NTS>R!$!zXQRj+*R3)gc;i<+JKBBHsEz-38Yd-^jv<%ElaXYtaDY2B{S12r6m z_Kzc`h*}t;4VMS-TFx_sqQl`xe(fQsGc9v3$&pU8FxP;kBP-wnep15t(xSPY(YQz5 z{=72>TFhCBWHJsSx;700s8J}yBs6C}Hy^ps!fQ*_g88%$Lww%va{0>}6(6GCeZ)b{ z8&5=Z2HhI4TzH4Xg{c;b9?8t>sQ+W%H%-@C$Zi z2N@~9@}}YXIq=r=^=ZAXq}M9VB;YSGev#40>>g$UQew#a-rAyoSX z72H#_jj2Bc?^25H-7!$p&BP{6tr%q?cUCVA?XyB-Q_^XVP+T~eQ+Lpbrr8Vo_C!NE_-%DREGV_?MJ=iNy5Se|95aLt3{U6GqxR9B6)hHJcD2WT}B&-q+?ra+5v00lG9T77+tVxy!LM}%OJ zgoqX6+CCw7V8-Wi4^UMW8BVyDN`J!ZGoY*JD)zJ?77^&>y?Da>-gdLGll+Ma9xx}G zWrF3Afri^CxtpK_Z9qGw4~EZdj5QvtO|Z z46*uZIYrB_h|p6yL=gL+&4Wnz`9%z~pWpuE6{YIX;(Lt8 zO{D~1$k4iJw|NSSHVpaoWC-l(GIs^6D6-ftxvKr?EU2{(q<2cl2pMHJCYy$_xFrr{ z0zz7oZ$U(>acuqvpda9r`q3X@MBgIJ-;9Tnk2!RCY>8Hn_w-bbPgFIqyR5Ont6+mG zEioqu2C|2i^p*r9Ix{!2I-*uP$9;D2R5-O6FWu*%EKz zCa>|yv+XLELu<0{uh{^TDNomELaiTvBY3oAE$|{74g`Hu$>FK>xZ6_&yEy-|qLjj| zfoux8AFuCpbvxJg0=BR~AQd91U07Jub}00Fo&XDt0M*2;u*k%txlw5wBaQF_*@JZ5 z*Su{!&BlyF*y!8Bw&>7~!L=RS47t>>8jRnELb&VrzcFdbP-kT}3fEtFC0dK%my>;b zx6f0}LhF~G;9oCC3?r1A1ddhrRVdM1oCNcve5~zp1H$4xAI`e76|L+Sc@t`nL(Vu3 zo|;lin3_3RSuA3lX^Q_o2+3{gNf4AXG0z6|A1{tz zfhv4wNYQUir9Q!pEA^(HP&GlDJX5zd(*Pk|sGd*PqF21}wfa%xvo*MDO;rjCwQ#L; z>jkOxFa6#va68Coi7D-$vgzI~@;+<)iqQrYTT19zO0%5FFv3Xv6&B}FxK%CADWV_q z`huvBVX%dBx>OC4%~z%}TOtlCN++rL_rUKx2+Hi3JG82#HTiq=Z_)4A0K6++L@l`; z7T>r)i_T6LQXysIJ`SXlmfS<5d$&Z^4T?=V6tD-v@|9vUiM22DfjxFj=Y`-+3`|siq{-Waf1iE7qh)M_ zle$q+#eo%Eq5VSBaRfg5VU68 z!kmM4gX=I*B3Vn(`T;gOqYo}c2B)FO!<00qc-R)llKs!xQ`RfQElmhjLw z6W5pJD12?_-{iR(?3y``TU)8|s*|j@`=(FMExt{kf0Mm*J=~j;=tCHEir0^d+1u5F zDWhK2`EgUIqZe;m^fTd)KP)-A;j|lWH?~)Ch4sUa8)+{?r=+d5X*dE$*OQS1xUf)b3lvXXnWOOG4h6O4C1U3Nop5tO zGyWBa-(f>VLlq^s@Z8Ku9yz1l@;U~+@Ol^Mil=-%MS%e@2wlNz3#4VPwhGIUs2P7M z6_}(=|Bi1Lrf^z7ScULH89w>;CC`dJ$xz#!UK}9_TBb74KicJzvq~V)_0st4n~pp$ zNIECL**MKOgO69hhLQYw86hD`K+ILv*J6OjkfB3(rA@}LU zeHy~b%*^&P4Pj;bTN=W8zY*ZSKK75-IB>X6Lq-c`z2RT35j0(8+*LBLD`NG%?`BJm zzRyBJg9V`w1eM(%wFur+^SR)n_&Xreg_WFZH1MkJ_T7HJKOHPuuw!5vV zE?dr-z2cz3y#KT1(^%wR?w%-fZJOQQ(e7yhMTyA zzG^1hD_*Qtw+-*=%Ix-O{MR@(M`r`4u#BFWrQefm9QeOW)9CV0^Ah(+S;=xOFMjfq zswYeAjJKkqf~fxG=TKlzrTBn<=9$BZru{=B1^T6N$WD2P9>_(UMA@3ZS%^$CR3p#--hLPp?qGXHvIjA z-LdO-5RapSU)4Fkt<$aN%na^DMZ@P<;Y>@_bPhVhw;K%4RrBW)qGnWI6cb334AjXF zT4&AXTSUDf2SiIr^I1mDW#k1v8jpMK09ai4Tq}QrQbyav28g!0&?>yh?#rI+>1`8W zNE^2QmKd-uRfrj7r@g^QxQckztN4i%>9UL1281LKQ7Vj%)^3!{HCprO%0k8C1y8&2 z(<`#b#qI`1e4~SteU04kkt+i=eof;pPhpKG3iTZ=m82NIdJ7I5fJTH~@XZmQbM=MIbm7oOU&`oO#$73bf~qJ6^qgbqZB$&8LSuBFFvyJ(O8ECKHQSF_ zFFXSB+{qI>TIXz!S4EROptn%bxULn+@s~Kw7~@#7K;k4e$_>m_d8QQJ|4b;5oZU%h zXU)|{G;!gM2~>bpK9>6oy1tP3^lkcyO}ReDRcHAQn=05G)d$LW&RHuEZmQj-KC3P1 z8cOigk$SqmX?sWDfXAt@Nljf6j9bj%y%IBh<(ol20ZUL(sL&FaMmPQ{Hco0b#xOHP zf2q99`|9lO@>CZ79l_|+&7t%vH|BiW^+v_=Q5j4wCdC8CS%2`s#Q-)mZpd)bisK`A zg@R*Le?um*ndT6B2XZ!m;t#jagjW&XM1)K$UX<=zL|}=m<(@S5BX^iZHrenn8&_Oi zoF;p7{P|p5|5^1IuaA%21j6P^il&yUi_1s*2xP}=t+dJP94{UH%P8jo5!uiO1r}#& z4rDRiT4&?YCRJ`Jc67(qt`ll8N@Au9iLgvR{Ih&?Hl7W9P@lstwsSCiuY}Q2Z%ly05)o5pniDPVM&;VriX}v$Qn0 zi;Kz(YHuTF%IiDb;ZtHfZ`!dZ&oSjmnf$4!$c+6Gl7nJpNe5_=dZI$`Z?8<0P(uS) z41#-u>antTjR_=*u~0w7(j#BLHu@G&vflKki?V@rMGtLQ?}HsXMLmK+u&=Q3c! zvuVQ1J6p^@f5*-(cJB5md$xwxqd@z4m+VsE`=#PA>C0J3L#{WB;#xG#4Wp_eaZ8aK zOE%p=KzMrM#5TjuatF!rO1JvkvEUnQv>7?Sw=}$u-r{zT>PPtSzK5G};y)TI?8{fh zEfnOx5O~QTHT;punVtXe`EtDL2;&xNZrN{ygS~MgwXv)_~Wk#mYRUBFCiFC2m{I z)qY%M963qu$rG1fqiW^jN|O+mUCJ^%I1xBf`>h(KW?029j25&jm`co#h|fTHG+Vm% zrcYv!&t^s_g^1(=XE-%~Z0v4M=(zTieTh}kA4B9i0FPnQY40T*5Hj7hy8-6df9Aeq2@`cWFqSWy#*Hz)z@K*45udvb%ZiHMhPf%b`Lg9@vqZPL_K`a64kG zY^VfX(UXvZE-XfP%8c0p9Wv9@pi?z!9XV8W@vSbi+-4Kx$B%xHGLSRo!^FABY>H`< zaMh2DE8PWciOmj~Z%+a;60o4cbVnH(svE~W3zXOo_{+JQ7}<--6r-AQG{GgTvVI%~ z6|hh7Ba6}2ZrZ>v2SEU5>L+iX6_#NVk#pzjiW6X@O!$|DES9hm)bF(|ahKnQhH3jC zAA|7HcKDd;pC1^0di}%Z<*a<_fp;~l%zkrOuz%G+U5@ctW_D4=%9_oUMSB^kiDj{K z{zgnv&@B{|GBpLAwWv?%Qi`bvJi!u0hmpc*VPhWx%qkJWUEzDaZKrznCb*j5`j=ju zf|rv80xdxojk9IL*W&)4)E-T3VGFsowJPCJ}Gcz-7qAs1; zp(8(Ys*`Sa z6?{X0!%Bpmi{712UP@(Zi!~kCXL4`7h7mT%wa`x~Px!PJlJK3gw}$$oe}s^2pN=c+ zD>-qrO{49{m40fcipW$^Ze|S!5#haOuPraAy4$x?$ljGxvLn14%kO%@l&H8hH*ONl z6;UxR!fW6;uJVGs<#G*Qbz1Vi>(Dmd60D+3+10gz3jqyQD5t0SbJ zn5(0N@;=NF99Nua|lH+=|i-3e+k0=J+I8%kPi0+2<`t1 z23hVE@{>W9U)=n~;KK$HrQbMY`MHhc|A<4@hwUhTs*siCf!%*lA4X6{qwh$N}R|K!v00(!NdP#M2QRek0&BZ%pAzf4+8>}AgK%UgK&@{ z3o`SAH6cYNWaj&sr}P)42fzGD>2KpaIO@;ZU*oW_AhZ0W_>=fw6d(NPXP>`Od~mFv zwJhAoEcf$J3GkN?zZ3sWo}c6VOCcT{<0sL-5Ba+)|DzE9lK2CMe-alq1OxAv7=VM2@d1$W!`dSX1RFbm>>O-K|MRu{TOU)_wMt@H)N@XTw~$9ce7ug zhmlyhxJmDi`?~u!koNb>vJGVSJIKZiB9@Ji4H)$6T-nLU@g5BBT_57=KiA@)88>91 z`=wxUSz!e^jXxEvWNU3`^UwPI!*L#F(SKAgJKKLyFDqoW-yip4-7EjT{9pv+dvX3J z$Gzwe;&a?9jQ#!_nH%yflM^yUI5;>Tj)yWcGbuYe$HVpe^M{cks{2{T^=BD!j(p#a z>7nO+i38H}zSaG~4Kd5l@-I`|^9eD>y|Ml@!mr=^QGQDCi_<@i33<%=v+kF)Ke_s8 z(EGmk0|dE^UJ~h+2KS%rlvqhNCAl;iktN?o_TSuUY zk(CwD)bZDe1IWzWQTHz=g(%_I+W*T-Wkl69r4^q;fWiR;bogfvWqE*uf4u^*vH!LL zurU90QBn?w_WnE|>b)=hhtIz>z;EsUOFe}8pJV(s>d(>t;rE{AKea*rgSX$W{;kdb zVl8+8uzy}{mEEk3Y^{D*W`Dvbqy8mMIe>EL{ zr}^LNAzb|FG=DSqFMfV<`nz-7_xt1eKV7}=^}lhHe>EQ!WJIM!MSdw?*w)JAZ<_xP zlky*6nT6@+r2Lcbe?J``5`f$r-dy^#Tbgu6mEW>%1t9T}kP2((rs&wP7G`>!hpe*8lfEN(t-~kDIeWPs=gx!O zmzFm66IP*XVON6CJ$b0^2Y<$)e5Dn?2hIwG0a-#yTy9U3V~HK!c% zO%`TgD8gXrEgXUP*98J}inl_7vXsFgCnKBRF&+`>`K=d!Frmf@$bPQu?6C>lpJ(-6 z?G)QX31dT+((|g=UIY#^AQow!8WjKWHLJ`yB%+>qVU?wbKBYWRe6i5hkQf(R}?pl=ySORzgY`PePDb1+$}w z){z=iP{x=;J9qZbtkbFOm`vR)=&LZu{&3K5=ONGpfe z_KL&4m|WjOe199zBL)=fJ1*&(dl_P-tM{ELPO;3%{ZqvV>6mz(iVBw{)U=ZAr)?-w zj@9DX)3gt*8PiwEV$kf*9*t|?x|n`VTV#sXA1GU4v$t${`jmJDn*XJBm#dP@yXX^Y zSv~v)u$t3hJ5YyLFbz&_#B>53;xk$zlj#$6u-|AJBL@E)`k)1i zyn$gg!;vNHWcb`ps|pwj+DGU#0gIbuW`5|EpXHL_^K)?Mm<;I!#;3jMueKW%^jmD7 z3tRcRCPbwHa(n4CP+kWu-G z3iKFn=yHHa8l?@w%h5uvq_zcPfj~G1b zn>XpXaji&P%A7l|!C_K~+opKHEBlIQzD5 z)t|lb5H+Bil3p3ATXDrYeYpV_tPDM>-xUeMr)A2}x_eJH3vT|lniQprCh;vj0*9*q z(R0>0P-+a*(l_!v(dY90&yg_*#j5;0cBhQoBrP?8BA}(Kz+y3SScErY<0$JK31wejw+F z)~z+Cyd9slGylH(ME8r^<~fx63BQW>GbDZCxHf)OX(AX6Et^Z+@Up-ZbY2Z;+$;Uh z(3fzYmD4TzFZUfTV4YWsqN_tvzqBmBrZU;EqiZ`YSoneqy=hCUEIs9>grAWLm~Jjl zfssZJ1_gRBqhBmJ$;(1N4dRQhm@`212(6x+bW1673p&1#7&cykn^vAoh>c0>q-MnI z#G_tRYY<5^UIbxcjF*o1Oqjs|Vcwy5Na`Ja*t05PQs!8_)EdF7d&KzuXupBS@p8dZ z7s|4PbNe7}Np5Aws@6;26#*4S@0J;W**rGo{9{1hkG-8Yf4rkYvd~ATb**s9iUm{y zq{cEZ1v|Y;Z+br;q<)>o81eiXnkYvHJZV86gsje@q$lI6WRPF2cJAdY!duZr|0qwx zMj2%O?j_r|JcXXuBLI4aXdJfUd2Lu<0}p#kOk%<%Z32>59hB3(244{N1Z+kU9^5x< z_|#UF`}F@GU!42rd$RuyXB=uAeZ+@f*THQ0zB^NnVI3R%c3*&?U!T=F~C_oG#4v+vy0;B-a02zQR;1xg)AP-OgKr&r` z3P2U022clR05l<(Xy^zqf&injt(C0}&fNX#OTYxR(+YVrNe~bMg z(|ssCq`3e)NP1&y0+%qaOxJpzo7aYT!-kgX5H!M8gxvV zfT`E*yr$ckIxF;o<~5>(5&WvmKBXE~Q?P2cjS+iA(5y_e#6HC|)=h|$KlWFCdmjyX zB1#Sn))4iO(r&BH1O;s8ZlX6bLsUv3Zg62Mn6Hia4dq{u>QQtek$pvGj@J+s#byo0 zTO*aDG8BQszSOKx-p{|1Z|GY3NL-<5raYQFifNw_g}Dy4cs?a_3R1tGe9lpxRA7_B z!#nIbzv7s>Gq9sS#Kk4T8k>R7d^%tJQol4A$ho&L*IGp~TULELIr6d0WF&^03Vdjn zXiqYVmXXR)=V&w73_5ilJx!YF)gBD{a@+0lMSm^w*gKPi^#|(>_r=$XZx=r_n7n;| zylI?Kf@6hy1lJ~fJMDyLSFJRhw2lmKD$1g z=ZiR73wz~?R<<@#E=2uRLDspt60Q-9$CR(5qB0J$vc$$DUzv20Gv*pl(=vPU`e~I^#XRJ^daoZ7BfF0UwEED2FYwfu~Vz9cTkAySgmmG`=vUKo~ zrKo|i>lJo;5*!8-7)@xk(m`dnJS-94!+CPW+Nb`8(X`|fjzjM|i+xzh;VKU;e*Vap zMJyj{w0Drqq^sDKcca2Mzoob%9;!IixYVj;z!h`|y4#v4JBsLhZLI`TsfyL8RxjE* zO>K@~pJom38dj_N%u8MdddxcV;-7e^pLZEdihL?mBi`X0QcvHbF z5g11{X~kkbCm#h3R0)wsZAoqzogqlCX4M(IDUsDgmwjzO$6mX8B8bTZ0-;!7D;7-U z#psWdb3JbOI_4~Ws;4$xMD%tvI6y0BkPSrqY0U49ZAV=3@}zoZdbb8k`}d{6&UNER z?6)+WDAZsjNuYEf+fx(h3ca)=t97F z?S5A7WLf<54PPaz7AiBthO<8sk*1S&g)H{vb5K*P9sES6b?YRztF1YTyO_aNK>n50 zqJ4K>l^fP3<7P4A^eJWR;{kogy|qW=99nNpy{k9-R>RH<9{D349i=2xum;Hm zRVod%Xc#J7P7FoH$qvp%w64GDPLp+0bI|f4srzJls3T1VASt42JVj}Hq;J~aq zDSHJMHXSHE?WgE`r&Guj>*0u>w~I+Ytz1eo!iMvtXr0TO;+Of2uxq=~&g_nuL zEvWAJk#rvT6?%Mq{;FewQ2;%Hqpo3K8^#V@O@Y!5Wmg>cj~_&In5K62{c%>xjor{e z&8{paEv4Y;Zlav*x>qFSp~$rl{e? z6#aTjVcg;z;1o%P#4=Wd^+_SFpo^yRl*QM`DLg)9An-a(`bJ_V$Tm~T>g6PzXm|Lm zgFS=!%4H23s-8`RhOY5OVQ%8Ls>CT|DbrQfi+axQv0-mP>lE?K+I0cqN6OJbYqdG& zGGs`P?`E%V+oRrjZ@YIf*de81It6j`#r4cQ%eCyc!W)pHj(-nIrV~VGIRhaGoMPsX zY-Rv(V)JNM4gyOP(*j5i+;LC~e9EEIrp6b9M7*V4rc_>YM`j>tuWu#ol$IY(sEvnN@h9$O1O3WA5${1(?(a(0e zh#p=!dS@dOupg>o&bRQI*?Mb-0vK={EPbmrz(IjR$5T zk}RRI<|o_)fi`1M4|IYy}!<2cUZiQSp%GNwX%}$7Ps-t z;Jml;EMw=FqN;iy)6;Ei7p)*$yP2{f2)AzG7V(`yWk?$pB|fhq?_Jbmdf7m9K5KD3 zqatnVsK>2H1vz>da_`l*tG*@*mw(z=e}DcC3Qu}S*ABh8&$3a~znRmSYCdP8^TdEs=zKIq-9-nBKBF(|wDCmdIo}CY z022I8aTMT)K_f*umk~znwE~dEd3{yYqgy3>p0@nr&BZp2o_!p171TPcvAsR)v^V^b z2PNyHJr#s@PM`0cm3p*3ZO8O-+o#XJJ}*puTlKwikg2Prv2^%)fP1m-wu#t4MJLx3llFt#~`VE8qRB>Z=G`sd{&2fDa!k5pWSm|z zluZaLF&$?6!|a8ZA#q*{%NUye&dngOLz4@(xFW0}#&W15oR6Dsei-FIbkCJ3>eCXS z@{N^{ZqguqtV-Q2d?FA)pWP*FJ(8Hhc4_V!TvUD?IYVN@--beY;>)FspQ8wkpX8|0 zg)^Z1oKEW;Rq9>FBi(nWrK!MP?QgG9DusdPiATwrAApR!7SuU{7Mhb#DX=ZB`kgxo zfz;sC2wQQ>Zk4J=NhC@^`d4znN_2UkTlP3ZK!-iGfzG&-KP*BpMdX1`oOUy8&ysIMUYyFO#Mwm}C zt8}P(uS8zlaF^4n{`Gf}GHG1OkinDT^*$3YOCd}tF&^}ycG6SYG}@eOaSHyRW@aw< zR%kP8x5l%TRi+~q-=J5c??=GlP7aFk@7RmnIcJ3^YLC1g$+zuZf6SQe`mO~!AU=+Z zzkT+jHrh#{VAWX;#%=xF$F+Mn>oO|UY0mu>&9JC)V-pos!o^!z5Sb5hmoK)d;nnN=4vlz*)=MfVYCmZ2QKr%s8 zmKgMWi4bfhQLK_|&H9R5{7)w=Q0cT-RHD_CXUhc5h`9Psj9#AFNEN>?R2!{Rx<&5- z8BOt-u$FhJ>MW;cg)sW)?VRD~X6QHHx|xOW)=O$cS-pKPS&s1inqFo&FTG&;#x*Yx z0jcHI*u^iLZH-?KdXC0pP>Tm1jXj}v6VrWj*{qq8*7E;j?JdLOSh8hNfdv+`EM|+D znVFfHnVDG@%VM^enHeo+X0*^^X5IGQGkZK|=G-^;ebc|HsxvFIGb`(hUMnKfucRCN zrUjK$7wNm~p&WSLEY3hNK8hoQtX9EWrb&_lo$U@vQ9@Ag znDs=^J+VD&hgB2j6@%n_yh3H0qLu?I9?=m@TI%CC)xNjcr1YqyCQTg8=pGU9$FkHW zc9R>*#E3!%3bEayf_+O4OeisX4&6 zHMYNo4^1kO96bp$Jw>N&F%ZJ75E4G~o4cGNdhB#}30ngjqf$m{vMUN6XD27{vZ&R> z`GOc~5X=u7Yy@L9cWQzd+<~GaOrbckS7=U`c8c_s8Qn>{D+*XT9ZXZmZox+9gN5RK z40rqh$Aq+|4pEYQ7Q?p_1jHS1?jRkr(pDKz_Kl^{=rljfmEnDP*kbU`fRT9l0&f?q zc?gxdyRh5V{pScYO|O2DZH#Xq_cvB8KZs9Vx&~RzQIMHD>YFVvQ#mYwdUO?xR{^r4 z4t|Berbm@1ljT7-LHYUBbX`pFb|??ZL5*&(A}`?hSdq*;oc7^oM|h>3kca3hm$xdP zmWG~i(!(tmC_GTx!Vx7MU7f#h6$;3q=~B@S^3>$!7S49P#m1Xv=(f{s&~hr(#kqvN zfOt!lHjNlZFVr;kOR*msf40jG!Rt$%gDz5=hn{q*@xckiQ1Of@xYKdbPr55epr~ym z)1h-fwwYETUl*M(8)d%TqG!{c)AcN9xTbi3%!qXwWX8c#TW!WxEWl2u6155JnF2bk z!g0UGF|`#ckf?7Z?#aj23R(QACnW1bRCdWS=C(97WJ34}x5<<-5rp_jNw78!uzJ#C zR*%E2qbW0w19_tn21pC@C5&6xUlNQ8U|6S&;!lK*;U*s-5d=KBZr&f?@}7_nKCDyk zReZzJ;+$!shPQ`yJ8SJ1kOQY!<-m;0Y(Z;)bMn`5loZs=YXQvwmM+B+trzs?k^4r4t z3C;^uMgy&ChK6*=rq*61!C2+8)Zyl${MCLCr^hrIz`TBMW0enuTb;MJly)j)$b z)a0h|xxYv`&8xW=Jy`Y*fDmX&T}!VbtG59u!RFRD8bCC}AzwhXi~#C#ao|E!JhoQ9 zT5qXeSDiBPLS>~PCub?-XsKywZ7m@$;Q*KQIUva#PJ}szuBv~%`Izv+GI^#wfU2qi zW!{9(F8W!zDLL?_-HFJ0Q3VspAhH_%!`l%ey}rD;e>bufwp}pGgllv*rwY1ON@_L; z(qYGjXj2uB9pc0d8gbk>S)`)$3cGs!_W~17WU|Q`vJ07=v(6J-Pch%?hevc9R)q8D zi`!9u&@DpmOQFSvcv7JpoPeaEnFj__E`sg6ycCy1CifS-&oS>Pt&E~A6tDjMTT-fJ zUi+5g9Cf!#%)v)&O;rkdk~RTU%H+vLl6DaBSTkia7R15L<|G9Lq@s7k+SrHG6_yAt zjVhZUG3ITX?E_6OoOTx}BV3$40pKU0?NnN!?PCU7QIVG*!KBTlHx~W5mf|F9W2wy& z6w@X$)asz>%6qXh)99Za#K&8y9zDtuvb@aARg`KwKN(}~_ewFQmcq^%X3u>Ol|j)8 zgWD^)q41{JBwM8P51$xOkN_j3kED-(dm@wEQm@DMxJbj?vND^M1GtWy%K8NzPp3HW zeI6PaNifP?oRY$=^Bx9ivkxA%0yM*HOH8PhGRYsxCB#kQMc`$T!}PKPlDw z!KC@LX4na{Ex{gI=Hof`&tWpBS|80Sb)>QUWR|}CqXK;hFsA{+z?{m$u6EEV(0P3| z#9Z=*2(5jK`CDSfJt$)1V=ShzqO@mCN*UlM2jMkv0;qzy35oCeBswUTg*(o1j|_~5 z+kN;@GTc7K*ZNfteP;pnqua1&-SGX!HcPUbMJOEb^37v?9uOKYJ8<=#bbYE}P-G33 zh5fLs1znt-e%t3*<#c*Qjw;Fop!WF67^E@6b<^-%{eip`6b@0xTs|s^Gaypm8Ve5t zP(vgToz)c+<~wV~{hJV+0bYAY;o%v>&n?F@0d?+fUo?a=l~ZS1lLYU-xKJukrbOAD z_KQTPdV!3GPz;3}P#;JIA4HVDB6?_<-txh=L7>@Ze%t3@Mm{!<9dCtQwqko$wQ&*< zFp|<1P?Yqxc9it;uD^}`csWs>g5AHHl`7|}x2b@}$17;IavjlIP7F?>ga#WRk# zLw0((GoJ*#2z&nt0l#T?EyaUI7zTqbTF9wV;@08&)2svbu!^RoeACHk?}=HU9vWv~ zEcG!S(urYHw2~R$oo4(i|2czsyXa zf4KXlFXOcu$2$MS#}kq@I?ikomPR2~4%oNxjgoKXyOz&bz?e15+Njq+u#OS?l;!Qf znXS7zxV=RZ1IC3s-4`{nN_kLNx$8uC3q#8o!s{R)1%d;(fP$M^K~2^IlTW32U~vt@ z!Qy_=iDJkB5Xg95?nT=t>f6Kd%E>*TcA`v&jsw2k1>n*ZwNJA9@ds3FO%Sd3)wGP9 zEqG0t?NF6droA37y-4xBL}kM3As`ive6dxad=O@a{tTRiEOXpKkcqjzl{{Drue=qF zSv7Gr7)A}e!S0(i7|E9vT0$f65sjV%26c>tz-jOcEbWWu>!-d1mzXU1by+V#p}uF) zlT(y$CEf%ZDAGl17YD~sGX@@Z6 zwfCf(JR>+UB|ED^UwQ7Pev%xFBMH0h$x?o%qW3LFS@Moh!%{GC8TWmj#ue*5g6DmD z)qgN&+V$jLNndNrYRKtM+&DOBvW-~0h)-AcCMp7Rfe*!XScD0M3y{3I81DSp^z`bA z6Up1SI(gjxtv$QO+=%(T8&`Z^ApL7ZlBVD!o>p)jP<>HOAH@SyT0~)mdceu_7$+Xz z&d!(G&g%gDdfXcHT-RN5Hju#MBHw+JF@mh#+HShhjEx5zi~X%MU&PHPx!SmWbA{JrSDvfd zjrhzI9GbgnSaUVzjOo5rd zN7yC8)q~U6CdrvVKre>9*j19wyx@wIYoAEnp;Qf0S8=v|5wLSRRstb7Ei6|w}xb3k*VJ`))Bp~eAS{1-R(j~%LDeXL78iySR6L;w;-W} zh#*BlvLn0HhdH7eE|{YA(`B6mhU5nu^d(6XU1SzHH>u99D`a`l)wKpz-MAYW&vbSM zYoE7RFGPovVO6oJm|Zt83UzHjytAv@re)4LasZL`9@(z52h?s=pbX@zla88ivzPN( z6*Dj!rZTYlQJR+bDUAUnTeni7&4Kn1xdJZO13Rr+GoVF{!gqc9zz-S`)cK;@k+P{6 z9oHu!gE;37yfD`zYk}+6XiT7;P_A63FGp9^c4mipA)d{RDt#@7$~SjNMaG`HjN{bc z*8VKIZpfHyZDQ_r4%tg6;19s~R76y3v!Ln8*7fTOMY!2H{)(`qt6(m9Z(!Q=MW?=x zP>f%oai*~B;5htVrk~A7u7qsts6C)@ySSAYE~LVEjIf)dEF8Z+HLq~K+Vvu?*m#>+ zNI7J9iz)nkghn-8X$y|3z)5U4MsIo_%VlwEkG>rx<6;`I(O=D6- zYYT24Q#i5TMwcx%<*Qm~-7SflIZ-gdlY4daZx?cm4>5s40j*oerYf0oT6}4m+o@y+oulQ^%e-8=C4KA6Y)TAobaH$ zwBDwWdi0~E-+PY`f;uTBe9!gj_APjcFx+N$d*gNvJhjc6!bm@#)J(l^$^I52c54#+ zGQ}Gu*O|ZMq5TT#B%-T`X=@*nd@G)x>M$9P9&o)7T{dG}ve%+OvU#>n6{nVHT?OLM z!Is^~X%HSoE>_J875#YtHwG>iZ_+)+g?Ky0F^;i>z38!G{{?7EHE`!7oNa}MVnN}n zvY~B1_2(|XEOK&VuJCWVRN3(bb(%Jk7?+{bmqB8%Ql>dXp{GTw-{tX%W z&x|}koCP3`0jThRtUL<~^WPKli~ye5-#KS2%>R^;|8@FTMjlZ0f62(R16XDJE`KAO z{h~V3O6$A*Nk9AZ>~})iA6Nb&r2T6AuVlUcADQ=G*>)2^LjAWyy44@~^S@H(e`d-5 zAgx&eXym_0YyXny{yoFZ^o#HJo7m=$^Z#cK8v_F)>+czE6;C;(MT{=WHdESw@HHx^ zLmdMY;c5gX=CluDZec38@(4Xb5C{l+sCxW5SKyZc?MYzh2y*fWkufl8->HO@BCY4a zFm-b*Fe~JhR-B&J$8s7?UH!E)rQQ$6CMLYS?l}*hxjWAx$+np!@DZlYE^GS_!-U3f z88$S!C({QeStSO2UdnWnzPOc;D_c-(Nky?KZs)jv{=RQ#%`!I@z{Ds)hERU9tk6Yl zCm5UA(GlqBC7@y8G#71zWm@E_x)fBfEY)6f873AU9bQ*Mf=-S|fBCTn(SEpdx<*N8snOBL_D>C5}VH?k258Xf|Aa&{7CCs#F%hr6($Vw`FEno*y+ z@k{OStGt&I*^($FAXG6h`ScRmV!e?}s2nab*^vkhL3c&V66XZ?J<0KW6M35i3}YE} z7*OD*7>DAw%+FM=6N@> zCu|?5&%7fgTb(0bKtlW-a*Ldy?m&3glq6+wRII$*+Hs3x3{9)m9N5DSR}3?j!`x%S z<52E`-qBpau%QA@w{1itWozPRdis(p+jA>MH2woEmj>SLK+N+p{ewL^PJ@o!@*`Xq zd$}_#*7?J53`!RYB+VPp??=o5lI=wwG^y+RU|62r>DBzc^XmAqk7=-lU^Lp*{W$Qn zkv!qGt7*{o_Pjaj;G|Xi3RI=ovr6$vPPlXotNSa;RR+q{hor9pR*Ydm@((x4MB#3{Q*>6^~n+*cvn-w~UU@ZRafP z_~SMO7!ZOa$Aj3D0%FNl6vIMPChfggW@hD*r7E|Y|LROb8oEG5OQ?? ze4Zus>Y&QlR!5?+t=Q6DSgfRyTsS1}0CC9ZZ7tZROB$psHab&!oq)ZLugX-%+CSF5 z&m}CPVq;_Sad-~1qk(2>Wr4ci)6`JP6LU3bLFM8gAR@RTxFS{bZf>+0g~P~u&Q{eu z`|#_rnRhXgA1nd09}tLuy`zpa$Fg223Uo&pPkntof)mQnt;WUm^=tS5?okQot#ig# zp4hx03W^QY6w-B?>k-JU!v_7+1NGQGnVOKAkPM4dw1>~1h%C8k{N~%`oS>K&W!n4T zJT@Q@bo}OXt%A_~HJpwX17(OF?6kIlH?-N3uhiHqh&Z7%{rPGpbslC?!po6tvcH;th0s7M(@ zh|SZF;du^o_H=;|s|$y^YO&&wj8jyt>8fv+@hGV&YYohs=dRII$E(R^uzy#H9zdgf z$x#11xfhe3wcfrob5Ff}5^k5ND_4sy>KTfA-ctT{ytkZ{`!Yd34z-2YFWHT8BD4pd zC^L(GLDFmTNnepKH+qrqt0UCpzj{AGI() zIHKb%BA6Lc>a&K?4GkPVjgPq2m{pboHL{(4d(Z=$(edz-YZ&|a>?|Iu8Ele?1D`;G=GuS~gxw-Ko7K)DZf?xif8_a^EY=%i zYjHt3H{Rsfouqa(hFD(pezY~r)7T-tES903oVOIOtMoOQ6!vY6bvZL{(?v1n)zR%j zmuQhFfO5HZ?$|3+JAFyiVBpIVGdFj3z2D+?`xZ zTR8sMd<`vO6`yrsmsLDzRsMQXNl`Uo7wvKb=VS<~augCLQck3HYDPC=b4(JpK82MR^vy-obh7OQ z^P$aXb?=+X4zbnAmf!HZA_SdD>Nb|v=5*aF6I$5lEAM)BXTm^z$Zb7LML_?d{xm$1 z=eqzSw0jw}feC-zgaAX5*c0Q6PyUZ#{8Un0Tp5`&qbwNM*CCk+BY_McDUWTSl8sx~ zl>y0(Pebv_L4x!gD;svzwYjGk(`mD77?t9TNv`oV*s=o-&1$q~i=7mFL^_~wKKdo; zjbfxVz8?r3ixnU&O^>w4r8Eo9q49eyPRzCvRl(&r2u;d^x(F`&37KaKcO}K>Ma4;6 z#Yx;q(g;694oJR<;%f8y6fjhM*fv3>T6|$LO*k^*#QPL^m;NIXDKrHljmu~scP@iN zEb9sU)a;!Hw{&{A^G=YI?dhRLn^VneH%n*PekIvDl!LwXTFr_n0^8+tM#a!wq%62f#cU$9ZBawHa=FbG5Xhbd5#uT$DJt4*%` zPBl<-^V4thsoJMGD{q4F=c07fsTNebi@MKQlMljVCB@{_yA+45R>CSS{PHILC;;O4 z;?9frcdfX+td$JV24&O{3LHleHW9nd!FR$QV4pT ztNI(rWcwS)WMRi=0Z1(VCT{p0WCE0xztcW{o&EJThCvpSgMe>~nA*EDC9Yz=eBW;hgHeT=Hc( zqHlLrfp=KaDT8{y-F-X)yy!bgZr~&X<|(#V%m^hRBdL62}RzfpI9@pox`MQMv;1IqoGM_E8i!Ko7wg&bUTNJ&uauF^CM12m~ z?18NG^4nF;{GAq!X0kco*7BBny`uOEUqFW;?7` zPaF^c2a`wF10hd%gNB-P&bqe&LvyyQl-E|)2dN*oFfUbPM$=3U*cUKF3j?cJ<|#8L zH6^dOAW2_2hU=^3TUM6cUeJ{dztQM`OPDQSD;l=4DU17L0ws&f<}S{12+KVX>dQvV zo3`0+)L6h2G!H%x9BWI#G@S02$n$KxXm)QOl`E`JWKQ#;HQb3-I#h$rTf^QHLxIpzd=qUk z+lr^Ags3aEi2SIQzX=j<%2YusOSU^|5K7?CP5}2nhDTFzB;4}G?g!$m1KV8OTmuCB zVD7kd0R~pjK~o$aZEL!nUfmvGhqs$0-a-AuJt%MT0Z0Z+#ueyv%prOfw2@x^aO^egkiHx&q z=D^RbxG}O7WparUy)MB&0L;O!W_KIk_c!8AQylMTqc=cId(4f~$I8#fdNri)W>|{H zSn66DG-jUi6glP%^nqv`7R3w0+`D^O)$RvB4F(@LHj~Cr;4_-9Rx_UP4-W_8 z;cA9z-tg-@Tu<~)H*~FGa=Gk+6H!s=NOGvxGnWA9(D_q@4}456#;Xz{Zc@jA?CNOi zzIa!@7@Ym*9j`S1DjHcX%W?z_`YYw?Ba7q86e z*IifUcaA{WxU6@`Vm-#qv-LR69Yh|K5?q`Q;$Yp%H{6Qr;)>2Iwn+OH;dEPie~2k> z|0HTs2}eA2+W5*rT`3_CKk9>17db7k8JfZB?vB|>OA;wq7BA#_YR?b-`f^Ye*}=u} z_K-c9Qc@8-IJC>;!c)IXPLq+EB325idbs4hvc zq07+T<>cWU{2A`N>fvaRHB+aXSdL0bH5GRM%WDIdgDbyPkdXx(ufW$qYG=0h5!D$m z85;R+O6Y?Rhc#Pr_m4UaPGYrC_CE|Z=wYsdELLn zKR-Xv0TZb|K8eWslDHet%W|v%G5Kt4uG>R}!8h!i9Nri|F_;ixempOS+`S>dlvOLT`(A3QakgrPA|oSJzc~lCQKVn z!9H#osvCS2>NAjQAjLr)|uZ=VSWqTjM`cZTqXk+{_dHJ z@CEHm1jLW4J338iG`i4EGMuDH!*C7*c-^Q$?ZRhz9>7$Ghttmv<^h$1S=Zz1nAZdP z+zL#KJJ`Jyg~)RP5Cf7pv`om!7Z`B}R+M$C`0WetX5-otzRw_a;1-()tIz9MH)?m_ z`x9%~A$|o4?|!8cBZfVWOtXNsy8%YEtAQNn4{?wVMl<_f3m!bKp}M+4?EkSk(iV;)YQO_Ldk9nSzd@G2bl(37vi#pPx_Ph zjQ$?#{D*eP{2!7bfMCek+5n*6F*p4iF#Rp=`8Tod|047GpAsLYKWu`2!==B8_WyHS z%FICjPXSOhb2r8L1)iMoVMNW_Mr<*lcnYmlQLUUcwC2$J_IkG{keAgr$v|i&fUa3ElBxx~zY@20-GTfiYV&whY zLiM>C>DoY}=j$ogr6xp;k4u_Ms-5p8IP5c<5Zfgg z0bv&Q_Om0e>1o&n;wh02%xvg&-{uYtaf=bE?Z5$T5hq<26o%q$AFHccva94MX7x5JkvNZRDMZH|$3>m@mq)pO9aF zF6wBA?}IkTD5HiIjFB~zN^5vVVR_bM2gPM~-oB={J*%9c3o{P3X+y|FbzIJ&_9N$l zzhp`jRYJMxj%e5nd@=(~NDcZBUZ~HM@16{gYD{b$PlZkZ_jTG11-p+EuC<{8isDH% zrdM5#i-l6LQ6h{w!Bf8?+3`cVYbxyf&oN1+v~V}YDKZpT_xNq%mzaBG9ww+uo18DX zrC)BkHdpJd9!HuVuT^!LJ#IUo-;o}1NBkR3fV%`qV6y{+*A#6Qfpz_a{2|8)q4~fp zTi=I+(ag&%c*1{72FKyneFxS60fy~2JM-o@n`>C;1uG7V`C#eZbHsOgmvH+rC*cGd zf6A9uWJ?2SRrSo+jJ60_bLk_cInzgx@7?G;?Z?L)BwTYVb5LtaqMf9o@;b`$1Y@HR ze9EasVza~`P*GmnGqBUf8x`)+d-`7XdeI(upWGmqPbPJV-Gs$7p4_R@0gPgOK&91^^Oq9wIl>9u{A0_!61E+K)GZBWHym7bzSHqNKnfe`0|O_= z+UVg#kBelx?utFA?z=x-ORlPZ8D$_L$$hDna)uHEPaW`5wQ)QGo)YeO-an!Z@#rSah!1is(_f->w&QRPhuDJY4}{MZ=YTSX*`>-GLmOg( z%DaVwJ%1T^ZhRYYcr~JkgD9+8rfcDeWxb(gvt{#d{}`y5lkrxCiG(s&f;IQKMRKoq z!WC0WB~aZK==6aJ*R0aInBH9bdm|xB0aK|%ltK}RyV5ve6hsp=w2bxx9wV z|0~5Zv33{v@JgiJ?jb<95kljJLlUHM>lkIdpgG?9H zC)WGeT2f6|Cp1$~*r0pius;+Wrlf(}m%ZI1Mi1eC4#5bQx?rh+HZHp~9k`){cDo-l zz~3<6;vAkGa~XF5@c@}hM5>F>1Ho$Kji{L8g@dNU;yoIueK90sPV`6mHb)lW%3{rE z4FcVL9MJrr$`YabA)+Lat2)*t5|`}g|zSMAXVLwunk?r{sKD!07WP8dfB7E@qy}vCxZ2B+)LTD_r=W2p@n$=#t z<}gaIEwtTVhe)t4J4y`y**2F`QBZ}vE5PG)<0M<+2^G%^cIHOt)4`>??pE6rMlKRU z_RH*X7}&IcQxx<^Bp&E0duz6^0giayuu9;|;<-qT;YmB&ui1T; z+_%y+Qy3KdrcX)*rG->tH7O09O+Sa7m^_Fwx-AeMg$D8J{NfwfjwX$82tm_~P%S6Ku&?oIoaDiM`7r!l+Y-%p5 z(L#2x7NtA*LG(U5NzYDWvml(tHI*A2gKkC63tpljPNyf z>!S26#o{`YQ9q(hZ%%f#wTNl!fQN$}*_e0PRZkn7D(~9l%_SG_ZLp7DgtJoMQw<6Y z_U(;PV+vQhf_N3F$oFC%E{2(O1$d1W;lC=O{y^td7Iuo8?$}`*q@alojBjWCwsjh? zh%6J1Bx7UcgKPCc^G69gN=9`S4`^#5j(e6s`X@=j8p5(~bgaB}2ApC*sYz=KAWgYg zKZoHrx$Ylhv-+blVh(!0p*oH{zIT(S{-85w=_fy!&Xgtyo|`0>qR|SCh@W7?A0G(` z_n~P3D!2fj|E}JchCMj4Q*Wi~5vQP7idxvxh^gCiKM|H1F7)&MJDx0RrnFnz577%m zw?VJ=$2lHXESee|u&fgY#@4 ze>#AVtmttB#f$m1PP;9Q3+wlkD+G)t)E9*d_+EHf@K8>1O?PtPn5~4=>H(>i7qbuV zlqN5q56;`c?ixz#R=7t>ovs;dLZbOck$mJtc0ub8Nba$awc4EM%(PALf}sg8Ok!MD zax!O$)KlbOyYp{>kTf8+=yqt>gs&phL>ns1^+d1QWbpMYEMQhW6kPC`vi^D3yt;aq z{>$S6BJ)YpKkm)dZ(>`@OlplTWthJRLFClbiW0KaCK+No+7CsuK6=HE2$S$R5{xH0A)f`(9eXC^}+LEjU1y~TcG-#w4AQ0EAAda}Zbya_ zzv?jD8BbT}rxXq&e#LpcU6ngfeWj+#kuny#sf@0;bF;e2LoV9+6w}HL7R|eA`ICb{ z;s;57#BNX+^4d+!(Dih!@Q zB4sj-7co@U(c=fkwL4yPkaa$SW?8Drv20EY+|J^$OMNoFBUQXZAK1QJQJ!cq&DB{GNft$TAN!>0F4BDp1RZ|5j8JHB5GWx z)kFH(CsA$|+;8C<1I674sC1@^a^8o>xzTnZ)oFqv`>I(2u4G>ocmGUvU)S4YN0LE> zR$=ulrB$xy>&CQJB*icCHSkT=qEBr!x@Y6EtWa2WKy+r27Hw7X4e-pRfeu@c#6AK2 zlT=E+eI8o}V8mq2ld(NO9AwRBXFT=Mtkq`Y@wWzuq>8WINiHpfn}mRusfWg%bK^ z1xrG|AK2>W>u%B0H$h+xXi{BWhnTULE%{fyAKHw)lK_KsEd8_txGh~+S2}-Vgg4Kp z@RH8NPgx60Yh?j)U6bDN6i?|VW)2k5TO%^Fsb>!K&e_~-YM4v0uvgRa5lmrL8_Wv* z{Dft+BM{!+PwaZ?%;N9DKja4-^%3Jdm~4sB=(7TCFlTcZesV5Os@ypD@Q#=*W?`_h zfBcJoLg^es#s*Soec4k*+pyQ6V-!f+J~fzkecSbrzP)N`airAf$VNjM=X0^`1s8Di zmXpy86(wbZLPITzp0QQJa-zxD$P(HT;JSNSn+`OuTP%y<)xcJil9NkF*>wnGdHWaLFB7JdHtY%0x-N(j9X^XW zfu@r#K2V+cQ^~AHc(NVdx5p*PMUbRdg`X>RY6veg(|NYmOiT>on0i=UTcrglrG9b& zy@|i_Tr=Jbtt@?wG}0Gwu>q;1X{iX#JTr+X<2O62oW+u+&H`=B^YduqCE}-|%w*C{ z$mp~p%H3B|xin1qQRUVhnC{=5PXR4vJdbe_ap6mLvC*w+W1^EkZWq2$;VQX8%!d!k zP*JN@F=KA&m}my)%lt+4XIis%uuY9rA+;*hyhMA_U?u9;mYnI^oYnlFKna<16F>IX zM0Y>rZVFILCumU9jLd`7v{gUr#Xkp4ftWgO>Z3b-Z+*FIhr_o663rW4nVMQsIH2oe z_j0vs`T=7uf@-u2YXiY~{D}{t?Mx14PMFDuFv?nE+{Q3_6PBB)JdkL$Tt&CaVhW=a zw!x!wK;3Kt!r@ync~yHGaKS|?ELoq1d07o8Kc!td>;wmQ*M{H6CPXH3YIc`}>mdDJ_9G(2fDvcnV)u%NqbXa=e?`PmC3LD>+h#&&I_u{{|vHT;D{L6Wf9sidxGz)Y2L8bnuiPJwZ3jVN3{Vj6)TR8nckK8iQu`vD4C{VUkQdC9j zOpf)82F(pF3|I-;d+4Uf%j7sVL*qZFPLPiJ& z=?t$cY`9f!z+b6!u{fRMD4UqE;Cvp4$8!wG9Gq0IJBxW{yFal#xAomz<~lg;z2rJ? zBw^>~S>+`oqMmrY{Je?&Sy9wG@{N{yZB)zZY z?las;pYbQ`lm*7N4Nf@id8Rm z8*qT@BnE4I`uFkum*$o=%?#dqEF0jaSkH9NP|g0=Xw5O|Z8w>L;%%)Kp)*gO@UHEh zbAvdkV>S z^hYe)=5bKsi#xHEdy7nxO=6v(dvGEQMZ2i=7rx$RN{%+=+C1#MS@E{Jh zuPh_zHaIb${b6?9iRQLwnhDKhRviK2Pz7ErD++y?sPk|?yW7Cb5C6*}Y%?_<=GX`J zegPQe>cV4`8=?lgigIby7A(&2I0i;i0XXnWX!W*+qt`e|a!ZdNqD|?6Lk2t9O=Qlp z4s(^>KR<5d+2Sg&wYez-*}Q=f)qJmvt;srJwZ=OiZVc$1FHocQ34S7wNh8Rw7#$T; z5+<=)@A|rRyRr`qmO!vIoZ9?3+@6$c1j$J$Ofp}K1RUqsvJx+Z1U+2*3WXWD7*(e^T-1F$br<@3+(3TPAsSkfx_v5!fA~$2EEQ^2V5D=$83y(0+}O(bgF!s zu4T865tvGkJ=+WEq1915DtVfyDx~OCI^_M)Rcj8FUPU6TBX7lw!W`-hXG>MOp0VWn zoLEqm^DJ1r-LdcmOn4ZC*S9?~)Z8Mtxs$XSi41)5)x#iVS7QUCyMDQ$@KZcbAM#9_c^XF26AWxwJ`Z6jIW@C>!TOR!x zXJRaz;u~rlxW3wZ^2^gn%3%xQ(gx}lT+XUrexizPziAo7Yol>lF6<2YNu_vIl=u}Hg&I9%i|#G%mf zeXLs;Ugane$?_KBPqQ%yuktVnGeQk|Bo(dD+e30nb zX?(AT*qD%!Fhvb}$zkWp|6 z>ApVTzLC!kGN_U0lk?Vpq&$XSz&bO46r`)DZL_Gp9gPpfi=U+5dSpFvV8?O9V2ik0*rM+~0z5vd@|$T`J29UQZQ4GkR_M-GfXM7S!)?fp=Q z8Z8zq(I>(f!mt9?0t9L{mM~eP{K653;=;n5f)$aA`wmZ2tEuk=`xLcT@sc2sOM>lV zZW$g5hPT*8LJ0w@C{+cyB4e@q9vmDg>KeJmG?ZKknh_mmO(F#g{nB}}$(8v!5g~#- z)LNJ3$4%2X>PG34X_+I5>8>j@1EY+d(5+YJdZ;9W!D$n%t!N6On3T~8T4U$b7{s4m zvUq?dYq$-6%90;uOdG$lvpDn|94~ij3Ys#1EZSQar>6Mnaf0$jxj4tBJ*yW_T}ffV zv^Hn}5g@+TCtooKi-!(_K;q1WNMV+6(>w)b(|4fffa>CeFUTi z?&=0H08Vnp`@%qTmW(q&!oMqU9ib+;ZbDJj?ZnQ7%{rSb!^o|Ww^|V8f&6?#K%2h}Lm&BVBxam?@%Xa&@RV_B4QEhH1=@9FSxkcDnG)*y zUV-*0krgWup7~$|>&y4hdQHq{srmet8HM5Qw^EU0iDUScM!t?+2wM}1s0ZgkWyfo~ ziWrFW<1`lf){hBjIX_kLU4NFkxI(xGJ_|)ZllB5xuKX*|`eVDC-*fhV-$>^l_Reb3 zQh#|nGcvOL1unRF-2ka+OJgT|17lNj8*b9`wk}e9b0cn2Rc2{AX*)q^$&#B?OMK3g5&5 zV9V`l>tKmbPs2hAxTS-U35Nn;7pp&S2sq;=HFI*ZOG4g-17zufaw8 zKMDcn9Z*Z~4`E7uf90~CYK)2VH~uUFu|m@xlF(fRvoCi{1bnH=zE z_16Lc4EV1lLMHTo3Oj$+1Y;nK?|zCb(suGLcX^YPQczTI>d>)ta8T%?@YbR9)AzY5 zrI!f4I6d6Igxo92h2NvK78MMU3kkZ4=nfy4q5E!FT)N@@TE9H}G10!p-5xXx%@cb~ zogWNkB>)Kb;jDq#toWsBPdHpOsbYjTr!mXW+A(Fr2s%3=F4z#S#W(=p;xy(&02X*H z#@fc?L8*<$Du$kOzLK=}l~P(eWT?1g>U>!ewe`geUw z*~N>5e~VlWTcp#G(7NujPXMrUfK8ntRB_ortaj`WraI&zq;Ucs%a54v&ITF&z z(-G1cD+!2-C<32Cw${K13quPl3nzDJ6BiRJ9$*24boM{f$;!zKs3?g5Qwje^nDKD zH#b1q#Kz3YoRAF|q6h$%;$-4L2oSY0a551#F|su_;pK&ObaF5;u!eQZSW!Q=S!6)_ zo?TqiKmf1w`3{|8sz}1g2pjd7EtE~gM9@OqqKNc;Oao0c!*Q(u+e5pMJ$&CT(bl9msie~`mm+70~>(D2*DP}u%Qzdsv(#f z++3J^ZRJb__yb6AXVbTZ2MR)(#1_FXNN2}QNNcqdwVkMWxM+viGEj_Tz>xoe))M$D1`v0j&rxav`mWF4#N9GA9E;lajQ5jLZ!?_ zZ0+LJ6lH#RC%BTL>Ye>afBP+2a+SQHB;k-){Wf|9@M>}{?SUEFr5tC8n``1$QI_vi z}|u0vnaP9AF1o8{l4;zxe`Bb zN!`KRA@Cb@-i!oy49yE;ZmF7!7HkJvt%qx?EG_3)XE-8tH;MWy+Wq!i?*q>bhKWVx z9T)Alk`X~%lAHD@0lw4TSz0@snZ)uG(%9K0$8!S3Q>9@&gcYd=_L_7%cLf&sRW`V- zE`%BW!LzBD&nqO_GK8d&C&$nWs6wPL8*E{jY?YZ=tBrU*T+1GdaFg!k5FaG(BcP_p zrpAQ!jLRB%@ASS-AXYx=?1q+n2F5mlLa7-zZn-hxhAc=l6OmH7@+rT1t*z3gk$OVt zY7`ES??ubHjt}Yjx7+2kiF4eVMdIfM+DkMlGI4LJ6=<)M=0>wL?S-WbQU??^2M9yn z$++8CVw7Gxf4h5C|F)y@bws}Kvo548XDCHkPU>>W{nhE^hXLwP8>=!y)$Z%0qMTw3 z!*iJ+WBC3m+hIF_zi(}VC8FaVfIq&I!T`dci@>-rN3okjk&xj~; zMyHlbrx_Arp+m6mxRQJ79f7C95+f3wOP z)wGm8v7!0AtA4L_JSkcpVKO#D;R2(i32S|3Ly!}1kBhqOd{j}{(`UOEeG*IiGE4|M z)dni~`P5Xa*X~P9Z;@w8!k5wCr7;4oKY>gff(l&p&V#asy!9c4yCebwE$t3Hft}( zq4SE;ijJ2At1)j6mr_VZmfHFiqpagSdGT($B|Fo10^G@H7Y?uZ{%`g3GY7tyuP;da z-0IsSzCQF`w{nl_39N0MHt+Jb9eKLFx)~v|4Y_$)9eU(<@7fBrBIQ?w(h)JW4FM);|@fb4{ zGqfNgVN}P0wi#Ng+f0?`6f6^CTM<%W`QFo_Y^dw|ug>}VFFG5X0qK}B^x!Eqc^ zb#5wE>Ztm#;YHT-^n4`d7o(~cDiz?f z;NkL~G35NR3(S}H`Ef>~LRv%!yle8U&KE-psbd{TA&MMV)BICO(G;4gWlp6b{V@=e zLZ;^mATh2cK}GiG+f%Ibtsn)ajirg|CNs3}X5$ax%rNy20zB^xUK5#JQ0rcX4Y@F2 z=#VLl3$C)puFQe*WQd#ALdL0YRL=G4Cz50|F;xnVExZgRXeys(2~Mil33-i&sL@;t zir2*5t+UlYU+p*<*VggsCbARajscG~V`bi-g4D{8tJXR49<2KgPW zuN0GxnfYx}g3bC64LVg$A8&^$KU3bYbO~p}M`Ky#SjRid((^`DHKQ^bs~XOT;c37V zI^WtPmZ|hF!9xZ<_pCFrZ3ol)-e%o1A89QN^1&m~JgHmAs0F{ehSmXr6iTkrWOWu!lT%qp`wAB0e4;IC*I;E!&@G`NT_|aI1~;a9 zG-yWvF`sZ?`Lr5r{guLrpEzbRLJr?O4{@!S%Wij=Cs;KI*2hkN6XT0qeKgm*g^_3I z#>vU^`N&+YEnSv@AK}Wo!^`h?K0*k#E6lG1B6Qo%9uEc(6qY^*{Irzy*G^Zjv9*>sk@?5fZAMrpX0NLb^( zc+Bypeed}VsRDE3d=j%OcFGqEg6)GXTE5x1mRut+F2JW5VI>t<3+_O0hC}-Hyz71# zQu_RF+w;@L`?xjb1^gbct`4kk8Egv^gSIWXA7(bn0)$ixxIvc&&C8p!kr z2(V924P^S=n!g(ObfW#)!bcE(G!WQdAcTZZ7&;OHq%4db3AJE<6!_E+MOYm|U`fuv zzBB#V$KNIVEI`P>$-v6i>{m%YVU{s*GB5_l5HkM=_zR>*Q2)f}H{P%SIe8gEMqb`u zX#SB>ksbDFF#am$X*_AacGCuVJpvcGs%gFSI5YWj0%lJ4wfKCqB zr;+@tq$d=AmGp1*Ji+=amWc_L=~s#WpQ?N;rp4SlE~WE3y%=akTjDS8_IVdR&-~Qwund zzt_btvISgozq_mCZf$65^=F5E6+_7UgLVCf(w<^}g7>t_e&u^A`?u#`+a_#bYH9-9 z34lucD+_yPlYbo|#-|nd zXOI3GB4(yPhlu0X5d8%D5$yl)0S@5*`1!vO|4)Pcd$@nr{>LPGs__s1ugUelnHc}H z4x}_R<kh92puq%lZE9+3U&@yHpa)6KBi@5W&2y+$JD^^{{>`^2hG1BCMzx@ zF8vcRMO$kFn}40$kL^?ZFLn_YhTn7h-yvfLp1Y6V$HqU#KDwV$!LkD9=RbXa!1I)z z{juRspFg1d1?MABj}ZL;>sK9*p&USH9|3$EfFA%qLHQflN4S5M`|}BG2QV!QF#NGa ze?A|}{nbjQr}jMh9$oCf@6VX0zWnIht+-kUx9+N1abC`@{d#4n_uGLLext zY=4X~A@h%e{y!Z;f9zcU+e3(vnFC;AZEWCZ4x}s$08@)Uj-jXH{?9}1aq;{`2cG7P ztbw)3Kd}ZuARE@A1F}~-Mh@UI05T;u;PiczD1pie>z)} zk!XPQZ9k@ZMzlqQ*Y`f% zx8C0Pe8^;9a)pVJQPnD_=-$#ecXks$3l9w9?St!5;gE2?l8OEBspL^VHMzW?7<>ngL50WJoLVQdAAP|dOO%FF(`P`!kwSlR+ zf=~|~O#iaN=dd-c?l_Xs${MqRnqei z6s4=#97=`RPZw|A6?Zx4HJ%2xD05SXCE(^`&Y)k~7Q8C7G&tfkc>bATbPQ4;?jzJ( zSL>0Eo02+xbRKJCa2a((SCmor$$%_b<i&5g%V`^#p0M^X^k z%?%NJ$Zs+oT~*z-PUW&-E?ou z(fvh-)H#A**w!HP{yCmUWm9WY6i(kH^tp=Gacam658~3BB3OiOh|?*n0WA5IV;;ZC z5)t2$apmUb-bk$UK|@=nwC0a3aR^bZNG5sBYkD`qX1eKG8&rDlslmHJIk*{;b>OA+ zgO{u7mDTp0x5FtdS~YfS(&;K;o7&Huy1z&gj$`4qc-L*JX)U$T9jDWdL`kI|xW1}L z#K?rl)1SO_UB$XDAa%_)lq;056^iV)viMXb@iEBSBciFOsj1CRm`kyyHw_sJH$A?k zu&|~)?y%yh;#O#d>=W{**n|G1V{GNgt%}Kqk?;XjGjx3Q?hO$nVSX73aM0QYnKfk* z*a~@ld$5fVoFo?}JUF}ylP~#j;7LikgQeguGZDj8%QxS?ND3ea+jG_&$8^&99eLs{IB93>p(d?vP&q<^>;Dz^Cg zF;JZeT}d64K~QjU`I-G}+AQvut1Moz2e9n#RI`%Pd+04L=oyI_*%&U10ysR9c|Nkf z;O+N;t`gjPpU`aJ{+Ct` zDpsY;*C_*0!=8MO_ctT0s~$q^>>9%*?FiMT(_yArNE0<0O4tT709h8K4_nfek-j4J zm~oy^%Jbj`bD!)}z#RqgH$LJnp++mhu@^8Rc?Z8GB`0O!;z}^$Lx><(>~ufWvQaz? zY;D#NL}r6=Xg&YRC5BCP9~8sDO)y3fEVTY%jez^(JLkqlO=$K?t}z!O?*QHEw>}gi zcp)j6Mwy>{3A*m1W6Rw?MlEN-#`g*>sGejcL=gs7mN6kAyT#FcG9Uu22WQ$Q-}j;7 zemHk^1I=pQL+3_)2R=o-KGaiv-4J0jlnE~yAgF;>EFr=tYJ1nTL)0IEN5angou(~1 zc;;APykOdZcOxVCtW64O%%Bm6-QSBdL`^U6-L=={cIl)}@H@0yzOP8f0+B1z#`W0a zte&lvx2V{Op)hjeq1)4HZn)EhuaS?QXYW)C*-*F2zzk2vW5~Ql@zW!~C3H7hCX@jc z1i3-<&AQWrdAXmj^ClqbmJ1Qjnk#BDM>Sc>mV{nMT3eIqN^=A8zARr11+rh!k!G$^ zP1?m9k(6oSblgSj&^mdr^6VU!bRn$2ldN~fLMCwL$SuH520xliR*p{)++v4ve~WGZ z8KAgW6toK!{(CDLpgn{4owmC+DS4|vPU~Vew>O*IWZD}!0qx8<2nX=DXcegPfFHY zV%e#v;9~P?NpzsbHBr2fZrl<18FQcwNlL8T$JqfD+n4Vwj{9D@K%4WL7T%hk`S6(f zKH$ecNQd9BGq6*Cczh}U`&G!(d+UG0HU5X!;3v+(0Hh6%+?nxD!okSQ$jHF@Uy=^C z|HL^s|8H>)BY-iGb38JRAAIAHZ8+K)7@0hB4uH$wh{nH2PE3CYQvU};gN>8*Z$#sj zypkFAJ;DfQR8nCQi#Q|?g;X)7XxreM^88HI3d0XB$Wds`jW#001?YW(ulYlXT;F2a zw1Tw0uu)wS$ypt0`hrwrqGJVBbJ(VJcu;ZdWHwxDaIM0#xu%r%{m1or9xE|p2p6vIXBI$Whr!8Z*u}oB>EhXXV)g$(uLuynC!@u z7&M;64~8U5Oe;;j?JxO6WULJ~fY!LPtp+ZKaY8$)SxfAhUsTs6siRq>!X01lkeJt^ z%XlqPE1^ji32_0he}KjbD`7!skRtca~NDMMua!0u5Q z(waYR$}NS-{2{o7s4v&42=E>cA?4*E2Rd_bg`T$iO9qJTeg-SJd8p?nkm^tqH6JZ# z`gShE)pI715T8juc0ewT0SesEiI#;;6Di+OI$ z0avdcjGn5uMGR|_zrBZid2yQE9yyrd-h5;mKiUZU9KZi^^cZzM6ucz>!ybme-itAt zIx0`=8Ir6)LolcCjJ>cNGi%gPuxK{xcTkCDa$35*^2N&~3xzB&C!O+|#}t$~WiTA;z-l zGoa~YGNj~t7gsJdRZs;&w(#CL*`xdxuBKhsEVz~M4r!}(CwG(DfWSul%weQJ(2-KP zkm|^eSFHG^opUt^T$-aZl`E#UC1dkTlaNJPVF0Umsbu8zsrSayOX~aYktcBO`<~PK znBIC=%c%_Xz|VDCf6r&N#A&#CAtSmG zMY_?&1^+D`FM4G-ed3!u1EzLR(r`?x#CV60P_xX;$|07_=AJMM(J*g1@?r?K5x60# z`%y`_yfcS&?bFjc9bSKmx#G%?7VNdtQ)%9<@S~ABCf`Xi3nFAsxX-8dDxa~^W;QN= zm!T9#O%&8!Y~tY)||*6^g5WJym=`wLs=nxYqt5?P{A_=W{b#mJt*^> z?}(#Qvr*8D(g?>|6_rIYQrA&UjOGZs#`lD0+8$T3NLHDkMku5{mARu~$+yM`knl;2 z@$JNBK^2|Rt?jtXF3};_S?Q z8Uo}>-M5w{Ad+?nNk&wYqaAm|hNko)!4$2i-*XwBOSZkep?!nlh??GQmhJ+cP@#OT zwuYFE!!?rm=Kg+<%nde+;p)IU$xpKH!?crD^GD3{Z^Xw|TZbIZi`&z|!o`(xyhS2Manw9&V__{?+3dPv7gnAT}>-jkttyFyJlmeqxejkz6sNvTP} zguzsZ9p_m*2q79dHUk(iPLjV@Vh9^z0qVZUB_lj{W8 z>XQ+%vS3{0?LHvyu1gxGFuQ#oX6xS0tKfkn0a3I89ie!|Vpn&7dFx^3ltMO%Ad~#f zHN22J;w7uAW_y%P=LM3LJy%B4#Mg_^jX^E z6sP7{SE(9as5OZQ0h-SXVT%-aDUo)sDI!Fj}p>t7%;K|)BSJN2w>LVYJ>nl z2p|Fw1&9MA08#*HfE)m*!2wi%suYi$!4zN$yqW=+0nC8LUBJ78pR$FOiKF8am#}fR zHUvr*7G^(W3_IZMg01nBn&D{S_M2lkx!MAG#^2QqfE&Oa;PE%=@vnDOe@Kb{J@o+U zEu4Q+4|R7pC6&c)s)-5o2*a_$QgcNJKMVmRTqj{Pv;la@R~lM5bSu+j`>R&gb4~je zloMSn@G_ch{IQkK>2kn`-!Q}G`+qtw$>ti3gvJ(?+d3O|wMk+F&2aBJm3Y{5eAl_# zaeC^#wsz}@7!evpq)t0mU>3xhIQT8mF&R#(nHh2CrnvU*dhqLMc1#r8oy(~$V$Jss zjy$?I5S!$$TNbKr9FoPrb3;1D__u_n$kiyR!mzb(#L4DRaYDBT`UgZeH4N!%!`$91NLLW5qFjXS zhN%p|4G3oq~h<)fMp->lki4?nN`qn+1zn zf_klyTTVt?9B20J4x<~qVsh+LZI|6bj*Wr=i6)7MjxnG4#`f&)+xC%Z&!p9h)34T_ zAEe!QH}23rBQn~Z zULPaUSz6KYECi@K3>;!Rl;JtRW!K_n7X?VY&Cd^*%zw?bq}3c0egAf(x(YybZb;KT zSnYZOw=ksUVt&bLjix;cYWo3x_X}JH=NxSf0yK8r1*KKqIFy!m1$fNsQwGzlFWvn4 z$^#MtO7dV^MBcfz8m0b7C7QLOX!NMJllr6tEnnax17Hw! z1!v~B-on*=g;Kx;?~wg~2Hnj8-63LR+GpEYTNC@d60#pfnzm78K7w6K*5mbYk+D2B zng?7U2aB7r`j3F5aELxGpF;JVQSerN{W7Pph`s@%e2zJdb4JoWunx63Sbe1Lo znz>5;uw^Dx2&%`b2qkkgLwpE5=2Ph@(Pk?PZ;>~IpBs0uXwzY2d|se}Ypd#^FLxR( zTBlYyLXSSX6HE~VtDdZ2rOJGMH=YW+BaM!v@UbKc)k*lk$ots^MUVG=AccNu@3%xB3%|nQvEo!5SiDML#5*&Qtf<`fh>rjEz?T2cBpTW^teIHQ6Kk{_8Qc2GU?{H8>|#BD>3*b0XF|48%UT5lLZw+Yu8Ds5 z0Qp=Q9Hkv;7Ccpy2vNAypL)Z%-ST=#`eh`>s=((%>LPrU2j`u7ChhSQ?5c|6catEn; ziHas!Q`#nghGx^kQy3aMLrB;nSrZXF*zt6H+M<{|`P3mqpAPTH@7q}1p-`^$;i75I zMzsP8f`2x*hV6JZl^+w`c-bH1Q=hg~A|HgLc|uMPdQ~{Lh^1OkdVfK!ov{3&vqQ zh2MDC)JcP)rYKunPPh&;^X>=`Ga7WS`Fq0AH>Hn91UkU98VEUmBImEHv?JK=KQW)i z@m!kji^12F^mlTd%stO7+ZaN&LpiFA!p}nyZdK!GX5%vn(bQYQpzb>4z|l;#`uZVT zNN?!K{6qTC8on5KCUO2@aF}?B4SoJ$sX{s0iA9Tz?20CPsWIUutsCt0<@1z%_?&Ds z4y1<^wZtJ1JQDhE?WDFu8z@e(@GvO6Fo3#aj?f}DM~2XX^nfA7>g6kS})QwP8Mf-`#1^4(Zx>B;6$66Mz-sAoEI75_3Y)d zb%mNbrdLWPK^4#miZIq=-QpLSTt>(E+hj-90ce>TX;c%>X1}0>jM+H1Sl_K=dIt-E zGW`ZIm}e* zL<$>to~;#9b=5CqvqnS^bHak?oDJoZ(5xs>Q)0Sy6f|fm@4CCbt=?d(1YpgQqkE7J zyBW2`)~W>s>3iqM<9NX>pJf1e3!+g_*?JQ1%UQyWCZBzkj_P>B$Ux~#D?oI~&kqez zN)47ws4@s210yCCO<>8*3_p3U<1cZlnmNhU_l_&>#0R?|Agbx2+ArcQUWp#;I)Yp=6O`*u&E7 zW!+JA^w=kTG!u6ibukREv2Z=upp4IZ-aZ2oE~3>E3ekKt-`?H>B1G_M)Iq>$15Rg? zN9L2@{j-@X1fydH;uRJ3eEIoTZr`e8iqsf+9pjad`K;%I`VX;f})!$>O2ZC-QkL(%*Ae2J10`%+rS<5gZH)G5?fZyGXJ!dRNA zc}r&rGAtFE%kz~){Uq) zWFAC3(A{c@jb;wUH_7yogYZLOLg9A%#n#c@2EhRmwY|R4>F#{S^vH&qja=~cZZd}? z&eBZaG8>uizPp{N_FWI@cizB;t3n+2j`T`*#`(tfD(2|4F?*4DxnkvA{r-3*B>$DO zCuGO;qyvebzSm$4d^hXwIl+Fm|))09o0W8*_-k+^@%Fr!R5PiemfC;qwK@- z+p)2S@X#oYtHGd-9JuP6_3`yk($}OjK@oeWBSPoZX5EaoAxXEK`;e1(LtkoC$|fO| zLTk~C?^8RbtZ(@i_*h_9bA7TNKqWVG%j{P>ogr`NSimhv%=nkZYGWcfNH#GF69R*3 z?Z~t2);Ot`vpPl32Gr}aLWH^5IDP2*A(Cr`2Fk7nKewkNRYsrF6B4Ci(Gdj<>*BYI zzKDD30%A;MUKyFW&X*7<=fKb%_e$jGwN-b>;YEUUQ~(aOGD~ zCaWovkM=nc9+aM3w^UXkWSP{+*fP0#UN0ho9jq9MXcSK0XheK%4WgMwZscDYkomH^ z$#yuXNWl`43=-DRO1aQ{>wO06vJVw(GJoq^F!i0(vP+;Ivp?(HaMJpOp=HY)+6`6D z0vcrP9p}Q_N>I9?IrVdH;Q{3V5+X#{lqLDr=-jM8J@tFD7i-VXlswo;yT0F|>w_Iv zChf>pzKH%j%OBnR@P21?`vPN^USm+NyUp;$S8(+W4-eNbewg>PUtyaEQLDZ~g?w?v zgDR%Ns^8NRwwg@dve|wyW!&bv^>x*Nzte}qY$eU#pA~?4d@DTp4C0}ebd4jM1sTCA5#m&-0B zMNHs(it1x{($hWHXEx9|65C87BqefS*qv=UD@C8M$?!!G?Lcl3v_gF8Xg62Y;V!Vb zwq6<&mZB)r%*LtWHEUEVfwRUe7cF!-M9WUIBcr%>HS^J*bZ)drJp0^D%2*Tj z4|3L{k=K7CXZ^Eb+wWU0PM{SG@Rp17w^ng7?i<7kro~bcggGeaxlth~ z;YwK0t?%N5(4=XB*Cd=_&)mstLi+}xz*H1^6)-0?y-OP{6&mUn-!#@+nMKt%ET*0g z#S=LCPo{n2IlONf(JqR_CL25ndBAIOApV=oOhuTOJL@3#hyBQOBEb-GFw^E=yHC-C2n z>s*sUjQ50eyI{g5sVBx1LTGa^w>5&&HuGq&Rs%coBI~AOgk==kxCSD=cO%|w9X!xX zGDzzi&xRc48}Wul$Srh`F+oi&=ad8 z|CE_cNX)}G$XnFf+v36V;-w3i1skDr%vtEF7RxHA6%dI%wl?&KJ>V^e`VSj?oMHhv zkvKlp%$Ug=OiD6Ut-XeISajlW*KTsC$|DbuQF7w>EIplQ*+|(0h+dFm1~2ZiDD_up zKklwn_oG3T_qxIs>^kSS28=F$a-YPah~oie@j4k_Vb7xfp3+fFsMfHYEYk_O#I`l{ zdFL2X$%zMy#*2(^a>U2OgDUlFN9JdPKuf)MDT)m@K3jX(DsQuvxneQc*!6@=S*VJs z+RWP2u>#Riu1&8cIjQCx*snO?)~beP4ePokcwu8>&7-edbx^hxqm3a|Q1!X?yx| zK36w9lpf{r7Y>$XWA^ZDY{`ujUrvt}f{;JTV8k-S$$sepVt+OtqnIHT8!+oX zB2foDMk2HCKw#&j40O+V%@ZS#psXAa=asiz#de8Z(H>izriPwOM%6=mud%v&z|G@M z<=Y>+`PM}YP1moVItjC2r|@X89VTB{X})E;d@~2S|A?7uz@}MImi43U5^v=Qo6+`- zM*({GwiuC8*#<1Ts=31~)yI+BdHn{7HD_5Ec@orykk=kruJ zhfZW;E=DR&bSBJ$P~6czQ$ql=!TcKKb8hLFYU_N%HBmz_+xAa((rhzp$J`%}sYu%g z1*t5i9OB`5M5U!H+@$Ha<$H+JB$g|?)o5jSwQFrdZ4Gfgl3R^<#bGf z4TcO(0)ur{ur5Y3C~H3!XzPWB5wBcGriZ{g|F)bo-k20AiLh@N9FCf@0~T6W0Wy?7 zWZ+Frbm;}Ler90P9sjy&^M|I?Q$q1|gC^$|_ln*0-r9F(^U&|(4viE2rQK2Y7#8M8 z|0EY_^5!8s% zEE#iHJED6`NM%R8H=~<-vDZ^evXbwXAsD1fR68RdABB)lHw|agKhUI~D1ns5!X zLpoRWFmi=@oTZa#Q5^_J;f9BQUEI9k;+e48_B#&{cd4c*%pr4RORaZ+kEP2F1@9K# zPKMwsxK3WT?!|E_o3r{zr9G~Qmd%22+#WRhjNp?dq^4H8JQD1tUx^4o@bri9^aIWM2^o^S4#!r&2PvzKX~f36i5rCYD4)yM!x0F_ zciPTG*J<}`T>-Xuysi#+vpqU@sQwbGH>vrzmN;o_ou2e7K1Gb@4a=3HZA_T!-(?bS zr$ZyXaD-hWq1rB@@D^S~-e%wxTe&QoIBQZZ=r!IIwl!%Q&@{N;;|mKFqCQOf4o_ks*`)jz zSz!Vi06&>HvvF|zx_AR#r~RTT9FMnPzwh1H*nv^M@7;h|{}WeXWc(+t^4rpv?VpLu zkNdSBfD>xHt3nN=ATbsWw;>;aPfJQ(6@jA}L!S+uk z#r$X@uJ{*|dh-7tGbvUU#=jW@sk;LYgEl@!yU8g{&0cdwYeT44wv|R##2>hn8#L`f zj8$JGxMvAL#_^+wyPyaXf`g*$xI+pE7fvcwS2n(}F8tEe`DM;i%clK=*QtKa^W~nF z_i1I-^|00%ltK2<_v5weTc5Slm$ZG>7`=wIJNVMlQ4_kzF-J-6?}qjdB|XG^iOk4CJd#a0`GYO+tnWBixh|X84SO zEEtG#ifS<6VhDjO`xS*I3~zwikm56FZN!31hme*GxWZXR7f~@x_H-{g`%v>kz)8k+6Chz)Z;iSE^Jz;+r!sEMS6f|56p!Lc96m+WV zbvj6KalY&4o_Qhb-gWe1Cw1L@=vA>=?0mz#?>HYzx6l1GF4Zmzi<|TyD8+L;LtXp2 zB7eLL638IV4Yp}!0>=vpCo9b+s7@kOF>^OTtdkt#^Ga(~p~NY2tf2ap+)P|en+XOJ zFe*gju<(G!1|(JanV|RMerQ%fESApK`jUR}8yQC4jG*2W3ypC4{+Z92L#=a?gI8u3 z!aQDK=E$)Y9bx3COJ3wk+O7cl;C_@PPv|vGBrU@p01b~l=^Ejqy*O^b6E!g>CZO&AyPCiA?)76hg0f! zYq&?*2oGP~yr_dG2&wXhv4V}#ttw=s3|BR^rYS#useXlrgPlT&pxI)|xtTv0oh%@? z_w7@)JVFq;bR107X zrSpg|5M>aj9A=4?oe$J`$v-273}fsduh>L71I1DNg1=nL?t;!=Z;l4xZq69_`h+ja z$30a~{0o;1MbrW!fxh|StnoLqw`1xm4?d> zeX85dgh{zI&rO~PRpgY{k+S(PGQN1oqAlbO6Yqh8HjLT3+ZAGCN9AQd+-wUWYDy4^ zww$kglhYB{7eJhqQZ}0i&YaUO6E5Vx{|xro7&?@4!#qq&-2Qq)_9=x=S&S7W3?f*9={phqM`@IJ?F9`~Q5yx06G*4rCy{dRf3qSbm# zjlC9y7d-c?%loQvvz9#4RAzzIqrK~tLi5JgQ740AsGESL0iO^ohm&#j6dzXRBDoU$ zQsISc5fr$6ls3M9;`a()*}7DMb4+;J zWSj*@I;G=ULivdd5wnfSiH%^`^nLc08Pf-iPN*8NdXCvP=yBQQl|eVhRc~3A;0l+d z%!y{i+p*7uv@aXa}7vtwx&Uo}g3^P)fM%p-ggVCiKcHzb2O``-RuCHZfq)|r_sntje zxuOJwd;=%rR*w~uWv|%ZxPFGCYfatE)9#6gZ_q~V@yjkPF5_ea^USR9mFv5Rw;Bdp z*dT098mm~;Vu|$IRe%mI62H%aOGALVvI^ql-{)mdKTS1u$8 zqhSVlceEK784+0=fA#U%GN&K2OIkj8|J5k$u>|&g=v;V7d7&xND;gy>k&O$;~*yT;qW+rvVQmI#;9~PN% zYQ&^DSzK8_?dK<}TG+G`&#%>L5MbMR6$j1EcSr1Fq%OD5qG!*JSUJ?CNI$1X5q~?W z*bWBmCzwyE&=FR#Tv(&1qM`{w?VdAdc)i`$jj^oDq$K%kf!)0^~#qC8^taXC6F>fdAw-! zg1)<&O4P7pe#pw|m2~PI3CpLk%lPGL=^*c(MJ9d-h(UZ9spPR?;QEZ50OiPUPqa?l zZ+*%AfYkMk%#^eK6o4D6T$BXDC8ohj{F(?2ORZS~+tD*07Yd})P^(4n4M}%x?WBfY z5v!#Pm`q_4Sjt|~J7cirMY;ddjr}zDMETK5v4#GFX@ibGAmm+62+#}T3IH02GVuLqp4Ul zUG5hL1)D%7k@kYimFb<1kvA9U#lvVYP0{M7k}JmP$h=TNUCr9|6zcgG{17=%G!c0a zGar;kg{PBaUc#95&aX#k;RBX-vyqbCA-dpje0;gOSb#M5`K8hUAIOr$z?%giA1dfd zJ)J%V-JvL!+E^bcZRRN1MI3Aj!45cWH;WC?jT#lsK=HtA)zGtg|7BX5y6|Dyv|W#F z=6sqwg(k&ypWXw|cUeV`l5DP0DA}u30Vs4CL|;u>bm&GzyHz|%Thy*`J#nYdC_8PRRR z`AzV}OIeSQke%US=sw~ZJ`fy>0rwh|I=Sbnu9xRp*tnI)$>z~(S-z@g705*{aXeQM zaK+FlCbEaIDO2tFc0}J)!bGZu2k$Wo-3#TnKE<)51}timm(JWpm?kOISltwOqQlUn zrk~6hsMl_t%e>R<`%>3OJrQ}bZ>wRQjbnzwH`y^eYU%#$qV~-Qy#s6`wY>ieE#nvH z4D$khi;LTs&n>uex5AGG#DV~;EY z)?P=0oU~hhNjO-|{1T6K!XWU(JR$}cQe`k8WN*LI*X?33p?vc5%BvK}>9dH+9ltOa zvIC`*Ihayij0?8qp0EX!#3ra`uS=R5;2^$_%1)?Y>k>uqsWzB67k$C6f&(>Jmlv?w z%uRW&w=P6-UwIXCbDJp@!!ap#y|IKl_Wh)bW*ydCy16nxd(mI*rGXR8p+l9mALk+!g#aD_Yil7};|rhem`IXT|8bJR&x=tFa_4G$|4(b@9uH+2 zJ#bPio7ggLNz-BJqcem^6Cf={Wr%P7u zrQ(VU7yC4p8BY#c*(s+vQQ?q^>?JX}Z^Dg(EVeinR4Am$d-cnEz+w{bA$`h|#&)>L zymxYBUj1;=wLZja(_foSvP1aR&i@ljPTn14ZYVa(yB};3(fb3*N+AcP^LY8laO_lW z{^c%%ff2=0l>`R2Z{d!7M#mj@P2>04z7P5~2}h@^gZ;y|EnmvoRjW{Yb#d}&;@@vd z$6Bf(wOb?pX8obo|5Rq}%?-6S6U&dnwWmTLqTu2Rj%qA|F>JVSeOl|ddV^fs`00g> z_y|%;1MNZ28iSf?;r^7!WuEoKT+#2EJDa2SG2Cn;E5o~QTx%+MxN7Km(y4o1^nVUq zDBCC@d! z3-1dI{x~m}8RFAAGToC2Qx6O|QgPvi%`1Zb2B*|b`88n2itwsHX6l@p1nPj4v z{ij3LxFm6OQoEc{_?*?#la+hFucV~C{qm*Wwp`}2srX`IdxPY(X>OletmI8!)IM)) z`1a+bfUNeXolDECi#N-fvVT+RC@9cJoc-BjEAFt`+U&JiYNnB@=Y7_wmaixkai`q3 zbJ?fSDy+L#s+Uw&a)!t+e!6*Q)n8j9f~bG@_Of=!k;4@#Hy` z(24#oQBB2K|F`rvKaeak4Ilfxt?^+7t5mKo)4w<=L&(L_(gOr(ix>}EqbVdBJIVoG zf`GW`ahU_AZx5RhPw1Ea88WGqM^AmUyg|M`zaTs@gJ$StwZC0M@2V3%G$ODuEy?DA z<1+5O1v}kgBci+VDQ17wMTV;FjTlYNQ{Hc)caF}qlf^sPXPp?1T6&5DTdk~j`~}v1 z(c%Z7=|yZq>yZU(uG(viaLcXI zJ+<=bXVIaH~6TQ4OQBJOAg&S2I7JBxV zcD0jin2E^c=z+Lss#=TVDMn6CbhlV{Q*0ZoOW!gZC#w`7*%Bxiw1>tyc)mX4p4D;4 z(9?FoB;D(#yzG%&oPxd8K}hKOM>g#KgcyOLW>=M_QZxBLz{P{^IR{lMyXY=kR7ndk zO2om_Lv~gn=TTdA2Lm@ahfF$1%C_mO+SHr4?z~-~Y8S2Vom%u0LaFn0#>->n4ofhb zuIZb^AAf$j(&s0QX~`e(!j{D0BmMSEoMmH_pI=01rqTN&9_($axNz&xm4$C5?I~rA z9VfJ%tJYo2pR(2pHC>(6eCFk%kPXf)!plGAB{i9s@&bRqk{-P9We%l2dL{WLJZWW$ z)6yl8=Pt-gPEuuV>ufwz5uHno)G69UT$QTa_rAvRcB7SzXXE|>cOG}Bo@)asO-u!FzaleQgQb^&c9tKBZ_7;VP^i+1EPx&us4qS6eFDy^v z0(x_BO|-B2b%J4;)?tGVv^anc8Mu4){;N|hqvp$aEuy3oEZJ96+8g7AN7W) zX7Oyi;nx$ac<*$v;dpFDb86W1WN_G6PIbZ6cBK}Zo*{(mKC!VRd1AT(OK zUld$lwon_VY}PKAl&i9tyb~T&lHHf8{cQZ9T8inzU$#{@&)qR$Inxzil^q*Ao~+C%%yMq6G}VUw(|-2NoQP#iMWU3e1f zwh(61<|N}+1@Cqr|GPduOdglJB%vkD%&b@K!-7k3FDKTrZpo_$zMLcmMvZuky=L=M zXbCL`*U(_Z_@NzQd*mQCMOZGl<{0t#j9j@Hq&NR*&zn*S$#|o0=Ch<>LuP76#!_{f zIPg(}c6Fy#bz7%;h8W`a(9h{ckrt_ed`hm?{~(uw+3N(ZcpN#$Zm}M z#Y<(++2Va(LlvU<&=SRC{xz>G3`v)5FA?9ygpM-q*vd4^^Fuom{MNbN#0;2F*e)W&ey9O*rsPT%=Q90( z-BI>BInSR)^GXY@pVQrH8)p3bkH2kI&VH1q|F~fKoPrwRWgV_~`*o#3${}9b9v4!+ zH6o^JVi(qW|GP%{WA{tCt45beAZ?A}r8-)KWR-%8j>N@>E^!|}&D7FGZjOns%OkWJ zTBgZpOlI)$H>v%rZoW5f|8;}r*gZu#i={=rs8^zf%4fQ7D}Bb|9MDx9|Ewc}nIo^u zLaRH=R2rYtY*jxfKFJh*nE%804AWwPx1HSdjaSf)ZdHC^QHJxVKXKaa4r=iVbB>Bp(ho# zlVJxHdV6y{Jpft_K}MkAXsiL0BLFxLKW~926pbLjz>oqKhq4WT={^n!zENTBLLr}m zMEd#pA^fliZ-E;UO(v6(C=3#VfddV=Zvaoo^oR3&R|9`Dfq3lvV#f1D%*2EMzqBJg zb|TRT6!Np9&+7_+!VHxsb z?-doO&9|ch1^tu;BcMZJ0IV4&z!dE6pjbkaLtk-GPd_i&1AYzs) zh2t#%q&Lu&d_F+h%;3h6U?#$7M&P2*L&#;*W;)K8EBtuE^^kTDh0El*QDOdY7MsHq zafLA24&ID5>ti*z9<+}qGj_;-$NEOCW<;Q)LD`UBo)91 z>%Y}6dSAei{sJ}!fS#~8CFx`8;{kRZ;<0!r2l`2dMWMiMe(3?_eUf2tC=}RcH%o@X zka6HIV{>E#DIjyU3?)S^&5@ze_<4F*6mgy&j)VidEN6{}CJ^S2hr?q5`e?Qu4hLup zvt=k8$nIPjS-SIbjvkgc&o7FICxV5}Sw2u$JaL{60CkufGYX5IKOTlioR U;Y`C|aA*PsypF-l)?Dd-0Ru`rt^fc4 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_finish_entry.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_finish_entry.3.pdf deleted file mode 100644 index c06343c5fc01099dca77e9dd8e5be0358ca6fc85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23833 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 z

=R*gf&P8yjy4JMz9qH#Av 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 NWC8~IB5yat{{TF(b1VP= diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_format.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_format.3.pdf deleted file mode 100644 index 777a4970fad34a9ed43c794bc5abefa183a601b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27360 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_free.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_free.3.pdf deleted file mode 100644 index 0ef0d7d38c4e3a51160fb2a803326dd46862380f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22624 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_header.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/archive_write_header.3.pdf deleted file mode 100644 index 9cd76030066d95648c13dbd8d8b6249de8bdc9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22488 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�*%OQxb^cj1b$q+I?etw)vIoDoauN;ucn1AIE}#AF zX$a>G{$z^|asErTD6U;wsz>F{^^%YdLQplDM)jRqNI51JegETRj>WRlqA z82;RgBoX`~BvT$mwaM2qm@hCLz>ZY_Kn62&ko;Xhi%#uL+Vw~4#Klz~@bqP@x1{OO z=d<#>xk+e3(bfrf-+~ z&Cjvavh3ja-6cS3Z42vZ*vfFaqY&;VBRhPz$ypLJ`5&p)2npGQ3n#AsZsVm-|qJ}Q`f^-(XfIEc9*`H zy{O6Av{ij@t9{!o^<{^a%E|3QF}YT5tga#`hqCVtS~v=S4tONK3(DIO82=i}W{nbn zyfu#72;P>CU0N5>#rcsEHE*HgM2UZ0mfGV}XPDN2y@Fb$#pv))#0MzNO{XJW@if%sSJvq2klpd=TF&}1Es5p7V zNMzO{KAr83{wyrW4JqN&`{tc@it2AqSdyELEjfP|a;T)kH1CW8)E+tHuOE$=Mc##O zx_G?lR$##bhrps&e-TsoEzWOZfsx-xyS@aENY7gQjNwmj1938}ZKQvMK}i2bvPD7O5?YPNwS|Geo~!A$o{Y|iodb$8J0DW75lU%gWJ3>j{_-X+`}7YM-WZDOos{BokI*! z&6!{Ch*UHz&v4~cm$v%g3ZRLFM@>zFTLGC7*CeeW`LdleskWkaG2Xx+oKU=tX#7AM zo^}{pZW=sxC(vV12@`GLPN!&>+HW+4X;4nj7I{KR(~k9xkKn8z{nkr)^adH_sSCqY z)A%tLwPl<0loZ%yXqB!}V2`_Fx{8nEP5p4q5+6&w5pfhLkqrLimhB%qhC z=h>ipx;m0wS_CQK9dTkj)ODrLjnPNY}RLUHX zzME**=eGd;y-%R=dF+}ZhWS#$d7(gdGKWl6Rc%2dSHClIi|-i+p-@021w6r#qBrPD z%>r|Fe>N!Mg$tAQ-PJ*m6#N`)i`nfbsK~GaGB^H(dKWqcdBOnXQ~Y{w^GC>>giE97fuw2$gVKZl^}HVWgEBR@iDD8>GEfa`?+0H+kutT@DIdGKa;!%iyNT(b3-4mL~w zwE$?Dct6D>E|I7Gb=xZC={D)>GYh0KJ7vAGNW6*#U6;k4AMcmqkDAu?RWJNvooqM< zuW&SjQLoALTG@M0)Y}>U?Tw$zPF^*@*5v=P!9TtK@Wg*8;y*1D0~;Ik{~cpu`WI|4 zG5IbmgAAZm|Z zKM>(hgT{0-tY9|LH6smAvxHe`2w2nnfvxGM_w%G3xgVb2`^BY+!{^_jo2Vp&o7wr2 z0lL$N5q{=D+DnGHddPunRCk|mYOa{H5dEzp_AHw610L#mZvM^Jh(voFn(`V^cy<$| zc;na@8SUm#y67aD=+mXq-1-Oy>@Wk+V=J47jl7>8cWN6%2-?7m`i8@$TBFkF9Wjcu z4cfQt_H-Ee$G{E-CXRZcWtU(zkHn*iWbqCM3^VoHIwD$qDq{MXa9v_cf3{k54E zq?-0f-I~<7Fqhs|q+4t2Hk9AiJp~kFQ$AJgY2{rJj}>syFbUX&V^#SuWbQO!aZoy$ zSY-6i-g`_B5?fT&#IidmiGpc$x+a5pXk-P19crc7S|{n(#dVzkr-n1nbOr`Tdk^;tU))D^kE#Y=?rMj; zNp1gtEdV13(^0lEvRx=#JL_jQw0uKCPY4KZRgP%`L;KgH1JLK&V{JH}C-_(6qd zW}GpV7d*pGiw$7tfe6yNa<+1w;~pwk&(6VkfS%#|v?D^l1>PuKNDX-Md~3|t7OS+; zQgy1_Q?2PWsmeh+Emc0&3|YhK7QwntwfG=g4VAXm%SNFzr{YlBUxS!eb=QueynNMP zS>#XM4)WmVt~<1DUT%g0^Ed;wLO6%JmEjAJ;940+LkhZQQ1;bou5O%THLbqu$g>08 zZNh%CeN_t1O+$oI4Xdu1qUYIoE1#^Ym*&2zd$X?mPaLh8j1M?b@L9Qyj46DJk6sik z9`$`tL4(jN26LGx2oQ>NOJ^2=}K!kmVAHn^SoeDueoms(ff@w zqv_x%QFC$pjdIo8;9vI8`*fcBHk^!pAmm0O)9x+mv=0miVs&R2X+V}3Z**Vs>9>SE z%Z&X6SLBi$QZK*{QdOp^|EHt$_7{Pcz1^X=@=Ewp8rpjtfMnmw0E9u!11SB)0oK?> zkeJ?zN_JT+djcaB-%DlGKWft};rfK+Y&TnBrQ307dWBi()j&8_W|FD2(!N~@QEE@s zB5Usc#)~`|-j|g*7jgk->Nbk$Hdb)VRQ^G7p3KuH-6av9X}lZP5fN_Z~RaX<1bLN;60hO2M{Anr9k{arYB z%@hB83x6N(Bz2~)1cA21`9BW{Q$BP{4ni+p-t5XvXoRuaeIsX>d9WU}A+ z@*HNI4w@pGm)OA7)YH*H2u2e{9Oub~faL79lp3p>`*_cU-LlJc=c>lhZ187-HmyWe z-4jHi6q0Xq#ii0zB8%(7k%HR8So1q`oRE25i-91`Us5k!QpP;QkJ@Kc8{R;9sniPq zQ8j?duHkmH|PCx<`WIUCWUba3gc+6kpKu)5^${UWucj4{S} z4$}RMKI=X1{b7cz8Dk_y(DVg-_B&aCjib?W3_UpLzpJNUVzc}WQS9Z$BI3M@aTZMBpVEiA znlE%HkoC%z6)kk^y#(B}eXeau=ppS`5}VvM8{^AAUt*}N-u8pL<&XG<{`R5A1C8-3 zSXci9`4P{HDE zlqe#+RMSccqF2fVteGmeY6_uy8U7iLpB%&t#2Joi8P-pc5`qhmY5~fRQGq@zz*+_K zmvzn}*Nt-uoA(bpq^meaHV;^omuQ;A0Ho3hB8}+Z_6fxJ3vsOnCU=SaRh+-1x1fO7 z5;QZ21g~nB7OwVzU}7Vnzuq)dcuEh;+cf1F^vOG8!q}J~fw_9#h$dZv`v^?$WuQHK zUwSy;mB@3UKv%LUp)r8C$GV`yl0oTSdKoYxs{M-@4~=6RZQ}Ngw=)Iuwyz>Cl!Gc&Qj|%P~V%w#!u~=lZ#A8T^kqANg z95IsnHv#R|PPxZz7cxU|i|ND!9*N|{ufJ8q?u>CglS$KHg#@ovp=O@gheLATY4baK zbzcX_gShQ7wBMZg+j!~JZD3Fw?C+VCXW3M;b=q}ha5IjaUBr{^mA)S?Z4He{)MsZg zN$2z6_US%6g*SIt9rgk1>=|#lbQ;Dh^HyQzQhGoyVg}##H$Q`0Nx?R)zZCmZ--lKV z34pDRC?F`R{@w{RzqDW?Gu}I&OposUo#Z7Woa`w>?F7?k=hSuvY+Iyi5zFUwxZ*DBMo&Rzc#t6*|`ZBCWOOYSY;2;zA zqnh1lcY*|hvj!z|GDdeHvO6xDx|A$=#i0&(-7={yF^$Bw&Pd0IK{=aNu{`b*{`M)|E)o5-yZi*rMoT|$l zLv10GrNh`(Y=m*RS{_Rsh!}a`AJw3OMoUx+`U44!Z`s{`J9VB0X30oi$o>tWGAgYr z>yi)hi}z_=f_MSVJp> zVd&}hk@2Ur*{tOLi5ug(nJm5jGpp${Mdd>bYcW{TaqlQnKaQhpk+yp2ubMd+;Xw`zPZ;m0Mh-kyr~07nrITcj;dN==81MJ9Azug;Iv!%F%P=W!4x`_2=$jY!9A zYvdz$J@u@mW0izrE7eU^QY(BjD{BWt0E?{9Ux3Xz4);P%r`{EJWr?2`*h%K+n+!CS zID`V|2B+!T$i_$4Tdw2>L2-fv%FAPIwMx#_@+XtAipX9dnqLqQQ64qe{@H`Brrkh7 zBe8n|PqJ#r^;tLomq+nPR+R06Bp)a#VYQhQRH>{V6bO{pRiZJ2**Et|bJ_aTb>vf2 zj@R`MMgkw>i^OJ~GLzFmt;MMxXhXWEp=^;AKP>P~OQ$yTg{5ot`%Sjh3>#jF3df?t zubelwPyv5T4h|S$&0SXCylpj@uu*$37BrzCJl)K&3>+<8G7A~Na7GPcyFuhlFHQgU zCW>bl16eXlYPNj!H_Sd76IEDvdL=efek5|#e!-<13HNI!ls#eoW$4jg2Iag)q2u_h ziMqHC?PWRwsy7URNGi#)6`IFZFVz>U?B5mG`d4u&cdk=!4*-A;#ZS{8iTg%pJ{v!# zCj89CaB!VW?BWjM-K{hm1m%5fWTtE5%>KS^yAAk{s~U&jRrNN{@*a`GV5nc9k%6F3 z*5BaMtpSm}`plc6Xfj2mRDY@_-B$g zQw9l3=pJLX?so4>k&yl?SbNp%)O2bwaMCS+K{9W^&Mq{?A2 z@ta0NVoO)6DyiBaIaM#9Gb?RW%UDx=$|}1Mtde5Wl_`bII58?@`9Z5US;Zwp;6?)+ zn?YzeS5nTo94%u#PoA&F*N#A^FLWXL9E`VO#1<)MO14(I*$U=D>a6s}5Wm{Fh0N=5 zbYAr|#J>L4Us}*t<$DcJ7TT{h+Pf3QOs+yuw9i&zGjCS-sJ#GoG86%xFD5&V-{w2M z;&d%`aVJXIN_Y(qp-^&%!ClvCu2Dz{O247Wbjs*q+YdzuBFS|I;S!>J``v|t!a@Ez z=QONXU?k2nWIiK+zJMe%f1zq~yxBQ%U~(&U!!9S25iD|gP?Z%knpXH2 z#0Ami_(G3(WJZn5|?fm;HW?@X;vU>Wo6k6-L3sisRPdMGoc1+JC!>&lAv zl@#Sl{3i4anqG?#Li|m#Q;g$-2ac7Ow1FUdHA|}^9Q2X=w*&}1Ax~eoKP>qbs@i{% zWWdiW3S|4%o)@ZpP8Z>b1{>QMOJf8t#oir0sHp@-=GfS!839lx_6f!auwEa8ne2&I z$ZL==*a&OXF#UpAFMZ%m7~tY2oIhO|&N_~KT}M<+Tn_mSnd#&cXtA@eWG>G28eEwA zarj|fNeT;r>lq;|IhQ%)jCy)9YXi>M)l6NuU#GwJ)cl7s&i%Hk@Nd@xwIFgS*?~Xn zEzJ5A*gUKVeYyj1^iYSjM;bV$!N_K6OUZ7rl4gMMOMZXSphjpoE?WeNBW-`eSyY6^ zS~cw0oO&owB@%EG`R`GpOJ2&=#2G4f8q>7t#_9ZN22T4D3Ra!Jc=jA*pj(lF&MGD| zdn;z7ZRZMrj*QZN#5k9N4LUpjgrhm|f-V2{R8tYcGL#BT5ZuyvhN4cq{-Bf_n<^#e zxMv3A4*9~dDZE{vyyHGJ&zTU*C;nRxuStyjVf>R>7_XCAowNP(ltM9yj8NN<{T!H{ zozd$km?BHCn8VsZ5kPJ+YKF(hrqIA0ES4_${-I?1>L%eb5B_X0zZWSSt$&j2-eTVz za|iplwCDIf8a1wO4jK1!lsX}2oWR(LFg0tj4<(reW=Z6$xc00dlr@Y`=omy^0LCxv zruneFstlMziNi!==!#{W_Sd22pw^sn$2{Abipj4$Rn_OV?s>mjGj^^#!NZON;q36Q zm**%FRD7X1Ab z4^4rGj619mL6QxyzGfAe8h8;%j*9hFpM0`XmWx;UA#h~7>hZRA{J?1p`^zO3I5p5G zas#FQ_}|`}5=# zpBATu-Tr9-1K-a5P7~BK;3lkEG3Gt&vBEQT#V=B$oa+r&P$z}=NK&yS`sW5wkqS1K| z8J<2uh{w%d$hY3fo?b6ug+GVGmeC!VNHjA$aT|Tl!kuk^9`6G{3<8 z{DAK-3=sZ>WdDO&|6{9}Svmd}$^NYinExwXP@=J!xXFh6kFDOD&ZI>m{H51Mh2Uy^ z6HBd0&OC9gwysSX87vk~sYF)(JFbrqzh}EWeu;Hw!?D9u40vw)l%-StkQs`SnDE<) zfAZ?Gt1Fr3Oj82SG|z0xTXHMTQCg4IP%spqW|g@sEFn3G1%qXB+>skbC^I6QCeQRC z&5i%_>p9QP_hWVY>VDep#!qjj_h*dvjROPU&Nj7gRs(B6qaSJ#dTKvZ{iSX^&T<)T zo7tnwZbGjmhKwI=y0?5fmZS7{+-0gA`{Oq5;mooB5E4-kzEiO4 zBmFE3HkM*zh7Qg%T>;4)2Upf0Xv!ipZq+eb0#(L2`9L{2(tG{G^(qth+o&L)^F^FH z5D&0=*_PIB$ig)=O-vUzz&D%T5_iF*^I{0kM|5j{W*M1eIpL`Kgob2p0u3K*7m1F?cx*Kb~|vh4q~J=-YNtyyCthNY_k;@u%MtVO`bPUm4Mi6V8cG z-!_>{m73LJBe(nto`IaKCi-rUJoY+(KFQU6PgmRbT;+*Cax=lrrp8462yr+~kBuz4 zFbQk}dWci$kI+XC>9nDAOb(?5F@{sgW`1g1WA7k3^SBL2gPA3W#O9L;+%?dxNLAg! z7R@I}5i!||d%8lZ7)ZfXY3_^uhdrY@1fq=snbY=j0%oeVQEJuzY#{Q<`jLXy%de@J zVB@M40{v<@c$z4S>~|q>unCUlQ~{}*nP3n)N5idqGxxS?X<})l=_U>?6Un?e2BRO| zE)R!-XvS2|ThjH`PKe^xE-kc}0N<#$Q$yv=13|1Ujnp}kNT2BFl9TARiDhQz@Fi&I zoEnVZXeNCyI@Yc?X94xuf&dyA+L-l1{r=oy%l$-Pp_Cq;==fyOAaA*FdeTc)>^|DnzSFcO-QZ6y4I&=wj2b~OZ(LaXPVRW| zr6fbgLEtOC+><$+repa8Fo+o-saQdtie<9`#I*eMzGg<;93lZOfk}sb96?JhX--Z$ z$*sYWklZJr_09clYESHmR`*=BPOGg(%mrp{6cuMt43lRjop5*(Y2=2aGgzrWvG%vw zgCL@*#ia)y#GGRk;^5rIT|!kF3>2;_G?VPch}l*IVVjYd+EbuI>SgS!6tLUPqiB?! zrUw2WTgxRVu9ek1mGzcR-4}X$L6HsvOnK0EQ$#SQFI(7T5OKrnC@(6VMV|5?o;-BZ z>MDE5&*|E{h*WNS9J-EB-Yd_<&&q}pF%MSMB54D=J*NFZqbAE2gL;Y>NQOIdO4(4B zkrXwr9X8OZr^>BWQ8P}!E1C!t79|>A9mW?T0GvtW2#@$O0A-8^H}i9&yb(+fJe3fA zk|A6}nmW!R`BR_C`s{2~HN65<5GZg`_Spjmt9cYGF!hwsr)xd36U z{#`;pCaPZc4+8WoX;9`A?%L-qIqGI4kTw-ZVd*R>Okqbd18(VM4_RiK0NHHN8 z<2_NU_0&~tW8adDD2p&AT(C z;2I`4C7|=}3x)wISnk9vO^IVq4hfL5&s3^O|AUe?qOMP#FL4q(akJn09AYXW%+HC9F)@u zo~F9|8AjVQ-}E67X;)n<$Vp*7KNYmzavqjff5@a>51siDIA=BDa{K}OKN%@LbK%Mq zDu)?r$U%75N2k2b9Ml1Ot(h`Qvz=+$(eBDP=Xi+ycOB%Tzix{t55<$tkG{&>-oUv( zmE+_yft-c~&V?($q+r^gKlK-!YHQ*+qvg43Jp~>}mK6saN)m)uj^kY!3J4hpj27M9 zTYbagmY$UyFwGHiTfnpt@$Tom$DPi}If)N;Y0Uci`+k7M0<%m0%}D=GTQM=Qu>U_s zV)?hWV)?JM)%HKyYU}?n67A9otPC(HeZ{?S_F9V+r<_{uu-v#dC45B2eq%)GwIxEfZ|9%UxA7#WJnIXTENl6lJdSh1 zzuyr~_ts$apsxd#PKB!+!)C(>oNz*o6Y{BSaP87+tK=(gr@KE7mu;th-JJZ|yg!Gh z`f6tUeV(%aRN8I-{d>+&9&4vOFfd3JaAiNxw8|f!_O~;#62xO3-61JeRMs~#l5JuM zn$Wyor|0M!o0ro~Z{iG6M;ej^Zxsn`GF?6b?@!+h)zB& zXIwU}@rg9L_+}!Ya~NN2h1w2a^;$s@kN%82N&6T>@HpK_hA;Wmf3#N2Tfl#PKGKTXMtUj#;OeJ2hOiFAgBO)I_@`J-)8Gu{Jv!6dONdmLDa+AKqk#OB&v8K6_(o3(^NO4*V4{bjE^Q+I;fo|CHJbo`sh|!vq%4<7 z8nr=J9pzJwePeMJO8OkRN@o(DMXZt4)pk+`4`>x7q8_AkDUGBQg!qMQOSOpN+_p)Q z2~(w&*NBK78bE5iENy9JuDr=evQ!gN^8u}JUum6e==XWDXVMgf)ks%>XMtza;zt82 z-OEn8t_@2bC^Q>rKTwM?6NEShR&n4kxK?j!{~Ug8Eyv4O*2O5fCF>q-Rh>K8zJ>l5 z;#Q}lE^u3RA6;mb^J@)htE;Pyx9-NOR-3=dBpD|k1Ry9DFAgs_H*4g;5np8XhrjQ$ z-hzsq(DB$fCBE95a;5xY7rU}IK9H80rg2^L}EEmBc;pP zSwpoY+-Q3>L)4tVMc`w*qH%9%zf~b~PjG#z6zG5{JvUA|2V=qGW0qu3D3)`J)di;Cv zQUA_gJm{5T&cbFAm#)<$&#CO&ERbWv8#lO78$@+*`moKr^m?xd;|ie|!oDLz$fU}; zA#&?t0&(s0+`2%>!CVec@QImg#oY3DU26>R;BAMt@X! zqKwt~v+%a5p8L^NbN$Ks%t8Zu*)MdDwiegNiO9OgE=NFK7$<{=@OoiGSAvLz-`#Hu zpLebpw45Mlox1o_IFm!(&z`!&S18cN2`c^^tAKdq^XN8}@T7;0z3+PtD+#;@Ay*+g z#VV?ZPPDGK#T4?4f$vXnx6RY4FW%Fqboa~`VM%CK8f#PFz?7@7<3BhEfJ7kJzLvRQ&wC#r5Q11n37o@(Qb;d{i!F`oM}Qqur=U5y275yZ zcNg?m!_aNi0rHHHKQ1zo=P5u0dZOU*jaIeD!g_=b`?m6 z0#L(fT9~9}W!S{m+cPi@@N+g!0)yrH7Gjd>6d3@ouM(2`M@Avpr(dImWK-)p#nULR z9H7Bx^D@?CF-=N6O}Pql@PphdV!8_WL+wMEL4(FO$s07RC<9U^4pm|-y;sk0u61^L zeP9yR$yi$%-uIj?O!GuT)Or;cao0+iiUd|(BO9(pER{t?a|E5aX3us1>;?rbF{Vm> zqUpY{!&&?FeDlN6biPdn42Zx^?~BY}efXi0$^=zfzr1G#I{F+ozmI{j@z++$V5I`b zju5fr?xD77-biXn6yL7!ZQ1nU8e^aVcx92zsQ5OA0O6LVNC8NaXz-E z%g`6=@l)*6mxD z*Fo@!JN1VA^v;dj$M$iy|3V`2dV=(Wkj^IC?(Ls-h0anm&(N}(VVLN$b-{}SI(qr$ zX85?4~)OKu~@d}dpx8H`RyYMCBx*kH;(dqjqN!DGMLTi5xh8PK3|g1UwMK_5A;xq0 z^6BS%!uWo}bQL9({|op22jl)niLtQ$Zv_p@zm*uvf2G9!|69tb%|Pt~P^W<_LwxJH zrVACe^|h^bs^?S~;4qRE0s)YGig)a6g!o?9Ssi;qN~ws+5(vd%olf~YzHK-kB0j+I zD*v@xYlim=7g3ezLDKTkVsJ*-@Ye*}(Hjno(btGKXM-1J1V;q2;9>9-ds2qHG2ys3 z|6Oj6@7=6=U+?Gb^HbH^Bm)1B*Z28p-cI~Wt~-Cu%n!R^f;>n7$_b2489R^PgWJ8a zuWs2>fOj8t6I_%c%xvW*sdDm(*_ZS##TvGbfZ494jPkEDz7JFq247WeYMd~Yy%wxt) z_nTHi79~RYtjSr)h+IN9VV4-K#72DbSFW!1Lp`|cY8iqGG;nW$!+Gual-s)EJ7=-Y6Qn;}w)9Zk$<3RSgb7|W?wWnT?;+q`H%tJ?aQX&Yw)uWQ-ov`yNzpn!0~aBQNU*IMOa4980K z+3b&ekzA|+qf(eIPk^|J#0zHfm^jL^*jTpnN@9%VDw_Sg<^j1%=s;25nCwUQSHWl!a!`!=gN zx~P@>q;j6SCd`>CvB=}&#KKk~{7+(xCLpTM(Yl8IGI(eqH3j*9?0jFf2!(aBV zk@9{)_5Bv<(6f9O7(pvJLRTY_d5%BCSUnHbml=ACWcw+A9fbg_O|7a0bF;j>L&$@T zmJX*B{4k|gdmWs&X$$*n7fp_K_dSt_v0mld-|S%n+%CdP9Ls>dlL93);aZ3mC4d@! z>y@z);M(0{8z z3ScO|sn~$6xyfoN80f?e7j9508`Y)48a?)c>47_2JT3)p>JoUzhF=Z_s#zugq@@`Y zul^m{&hPaGo;rNQ(Fg^X-mEP=;T2Z)*PaZyAgYRwsa3oX&EMt>B{nNS!7^MEVQX_A zhgbJe>~w>y%#o`ruA|y!WS+eBIZeP+a}NK>SL#E0)Y=r19VRqae%n?x$4#js@5?|a0%Dcy5N^&+(=ly6rV6GoTrEMzp6~%yyuuYNWZ* z-T>T#2=m6E2Dys{nU=k>V_=kZH z{TomK=Y#=EHLezLe6^*ih2|vpjTX~23MFKHGf~~Vi0nd|#_VsFHqEla1-QnF?x~ig zFX7W!x>%a_r+%zAO4{6R*;cK0a3(X!K6#eBp$YM2JL)H)qlES6&C|{`_-) z>BhVf-o<3Ktv6vMWP^|@?YU+xlEYD0`cQQ_x3FuiQrL;B>3)?yUOBDlSIKinXKXaZ zR0#IgXm_XyL|eGPdk)SY*J7qYyxgbnPiUGf(h2pUKmG*13jPcg@T~zM731{rAYMk= z=Y5h0_%7@urzmUtI5dZag-+jC3o zKuJvZy}oP0?Cy)3sLE+SZh7m_KP7GCmk7t17bFmjaPktQ^*?pa=q!=r-prU?EXa5n zHxM)HPxN(Vesbu3y7H$TU-aO9NB&N^>Zb?zhE9n+l50O)}jPabU`)#M>LX73U()2K7)&tkARSYC7!V;S?4US`fXi&G9ymcyC*dIjnb56UC z(WwMh;YcKFPX{({(yt+~?XQi1z}f3`Cn`hyp+G+`u!j^v&nsp;+k}@RpE4m8d_iuk z!jN|`$!KB#e4vOs*GxoKD%7JcDcW0H$?}${K)>7ZhV8QrT^_fX~%6O%au(^k6Le;&4?u3NG zOc5EQn1=$n+IaFGB26o7AZ8>;L7&yYiE=vtJ}PC`FW~-!Hl`TfV30Y96~quxA=63p z7@E32wJKv^hI1f1=a-PiWwfvhdyqG}rYQHIZ~=>Kgr~x$QV7v-UmNIUf!Mjb93N9l z5%6OL{$mbjGR%!Bq9sYXR8jkW59}bb&5+3A1hd%p(Uo+@0%K_Cjt~)f0v%7L+DGJj zZvqxbqq3-ixL}28IBBylqFYf*s{pNo6PzR&E8s9}@=x`%z zh{3tf-PhWjF@k&;PeJg=fAe*DyD?@wdG1_cO(6_%#d8MR=apGpF&OP3CaDRV{(Ov4)tX%C_h3w6Lg4!qnSx?bH5b`;POn|5Fm~=qyc@zU#hV<_3+(t4P+hq zVH1+1spP&?2Esd#hagpxep9454p#ME(zFYe8*kSDa7t$#uM{$(NKK0rmd! z9t`~q9MZvv7gIU?7HWMTY^l^JfoNfXu}P@-s&V4}?6940WyJ9yB2Akd>5(%WqhT1( z7S}>c?md%EtJGS$)H!1kx6}y1&r7UsbAuuxzK0d`nO}Bs4ql9UT~A`WubKGgtBuDn zsb%_!9nnoEA#f;JP9HJ?dABGZjArQQBLryq(>c}FnzRu8V5*hPI2#8b_2Q5FAb zutDJP_a7JS71Vp0$wegd8SL4#|}p=ZR%s?HBSr z9v*{1+8FGmruD3tQ@n4USce?Nb%JKYggATbY|Rz_CNiDXdzIR3r9OAQ?4()kBnS zkLR?f`Di}G2Fn6B=Fc_-SIMS%+pR^iTAZH8#-UMa65gyX&lVRB#;@;1Ke@Is*xQ5dh3cHi79ah|wJX`|Z+?lmK{)<@yuAff zTust29D)V65L|=XFgOHv3GVLh?jC}>1b3I+*VO&%=YI1u3-B+q!e4PY3a&PW02y6lLx7~AfvGOPwF{v-Jt&)*otco0 zi9r(|5J)|MiA82^*{(VS8rvEVwnI6)R`42R_w^%;J zkokX1L*|DxWc~vU?`8Cd7~V0oAIt{CyFl!a@SY#q69Obm4eSZkVSfN*xa)@;EGTs9 z?sC7nK$jnP_wz&!_I@zrVDEb@2dha4;vbG6j>mS#?0#~#zYzmeMAt#r!rJ&(n?ISW zq@jbZ0Vs!%<;R1+06Z`V-*d*_Tox7}Eh9+?(%ne?zj(7k72zjFVK?mt8Pw>aLjoZk@tBI!SYxn~2v z3jPyf_k7`3?th5b{j&X4=bs?nuj602{~^TtW%jGiKSTV7v3@YU{?Bvjeq#P?hhNv; z@J@yRs41%ns>)J>mY1EWq20Y)A!ul?Z)a-bU~NYT{NW+FUmkbGL4t>=oxOvAiLM2?$0!kfdQawYT#gEuMW#Xe>bUr{J%^6y8HFyLH^IO4@>Ph2k)KV!y@l$sb_8RLt^_u_+MZMS?;+f;9o$y&;2>bKe*a2bnamP z0`gC|37Q%i8G>X|kPr&u(hLC5z#7__+M8Q~&VJK;fa?Rc^cz=kVIh8HxnEO=R$9-( z)Yj4PpQh6N`{QAc{?$|h{=-zdBlVv@zX#!uljB#tpVvQ@c>wo6$p6*ezq|f5As&?a z!^HWO`@8&qGjSeR$o?7(SxI>r@!x~NZ*5`lPa|>vBK#L4!T85T{kP@(fNno?K>fMz z<*$DI{raPyzv|uPf<8YN<8K=LUY377`9tb{q<%p7>;F%P4`vGJ$xrxqdH==t-;CPd zp#3*vcSnG~^I}0&0Tn@EY6VkELwnjkj@*x>|NmsiZ0x_65X1c&=@;SuaQzP^J}XFP zV_{(>yu1EN(-X3?vfY0f+3sG|AQFR0u!G*W_oZ0bU|E27*xubSGqe1ze^>G+od1Gs zzYN77Rq^+XS9~cgDk}MtYI4?=x>kRm@OSvh{fqhj@Fm8~^f$6G(cd-r`aKwT!*@RzKY9Yf64WLWXsGV+eR#d=&#ylG!t?I_E`2xL zKl6U~^`0IeT<-FJ)w^r`SNab2k2Zhw^LP69Qy@JEJctyaPWo4);{{AP|{c%X_!!u$*BzY*I3H&-#mVu3(g`4~L z@v&)2t_t$T&%D774|4gKv9Yh*Pm2J(U`D-89GBnv)??vR)YQ~<_m$?sy&JDH zEigkpK^Ta~J+yoYn0QHjx9RRmJ^xFg zi#g8Wb9M$6U40D$j~HtQjRuR@T4{a{zuH^79m8nZs@aMz?R0FK8*grkkYv=13ZSjL zoSnGJ`9x4nZCmtC_KZj`L{HDPYj{rV$+|0CYQe(1d>p}NY0sCm1&<4Pse;tRXtNg! zlj2^W^V8PatIKP%V_uPY{<|3b&ZX-`5a6~CSu_(CiQM$WWyQhk*TValv=WQ zmTq@Fj;%8UZ7lV~WO1K2rii)1K$BV{LsGa8=l8>5uI<4>$ZvfMNlh>Es9-D&Y@Gc1 zY_xe<6$o4RF=|}d> zBIjw5{45u5<3jw~KS!;1mvu)}KWkbTR&n{X>Rj)3)4vV;I`i6`Ru|!50TR6nfG=xut_YX`-eN7e-IWn+|yT_^AO!EK^w5Du*@- zRm$=b#bWH-HUCPHk$mm+C;4Z9MN_d08sSc>*+!|)@+{2^?^Kl1iepM-5$umG^riQb z!dLSqEQ`=#nf12gs1V#WNz!v=3nv(>s~KT~^IFHVrhU;YHT=0)r+QiPs=|xH8*lr# zGU{2at$WgGYZ>B(AOPWZ$(yc)ip78(@UlmxVzS^*2tk3!6jYO%z{^_g=G|RJz*{$#ksesxnyKhwmN=)2F@5Z*cY=ETsLm_29`lXi>%^dwZE@u|+Y;ZxWtbmnV41 zuBeTNCGOTW$jpeW7f8{-2*KASe_{-B94_8$KSFe zDj4S{6w0y^Q`>{z`aH%q?Ya0gL3x|#LDrN z3vyI;$5Yli1R-4!*vtBe(Ua=FaPLdOPaQDr#ah~K8Phftd#Huxq0|K%5YAw3d&IOt znAnRI(h&V^YoCnpX6(PQ(f;b=*7oI_MiJuIEWw2X4vw11J)ak1dQ-=yE=>5>9Z)n@ z8m4Uyel{JByi8qDI@ks8J^iY79F#nwpxt^p7Dm&To2~^pUL77GHi%{~S#?w52tlP9 zk8x}rloguWpoA~5Cn4ity|*TS5B<=qkY}Q!`#NH_>Dg90ZFZKYO#UeJhKVjJ$^hMy z7=@q#q5Y8>a+k;Wtd3;(!M(mZR28G|OTRqR^ zV807}{Nw~`YQ%Wi5B?L(2m^m4*@)m{iNFK>E!Xc;2O9t+R;%Gg3R=K?L>*DSl48-@ z5m}>z3gBmaLzE!feRu~$@Qtkkq!rEGRjWYV>XN}I1gAW2<`<&6-;do|I%$0gNX_Y> zzL8F}KmYm-c;Tgo^jyVu&(XnYB^VC=Sy0`jcZ-E7&>suGWy)bm5M>V%&sa`3Jm9 zes5hJF_iqM{o-vHC;oeTAww#{+VJ&g1!VuPTM zNPH$RpO;D;I*$;g4_#kNLGdq!YOlldSVOwJQ7T=TKs2k|JWi(H*^Pq!dv9Zr>VXq&CgA@edrti;l(4vU-4J*|9*6Ua`b1iC8s z?#VT;WyCpBr~QSemGbHZ>Z)y0KCn%nEhgUz1hH4}7;%M`uP`46xh!?|XhNgd+jwg* zg<3D7BP?_|O}jzP^Zla)-kU41rv4B*vI5TTYkZDB9b$gawI;ERK)JzC1WyG4E-NGwH#`vE*G6 zrj%Y8pXtI1@}7Y~R_C3!BcVFv-IVmiCU0ysjgAASQuBjN;mgj1xrcC34kb@QkR&7K zqUxRrWgD1cDz_oX+%rcJg53C}XiOG`6Wy?*eF3io&&)8qCODaT8 z1;k&(Uo33KZ$H-lUF#d~T;sSJ zk7$DrKt)YS%OhhEry9bIZC8R17rxxPZ;33+Sq|r7kW|oMJzfvilNVNDkGUYoDO#?0 zKN;x7tNval?>W`(@sVU3(S%)pNT>rTX3Zj(7qX9a3BXO$HB35%o|hdK^L66ugx?xx zmx0kBW31Z5h=-%&Xp#NbVSxH~6nc0XyT@=Az~MO zGTa7#>J}gTz4B$0jSlqUXZB3v^-P{oUnWiJ^{WH-7$V1=4ERcLHTN)f>&Kv@GlrK^ zKfVs1(L+fN$;V4x41jEY9v5P^1gjyhR%2<7)eJGDubr*@WfL6yLwjj%sS6I3p;?te zQVVQWMK2~dNgc!b;n3AuM-1mF2g?f`0kYxsSyPFMie{a+-OcjF{{TV#QEuHAhX$Zz>ft>g+-$wSiBb z43NI@_2HH38^n6T3bC(5R|b7@{$zH7u8!JF)3U6jx=h}=w`g8Jz5Iw{q)n_#uy>Bf z=}>y(I{nkxRl2;O7$-%vD3h0~xRDya#eC|=FI}%RlPXW^+5I9#6W54dq8oqu$g^>~ z$_EDvDDIMY)zZ}`F~QKib0gTm4W`z^*X|-tj7qC@>*cR4sIp!C2aC>%oQu$>#Ldualhp*u@@C|53JJ|V!YxD#CKxLFd@5DiW~0G%d106no=d}Z%3AH)qk`VGXSm$n;%1e@g3 z%kuVp*7(F^->r*w@cN)fC&J)Y-0# z_8Ps>gP!f+g8);RTzkY8$qt>AmbK~R>Ay~or?T&-%$9VP^Vz$1%`k<*?*pZQY{dqJ z`(<_Cqjy{Oad4gIJ4gge;J{6TBL;$D>A1O%+_oXT5iXXibnIU|()x#nNBe8PB(pbI z6jT>wjg_w15Kh7YYhGRuM5Qgd5A=p?*UrFK*OfNFiltz0no;8y_gSbdal%^N&Hwc(bV1-P9w_i}#&=VyIYDe26XUf83?4`Jp-T%c1(y=_Vs|hG*oiJ7&z&lFSJ+ zc0!$ba>Stn>s6HNv^?dRGG)qr9H#{y8U(BUq;P)V4BHc>u8VD7!JDidSgyG})wSgL z%3zD~qOHA|0EAa#l~pkzsMXoI@bOu4rjojjUQ)Wc34B1*J^?Rcni|Q36JCr}D?kt) zqQvK}C4Az>g-p?2rq&L{s5gl=7L;^Mrn0`AxjY*gu&O}_n&xaD+-ll-_}4&(x??24 z2f(UIZ_K<;waExS__h=eAw=p7M#J>gVJ5GRA=Dl^i-b@v06o@&3C^d z2wK`}4T+^eB)cDdL)vZqt5);OGowevqG(Dv;ukCY(sUtdWdotg>)Vb26xzw!Wkp34 zLg)w~IAxdA9MKM6T-;K@uq1^vmYWK{cZDED~2E z4gG0)C9YVfQ%%PC_9=T*Du?cv1D82`G@-x2GnS5wExUSTP7Pfr`rI8XZ=EkvtYDSY zJq%D}Iy^0CfV^5d=BQ?A)Br5;1NIqw5O4o=;0rpMl>_3{Fj8s-8eq=;YD@$Tyk%<@Y~o z>qK#XBYWTQJu3k#Dd#kpK3R~N<`|YH#b*6FADN{4r~-FzpJv6p#0RTQ?;G}dL_I5W zj<6|$>C>`G75U63^HnVRSTQ3=o7P_Q9&bOP?dE<9^;aH)acHSfv>e}+B$d}~u5VM) zH?2}B{S3RKDH5A7Xm}J9&9&{b8f5+v@$2@aqVsZhd^kB@rkr^h>M2pcwE% z&-&2)q;_Y}tC7Ls%OHR~iOLx3Tj7U%;TM1uEKVG&>Uug0jgEdqN>8y9TG+i?{H}ML z5Z|{BRr)%gY8~5WeC!Vm2u1Esb{F4~jXmD1f2#v?N}d(jjhnCt`>0%7_wYg*x3gWP z6rkV{b?jt>9P_>W`br9t3Q)B6YMe7PgI;rG1?wE<+NTYXvF$ltk#1Bh6Rh8>0ED+* z9p*{NUV~USUxY~ZghfKW*D8`-#>KKse_&QU-ne3*tF((}hZ+{Lww8n52y_QH#UGzV zbkp~qJnDR_)(tiU_u?B^*3oO7*CG~c#wkdpB&H`sVt9e%mzt^vI_F2%7<4vU;*$H# zSvwM+Rkmks8>e&AeRX#+y_yxhC8&;?pP!FyYVKcSsy@}i?p>}Bf^1_M^zMo2JNiJd ze0#RH*yqVRL4oSP0-V*Fe?GeMM7q+L-3p@fLK>yGB*A%?%VLW!BhyGAG(-c|%#IRM za$ZmKY2(vu?d5zRJkmUaL~yq&B@N=Wjia5SWq_n4EJ2@=o~L()F{C5=T#+>z#=&xXp#D#trDP8Wdd;+r(ZYqfBt4VSlmM;XmXspe&x6 z-bk6w=PH~vVA@h%D_Leub04R?Vy}so)FVpC1-vzucSzmtqzze=FDfI*!K@L$!!h2& zEhN#gl?WfVbH`=*#+j^3__IchbBeKa27iM6DGV1K%PFo|dS&GvLu3Pv|Y zM}N>&Z{V&usK);wKL51`>o1qrpL`AC|H4!JLv{vj zz@i1RgZy@&1Pd$hPYwrG;6FGVKt8Ys4hMFYf8}rhW&F1e2T%*Y9S(c|0e~Pt2p|j) z1&9G8?i~=)0Favxpaf9<>4>-&sPEh%KOGUj#cCr{CqsY{XwS>NXX3YjZT8zmVGXbb z`6z6DI3Mm@4i+HS56I=X(104VEegKKye{wQ_!drcO3vb?l=&w;iym$(+wAiGYK*-H>n? z7b1h#c-mLWJ%(hYqSwZ2-s@d?eG_t@a#e9+#dijb@U+*0MLs?yU=z$M#a_v36O8NsGdZ$F!uRRxvv+EaDwu(0BlC z#w7qe*8_5XF0W@rEr^YfQ-U{xlDeMhJv*R7c{xN>hYHrkLi|cas)hFzDs@m}my;eT zif}3M23kolWS4puwjM2tXp3ZvK#O4M^BJ_zV1zE}E|N6_J%$5_Rmms8ln|0HNj-vW zUl9-yYxUR?at3?0AaHiF-P&fjl^&;lQ62V9xwW=?Lzt4xTSSm@oM?L`fz}7p+tSfu zB~_Zrq$_v+Nh?wv|5pF-d%u8mVT-cc3PumyEs!+bD`X^NoBgC=6q}%IG?06Yb?U5P z<>kAxg5mTTM$Zk0x#I;~P0-UhQgG7wgBL{OfZN7Z)a3#g$awSS1T#9Wt zY{l0xJt0oKe85H=CdKJJvl*PB_wdQg!vRo+X-!m;fgOoyZKA^YV3MTEB^~bQUzf?^ z`ShoDA*Y~8+`z8eSE4DU#VzFFL$WfCX#BGb*Gt_TOfn(jhR<&7+g0>8%+(oqB0EAiAX@U)ig-dm-p zD5}fFm*sq906QnF2h3BMMw&f=R`<=NAb#CJ_H0%sFWeaub)Ug}!_|m3{Be{HVzS>W z8G4+N4sQtOOk}s`?V3yi8Z7=dyRl^@O64$GH73JzCCWVPmt~j)@&@`QIHMtv6&-Te z!+y&*`{97M$;~ThcwbGvJ+f3#7H+PoC@gJIiAx9bDQ0S=mqLS~V7dvH;0Xr6?RwqJ zEiG$Fwrj~M`|_#AYGN!XjDf51+P97?SQj$*A#O{6eJLyj01K0!e&@tpUz^CjnqJzf zRo|zC8;4-RA2yccBdXK3r0?vxe9BWC={dC>dK}#4>jyU*E4|VT*_yeZlrdI~lLPyy zvs)wzW5=beX$aqoebYrh*cZXO(?$olbv_Uf0G^P~w-Ah^E>#CMiAi6$9j9pO1537Q zKeThq`i6K}Dq6yzaSgsv5Dz@tS1?0Ys(Sq!^wLx>2K0?cS9TZFo<0e*t~^iexNW?u zD*(982I?*Ctg)U;{7Z_!lW`{%-rF)ih$IfjvUwRDrKHLu z^=*WFH+@B}*-&Y;M-qmX0a;zClZnHR6>_L1C~B#qq!ej7&->GWdC2L0HdVXcy4k7r)YJSdP@7-};rQ`4Mcx+HlnsM?uo z?!`1=cnB{C*jbbZ&K?}*CKwX^pa}`tXTtLA+^|nzyP5bTa7J5Ma-T)%c8y&^aBB+0 z(4^1|TSJDanDC^?z0a>q+*#?tJYDr|?XxONVPs|^oJv&n2TW1Ookg)xc_~C`RIsmn z$Q|FNca6-R&>LUv`cyWFS@qdF=O#Gj(#1ID!oFa5C$zNPR3GbC9cbux3`AiqBG?w~ z?h}Z`^Z4jN(X)B9F1owo_emEXcdva4NP?h7y+d_uSk{V-zZA|Hbkyh%o5enRV>a!YjmNG#U`dFdJ57Z%;ADD|8NVjVy)1P| zkFDN4+m`FCf{r4-cd#|46`*UTe(;iGzX?s zJ(3qbdScoH9u=vlw z7u)0-!q!^Y&vcd{qE3U3KC+8WGV0hgFI{?_!W|Gefo#}XU{QdJz9v1ARaA#GBpB2- zsPZEmTjUcCa1234=MdD4m=V;89O)w4dAnzA;@U#xhkpQSf_EFBeMsAefk+a1UlkSn-XL@XbHou7ti$R;gUS$-X$1pF(fU3;0S|RCef( zzLLGu=FCn9Q}h0V7q{gRH@uiiUv{of5`!az9NmQ~JZmgZi|sSlKpMcv3f;gA1spF6 zspVi5Hg<{GP&Qi6vSzDKQ%k)lRRSEUIq5X&KCwy~N*mYnRzj3q8UCfia@M&KO_Nzh z3e?>Xd?AQZFe6A%3Kn*;jg?vbdZ>GrTg5M6ZQ{$=v^q#BCB|sj11C43>DINAJaI41 z`P!)6r%D{o&kQu~+*J3}U# z8oJ0!gZ)59z^y`ZDQcYXW-uwT-moNeov;^>C27mgM69UlKCR-uF^5*$S2y;!e6|HI zW=I6{u`;8x>3a7v%zheaKx3(IY7>Lq{Elh!>004HHvm`B)iJi?CN5Sa6!0>z+JcAg zT_nS3AOS`o0a8^9q93mbUum4*s8zN!=%8O^H+Lm{*k_8A0sTp;rdTm+PmmEw5KQrs zECaYyf<0{yj#+cW;oIIHq(U?4O0gdiunF-;pfKm8+CeR?a12nE7FOEB#zL{Kt>sR? z5DNFG(a4t#l@0Teuiz|vn^!-wF={(wpHQayaTd>DqKZxw-(1x`E4`Km?>#Qr*qi5% zS#d|a4Z!_4Wpe>*?R^4@2})zb6TO9rnqSh-8LB+R6#6tQBXFlk6MNr`sn z4kTY-xwqribw&ii*t&BNjyT9XcF|l_BC#WJoV+p713mR9;thOr@rbYh*VO(ye6Ri$ zO8#E6f>s5DR5D&i(P8Z&i-vAf`qn1Zx5m>>=`FFHx;{ ztH)`g^5SdzEe4tp{`fcGr_WX-OefRmo#J|BuO{#f4z`^VI&2-0V)H-@5 zl=Nh0$7xLwO?#z^Hx-ps)czD3)_9)4*_3Z_9jV}nbR!JH?!XpFF9ho@Us-GQYxh|} zIGrvBj}NE$$SvzdSYWdS^1H*n(&^jQUw6?&U^~#{{Dguw=Xb+&5u{Pw{H(1MZp7R7 zaPY%L;9Z$Ki9E06_LCJ;{ItF8KQ&S-)1|eNIi;D+LIU6~_XOWMqFx9r?~3h$glZY( z-;xV~a`wvE(uV9qtr%fHtiRxQkwcT!;kmuh61tP?kQ$$j?eEwHirWdqtE_t z+tUKMUrfDtLMQ)@?i~IiSZ2e7(xrm-vU5BkzNs#+p+?_w$1ZS?hBDw4Ou7x3RTJQB zQ13a5xE3B5^@y{zMb()`Lb_K+6$acvy-2~M2ysS=rq>20EzQNB-{N6ok%bqkwSagV zk-XG%Ye8OX=)*+b-6{zgOtW`kNq$G*o_mjy0@bCzef@&-mGHUP7qB)%zMfJ63`iv6 z6_tti!V>3jyGduCykNA=_ZS;sJup$72@l{x->%re+!z937zid%KKRqYTH!8-v%sdV z44YM7o>}i^Ug9hw^nIXi7>6w>KO~qs-(mL*2<1g)f#dODjcey^8mB)lE-utS2*Kqr zY4P+LTU#6;W=Rq}%0eQsK6oJ(i0v?WtYPM=$3!9WBC7*CJ}VJ5U9~kFiKp9A4u8xC zrEJ%xL~|d`nHB!>1(aN#3wS8m1yeI{Rv0ki9d_Fq9r1+@F8p}h*N0KD;bOX0_x2W! zA9uLN^_(+YaQ}H*|D0QsBW(BS+wM_E_|=J8hsO>2Yy%&JJ1EEo9&h`!&5z1`Fac{` zI^(Hvp1`E4L>pRv0$F+V%$?E&k(}?nKu!2Ey9Rof@#p;6of%pT&+XK3D-;!Xwd3=z zTqoNvfgJAYAGvvkE6eBV%Zu>c%gUr;4}zG-{ml7{-*kz>%F78cnCscoh(fxO_9toN z8O`X2j`D(EgEQ2>1U5M7rLcTA1I3>qO$ zxZZ;%5~jiK0n`AsB$YdbB8zGtw%y)_(OvS+So5Gj&F0?~96`wSE0#2LlxDyGRSkO_- zUl#T}9Zt60cQ%5Io;)UAaos8F<3VDdx|JLh-MvZ?E>h1?2ngWae$zx=Jt$MQV2E<9 z&+2_1>~s5`d=q~N&&tRqGAU4Ty!y0#nhQHwC)JVXJo&rlva-qHYud)(@$9at8XJw} z3682#%LFL>tl97>E(Bq?4y zEOcI z6!^Baw5_Ml3M{Bq4)Nnx*IOpk8LOsXnE2c!oNyF z_{6fo5}r;hdqF>}4gVrn%r9^V;0YYJV=uud+5XCIj;<515Q6?zpV;6Q1w}qO=oK-= zsy)7Fy=SPsln)TC|2tPKWzMQo^D?IY8ArrAT{fNEM8ceY>G(8rNQ5fXOD>=9=Pv8& z*1{yi8q_7`66hF-Ow*7)F-8Xcbyt{>ytR?DkR{w$*$&4!eGi@GJ8NSRC-nW??-L%0?+6b*G;TB7Q?^64Z1esC z(1Sy^a=2zX1Ld0ZyFdY_q|DrH)u7?su=-xz^DBf)50!Fo99X!jo?z z$we$8#kJn)Zr-%Fw|NqT1h7nfy;$9P)mQPPKe=}G5*k{H;3}#W@B4h)dm@s=i{s}) z5R8z4Q^!%lDm`+TYGOREq@++UqV>>`%ttKZlmwn|kT*485Rz;6Oqa_TL-JSwOq-LDtq^+a&IGiT|~? z98~TfOuhfY(hJ%%586%saQ`?cR^lHlxconDxFYv9+?N1J&?a(efDFirD-W{cDgsmh zsy{Y+|HGb!`*4m27S#ulqW`%?l>x{AiotuZsoPXV;R9CN8{J*@XM)euo{SIet6*pp z=2x09(NPrg3Bu7e5LWGh!#`$ZgU_^J4AfnLqR6qcYqapBiUypY<*#*^i#Jtz5S5B@Nn-Na2ni(Ji3K>oa=JYxC~Lvl#deWq7jGA15!Q-@H85q+ z)&8gvG8O4e!U|ab%01LQMSb8p`RKEYRD14fYNLx*55cOX6pYjd!?r4-&F&G(5%9yt zL*fhN4&l{jAwsP#P)hs(DYOwPL?1m({p0H)gF>Fj>CAzZkH6e%5J~1`KFw0exN2z) zU-Iz1qB)Mj(>}d zHeQ-{HoxloP2Fc$wJa2?gsFrmhZxPMY5@JMjFg(u#AB6@x)su!3@3P5vxaZ8TIeq%bTIdrZNMA5)ekbb~EKf}(l?A)!N`klpW2QkJ& zIwocCNqo#>;b0Uu;_NOv&&g#J>?d6K+P+^=8k}mDN)8;VX~~Rp-xL(I`s7tWEN6+U zyjZ%9P57Yu(ns+lC)6QQ%{5F~@vF(;VX)y@Ph6X`_lzNuYwl*TfDs-nfl-ifJl2ZDF*8$P3@xl9~+ zFHd4w#$ehQ7L)>cx3E{G#0F8a$=F}7hk+{y*Sp9lkG)Y$8tS1MZTXZJo{Iu9$Z-`s z9sEq}naj7-gILCl!ZHbs?|{$nmX<<8wQJssEIXb#;G_o#&-a9X)#&J;?)5I!jAQC) zwxt|~H_T&$I`#_DN=pg54g4|=o+7sJ77@RZ;=pO;BX06fnAz5TXboCy<)L^Ah+TE$ z4&~j%m=lnmSF0Tsc8TkXM$>^cd#1Az^h+X}@&wpoIl6Rd;6R_cyz2wCHk(R5I zZk6ZPC?^78oRXq*ak0)*g|uTARj9P1s7g1=*$>+1bCJ?V`hn&gr9f957iJh-ECWX#a8k(yHh^UXln7wum{s{(A=Z zZ;y{vE(j8HyAgMgWl>~O77UugNNK6w+0~plL57Z^AvDPwIhwR@qYE5&4dC?-)MGo8 ztk=8QCkl{G?h3pP7fIA_Lyz_jf7|Z>DM0shQo{g#koo*Y%P~ZwSUQiJ;>aUXK816| z4V9P5Sar1ELl&>2law0K=B?6~LY(Y5tSk)16Y>zawi7^1G}R3dM&__Fpt>MroZr}p6bb{@vtp%h2bHwXIJDaeK5jq zpU_z6CJC4y?Uxo`d9vO~Hdw~-I-`^?M`*@kEpkgF$cy}<-?T-zB1Y-D8`(nn`DC2{ z)XccF702M>vGg;MEy)F8$nczH2mEkDv1F0W%CHJ)r|$P)+X!%5Uh$M-U{b7G2G{~Q zew5NcA$6a?C!&pDm}EtZBs#(Ps8Q$^IXI9(S}``PhbRANEL zC$WnO-9WtK=uB;LMaG;pQh8o26agy65|pEJG9W5#EKM$_^or{f*B6WC>U9Iy2+(C5^9u^U`0h=MBQwoBl2k85jR6M zuUI2Uzl})ZGp5s)TzZ2D?JE(qJ-IFt{SC{YVDmK>N=f}U6hJrCr2A2m-JTvZX~C=Q zi23h_RAZ8=Su$>{l|9a8~+{s$HEHA`n{1ARP|qpXh4t;|DQ#)-ywc1f0oyT z0Y4-*@q54f-=(%Y|NEWfruI7=@NRSKgP_149{Kxd%HI)!cM+BMPI*wc;J@+9{|p`c z;hg`s;e&q#5Z;Gz{xL-JN0}dChkpw*G;{)OxxEiIy!ZV73OW2g`~O+)f>|H<|L^br z&moAcO!V{*rBzo~75NWMXAwm1*1c3ri9uv$=CzJ>YPD)2sj?^rN-}Y->EI+Jz9dnl zB=9iuKJ=pu&x4L$+1Jj%SW?&K)NvKaxsS{{*zVeY5FXt+TXIi#&)9SSh@?|idV=`w z?CfS4GOz+mz=kaq=2C$8@!GQ{K_T1-1MgcO+mG~N4vD6S^Y!&yzuC{AF@A|N3r6$ddPgO{}ED{ubAp>cQPCI|@9R|FB)Jh!KtrnlakXb_do z`nj9=6y?L?%Mn0zz4{)@(3SLx=eEWZtD30Z1?$h7lNk!BJEuxFKBXE|VhO7=%BFM5! zPVYsf|9RA`7!A1-3iT86wdZ=Ql`*pdrNm??)+jhZ{asHx62?%Sx)vZZD#&AkiXZ}! zk@@{3UOvYS+Ikg~8H}t)1B?hFBtwmU#VAFgD*%Cv#4fA!OwK zMpZj;&INI^Qnle#)wPog2rYQ$r;k=52#k1!+h*EEZz`{)<=N%03)Bkgo-{lrY@k}C zut;aIoDVa7k$>_c%wE*aB!k=b`_-06!AhDgPp5H@b+%#l&Sz{`x@+78!#1k3YlT5^sj`ePQdPtqyE|HZho}1~G3k%b&&} ztLg$jR#4LE93=ZFZ;4X+WF$LpzcAo%ME2>n)Fge9+p4qar}q6g%>_YeiuiT`)a?Bz zSouQE998W{U)-vv)WeSBMpUCW;)NpJm^h)DKQUc_5#&kq!Of$h2SLjj+6f}B5k-I8 zkLMa)i|`jGqNq=d*xEUHOx;A0Wn~yIcI(#_<(~jICbwQ^kw7-dh~`dLEjKbpNhSkH zlaPGM&4xdMcJ<1r&L!bBSP?Qw0hNG55^q*)H5i+I-lBcpMd0^wFBNj1z4o+v{5KfO zL(inJwczKIvh39RaQu?9B8ix%cU`yk6>c)~d5czfBiZDe5KIrJRnMcW3&Cv4vs?4Z z8m}POAl>AfI0}$dc~YDx!^^z$)7a04LKeu z`75qApIOi0RbXZUnK&QX%!^AS zsVNh8T?C7`1)G1*ZgZHh$8B>Gy0Ax%pE(6p-}SNPnzBP-pmel*d6L$30DLW42eyGa zZp3VU7eb?p=>P{%d&0%miXV=aWv~WkDiez6ETBn zoHRqk(27e!G!+$0+2(Xi9$*2R&@fjQp1n$c-I|lqKD_vK1SgB+x1kT;Qk4bZVb~W@ z-Djovv9G+oe$P`^o_`1a&S&pAL9^E4Db`v|7M72&BI;rAK->XTRm%Dy0ycINJ?n+! zMgFIi#g_=|q;6klS|1ZW&a}Ou=HdQ`)hOMDJ0`M@=|j`;7AU{XK0T_lO^6XepRw<0 z{(MMezr79)8Dp4Fo?G)Y`&RE;kruFHvze^Gsy|mgGdt0aTH&*)yU7M*-q;aKR)Gid zo1}cuIUb1df&MngX&D9x<}X`dtR`(1FD|vUtznmd*y(mIwK&Ny*u3%97yuv1uP7#r z6Rc_6L_|bl_b?sZ#>503VaWQ=6T6O^HNlF5_K5c~T!_<#KWkT!TS-jQL^Ao}^C_G5 zO*~DGc^}O=qIIqo|MG{Y`B*H~(PLIpv6ej_4d#o)_OZxX6+fqn_%GtR7gj|rAQW}a zQ!~BHOpeSb8f7+*gCq{Ek&%b^VkTjFUD;(%Qu%hwX39A2q~`)tQCKs6muz zK2+qTXOLTiZ&n-oSYY?+_Ol!==y$YZDZA&N&Y4*prpm^K_qcH(6x5|X7M%#IR_<~mJYU7#rq&ED-PiYsmQkey7%M5vrMDs~ucU?ex2{Re;uU5r7&5M{#H6eMZsu)LS zbW)5YNlEW)0$V?>T=d1g3kVu zA~JjWViJ?N9MF@%{9RyjIVjm_Q7HI|f$XCn?B1`3R&M(Do6vC_do8_|7+I69zd?P} z>tp>Wb#Z=LT!3f5rYv*cj)e<`g>n>#mdx%9bdU^tamytdd!d#iTw`r0C~6SGpJyZx zllK9;_Sn_IS7XlQ%fME|wtcUlDI^TAXbXlHlcKDd=ye*P=tJw70>FZL^UCvy7WSIj zH{ICy#VBgP)KX3sPs=M#n}`YYj0$$MDmiNk)Li zELW`5IZ60j0cCAoJ$0!^7lex(L0R^%%ZXYMsA6|X5WIy4;?OW0=*m7J)U)*8I(0amsh4fZJnGvRhsDBT_zGtE%LbY{IraLNHW#S z`S*p^R%{_HXSbpITa*2#LFt4R=uNA zc$zj=rz*hcY(n>$?~S~gxt!qWof^TZ+w&o>9e6VRr?0`_kMmW9^eS_1wNhX({IcJO zKFV@}#p9v+tw*knL+>`eup4OO3jJginr#p*W=W$LWWbXfX%S^jBaZjimf$<}8M~D83Jj1ylg#@~*zMyvVUK*9U&P_`Sset(Tna&cRGqYu(@aQ zM>A;*PE>kN3RRpe_q?haClZ^aVlQ|IgDS{YOVyey+3;>E9S^A^)OJ%oS);HDOae>^1g1T6+HH6PVyFOiFnq4W>Hrh`z&t{5n^bzQZ-EV zvD=NtT@j?EuQrdAr&MJ%X-rz}=~}(L6=K^X5+u>{wY!L=FO55swKUUueJ+CSH|Mel zI5vtgaMZL1E;^9+(wK_lX4i4+r;?X^JxujfGv!T_EFQeP zh0NC^PE?+lmYR28icx=QARwaQgjqgRFD@@=%JZ(oAdEntO^gYPGMG9sJ~Xz_*2vKj~TDV%OP*XHKttqe9IQi18(T)@n8C_WQn3KFuZG0 z0L_+XnWGMSefeTc+1rPLN7WTBZKWp?9i6k3!%dJp(zmASrWOq3+cgABGqp;wKHnr- z(Cp7}zkx+ANpzG*F_`2{*pQi0?@&r0xFp_vcczc>q+GMkg@D%Q-;YB^qY^28leIyz{Cdnn<8uI?R0h;~>mOtU{`D$G2#^ZZl?_O)Se|LKBnMRUo}hhU$)_`7;wbvi(&{5 zmbgdpz8Urkjd~^y+$GnM0T#~HuJjcr%@T(TOhDP%0B7jK;y7i2NFL6dsKMO%(cde=|s11q*u@x^eRF_Xga z0USdKNBkbWi$B)^L8^$hnIONVbG}2c@R~yS{p8(MhbS-GZZ_T+Aw>y^b64r*L?Ii* z!~){m+f=`DTz3vP;EFJzFkT55lHY@928YQ$Ses;w4Ck-{#)2s&lhvwi78EC*99|mn1S7sIh|igjS?xprpcNOOY!w6NCn)3 zRD%~neEJlF+NkWm4l2j4y-9rY<;$eigsl(p=$BhGlD->Z4b(Ro!{-ChSK^lz&=-A= z^^|14Um%d5q<`jOV;ve6yUh47N_?;_rt_4YZAzYCj*dx`m$iwB;a$r`3*lIYiIeWv z-BfS7GSy=i#7TGiU3J8`hfAwF6pN(97@Cwg--ajT4QZBUF{V3y*uqfjoA}1&ZzzPL zFYbhE8qR$*EIC%qR^@O@(?{>|h~7mo`B3+VO#@38*IHUxnsz&$*Gy`cZx2CQbwrWZ_xecPChrnZ{tjR8rId0xuu*_a!VTS_0mkG%J^K;U$r4QkfWR!S=da| zFnM^9lhvPCwNsR#QZgF)gQok3!V@}Uqk^zcgu$sf+1yO#_1c}Vf$oUkH+WApcO|x+ zJQMr!O@`QYf(FLSt*It-31-L55_=V|Ibi!Fj~LPd?r%uFeh9o>cL(!!2sc7A+b5}D z*4lBm7n37yjwI_tpEa;1B9sxTr`0M!fyv@Q-jeLyL3|1qO#RL) z$!~U!sG!7|SXLEOw;NgR7LVO)yXL~Z7#CJpwwWctVTGw_3l;A;#y7*!*wEBZle@-e zI-5jBsh`4}JYJYyVkarlP#f5>vC^X!s=p}vlq$1Vaj8Q$WmpN6(cv9UmH^4tmwogE@euD2#k_?nn0qC;zxI$h)f zY3(4nBVa3Y_iUkf@4n-3*3}bqLh8@8VXwX0qo}B~GJlH*w$ya6C6ZV1lazyNHHusx z{M26Yjmp;p+NFXt z>iNptHFpf2dey}_J>V?*-7vxMroJwNC{+MnFuK1;-MH8`f31~EqdYJ5^8iTt6>pA7 zhu{yqz@WyW;;eFWii2BaTON!+ucdjP(_wav^w?Z5u0@@3&i+UhuWU4%qK|?SPwF9; zc}>?#rCVsh`xq~p6cE#c+}!8AJx7olO@&!-Cbj9fISD;Hb@bO$^(L=mEt32ETLrEq zc4Ni6bYYss^+)u(eI==PUUvaMWpjlZDE{VfMkCzE(Lg2GWj-h|(jnvGJFXys<>DCG zl(E7~bkYvwK+>JBA!&pW!Ttnk&u%b-%a(_vIUSnW>=P-fAolL}CJLr#(Wjqio&k^4 zQYC-Bt>7AlHNdG0-#=yPb1gu!14+)I72|ei^UOaKkjeWnZ^nO^az*_}wr9d~Z~NZ+ zMb2bvv^`ncX$DX43oAcQpCw-)X385p6GNnNklo^6Q&1IpbXdW+w0ig^6~mg!f?txM zVp?0d?kjj6*W7WO`pK>}K0iGjBE!Q(ytwwYN$wBBAd+?Cu>CC@<6Qm)aF5sPM@ffh z^{-f1Xc=B`6u;*u9tsms)-h$zZb_P6Co@hn*b0r@MZU=7^t;ogedwEq$(k69A*-VM z(txbw+Y@$~)<^JY2FBSFih&FWyyDKrrtnO2#fyW}xmAVeN>k|Z$5}op^aW)vUT@ZSz8@#oXGt}fkNs4zL}Y}S>(&B6BLMVK$yT@IDXd9vb_B!w=;4H}0RFy#!A z%jQ|GA?EIo^xn$B?P#8xw8T?P%#h&n9s^yYBZ14*Y!@g+n%rihSg!;|sNp;4Q8Ovz z3YG}r-~E)*-QS`7-dOPu1t%UF7rpZ}tP^@~@f`U{*_i=f+)cyeY`k?L%VTZPvUN-< zm8cB)4%H2*w}I*xV%gROa^@-NwwJGWDK~R$RirirFbq(p9kshj1e3Owd_M>*snHLi;~e8#ZqdaVf1W7S9BI@8<^^bMw?7 zWlF*KploeMlDxQqy_43%)!s_P#fA#h0#16%QPG9 zx3*?6K3x9(xUiT+sM=)ugIC|LTb7(-Y)SD?c=60B%AIDVRP62O?wriVH8P6e_ z(;AxHSNQQs@iBGg^|Ho^HWW=14*JCy0i;+5Sm($rs9k142aiCkHmert{#*VJnhA|LH7D`F|szsYktaJPT|;;+xDRw>*w@nP}e?A z`a4k3KdHE-x}BG>^K$Oxlbh|_QmU&RG;Xp%}>kK5IS-)`ENIR?}M4G`t85-X+7o&!XA0H zv#xkf`iYX9SKTV_d;hwC=h{wFpQ2T~C-}PyT04sR-Ub5a`-v@0xs6O$Qx%T~9u;cr zYW$?jLv22n*3fWv$Ztcg*6?+}bYh3=<4FLwd1)n^y(@WsE*yS-;pb{rn^@bQJVh&x!qA8 z-xMLG!d~Q~-FTVAq)pos9RBcjQ)vh94a*H)5BY?pfFswU+t1a!ir#vy*_w8Zt+i*F zfqN$O!3&bgWs-l;nZrFF19)3jZl5bQ>W@0t<;1{A@#Ez+R)?aK3C9SKy!Im-LS0sU z9F05L_`}0nKBl2s^Q-;FI&{^QUlLZk^SwuRVhAg8PIJ}YXjK(f==o387WQar_*w8q z3)WgG#qiGZ;6%byXskuNps`=QUkCD9^eu-YN}B02S{ySxl25m#%VkY8&uSoF&a5*h zhpELi6eWDG+7V7J7b=@(<+kje;{dZfIqA7jsndwHf-DZR^bDC^9OzB8Vlv1lVIHgB zA9y$a0MTEaW8+oCezq0b{jFrYh*Eg__V^o3HpX1&P<}M}sSu`BGgA z9Y1~Fx;tn|$;~)98rAi1~F7~A*U*gFXrS**vrb#UHtc%xL`t10-;Jcgk zSF-F0JfUh%z;BgT{phN-UNCI)tVQ-O>2z*>Bv!?=fw5alTlLS6FFUBr zRTdz;owlnLOdiy#C^6D71gp3WWE{8UjLmB)+k$0)7x}#whttqPD%guRgypd!2}9Io z_oLsKl(y*U4g79c<@%%H^xMFKByJP_?>SonB-IHW48*ZO zxR!;GIaZcLAf_({aw^prr3e`_F0ws1_u$SEIwl>?Y;?tVa7bRq7%n1o(#pL5b)-_~ z{S?057(su0Y^ugMdc3RPbGSNuhS7^BACxAn%WTH_ zR(RUzkEh#SNLD|(L!a9zt#a^Y`cDdve;#-IlicHP=vJK8`9E=6VF<+EuthR*WB?|~ z$&LiFwzGG1#R`9_Z4?GM+G2%`CAFYhL?t^1NA=4dcKVmK4Qwtu*`RHO_8$BF%XE4kB@{8Lc-0%9s)z7(GVyc0*8YE4X~%LD+x~qyLt)${(c7Hi2KXT z)l=eUOcKC7c!(no0+WD3{&e)`VNpjnSJ19wytSJb2`lX73T6t)=0%c6cc~>`!;Ze}uWmAMgg?5CP-?xWWMRR<>R?b{<$^HJ$Sy zH3v6O(l4?J5L!YKDh&DK~R^tKIy=B;arf zdT zFwx7y`R7d7+Cc1_?RI1H1d0m-BDS@`5ZpWf5({7|i9`VX8czZe4FNh)SXKsjljKNp zwv+uiaSG0)Ul-1fyAyZb^pXrOG6zxE4R2GD=>`tKI{dy@oE`LM!1yIbG^e7=8RtN%I8BL6nbqQHTq-2nj- zzB?i!%9!2Jf}-GXI0A|QrV0ub2L1pwVEX=t#vjul@^AAZ`WH_V*~5+iz{g7=8Fsg+ zUoQ}Fk{#e5B7lC$U?{0w`la0$$n_5yQu3e-hLVH=*!6q#VA4SN`(#ik47GnfC>*iN zo3qyzB_$1D@9mMnVX)oPKzn2e0N@<}E#D)9Ls7e=LwjThg!C@&)E*feii85#iF;)z z81#T&Kx2P=a7j3PzYK;(?UHisSr3Lr!uQ7l9534?2ivQMlKz(*NFxvUkVXK9+xFT5 z`9tj2gCfwV{dzDI3g9c)YYWJBza;F9MOt!~FmI0xNEH-#c4DtgQc8Ni9t;JbqwmuL zWV=A}du(CSQt18t0+p0P?~etFg2DI8VCaMO0AvSp0Fy=?@C&TB%dxOG7AW#y4$x5a zf&8Ii2YLvG0vh_@dZ+_F5K!oW9H3#l>_dBFLBr4oWGKMPemw+qmv(Wltt9fmEWprk zMj}N${r1bv0z)`?( z?bAd2OFtt3oTUSKMxzhN;6Tv(bBaU)UkLy9LGr)@1PC4g=_d%H?|9h`*b_kj`=}cU z1Q>$!KoAXAf*S}33gF*^XefisWTcc-B!Mtta76_;OjSxj8TfFjDhdj!NNHflR#B1t e-x?Qp$@x4MvjJvMqiO%L|6fM6|}Md5=?YW%uVcFqzoJl%(;OKh-hqnwv&;S<5yM`2DTL7 zR}vH>qOlVaRuLBz=C;;1bh0(EHvrby+3Q<5*mLs&i?R;()(-X}CguiDxBt~haLhz> zL{_?{a9msfDFaI*dt)LNV2uI*$i?2kmIxqXu48W?WT0oIZ@|L?XJ>C~pko2&oZ728 zZ@JEb;&G{pvMsnlZ0Hgr21^6S)~r?9utZw-6)P;44nsX;s_uJfF6jW^tb{XHY%%rS zt-^LE2z%;qax&w(Rj_tw@Xd%-HU52N{B}M8sy*WkOZE*~a)y483^B^l6u&)p@voO5G=%5hB$Zf|>>bT19! zQl8hF;!wfJGhxRO+zUETIK8ja2=c0z}q4z<5 zje74ydKQtVlqV07umVj57H*7*K1L5ewEt$^t2^zW>1M&s6w>m_EyZVfte z(^W>mr1B=*GFYI%NA5bDMukm?Exe&oDycsEH~o0%QXi51@a21wo7@Yn759l`i=4Gw zP>#}2rX`AoeCRQliI7;36w35l44StDq(~ffTS>*u_Vsg9I@Z4Sp;JQrl}LpD3}vpqpY3s_2Kf>H;5*m+KtA8>5bDWr?$64L zZ!&{L56Jy3EiU(u4x<5g80l}`Ob(n#C)5`>~;jkYLS-drdE6)`yGrfr!44E|LL z7XdPY^Cp+ir!u+fkT9ROuWn3{wRmQVeJQ)81w0A3G8%ipL50DXJ>KBl&N=Im6P|M< z-5<&=9oC%ly&|vhPBO1ys!-W&4232$fbPxeMGEvF_6R)Ucv;7MsT*#w#F4gPmS|4Z znh|jL;q=tl)A7cg^&UI0oyh`$L%+Lv7BQDBgDzk%OGPrue*Mm12@wXXdYo9R%w>So zd1;ccH&wm9?Pab&M;eUQK5U>LpIUdafuqT8dC>iiRhaN2dpNoCl3Xo53?d{%`hjIh ze~J#cLrS0xb1Lk5O?FPA@+n11*6!nP4knF*%M-*s(rp z1{3j>gk~A{WEX0SQLveEi=;RAMW#CzR;=MR;(*dQHWAw$ZSMPmVF15S5HXeK7>Gu| zRK>V=`)&SXY3U@`(30tN(U+zo7MlR-aP_6dxkCS{Z?SRv{-35TYCM>wJF;lbAh)E^ zHQ07d_iU0L#vVif*q@@kp}8!ZVceAfor488lT10bOwCa5%{p*{h`m35!v88<;PkmW zDb}?hL{ixS21G

MeikdToLzc);W?{)(jemyVF2+47V5$Fe>jIXZw!5cI?&(U;Kt~VvvySPntx(Cu+5jM@V`Ko3HqbZG5wLP5 zdPfH&GqW=ju`w}d!T}Vl?13925go9Vt%0RI5#!UY39L4-vvRQ2Gq3~hr*gJddWr`2 z?*PDqfe4^v;A{`hxNKdo+d7vn;!aem<_)CuGY5t

i5k1&zpahO~}O1&;a;=0G|lp0%ZUI6>DH? zVrOOn#6z0D$@<%~_ou89%5N29ReqU}MpoC{#Kytk-%R=ZnEXDYzf8%<@VhD5ewp&8 zqJJ6dAFjU{_#dc5PsaTpKmQ9IXwZLI9zU1BGuOY$|5o~kCGxY)|7C$ZJzM|!+{g(C z3d$+`sdND=bNzqQ`15Y@-)Q{Lhv!d?KS}#fpXd7jsI@{d&(vRI1MB_|>U!G7|5aOJa&ILBRDWtq!OB9%@?RJ5^TGSSYm1)ouN~vx)y2rj zNc8l5n!pqFsr=jujv2Tr|MmN8n$N9SpTvIt{HDZTihNShlXCu0)2|VpYT2HZ3RD!_ zAM~dl&uaWrsZXl@eWYhOfMYNL>z^e0{rbfDmy`_857e;HsPXIEdpa2YyMyM*at0RqI(C0MV}4sK z&nMX5F~Rd9k_q zAb``c7Bet0GPWmTW&x6(V8;{fsVf{n9EiJ2^!P1}%z@w$4xngnV4*_94kYk98a*S8 zr;P&+Ag$y4`<;oM9q{D;tw!zV2ux3dKfx9t(0l`s0>}WA0XhI(fF8gAU<@z;m;)>U zRsd^&Ex-<74{)&5H?XzSv$8b+I0Bp~o~Qg2EF=N;s)1Nr&>=acnEDB$-<08sAV zF^Ax<&;dOwBRdbzpFx5&Wj8rRBdqpUgQG7xi<_VbXBX@nCQqz0c~l+YRs2C!UX~Dr zD#K%-hC#f74Gbdl$=p*ek%mcvKzGM%b}T#KYY?z1oYj5*;Z0dDlAtElu8NZ3{7w_+ z`@Tg0EXw@c9PdTDTf3WWo1JF`42(R=D-@VQp}bGoxrJS~Ey2j>NASK^1p!lUBE0S@ zi0A>xuaE*^W>H?@6LVB~|A-OTqGsa)uVsXd;j1L}sM)_xb!bABm!Ak3vb7KvKSoN> zwb_H0#Dsj?+k@Skl06i=#vsh*`57aDa@Ywop@>1k5wnmAb7zPlkJzkLS5v;~6I1)z zR)J6C$X4y=jQwY7cvrfbb`HuGXYQ>@q_Fy#l<9g>}R zL9cnk&In#UO8CZ9g^YSd_14^apX2^uF&5@KnOCg}Xoc9(ksm^C7})rbUZ3|5>{v0* z>h1@gW29#W`iZ8lq`*Jyqjh2OhzD-+;`sL(9hG7lf15*t7QPZWq>=lC(NI>YQTv*{oaMtLw5be zs2do&ezO-QvtU%8cc{D7;`c>AYRJhdH{s&F-AR2>tZ5Rym07i0`qN z=e$n3@ykwZSsA;|YRQR$V|_yU6vK;ek%0hwT6|f2*_rfjW{NdRnf2+=C0O74tu9mGItVm+3wvZ(*^yo?$0e%B**_j5IFip z%@B#bV^jfbGnv&7{X44Iw)mw*RYz_FLoR|Kbvmjw(3HW?n&Re$JJZx~YXIGkq(VZy z{i5_|?{n6xl&z4Y*#gG<{quC?zaAUT69^W4sP1ZDnXREikQEimaS?Omh3YEz@Vs*e*iGwLbW>VQsb5U9 zvfv_|NWWuH3ZXt9p}f3`@|*F(Yg4J+d1F^Nq;#0r=GR1(rI)sZzgv}--{-mFi>xW| za4xsB@Cp{;rT9(l-uZ>M5p#&Ea~%#OWc|+ZM&fmY2|XK5@EJvKBKzQ-DVi&nX*;bp z1vGr+i40%)2&s!8SWU+5%TZA~Y+8XY6B;Pg5QYf8%>d_CorPun(nRb72_>WIcEk5~ zwFf-CA$#4dJXf5YLr8}6YlVZx{Sfd(vylCC8?ZdK1>U_q55zO%&{Y2S8_6{n>!MNi zsa#*&eOd=NT6Wr?3!2di+_FefvUqQm!P!$62-DQ%>U3({8L$t1)!?ieS+9w&Kd|Dd zLfwJtZivwP#H`q4zThe7|9Az^7Z=+j^FTRnX7BXig%7H9=eRqWaFfQy1#t&Kj2Tu? zNTiXyzN;q)gi2qb^i3T~W3|DIT~G(ZkXv2^9fTN{#wlmSDS3xORojIe)j;5%p8rT+ zbZHgbwShD)`?5uV444#0+ z-=M|cfW>nF=Qm*So74IK0a&oHvi<|GNZioMHYohg!WX)PU*$L)+`L`=cHYECp)~tD zMF5YcJX~oD94Hv*U>slD5yEPWf11v;Jtx z=j}V+>aM*J>Hv3-*-zFkuE}=~*w>P{!gI+kCk00tvEiwAz6;@8!Wxd2t~N1u33n~- zE&|o=CAz9I7Y9Lv*x(Od6fnNpCnxZ5VHmxynX?8GW0rkZzG)GS1st7u65{8d~UgWa-MPR_im06owV zhr<3Il`n9}QOG7j3(N`?O^CUir;;|em9d9{H|~lA!F>8Ud9=mT(~X0RC6J| zIki0}jH-Bus`N$%X{>Q*r_v-Pfgm(jbme7e%p**4oJWE0C;p)FcN3*06?GsX-P1Z& z6ZMJnjgvA4cA#RAMFE}Tk_*hkKLRhW_AGgEoUn>{khJR`OWvC@B!y>+WcTqnmedu* zFuO6{yWR3CNkj2JUhfYZpw&P5l$!Vu`FQ6!KGC^N)Y~K7uILeTc+cUz;NcFA?o_B z%o%S=apkc3x+)~5Z?hGyNGwPogB!=$PQ^YGO5MtqlDh*Y?)U?rDTRart;1c0XAjK2 zpttJ1*QT&fjpM;iEDeT=&E?%Ed@#4f2$e-tHG^hH&Sihe;~Qj)11{kw>i==FU|~fW ztNT8yR1;?ia){OBcKMAVsiiix69-JWuWSb&jyvZ`Si;AK4N@{2>s$JrgpgbqAt-2) zljNS`61lTe8ZoSh#hXQ~$)~#f6DyIo;E#~QZK#Z0nC$)%eBgTaf>fsp(N|sk1!f zk;R52CZPA|T87G$M3Y+SpP21-w!%8o=LNFtJ02Gfkl@+^Vm@0^7RcnF48h+zbLQdVCqU zA`OlVc6LBN$+$CrkOomJoK)P zyWHnUc`kr=Hp^>1%Q5Bs5BH7u-u@t>2gFyR`kMa$asGPW^jECxuXiYa#Y_HE$oLO@ z!^8r_H|)S*AF#l}%=l-}g!!+a3G-77qk~l# z34tUL9O950h$n9)U%d2tGXg^?M~z|bGl_L0HR<%F<-J8*T5YXMdrEBWnU8XOP;F-L z$q~o;N*r##`i$GTmJU0c1|#FafZ=qChfFLP&Des&q3NUXIJ?`S)nnV?<*g@SkXVL* zHCw8QtR$Z4uq5!Ud$dvl9r6bu!ZjhnbhLZ*x37jCk2?toS49Gn{a?p{GkoDQbRF+z zY#a5RDd=9h&Ajs@PV07Yw`+6r)H*1K48x-Fd`p}#^?{JGWL&+<{JJ<5ygK#jW2%wF z?htZ_-R2rEo@5E>KdV&xy~D2eb>6#S+hM8_N7}_iMz>K8-y~u4*PAHwA)+BoJxIDQkBMVM zsfirX;6pTpc&dEVq`0K1U!}idLHihN&{NYRq04woaLjegW)M>7L)=S5w zhU2!G13>fR$ywQ#l7c8H-t=?R>E-Kp*{p{VOA!2Qj9_6TsoQXk!3Pv8_0i0HR+D(& zIV|9#eXu@u4>g&k>f)`CMfKf0%<1oCZ7WD{s4 z@5AJZ)p79U`2qiOn{gfisjQ)QDZD0!rFi3Gpy?;a70nMhMQ^~l z$-1&K?*=YW)$mu{Az+;E@Br=?= zt9FU&MX|#pkXq7kQYjw1n#W163jN$Hb?;n*s1MUfZXiEjRwV(NAlfCG)1KMhqR`kR zq4LTEZEA?pzIO$ruyO_}w{tVG6Xm?~`@|y#!%jrUd?SRNO(CK1wt}4pV<8xgW7E4W zI_J5`dD$*Z3%Y$bcnzu6PH=13way~r^bi4qxX>}$%k4d=dMqLz%P&V4%g!^L6_(Xw z1s5kBYg-NDhq=04rn*d~EEq=kda;$8s$qTJwgwtL1f+z_6o<%x!V@-x9{zY)T>8$d;AnlUvr*}J+08mgU*Fc+*v8C4BM5zl;vRgr z8Hc|5Y6a?oCF)y&eZ4Cv^DOpDgzd!$PkDp)0lO%(h(j1=rw0O)v7w|;>qoLa$AT^4 z4qC}MF2vDfP-4ScP+~Mt3I{Xix#jx>D|eh|T0r-s*?|{UfA~t6YF$W117l{37_GlN zn9t7tlzGIvmyU$y+l$vGpY;wb8yYT{n((~|w!=St@LM9Dm&8eSQ$0|tIgp@F%|p>N z-nTf#^>a;xGA_(dqnUTaY7#)pvMlT+0UhPj`TS;%dP**#rHgOfrlGZa6QhmRO|oCk zdb1(14JRS}8$OouZD^|OT*GVxmU2P1efx_IT;Vl_(XHKT8X1Vw;V-4U)P_dh6Y-d)S4x0nWX* zCPb24+sHwLZ<6zQ-)o8}KSnQ0JjR45g96h*U!5+jNspe?@FYq!tr1zLS{e?3ImE2* z>DlUvoLN5uF&?}U6T-pyP*;;Sp~Qd3f@cJnP5q7MCr{C2G>S zaJv=G==`mY7P_!DZ*G)Fx(rhbb7;P~4c>h!8MJc#nZ{_MRa57P-A?h^cLY_WP`b^= zN3_i0ME9qf9OzXV-m;T~+2l>EgMih#n6Y#a91K!Nog6I*7JBAoT1guO8E`izDi;{; zXm}&L#AwdXrM6c-)*@c&IZf2D;wFsHPH|VO&Od@{4!2=`iA~^dypgpM zuGaD+Rbo)i4jyyXZpl@+Dhiw*w3>d;r+$t9^@O_%s#OFO?~P5N=jYWbM<{=zG?E}u zkn<(^1U1t21P5h%C2ve^MT^e#Z+ODEh1pjh5FguUPR3r(#L&NbG=R_DZYkz+d6_9e z*$NspjBg(nc?11P7G%L-UKU@M)Bqv{bqnlfaYFK>wut77iOO<+r&t$zDR5 zyFqFh6pK^+nH>vc9SPcSw|b1bVzFs!8sx5$n9|0<Gu+{9K~<8Z`~ z8#1%;*(j8biFVYzu=_!5YJga68SA5d$o8o3<;OPg44?O$vQW$0i0A7cxaF|RRZQm3 z-s;#0=UFm8q$l2ftK-#T_gX)ra&^fVFxZ}S8bD^X$FYEFUNSmcm})@V=|aLyH=J}J zbEW=J{uRI1BBrx5bd5xRaK+M!Rt?(rBise{Ud23UI{3RT&c2JN{r1^2PHWgy>oolQ ztI;XCxT01ivGp3*ZWc5L9Z_4B4|PzouM6|9jMBf=yD94gl*m%*qdOuXxCM4+<=pqD z8u6EoKOEd_&BnJuW@O5qtoXgz=j7_5=3BT97GYeC&$I3&NA)@iuN+@J@zpY|d__8K zEVWO$dUBIeFK`4g`=Xp%R=wg&+k|9)xo^peZeBYbJH-_}5^6rtQlwUn7bMHf-t4J> z)-_&bsDLaV&rsm-ik>ypNFbG!l9t;+Hr?Su&3!w>*VHqsb~R>bR5Mi?joQtU_WN_> z_xIxQ97I(#ILP9URH#z0#8Sp0RS&5$FG15`&x@>0tJo?%TxqTkt~2#8SbwCeRD3J= z@zqxXu8c`XHUDF@sMXM{Ln1`VitEW{;4+b}6TjW{E1f-HcGt>6QdFroDT%VdnZt?y zNy+tAq9abtqZpJ=MfY@au*8ZlmL;2*I{pXT2@ z;IM}FDdmLsLOIRHGb;2=Qlh<-2(mlIIa9_mlaDxEBVff;FjiGlC$VCsEB9xuSkh`j_#AM-*9CO_vw?r$jK6SMK>sz&dR^C zvijB=K&Z1miEyUf;?^gMT@QKcrs-t6Mv{#R(Ec3HJpkpWH=^GiDP;G+a3F6<|M@E^ zjcc}&F8X&PC))=AOz-?-vo&gj|B**Irw$bPnI-cs2}F?}e`wS;wDodY_8tsuShg_# zXT-f1zS<4sFs|g~kK(L3PD%7Ipkyeokv5j&&vv{0Dqd9JQKAkGOb-31!yKO<%jsH0mr9J@;KJ0zD35nadT86;kRGZF@IvhX_mNDMhMj>I-@*(JO2? zV%AEc{ZJl3&Q&n80le5VNpC)+4X6l-0%qJ11;n@MtpPn&G~5eWH*yIYmU1Tk9EhH( z-7O`u7~dPujiQ~Bpg_LAMwDz?8^oe#&w2TZ+1O{!8#7N@4zrlhGmqR}V%vAPvE5KB z2~WCC)C|hI1KNEN$w^i95;bfbHqj_Z;awW<&Ytx{y#6KP0m%AYY2=1m1_Qt8*%1L= ze{H~Zc+&$N!WZX`k!`2u)(!v&OI+EgVZGt*{rTA2OpqbRgyS(srPLRTkwXh2vd!2q zH+%yor|(MV(pb29ocvx!NbVUN`4g@zqVRp`fs4Rng7@w$KK%MlYOel6bUw1PPeJ!0 z<|5K?^`UuCZ!xVw5EzUpf2+u{E{j3Kj2{xsrwaY!%gS{ zh62zd6>wr5678jx{|i9n0^IwX&I<(iSdHkiqz69*UA9ivUyeSCP&)6SYb- zBGDh2Z6`o6b7)}>z=jR5v9KK-oSNP{@W@wb`;p%glUp4ZKb?!; z*w*mBQ?sXD+rnQC2^nA&y}KeKR#z;d`6^tB3MgjEyE$QqI8Y0$r(RaWjVS^Qe-XZ_ zdc5rP62158#tl?YiN5kwupM$U*}-kT)HmFZ&`wew8BbE%ls06p33LeyF%wQ>!PhYpn<2sRS{B?1LhFO&2hYK>6%1>Jo_Bl; z(YETdtA?!cN(BJs-lt?-iqZ#bs3XZTUC_Je|uxqVSQA3DX z^RkVhbIBVc#EH2y@lYI4#AQ4=g~7Tr=tgRxz*^F5avw^q&E|>^Ms$@^VmMm6mSR{t zQ1jwcn`(C9Fe*j20I1UWu>e( z`Wat#&pDp^AU{P5EF2r$wGu^&sr;lY;)2m=_lNrKS=Auh;RtoON_emMsK#5`aSx3a zJp~)G`2;bRnC%})u>@s5K38c%Y|Y*n#d~7+LmpL*_r6AQO|YGaL*JhZOW$jlCS}&~ zJ2GN|G%ZS}T2wCsd@X{zNDC%$PHcKiK}$ic+z9;?rOO2sMa2gH{cAwHNw+qC;!U%W z&M6`d;ua=Xp*wOT%Bwrk;auXBj^h*mNYli1GAyaW{mq@uCdZL4Mo{(@=d6#b)*a^J z=2-X6fmq3|d6pN@?TcA*G&456^Tm>35-0H0Bl9q0M~r9^^0$Jjk0g(|hltyeh4~gX zu_W_vKQ0gzCyTxU#J-=rS}nH5ViD64Iz73voY=cn8{peV)+ld6I<_Ov4)Vx5tCXY6 zOM|j3cNviAk$2q~sGRD#7SvsrFa5IN$kic04_0tkb%p>fvznpsp1j)Vn<-k)ekVzc zi_e_JB}pJp23Bl-;xJM$P0?o4742!I9umA+w7JN@iDpbX=EG2o?2TrIQ`psODEsya zP2pJjdyI+000;^iCTmLu{igH~4~~slyDl8Y&#YgJ0LoDQ1C@_zXXHxfK;I}76ydpD9g z#(Gea0kG;Ng@(M=n=BR)7cZc37*I-$Pwl0U?@ioqE;sNIobO+JQs&>fN3>V}7FP)X zXP+$VOZ}jtU{q13XAQGFAR2f>_P`J$nOut}-AgZQ;9#T2&Y#bWrBmOf7FU~9#N_1$$c zr|sItU^1AuwDZJC5Um75Lvn&HiaF|g=A(nfifR|uV#~9vYggQ*IU58s?9)@sVxPpUc6a*l`vEL6=m_$%g#6p? zV|V575_m4Wjza@+yQ>Z5TAw)Wrj(9+x)hlT?GC#hR@%*_3)-2vTig{zEh_F`VTqtp znEibV_O4Y=7W>fzvMmuoB%EWR|8wCzhRQ+-zfZsNq);7 z`R_3aGd=6yvMbe0oE4`&Exj6D!tbR-^bw-t$2j&5ho;8VkIp87Gngn-ja|n1j9`Cat5j3<(BnYjxM|5P<931YQrwGF zlhe#&*KPUmehEO`W%068w+ah_EWgjN;#^iXLdMQRYn0l6et44}Pzfq=E6q_8*A0V> zq78~qZEdDe-#G2J3h?(B?`qkCVZ|Cg<*VGE>VD|-dRwzu$Gw9apdNAz%RbC%G27_k zBDH$5top&N-;lhofW`~5eK1T~d|WI-dYC;v2`}zrtNX#i_lK(ECW;C5$8#^Qy^F{B z45DC~<}XVU%W2rxL)3BrCPcBdg=0M+e*lp9({9&!Dsow za_@3_Vo~w1!|bcZ-y+%~bcF^$_w12a!zA`r6NW$w3gJcN?=dA#f_b$>e1T#XLf7?C zO?2<|5*Z81AqswoM~~;)cu#YWp)UNYAOR^?h+vOOSDN#OSz&5YE*P55*I1}rzQWWb zo9MEr<0ut+Ffgpd9~y_zYG}vjIjnr|DVx(H79yMP(@voZqBdfo2T^}${t*3^Sf18y z?m2d6mCkYT^}4``OS4(K(>G`wg6A~mw&Z{{UGv0zzUDno!+FyomLbhoYV-GO2c4HN zXKb7For|LhHkb=RVJg(2@4tdZ95C8+fC`EvVZSI%&V)=k&!^i zS26H<^({Xrf>~zQsYM!#UPRGbCeSUr%rpXZy zy4D>jM{+B7WWH2J-|(Dt9pq4~fgi#U%25hh^Jf#QQKBds>Lo0}ZAVg?B*E-Zq*Y|U zsSS6`P)CMJG6{m-kP;j{!;gO3<)Oh^?zL39O; zLA`Z+5oLxuhMp%YVd)dK(=M&iOw)6j5W)CJV7TgDV+2E%q>5n2?vl$POFRzU%V!#& z()B}tDhdQp$^2b=Wy!B<7c@mQ=gk|wVQsdJJEr4nOdXy3cT2Yl4PZXVFxEndQ0X$) zP<*U-2VMv!jVEjROUF7oven$JtD353Z!q&I-Ec0cUOE+MALP7VFh!U6&M(c~BnfEP zw)|{O(n}*|%R(iZ*j3OTU}^o@-STjz1e~}AoJ9EYP2H-smVkVw8c|m98Ddiyeul zCWi>BG>2He9$t}5or?rJL60aKsO-l~c9e}Vm!;6`K#)5)LM{JThBRHEX#PdFusZG* zAr^1n0B=))JI9EFvY1JtA)o6-d$Ep$dpcY$N{hTU6*=~bJ(E&G##a)SB z8N~9uB`DJZd6k@7|3DM#*XMGoR5h(W$Y^gqZXg*-*7VPrecqi$L)Z&CBCEh?>yVF5 zL6c6#EA*Mnr2DS4nN$thy2$G+%Qs#H=oU_ly*b^j<_{%eVCUZ0_wU>x$bzsaBpdx; z3*Lsx+5>0)%@AAp>%K)^WZq@P`%eyJ&6nH-FsQ7PySX%(nsk$kJT_HSCVDlWUpP{c zCqr_VzEd<;8-zI4@?kQWz+)ER9sk7A_eulg;DUAg`(0J^V=BcOZhfn@>1C)RRhEY7evm~bi7FW;M6C$bc>6C@Hv*fd z>H*w;RBUDLh z4p&=T_vGCabPtdJp{TCJhmiZjT)0mpzW36feGL|buMUJseUyCkDq4(!S66*q|chcjV?Pev91=H$8$p`?jdV!;W}OLlY61Z<{7=gk@4luqwMAsK#y1VGD8uqIUs zSc0Jh<#rhizwjIa}M2#&7qQS(+UfF~)QC08-O19vHNoO@xYJhF;`TCaT9+Xxg zlaF;LYza4hZ&6v)tEnl2C;u zFKlV>wzUx!<{KV<3SbWiv#??b2}$50q`aWbb5IXEIR<#>HRks*>RDOs?KSfkz1%i0 z!So^+&%f*?zt?bqBbVPS1r^5uhYrAuMwTpt1E(#YiofV3u1b^?*g*UmX={>mk-=0G z>ifNhoSm7pRM*nRP_Rni4aU4z;tKb7Vdih_Y4i*A%3iuD;GVHAZGKY^Fq?Xd(eKwV zcfMv~Fy_v3ywbH?F|-kiEu204(VO6kUI=!^m%t$6&mvdFjXSN^=%%oX0$s)zc3>X3 z2k#dd=aCJrs*OoQ#$ z7*+K~_v~I1uQMv5yaG6_-e?5UDEIJAzJ%1mx^~~#(E#6eZh)ne-1F+S=xD=PuG^twn_L-!NvAYBfY$NO%TY#(vY3 z2xu5SRGFs$@QZu&MT@nsZ*>HHnZXEhz$eioUxr_=K(EF% z=^e9AlPeyfY_|4{acbnz@ABm9u$`NYumhI2_bwyhR)r<>q@s-yAS57gX>qA%@U7>w z`Y9!|g=z-XYMEX?P$I~MrkyY*sMTHFnwr{YmssM+(v%&$3BL)Sbj7B+W4_9Q7-IHd zOWFaQK4YTpDjY2}UFpR;r7`h%1Eq5Gs^NSA_vi%<72d#J_={uncR}(y)I^8zY7gkM zy5DJ;q3YpPTVOvz?G*?V!9%Hqm)ovj*|Ma%^z2ruAaw^MW={uh3io5fL>ZD5&KT2^ zG#}3;=5rs&w)52a-=fy{N^mwU=N8*qfE6i_yd@lnS)**gHFt$asU1lcpvYU)EOjpk z-}HoCG-Nqqu(h51l48sGDJ6x2(=KJw8nqo@x596SYA* zOrt!|E1AHjL0g{N)XHpQlOQgc!=KAWLGvn)4iCc5VjcAJ=;g)npk7&(vT#0EwD2J^ z_sw*l-&U4eAzjd(0BkB*?CzJ$hN;=axBQwWesG7RF9;}b-@@%wyu3T1JAztU#wu&X z;YJ$!vLy;#o`ypce2DExKBGTOpo z)Sm*Bx?iNumE_{>uhd45Mo+0hQ-FI|)`x$!pipuB#B>I6?$5qUP#UCYeyXdcPkwqn zA=0GGO61Lhp%J-6HG{+4$H1RASqO#qsZosv8%ss0?IUx!t3$JF+aYl88b0zP#DZ>Qh#`UD@YcXgvQjtoM8svm(S zv$CLqdA;VA7B5S7q0gKZ!OCNmBz7y5AR23F`(+?O)XT7BL&%EFN(&xHGXc{^=9pQ| z61ycT*G0#IJC2lJqRka%JEKARBz(F$P3vt){41qa-)9+I0}S(H#AHnyiveWl`q8c;QQ^JPNd>;>WR z>SggwwS+}eW~2NfNNHx?ob6Zwlqjf!yb;C0{Pb?``^cM#;Sn%p50e*_x?bvvHuVI& z*)*ABrh5V4W~-}nJgWKA^z$p5a~1@g*D&8kBcc(Pt&(b0TCHr(5pe9&m?0eYUKy`m z^DR1XZR27_kA8xjGjBX1*D_U6v3+Z%V&wErQq{@uUGYHP$Q>hfKE|<&k>OMpt>@4; zL#}UXG`t-@2xmWs!_%V(Nv^HkgXy9|es0 zfSAMDfjxnyqYnHP8pOeF)f*Pu>kl+BkG}mnYp`sGF~;Q}hUwieUmv65^VH!uej9wj zXFipdolIDS2L7$V#}C%Rie9hcv)XHEEFJXhbJStSAJ)}*N82V?OrHYo$+)>yB{LXC zoz#xzMa{`xv~^H1^j=daiQ0oH33Tm$zTNE?%<#SS%~)!@RM56QsAAKx&1O>HTP$2f zer#>u!UATftsFMpZ@Z356Q8l1tPdn_Z85Cqx3#W;@_M4U;ZwcPfNx*Xgc|*}xwgyh z2fAW$bM6h^{N;3%#ztUod_>p0E3dl6ziQ!K29Gg5`)dyNNmtkfh`890vxAm=uy;z} zD(%R!^+>614_V{a4p}j48_qhW9QEOcbCTEHPBLd2&}Z-aa*%o?(W@DRi=21T%w1{a zt)~z-rGuckY`pqgUoZ4a!M)5=W$=t4{lvc8&kl0?nI-i0l)KR)Md;S@C_2=i@(LWf zJ5uu9e)JufL-hVJyZ&&{2kXmw_|}2jLaRNvMu7}zobcfBL1_%z;n);7s1d`~Hh}?Y zx}-C{_S$Lz&DhkJPHZwv0}ER=j1QU8W?SgrIz$-(oN5Jhz6EsrjzM{by)Vv}QY%d( z3B#aNyy|R8TWFjZ=2V849k~~iZOCu)*J!VB@7~@E-%drEX^zb&ZZEU?tVYfH83PW- zcFL!HLZTkOJ)(P`f@)y=zgEuYMQ$n%;2@O3DqcjbSm9AwvXv(9S0;el&UD=&7qm+c%o$J?+@tZ&vSpd+@_U=H-uXfAq(FA6|WU z{l&*#V-LRn)$f0O`PPX`-~D~{@jJ)fyZQN}pML-Hk5Apab^Y2quV1@;^5BcFe=aL0 z{wd>Ml@FX(&X9LsJ$dlk8#j)>dH*A&wU_QZP`P*f`V+sP{72#p_cN;Y&b|_lK|qIv z-aGZpNtHL}hijvyatbwIEiXY0Z#U>z(x0DvCZWK!q~{8CQtwv1z2NEn*t@uYe!IEf zY8tLowpU7J2QW;YoH||E&q#AU1ZDEpsp{6|#wj6?nrXY+1|AVg+hM0?rk0d-G2vV^ zV+myK9NFMPVxdkdk63RHpn4@?$9GA4G8rQALwr$k_GGEkH312ZVo?w3j4Z z6XU^PpbWSY#k-gqhJgvgjL9G&_pWpjCzU(BCqZ9kNU$^M*6AskO$vN-#=#Dz3c+JV zeRNrD&IkWf zg)v1PD$BZ!q)J#sX38ha_L9@B*ZlL$RwTMvRu!D6>*`cVuJC&@4FdVKO`k1Cc>y z=yY~1DV1H%clu!>+0S+|X?GZnFtCRwSwDO@)`D1NO_0$LHavM=*ehsB$MOa`d`Lne zu_X<}BQRG|JXIJw&gQj6$$T32#)t%gnJrRet!9eUB1Og+Cmgbh5D9)D2HAIn#3&oq z7Uj$73DYf&Js-#}%vceRso?>&JOy4rJ{q-A*zJR|OQg$X8RJx zwRycnqYM`NW^_Qba=s$epgFyuBBuk^0P{XAiWm5-4waMndn52#$;lOUZQd`GX@EJL z9gnI-BR3vndd@y>2pZ9hEr3`oOpTYs4j^Y@AkHFuG1&KDULn9KMnEhSTp)zcb^Hj4 zY}kTz;~ILQRM8BzM)gW{gEPIN(v9_MMW;2&bxq7C)jnF{l7J!h5+_cw$;_z0D6Oup IKeMs&FV>rt00000 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/bsdcpio.1.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/bsdcpio.1.pdf deleted file mode 100644 index ff11dc50141f28e45e783841e1261a645aa44667..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39464 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 OeFlY=R$Ng6<^KTb%p&Um diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/cpio.5.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/cpio.5.pdf deleted file mode 100644 index 29722b2fb07bbc0836a248a09de5cbb4672c0dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39944 zcmce-1yEhfvM`JjT!Xs>&Boo`-QC^YB}lM9g1fs14Gw|e?ry=I;Qj$8IVb0yd*6TS z{Z+4at-WTZXL?#^bunzVaAG7FlNRLt7h#z4=}%*L9Xz*f)E6ky^& zKqE^-Kx3%DCoClYbQiF(dIFf~n^~GUx=9*28(DHaAt0c!``J%gMwU-WLFlO`KcAw2 zC;^RwppdedfDo6hp|Oj-nWNEDi-V(~jguo6&r?yx$>OvKuchw zZw}4L36M0hHgPm1V18ACRP*Qu6x*CW@j5Q$aj*R)?G9CN## z9FpFaS)<-s6C&dUsi8XFXW~F!7|i1J8=p*1BB;<(wjrA$>dhwN7HFcq zNA61cyxAp~a*)2WiUVNE3e)OaU(4L|lx1e!fc#rQJsZp)q5yZ<{qbtEE@BtuYzT|b zttFy%)S67>l~rv;A7k$UuA_cPKg8 zoDvoA_$=G$gln=5z4eP%ZhBi7kBVC31<)q|4Ryp(yEzWR%#Ogl&#BH~#%QC~^-Bk? zs>Nwd_fTmK#>oxcWm-Dp@s*1e)(ZwW{+6yd!cMx2H|So6TC|*aQ(6itH~Q-n0f>g0 z#(MJ;2O@JyG$gWAQADlKNOps^T&#R<0qT0AHDyX8Lor56`@XX=4cJ)b3FMcHzN0@vYe1I}(}O}GE< z$z?{Dy+Q=(JP0)zl>t<`TBEdic4=tt$|x#ZTG))B&3zA|S1lJaTqB^{O9KxTJP5DI zc^{vNe;b?agY;UM5y(ZTkR+Rf-YSr$SqG%hRaPpZdoGj|s#rzG1SAkCc`|WOHy4OV z`YCi+8yy0wjq}&MDPnc5P$_meTGN{ach?#UHk+?EgSK~ z7~`B62n<%%5f@~0=6Vs>>qL?ITHb2pZ00SgcW-d^rG9L4FTAe{Ob5;a&Fgs2d$~mC zTogzc=88<(x+O@FV&;L}zzTPO&g%#|ne0{E3BC*i6)FxExdD=B%t$T?i($+FYi721O=xNin$ zh5jQ7p_mcxFU_KN#lN~qZ~Ax3ID|sN+M}ndNeA^DYnp!{CvtLVASAOYHzA9?-kWs|9?jXQ4ApH6hJ{ zFUXwcZ1pM}!?&ku!LEI($AxR#g3r`trb=(~go)!o$pSh(`Yrh9dP#*X=|rQsw5SA& z{l>x1?_^F6TJ}ZIC+Az{&o_XPk875Qg!0^m@Jrw~P^n|Q=+eiSuIiHoC{n3n7$dfM zD$$Dq#jyefLx67DlQ=gDO(2rA6BOyg1>Hw3k|8Q!D2aMLXZkECpNZP(4JP@q9ww47y+Gic*X!RxkqZ-gO0))P{ zq}9c2XWglEfuv8_}7oe6-S7b_wNPji;GPd zzwyi!yf;B)dTh3CtU7{JlrcewIN#jAJzVpUFq*kW+W@?8$Q7xDwPe>s8t%TyxNND2 zlD8>%%u6eq$)d0$?%#=P=SkBdnI4c+V8fN!a3s@@C%%~oBY9WR)AOB93J!qzS|m{1 zFfTzge$Sl|L|_DgH1gC@9Tk)D3x7upE*58u+k`e7NcwD?i7Exo#P%F|o*$FG3O$B@ zPn>9FJxxJq=uC)IXW(a{J$#d+-P*CLkv1`a)sp_8UJT=O5YuTuzAnhtZr+2bIuMfD z>N;JGVHXk8P#}Z2aifU#aaztB|DF86S5|s-vPMuvJL;lVVMUn$4Nu)VfK5EXM`)!T zyH2IDX3%CPq;~|!%O7J*CI#dAda*jJxL&_XJ);Wm*~e86 zjJb*LGvsxu0=>2Ld+u9!3aF4Y;cV{ZuYxC1N(QI>tB6SZnRKNaoM&Y=iU1S@%9px; z5sCT<7nU0Qef9fQuM92d1_U1z`p{_9D0_8Of;hpR3=ZZBiNR{0d0Y=>oMLgfjzDG! zcDG&3KsNtsH!d5man3WsT4%5cF{I+4R-uy`=0I-~wtH#$!4#stFDX%^fSmXisEORs z$l!*7iSAV|TB?|l@2NpHZ=-|hA8RfkKSe^KeHk8doJAd825*|~o+s0btHp{I)tHhy z@BSL@eYKG|0wTiZxZf2Nku(w}z|@HP_FFlir?)05DP-6IA0ti;!_9h2E=ej#VO|0` zN;vO;6me?e);)9nVv*0lS^)vyPb7y#ChVOuLeN-*e__($hoa=#SHV;)hYe-$AtQG{ zdOGIf4l3dw=>a6*nLVJO>LcQP`RXfT{gm5*?~Cp6Buh&zc(u-Zn|i#4>BC{@$>75> z7>vy=zxKPuyoPVpvu4%wV2 zR|h)zVOzGhwZ~=M)7E2iaP{*yPWjIg>Eft1W^taq`61;Lk37;ffT1BxEZB~eP9wZD zlisBhQShD&t^8yJ^PG85;VTf=4TW%H>*Ij8) z=wr%vuk2eu!M^Q98bR-esO=ef_(`vFEFo}c&-~`(&MHN>1jdlL_};w&O_~5l!Y%W& znxek%8R4HYg!L~gu_A9`1)wyIU#)8f~ah zdJryKy_M7^S{7oT3POw5V_?97)>TP(L09ajmkAynq=&(Q>ebakHYgADt+^KSWzzBP zhd|P+d>>|7`#bh$=VPoI)!J&SmQ6Gf=x>kM#ziu;`Fh^J0*nmc$}66CVjyhlMJJexHi197YZ0*yY)IMjNsV1rMcPb9{09t zrjk^_it17x-%m?uKzSqlym!rWPW!Ts_#9J5B)0*37YHJ~Q$x?2`NzWJ08B)NnMWkUp1 zS_eBZ$Ga0$?}M8vg0g**Zp)anp?cCS+h9%Y=oDX49wS;VGneNl7|@m11XVVUx?d2N zFi-lJ9K$175K3Z&&i5CJw7Ic0yFct@O$;BzEj6cnk(Sg{NptUwsN^arQ;=HRp-nTh zAG&9ixiUqW4w&-+)II zR;zEL-P(Aa7%Syv#Ig0DySAuMJI$q5a(}Z=6G=@+BLw6q%WqD3?A)5BXtc?Ci2PNi zs!e-PL(^)7zxLM2qxs|emK8T{qA(D}boff8T)TjxYK3Z_?Rewt)1?KTFybT4erG%d z-t0~W#AGb|laSSO?MZw9O>mI!Iv?jdFy<0FcIj+V+*|>f0nnC{t$tR7yBQBUdx)xi zaro(np}=&*i={2PLBt?dyPiB^ln;LIBM#1T2z5bFI%dWgF9TCu->3nn+0FxZ`(9)p zFnYC}Wtn)WIf@#?@vhTKk(-#ULxwbdncf#ZH4WvMlr{xMk{zUt?Mh7(Krq#B;Sw3zMwhjj4O7P1V7s5gX;xO=J_Vk zJ#;dLk*52*I?3CY93OT2{0_h&L3S4i{Y^5n1H^JOV%#*N3>Q&U(b4+sb&wR!0*j>R zXd24eJMsJ~C&RY#mS#Lh@L&~GKa!0b>IAugJvLt55;0}*L&iA=q44@M7b=#v9!xlQ zPa!ljR_Esz-i%gz8GKF7n*$Jm;tL<1opu5`-wy#8xtI$lK^p<*Xmoxa>pC33kZ8AD z7PiX8TxYu0B#7JOEp62zMp%amTzk%gP=^{4Q({`wj~}i4=V`Ur=cIMStn6@E9jyAG zxq068gLC1!JAF*gf0Hpf6_%bP?nMccWiEV*OH7oktEN>b4_QG=i0f7o9qbgy|Nbo6 z9abp&VA0;qvTyOL`>CYU8TLJoN9#?*z32^6eHVK8mf6bi;{|vG4Sc174`<8!bCO^h z+U+mvYW)0L@4TsRaIHFnbqX-lQNjH1*T2@2Foz$c4r;l~bu$9!1U9IHqFy@v`!#(;mDLTtR4q$-Y8b(E6^GkukCeuw6%X+8uu%A`H8VYu}^#p+XI^FAsHlM&Vq2?y#S1_!e! z355@Y_FW+ccC_R8($;_M0H(l);#m(l0Ydv!%%bR=7b2MzB5wZC^bK6Dj+x3z#doO!S1+t`;RIj0U`f#1OT^}7OLm>TmDb-aM&n%0} z_F)JXD$6U%lZ}O0_1kxS@g@s+GN$eYI7}V*@3VtHVzj9k_!@ofE2_#`;EGaDOc(Ya z%PONhW>$y=clw%7**}U|fdwlVvIH!Jbc5rcBZwjGLpr=)UsSley_*WAKsJ5m7_vpm z7H15bF%W>U7tXj#nPZbfl;I1B#G!=r8DB(N&g15;cpo`4J=dQ;7w@_V9fTB`MOs+Z ztClVXdR5mINX;k6Wppxy0@#%JEaaotcBuoxMq@z|F&)6QK+og&m4t}?_?@U&EEGw) zOLqNS8{2wt7_rw89R{k8{)#X~JxW5?5S5!L8cl6VW5C%8K$L*`5OvMf6eMgT(p;a4E<{XY!qrD~P^+t2&K= z3l6S4QM1oZxz_WTIkXK453NGaY+0zcNJG)p0hNjcW<=_dtv@y+0~y6q4lEapoDi{r zj9SLxYs<`DrIu~hlKlplxUp_KyR?h)rn|@{Mv_%xdrFC5{Od49-m5hN4BJwZJ!Tnt z(;zV>aNpAb&5)+?bLcbsMf~UoEcf7iEW_Qf#x#=Zdd_NoMmb$wbc>D|6UJl0N!O^J zj}FY4f?!=h_2y5>(BXV4e1b94L1tSnk{umO9cC?SwcwNnmTbdWSenZ|b>P*OA)!CGLT0LZnxgM1fe` z2pt2Fl|2$uDCW{51mKy;PDo9R6YbcXK(9Gtv|UHdV`fzOZ6Ic^kiEbYOc6^Bzr?

}tNRMF&0tMH1cqWr41VB|>0_lHUd!fqqtMM&|`p9;3)%rUS?`5E!kJ$sZ; zTRjNu`nDRg=mo!PSDz`l_Zdr(TvrBm5blOnAt?RT`0&p4Ydf1EvfecjTz z4_Ic(m6NkZXGFJ5OhSVh)G+6gd6fJC;x~?f6_W>4(Uboevle38F4$I&*TrYHa!j*5 zepx)*dc4)@E3^IOAHnZSRQpHtOHcP_^!qC${%fn3p5?!Zesfjl?dOG&y|z>&H-uK= zUJb(@_I6CMYgCT4u6|D~v21MSVOT zPQ5q#?#2u;YQt{R>-OOS_j+3hf9rH(m?4fnT?nb^Gj$uMrR%Zwax)=|5ozyWiV%0M z*h-BSjl0kTMN)IYCJ#+(@=5TG*vCZl$B{dt99Yd)y+o34-pF=Q+$95!^Ye#yWjMs( z9q?|{x=>^kJ;bK0L?#NgYm^eBi!AYC%ZG!$s|v=kxu)N!>3beqt8;$3H4eNX%wBlw z1RYQQ*3kRw3Rt79@mab%ra|VC^e*YH0>?_%D&lw0JjT zuIz=;eP3th_o+rR^{~;@Z@p{pU}myUBo0c8n0-jh-<--T=6rO(b9+zk!u+A;ICm+G^8nhv0em1aCkuRa8OcB9C-+x_Pm=m`I45!Q|-Ta~o9B z_h6YSGxc~9=)|mc)PFb1yTD5!ohQp)3PDb{pqrM()+rQqjd@tp!#mC>hO7xgBb|tE zGEm))ygHR+OK}U*!kL4N}wV#?$n5uoce1F{5r$WV9X7M){tixxsGpkB=Qp{S7%UUR-sD|ZjsZJVx{_L2H7tte0=MhF#qri|* z;Gl^xs+V>7?z99A@0xsETyBYb=Y@})%0M@A4EPazRvMJJUO7tK{eo>IfA^ZE4$y@huLl{XVX0|qAzc*eItg|u6^@J%sD8&jq6;h#= z0{5&Vrk%pB^B{sZrQ0Vf(nP?_G-fIe#@Ih(Ydx5NKd`Q1HkVM^FT`EPRa+c5_)Lg^ zar+zU+JPLNX09EWCrK{oJD@;f730O!aS(E!k08MzX|>P{)5TodAtTrrUkrj8Ixxb2 z=vQ+#(-PCYK_l)|#SZ5cGaJFNE4UeHvBf|*<6v%p=syY8FxWh$H6CLAUfb`RVUB^R z`&n)*9Y90?6(`&<>9^R2LoVlx3ty|rpI{WGHpPa%e&4DyUtrZ~f;)_|&C3qNwyp!s z2Jx^u;4~t=KBs{Pbhw>cmzHR`kp!ga=V=KKbZy7l3k)Z(@mgzMc#aOH178}JKfU|2 zMf7=fCF5WaF~wmQSmJR6DKCT`v@gSYnQr)?p7~xcxkmt9wI4a6d~~7V7pOba9(9|1 zwcU`)uat*QP3{><;YC)B?}wH!AT$C(@C8R{Yx%AMRx#9y*RQYqMaRH!Tq^D>Y_KFe z%DF2>`e+Eqk^u`M=;KgHbOc@Nuw9(r-rrU#sa%)akCsC5Ov$cO$JQj zrveLYQ3rH^Og*w1rheaC`GJa1W#xy>YX{o=8Wq+_1Nh4ZXRrW|?!w+Y%!(b!w}C*{ zgkvXmSY9dE28oZi6VnjND(qntm1Ppy^bLr%9T>?O)Rh8umhbk=xL^&H3xw`P2*|)1-#2PdjGR{YZ02l_W) z=GzW$Y4L6AuFeM(VTlbHom_leR)#Hw7_qu}EfcrvA|2LZpa+IPMh&AJXrq`0I0;Ng z&+>@c#v7-|-Wx?Uf)${Cbxrs(AH#GUh-x=#R~5^6{B=9pNvSP1r0H(Z7Ax^`-*-n|kfrDuKSP|4(Rr|ivvjDm@Kq=FkFU>C zzqfr?nW`kU|Dr<`^|t!E#vS=O7jWNcC4_BaTvv}>0FXhsVZNgaMLlTLw-xBUM8aurs%l>0=wAVY-0>fPu`><|KTakS8J%IMzvAX zL>B8RA#UZj5-bP?!U&WkUvzb_QC@Dw$G+ zfF8f!1!a>r{tX}HZGC?SA_p2(Lian1t@As$TQ&gdty`bK^r`-G;jYyj^FF>=y-e87 zQJ4-H(b>X`%s?0VVCzi}@!s?R`npt`v0o0C=I;3{S*hB^kylGYT~$ zxX15J9D64_uZLwINN4@mS5x=>S5uZv%%>}>^#-Mlu2pLEC6pAaVKPJrH4LLk?Ac^2 z$-nIFeRz*DHAWe!eB5^4P3O!U>ZSCpNDo_yDrm+Sd&;^<7_NIknF)_VnUbDZ(+f5J zE8M==kRBU1!J(Gz5BgI49w68%$62@jnhZe_7(@ne`7{Nvr7f29a;(_113aQE`)Ye92ro3K%vx2`-9^tiC-c zI(>^n*q7ZZEz&Csm}C+aEpgSY5m#|7DJSPNw2pyY0wb&25_giDtWOo)Y6-kA87!9X z_Jnb`F=s#$DTDN7uPjqc-VFTA^A4uYZ_0EJ?CPx*OANT<@_Z4Hijb%=(U$Ilr_VV& zPwCeh$}5o2j{;VcdEnU-dXuHzKhBq4eSp=%>^&soWWEb3{m=rKe|@_-T1YW}7{Ye& zaC$Pf0-{-VI~QQ*8pP*gQWkTIUmw2PhPP(eOZ4mQjPADXX~YSt!?N4*nk<4B_)sTZ zZ`?Ys#B|m`83u_~;ly3_;6A4#$n5OadD~Mqj|mF4GczItY;q0Xb*E_qky1soZwJJ%oNlv@DSU zNC}s_ZA08?nW`v};FDkme8hH|+92-BCLmjWuPJh^R3Cu4Jp+@sFy$*t@nZdg_c&L{ zAER7icv9eFBKhdkFL(O9s5k{?X2qG*QUOR1Fk|ph#30$lIzP;p&q4)zE;BR=XYx`v zhh0${={LVGY~Bc`uBmS@{s6RC^agy0F9H&IxTUY1zG>YBN zV-u!!KrGnWV}b)awRH|;F?_7btT2IVqs6oDwhrGGv^3oMtA9kuF~$~iclESHka#U^ z%gU=!A*m?lxr(D7yPttaFR5#VhUz}<(8!ZaQfqBY7*pqeW$=}EoB^KsT!&xA4Xku` z^yaQRj?3zzw3)h+&p{^$_)9wB_{BV_(xsC3eCrpXWaV03OkqulFTi-gwCY!HUTJ~+ zNJ?FunF&0NpD_q?FI7Hx#gm}3VT zTqZZ|4$tFW?hI>`%Lz+h;NdaJKiZ5J@sGxX>XaDRZ~9_)HF&meN)@Twbi^}P?cG#A zeRR?^)kvN@Yk4oYfUZzD+n+jqX_Loo$I#Zw(~^jP`E}`0x+cSBG<}dM@$ARWn}tq~ zLJb0$QDAg6x7C}f z0jE~R&M9W<v>jJUHeQW;07OPM z|C*Jl5Joco)#4Y42~ry!4d8u{vb`+~CXRBvdJ0)OtIK%OtzC(q=bF&!u zpcGdRzmkl#)o)|p2Dz9GSI*xli1F zJ|6d>V}W+l3<_g)2u?L+;|I!JHGcg$B^l3j?H)Bs{XMyC3+p>&4=G<3V}Fr43wrHx8V_UXTqTUC zg#QUvvvO&H5!30)-9Ba!#_9V82+mbxj^Oqrwuv8rc06Kr z5Bb^36!MMEh;K1kLR&z0wpH!q`)Vf|AC%E0BYHqQ-(Ly(a-8^!F; z4>xH%#m8jEckUvg6v8VQzrERf9n=jIw!U#dU&hQqhpZK^HVq7sV^rkoX z|WR1b)lv?Wr+B8|q;3yi8J8e)|WmH}Cq>$J0Mxnb zL+6zahVKIi<~~av&OV=)p7^L*;Y~WB7RlZ{W3-?}9}2y?9|`892tD}Rn4csV1i-r7 z+FDxBwJ(poa%a~ybTq#=B{w0RGHoHHD?$PKl*KRf`Vyu)=*M7;H|#ez1_7?JP!?^Z zve@Mh&|7S)BBV#!I6|LNMLj=pY8ByxbgHdArh1U2mTuq8NR++vxF2Jl>GxR9wl|pX za6A*3|5mF9BQU+-OFY~dOQYiLDY=|%T=5O7>GO2yrK;cRPCHONG{l2$a&E_DM=GW> zMET{dH?0%CA|AdwiNjG_?7^tue#7?AsB0c=5x!RnNTINBSt=sZlsmrf0XxT+Grqx= zp$r`p9?1JFi^*?ztAu={ahn4mw;Jf!ZKNMyd>Da?Vy6dB2@>D4UQy_+$uh^Xm%Kkm zljx$oZ)qnR&XNjj{H(6|k$q&9wfJj8`$3n;&0^pk;{vqOvC(nK>rt>T@d^rW}k=mYJPzg1&H(Miste%MxK+4F_Opo8jl|X~`3CzUCM8L{O zuLTW|w{d*>9G-yosh7QxwIcz;^ZS#hW+Mk1Cwl`Uho@I7vi3Fx3Pz3^fT!aC1OP=N zSI4JuLavS?3NJ(HSpOIzZ1Xgnj_sxL^kF?f;HmzE(ShLkgM4}Dr=}+3)e?sB!BBcK}BBXyg!tk368UBxD$nd)i z8UBq7U-o}~mm$Odu?!i0mm$Nyk>N{l@;3_qG{YyWesUCo7f*2@07#e_IuK|;|G_2w zv!vyr>Ho0e7rDzrzc42ctwr!;L{3j;&-9yWe%lE91FL|Zqn@RW$uIOjB`Ia(sAu>D zAz*xokbXn(%cp<2$DghS4UmzQBB0~u{^>|Bp7+y{JSUXN7(d%(h3TL3{EdnKf!r4r{Y1mB=V0`_ zVgaPpl?0^}sGbbX-pt4z@Z2V7$5{WgRwS(E8bpd%2#WzwrDq!!zX9 zT>qJur!l{2ih%JCQT_)7y+D5|=vjAvY53WX{#5V3s$0;^*x2YP?s*DyG@e#PT7a>c z)^A#WUK{^a>*8wSa)L6y+>wUg#?tT~T7OyM|Gn1Pn11(3`d?aqw)~%d@XPm}E&BQQ z%d-Dod+z^xk3Z%4$B5q~_g~xiGm3xZR!~7+L{a&tjsII-pC5Pf|DM;suRnCZczt@7 z{!Z<`DgS@i=d+}q?Twk4<>mgX%uGi|!18R1PuDLSd+x*bWTVf0p4y?G`}{GQiHZ4d z80ctU1peIdH4pde(Fcw#!AonUybo468bOn!^HSE{X7%RNc#tK zPlP{9^r_|7^}_O#7N6_S+I(XF#p{1E_lwDYdw&+yFR{I>F28B>mqwqp^eoC3tvw0t zW!{%n;~B#GRQd^le(v?;BTrg>F1=X5v!NlLIV^WjjWUj*q%o5 zIh(x1L@%o^KuXW`_nMi5!&8LtTZ`(?85o}@e-5yol45dz9zY+UZ?9)y^dg9t(u)*c z8ZC?*|7?CL{{b)n7y^s{FVq5z0VV)bfEmCXU;(fMSOKg7HUJxIBY-Wy9^e3QFtRc; zu(7nU1~{0x0vv3gW&tOYO*k3;akpMigp$L}$Zz^_B|^sKDR+}wX2k55%`Q$(4@N*ATa1ZK(ef5$99BZR~$ z-$+3zFBBRh^hqdl8&uG!PIN|26f9ij>2*CB0Wb@*#pG5f1hjmC)g(b_R<6EIjk26u zZMh3){LNCTAo9N3*8Ry)Z*T9w!gbv8<-PYZIxr!Qz$-8ibF(N$HZu0aN3P^#%9Xqi ztJ*C6f)5K}TLywDol!GJ6hLvtZStxtR(F_GSK}nAT)@VXBmp4pkS%(5z^8_ z64A^iB;A$^G5Rdi8wV~2L=5}d+@DW_myoOIMu&hOML$Hy%%vcvCaj@HBT_8tZzabh z7}n{>YVn>4n|TWUD0Y!Td*s0fo~-nf&9w7{ON7xCk;PUCqOq!j-0T`6=7JyGP8Ly_+1csarH*r?GXgwQXj*I(A-0 zLBr-6_L+#}Q zFG)BIUhOjnLvG4+1*Be4O;hdI5UG7jYZZgj76)$=V-`Xf%F%Vsl1_ z$b&Wc`BT2;vwk$W^Db0pw%7Q z{Bfhr@L6G!76R)>}^luiF|GmYMd4bEVXz2D^Z;_=$*hiU>o57v3Bp&Za?2zB$poNAr*8}Z&TgvC!bQCp>p`s-wN~aU@ z2+E8!>$UmA-O1dyrzz!@@m-Bwx1?$1>YKrasog`G~SCMze@pX%38BOX92gl*)d& z_);^PY|o9>V?8yE!!6m>XwAi3ZMm(9C&k$Xg4hXIjEbOvME>FWI0Fs%4`X5muwy() z{T0n^a!S0|9SjAK^iQTlM4w1Wgrv$-XyZx~0vtXO{}6-`vZtTSpkbn}9tF*MV~Ys2 z9KdYLUWpVK&QABuQJ;hD-2g5ZJz43iPW2O13-IQ-0yxK&Ks|8fFxl^^nMYzbO*T)* zK!z1rS9=jtz}~QN3!|vroYAk~w>pD^FG}mWsqSyDZ*F#unWQdO2rh2l#^R2$4$NpY z@!Ddu28EczmZ|%#dM=J)&Jt{n;;^3g)!jzce1>BxG9T#e)7(&Y^W!IrE`hp~P=hXD zS#T0)y}Y;^^&xeag3^dlrer~^32J_mr$sBrz_5{UM>azD2EI1Qj-mkj}uWkj)-%ZRy7hiAIw;hZM7zTU?nd2=x_+fL_ zCMKD{28wRGh62gjvQ?Z17+zVj$4AEIpotMQJBIJ-@*EUJ zIl}mmGA8=$m2#V?O<1t&rmIMxWgVK{EzGuE2k~{)>GF&XVlqLLCt|_WNBdw3VAODf z?pWL5xBJlVu?xWKd1rhc8hYi!;}~S1)^JH_%Hf&k&ktgE5*iE4-AFE|=edEYcC$)C zc7%2}(fVB^w06r95WKU41xlAgZ9O3~(gZi)kH;Ct$*HLsx2EQJe>1$_!`U4;KJ9}) z4zWmZ~Q_K=k2}=<3DDit0 zB%KunTeYqeST4T%+76=tdO`+j@yZR!6fzLmGhS5DfzZg!>-XdXo8E$SU3y%e-(ujo zf%fd?cx>q*7!S&=sLSTH)Io~Km8{*m`i^ONpwvkq=;X~xh@=Rk{Utvtk(J9aQkmxx z1brR88wzw%HfT}qm5_IqSi8)z;6(vH;doOwNou~!^cu2F%pdmE3ex^I^JNO3-^0%J z^)*4avBkIA(5xR>THlaacLGdV5oROQl|7_Rk!F90b_mS0WtPGQOT>4f=k0&o@|UF4 zNK{#LE6dgR%E6_sF|DasRa}Cq2wYRbSV~?ist%cS?c30yp=`Xq_N|<;)%tzTXWLfP z&J!r#g3y?oiOvZt4PI1y(^@oU3q5jpmmfl|upDPWl*T4(BbcesHOOqQgV;ny|e8!3G-FOQyxofRyo7;7$Y59k! zW{HG`=)NMa-Mrz5BOZtXn|ZHAEq_n0g${M^<$>uAM1d2bgot>GET(sl0K||)x*jRN zW!m^;>|sCY-G?S@29qI;{mM#;JNuFV@6Fffxa$Uct}gBPj}0ETCmZJn{n(^uEAtfr z*JTWb^)|dSQKY~$I$q`?k` zhhCz8JU8z9t2G``3j)dK-Ne72>8JbGmn8owKl)F5jX#qlMmho-dfKPm5L!k8W>$t@ zSrX%4NfPUG&hl51^j!TjNqQRjACe?GTBfHjaDLB(p0a&tz@M2A<8$iudnWWpZewir zlGd2I*_s+z|4VlBGqd^kxy;}5n3t`k-}0E>-mLuhc?<&`Bg^l3jIxKK;`Dh7=#VXG z7m1`uV!~3GmA=&RCkzYi;*d}>aWEkyIl880h7O0Nfm%(J8wa&@M0;I=<1#N%`bD>meb~s+d5h%i#0>+E{k3li_3MbHdPfudKh8f z-0ACO6Er?Mn;7L~(0Z&A#A&x@rNd;6*;z_ctgxwxwl#y^xTC+^GQ2mc`)*HapmrhjtEb!m zr7>~u>zEj52cg)Iz^~MHLIX?4dU@oV>6edNqpkk;Hmh{7-^0Yk`>80uMGcf#3Q1dg z^XbWb=KaFV)fJ)F_?b%;xfVg9>%xFy2H27c?Y&h8yutium(RE}($sh!`166Jx*;?2 zmJD5A17@lun=6D=aW6po2O98|kuQW?)vi>+I>R0Yq;(M-~5mJi=Za9scEAI56Oz>>?v@>5;kWIc?zh9VC2a`^(m<5=Ec2<&^VTdMJh^NAY zHQQFesz1>pz9kWZ2l%*4y;ReHlKxeX;~7Nqo-%&MM1zR~b_`dCl^^6Z6d9q_M{RUN zr-6=(Yg<;4H^=n65zG>Ip7J=MKvX9m&=n4Kn#b6fnd_t@v)Uw+%HnKg~`;VK<|rJ*sstQSmU`H zXdY}&u*D3wT%79`p@5dnoMZz&_)mq*j&ze4TD=AJX!ppH!h}j}M1Vm6Y7(5A8JmZU zcN+YNJDvCcSbNK`xRz~Q7$-n*cS&$*Xx!c1o#5{7PH+gp-CctOCunfD;O_1k_&RIt zz0b;7d!Kvn_ndzCF?-BWLe;EUU1N;*9sS>_DJc2gOaP!X&Ie86&k0}G2dvNfVzzu0 zAa$@B$MVlpAi>TqSzX))1IZH$RSQjw)x=ys1GN*0eURX(`_&p&TU2}0Me3V$T#-Aq z4_zEF!G`Vz*e4m&!>f@7g09olG)drVZDW@8#v1N=RC%a96Hm5g9(5T2=YbT`{sA)j z);0ytw7Y=JZ$46vTsCPVgsMcaq-~Tq`{~C+PqKs?TlU!q0-q~4_f;vRF&V+yg?CLm zt`o`$A~3b5fUX#@%pY&#i^LO?Yw5Z)gt87h(R9d9md zGMvk3uC7!e+WAdUnkP4yE4Byns=>GumOo!Imy|e6eLzXB=KbxmW0n7yaad-pa-nIM zO}&a&Ik(z-{`4uX&>#(#}+Y4`^C&{pL@5VxPl>Oa{Py~ zFmQY@7t_YsN?5TRcJ+OPs|i4!iM9*`N&i*awoi5@H}YN28=4BdSC zQNL&Uo)g|nu%BA~qWny#M8^AjChM1h$~khAHLI;Fk-pGq4sk2n7Ok(mIyYu{c5Of5 zIl|qNUEa{DT87tZO&7dBWVMBy2&i|*z-km#Ag~Fhm5o2to;nKZQpmf7oM)RUBS_@Y(~>m5|uLcs{d9^36E0Xj%*l(2H;qeo*D z@>+9{!kdEeZRR&n5w*AcG@eU5D)w5RzLOZlSA(SLZw5{(%9^ihT>Zp_Xot2t_pGGH z%mHgliXdBC3UmsUriI7M!+hAB80bS^%WRfGl8JRjR*H?cEX*b{nw6kA~}EwW>?fe{sA*IjAfb0fUP{grq?$Y3c9u4xG!@1yp} z>Ap()K$~i84*|w@rUgK1!GqD%4I(u;ozwtIKw-zGedZ=K7x!}H_WHykv#9S|NIRPJ9ntBh6I{u{hQbb}$E{$r|VR2pb=|V?6@Ch@FK+DoY|0T|fjhro{s~E61{1DQn1q}0Xo+~h!YSk5eWMj$tE0@V zAyObeco=`UVR3I$kDVEYlJll0pSmc2d}_R2jCC~xPKJMY-x_C3dbN<53apCRJ?1f{ zXF#th%=#yp{S_IV!J)H2x?K$WW<(gm93CiEcu1^NX=?Il@*`<80CwFRcQN=jC;2O) zvA5%i%w2X>+@gvVW{Hl#6u=Iji{0HRP@uZ!sExrY|Lrz2lz^3QI9oNK#G3g2n?uw6 zp$plJM;@oKkIuHiqgiFemRs(zCC4*dt-FI4)R43P+3?Y~iGA~P=Xg?VZ|eIk8~afH z_tyMjS>n|>^NPpmdv~KgY~1$;p-^aDH*KqHD`}Zv?lrk(LL|f3ZwA`}bsnn85#9@F z(x2<06lGYNhhOUKrv`mVj^O(+_7k5z=fgI+BbB}@PMLIi#GzxVAA;Y`Nds(P_W{sR z{;Li=jsIf4g<55d*{%4wTea^wVN}}d`RPvm^p_Knmc|iSyo>L1x1OPpKQcrrXRWRv zGM;|2BX?w6Df=oTaE@)f1e;F!WD#;$Bc)HPi9d|^(H{d$x=-YXe4i@owl4~y%M~7Yu*DZ#qGG+*q5(*^rk6Tj;+Sx3>JB6RPAgij>qhI^NoqG ziFsS~)@fmX8n4tVUngEVTb)>2eiW4q{H& zf=-PZ%1x0OTe74!#bZ=}k3VKyB&uAtK?A4G+KYFMzI7XwM@4(2t5%`G!eE!?TGG}Q z&P+TheD6d)Wb1Qp;2)CJfrVsq{lqi$rIe;m!P>;o^~VBh#)M*~h8e?jQM`kB6AEe~ z?t*_cQ?sRxYv{17niqlXdRLI+2a`e}y|^`HKF7PMx62#?BmCRX$q2YDa;DIEO~s#8!is2T9|b>U@;=; zE8%52)2q->-;ZU*T1UzllgeT>R1)SaYYy|9(^2o@62RB#mYHTwr0wL*Y1W+@T3gbM zGihN2w3h~WIuuU8tnAqchSrta?&lF3qDvFP8nt zeA)DsG;n5FK83l@h#go*v0q$0*PafpPBdntNE7e!7GZe-;a^;^YzAgOYGc(c zSTj)n(eXh$PT zKsah=&IE{koX_z12`Bkxp0=6qmRXMr&yi$0Mgn~%dW6XdW*OM%ba5aiY8|k2gOe`4 z6XPO_(fRP4Sshso9p-Mu)ICS(^ zPt9~0Az62hufl6ZXu>soAV(|A1AZ&EzCT*?ML-V?!#}6MuiA58NtiUOvt%CREyfMHjUgJd~JXUt1fvcecz^`CMRnekMmBX+-(r;?Gr3YlD+A_In4cX`~TJX z_MZ-O|0#sv&%+$Z!$;4=3G!uvF4!3Vb(Z_9$BXgz!`!d0|2oWpivEYg+^-w|e?4BH z1L9xKc}5`r)i1BrpZ+R)kf-V|9;x5YaDRlC{pAezmynA8`!gKK-^l#eGhBj&wTdc6 z|CzJL88qxnQXG`QY7KRHT%Uk3Dgv57NG%3Jeacsi#e@23IquAclaX|bgKKC1vBj|| zYTcX)a5@QTf0elsy6-tmc)bGtRFP5Pcd61*Zsx;i*O49{^iFvn)|_7UGP0q_dr8AZ zfbIcW<%8q1GLnkrY~PWJ!m6cvQ5`l1?qxo|%-dfG=20c*d6q&IT#(3`6LrzV+aHzx zxB#-X2co_IoGLwy-(Ot$Y}{QS8IN5OiJ100>R}RLVJDxNJHSTuXorE|Bz?t>O}(1K zztc?P;$UE_xKR7tZEaJ!Y2*^871tt#I=udnU+nmL1|IyWUP4zVEzxLXbQtiAk-I~M zSt(Gi2(J}3moI7#rxlTu`(Vz<3Q3-$yWjC1tr2)?&_?m%+&vI{6i!V3GCG2OhJ<=1 z1oa_8%GLlQc0SU{1U<#EW*)BL(b9=CA!yLXvevU)H-^xKK#^MmQR67sGG3q6|I6#t zs>Tu$ft-HJQukBPSAme&#wMs@JPz2b9)hCx zlzM2|wzh_@)0sIZcOnEcXYpF@L>tYQw;GT`Ln8z+MdmS^EhXD1V)sIHqtlycxTz99 z;EbsxzaP6lQ~dn##DPnRdJB#_JRg;~(pJA4BpNwwI-;@cwKG(>dc>1RdN3KPSP?GO zkt-!`C>1$27_;Y+K0b9V{?h?c+Tn7a+j!)%B0?7T*?=rs^$5jMMy(w6t~H9d09tW#OPB5 zO0c5RAv8~KI^#&E)kjm^_+Vq%uG(4YwF75S)7K!d z)@TwyB-le+n>Ib`=bM!;QSw`JQ1@ow+#W3uw?@WVn{OcmX?EQ45_^^%(Ke>yLt!^H z6>SA%Rrv(w3KOY4*qopQ<}A(c-*UB2OwN}bpz=I5#!nUqr*vWBAWE}E3V-McO3j)J zaJ`ck$JFauPFs`yJf&PFbF{6M-uG6ks-&S}dTDzZD~b5-WUYg^34xn7(j78=K4-Zs z*rG-v{)?Ql;TR-lvQD-mJ?mqi=4%X*$7P4-$l#QUMG?z78x~Zz?2AA_+#2rU&g0vX z;s)^(dCCK*llC8?E5~dN)^l3co~=CWZDVz5EgYguap$G<2fFwV=(ryaPrFp_hvqRK z+6o&WT^(Dcmf&eCwXM}WVrm6aWVaR)Lpz=ho=dsKk$=dXw5_e`FIg^Dt!SNm^|J0d zEW&;cpi&bj|ACokfc%wQ&+9rSFa%g!D0rSGBy=UvHhz#hZqw7Fxk)CpDdVt!h_!fB zQij6few_o+p3C;FI`7Qx6(uo@@`6qiJ2Eu>-pd%6DuC9Hj*I(oYqfj2Bl;s*|MrQV zADC8?oQ+jn-)2c=f;>I#!e_WTeVg=MjJ-B`1lQ~pFIJi6ij3uZ3bN5n>k3{HwyH4{13KxR1}Hm*9=n z`U$~_92Qd6IA`np)Y}6}ML5>-3C%ch+v?$IZw;kj#w=cReA9EaW6tHZ0H;TM>A zCJwn;Y3j&S>o54wky+hc>rBvee3rmj%vP#?^JzRGy$?8Pq;ycD9W;&WbP%=@Ci(7w z0TEb(>#4pVrGvhAQ(bR1Ggsa|Uq+Z= zrl6vrK*MbCiPJ!W5l;Bc`vuY{xKCiUX>l)WTY0Uy zZJJizxdyh6H_mxkwcn_{kZc^+-M!r2rL)DRafNJNxKF!*j4_1>^QMKAExsMyqni$O z#r6PC5`sIb+2)0KbWg>BVMq_zla!OXPS}^1w=DdKpHpX4i0l@2b#DS%h2QN0G|mrO zDy*B|vvQKpzsg5`(B32l-1$BC`n7AMrDYuO$9fN97n_-wg)ut`D=}|g6};qX;yR?h zRP|*)_xs7-yryU5m2|SETGicFX@3)}RcxVlyGnWv(;0 z=3{R7K0VJobHyV&eR1s;6_`1SRcn?7?{gSrL0il!zg1+H?K@+Yq`vbu8&{I~rH6aK zYvAc+x;)#LLzzz*T+Gf4t+wl<(Xtr+cym`*tYDvP>jo~}4i}UrOOgx$Hh@m4L-~+0 z00*|Non}0WOVOyZ{in~cKiK8|Y9qdq0@09iV$uH44Nbe!xYRlpb8d*?%bmgnn7X^C zQ*m6h*QsOL=pIa%z?-~1pF4Z;ljj1d#6HGOAxtOA=OFg4;wC2&XpcnS!g~rvBtXQU zq)C00I6f6EEMlWlf<|Va%T?57`U9f{ziZVE_CBs!+BLE}k8n+85K?sSMCny<)qIeK z!Dd<=6WwRL+tdXb>MdDnrf{DX&V z^R03$8!OTqA7XD;4%dy0pPKg;l>_P1G_B2;D?G4JomMF8;Ho+>#QfZTNLkUZ=Rb!@ z{P%p_-@Kep1%{>ofCX3MUr)P-FNhJyTu-UoW83PhOrF~YR*3gx@R3^#N<*Dmoj8fj zr1#~AD=ibk;Z-a+zx;r-L)Ql=n3vxqwpj9;h>Jp6>Mzl|1PO(9O$WSE7cn;REnD`>b6yvst_Veok}oHkTn zVr(p?Bs5JYePyv01HTdt5{&aywnY%te6mL^@}CbUZFU#op!-^UU1ds`GgO2*SV;a* zftjW=T#6RjcSkR!kb$UaH z!s-xoyX%V5_RT#M1@6bK(U?@{B& z(qOix=P*{}L$*fScp*p4tYXUm>}`faQCA|+7Gqo)a(5EwWZW49TEh$9$D4Ep2R+0q z&gDFPf+oL;tOAsVA1{L6y{{*jrltnpzbIOJI?eA+a0@v>b8?+lo0D_(jXPeJUl^u8 z+i>~$wwsuDozJ@~wAmv{ESFlH6p^NqM7c$0o9$p$yd6NR?r^CY>Tg|(rW z-1WzjEw`%>&3i;x8{6vAQt{amIkPej73Z>h6vH!Jj@J{_3;WJb=F_=!u!kmINL-Jt zT#;8xAvVya&Ey|%T)z%^W&{%H5nKB^XdG`;_=EGkC<^(h8c>(MHQHnJ0$#D%MOzWB z0-_!mUy&dHSf3eCz{WV3=&+GriNRC+x8T4&d@KkRSa<@2cP5v%+1fVg4SV)v=9QnD z2fHDP5ZNb1ZUKTZ(YUs6g7im(gmn$_UoeITaeBOLMze7=VLJc@e6x!>B=46d1p=Q2 zi>oNtq*A1J=p%-Bt2z$vh!kv;;yZkg^ylV>@Ndq(D7?Yb8Q8zYD4T1Q@XlWEKKml! z{u!EcvFn4f>O=wmiQc($>x~w9>TPcDgUr$`_u<_Drq%G^Ffwkk!a|cQ8xbYt&L*^y zr^dX($AS`xa+Tq^4U(=Ul>Dy;m42Sin@VXzD|Ks__R7r{H#aW_U6W=+5`E5=#7D~ zkeaf~x44mt&%l0~w~ur5FgAsYC9A>ea0S@$XTx%d+MgDXS<@|%)#41$sHZjc3J(?` z0??ckJe7j?hzSfkbXF6t{8u2w#q z{Epv5Q@8F-T1vHgw2|F$v*q|9N2{~_dQN*|X`7-6W>Q)`Ysp8Oqgo=&$5sBl0VLE) zlk@9s2~8zA88Jbc2oqtkd_X2{L*}D^`RX(SzHm>;(jvcvH?(-hhFLK-h9qiw+#0LB ztNH%gqR#C)790^}-4(J*vT91;n8-4B*wW|Y1*`W^T7ET<)#7?+UWo{%>%Q7WIoy+n!#Bv2xAz(bi)Vye%z zKWbOWXmhBg$|X&EkL zPHarW`{tT^hYfcHH)$P&-~RZ<uQeXG{dL2oDLGk)3DYBr>ZBBQu`1H;sAa0G zU(n7ivjVTfcwOX2%hT*Ebk-;a71jFh8JBfQIQDDdB{pHDajb8J8dVvm!q{d%xHfdsP(6g$1TeiizJmXwA7D zJ#fjd5fMBP5?e^YN2)+KKlFKoAtq-8nFXx5oLb8_sw{5ETdiaTy_-;F>aZWRq(RWInor=}pie>BMK{vrNnj(mO8dt%17zE4L@rE1n( zD!4Er0!?M4$W6-Yi6ExKi5oWAHs;fJV}vW^nTvfFHkRGD9l}RO5s`VcKP2z=2seJp zWbDXloCwA|RR!rOR#(lh=#vHqXntHRi`xaXit`Ei83g#;pg$*}tT`9 z+9~gfs+%i@S84PIW<4Q%%WuxztL9}&S=4$zHi#*OaGP8yeted?BKk@jpSu!t^z};l z?GP4=L|_efZ73z?aTJOWV3piNOxlX&{TKO}7rXHGvN>a5^A?xkYkyl7OR9}O#SU~2 z4YFBO5J0@_@G}Jg^v^)2%9xKqnV~Hekoz3e4Cg#ZuGnssd6JsV-&HegWi1A!lGRt8 z7=v9*S6H!botZxQ^IrsWc#@?&g~wW!(S1+Di*HyA_;L1VxCcdxHhn3|8B%Iee%<@h zx>Dwij`iRT6?x8soqj5unVGFsSexUUlzvd=A|h)`8QY_o%GDB#kz*P*!7r+hk^UJC zdj%9_SI}r?{Jw!biR!0C;8*Mx6Sizr2y8?dzg0I*%B|Y_PjOu(b*v_iXi5=L55b;| zY57x@Xl5HAYFfiJ@-1xx&ysz|#kI|2PO4=)Bjb@F!nhcwFO0473(EJn>EV;4Ek$)z zV^S5J6*d5T+GARLQgFceUUk==>Gfz%4;g{|&(Q!LSgr#%-;&qqE#caN{O(l@t0MX^ zm+*6A%Myn|nE0S?^<_UQTKgPbVX~@lVlBTW>A1G8Ks}vrmxSAEixIK&VBzUzwk)-iA*>YUrCo~lSO@RuLk6&n zgg5#E=%6QQ>}jo?glDe3&qa!C{#J{}ibn@i`_1nCNNKHSgAw+O{4*5^4c%5pZMK~y zK{ffo?)Nk7rSf=!)VAeQCtv-&NW^VN?)#@5HWns!_gKa)p$H#Zc(KWa&6A3=l&2zY zmDO{RiC72dpFr+-E!COem}U=UBO42rx{eQ8OBD_DbupTbjjbt05-QZ6bw?EAy2ONP zeec#St*r7(+f$=NtiOr2^zgC>7D_lads1)xl*p~&6lGh@SDBZDlH9**NJ2}9QPC0& zL6h&}hi8Od!??4=|1^laK!5Y@yVU1RD;-J)$?ms@)`g}AanKMvh<;J+9A#~q>XC;( zCvrbNIwaR+eqt2HQ?_t=Um)`=Z2##a3InW~>~_hys|n8(ACJfb1}!fHzYMSCB=<8ej^-Y5%9_ zH(Lu3wCA4yANyZ~8-JjK{er`7dbIzb^g`xcc+fpB4N! z*bpcK=Rd$h)*uMizaT`;=8h&HD3O~T2u$=3TM@t$;A!G$_nXP+51N3#n2dgX|9=J& zv9qxK1|;(E&{3XWJdFuxcPnpzkESq0w<-VX@>Q!rt097!28awF21MT_6%ay`fEbj5 zcuyJt26shu^*&-V*vYE0u0hF*%VW_=OWv!M&CH==tuc^yZ~1BErQ^))4EY6YZfNny zXKl|XYj36IO))i8WMA4Y`nxCz-NQsGp3m#|KXt!@T!)$6ZDXr3XfF&zZf>Uc({C7~ z5sNrg$1~54x`Ri9^Q*g~aD&k!8(gcu?bv((yt-il^lIsusA50`X>MM%AHLT z=0i*lWi7j$w4K$)Ya)I)R(a%FFGpTfMY1)CG)#zlMC9q&u1&Dr`7(F!q;E z=M-3|e7#G-fD5Dz@iysu^vG~9Lt0b`>vu_Lg2CKhqTWz^MIR0)?1eX^{POvS=rP6W zyIYj<@b+H3?jZNN-R}X_Sc9s+QLF;}hF&R>iC`(F~KI3txK4{vxTE<88ekl5&wTQiq>uC1OGt_VMrX~T(!Tv}v39;=UBsz3LrU(fV&2qa3_f#~|EXs|v(9gWXm@peb(<`U z`|OxtkCWPIaoM~v()Kk4pS$turmvdvg8D`7g}Ee~j|lFVF()?F&Mf+AfrHf3!{S=E zz{u8~S<=~Bs0EuoVHc|0gAB(wKaiPz6wAlMAyxlP$M)Mw<26I+&!o5#?j+>gYx2U8 zIdN$NA%z4IT@(`e6nh6Uq&3VLR~6&^IZrsPmRM0=KLJ%dw0zfwd(^jKK@YOaj20pADSwSD@+hIPuyI~Ti`VHHUxgk> z*Yb;|uad(JxmRR|Vg`x#00}Tnb5`t1k&g1+a(D=M`)xG*9nAzAsD@6<$}_w`<&C9f z{(O%U@I(iJ5lBtWOB`A7PZk9+P#IqpeaSbcY81C2@tf^Qmz}n9R~*~J*nPY?_YJd_ zbaSqpN<3e{3rt&mKXCG;GZz7e8?^V~S~w|Nv<08uwWp(GW4H0Js4LwgH%knC71%Zg1QP?k3+wZ0 zV1FAod+G?=0h7&D#M#bmX2juoWx2iw@|RndKQU}@bzXt3-qzS=Z`|8~Ip=Mho{=JA z>ktfb%njQ`)=@0pa@fWOD^S@P6@74RW`~*19&@Fq6%#^IQH|5CpHdoi!K*6J5&e?c zaOum=aihHth24p}^v!pkn`M?#<=kKC(3?5W$*0zXGeJ@tLJEAv_7gFhjEHilJjI>L zR2AhquqbibG1qDT^xX6sZH*O77H+Zj^EI zUxe2>Siw-i+6g*tgM`81U<=E^eN-YM4@%}RO-<3uPpL<6je6jAh2^4N-rH?9L&|Ni|E5Icme?-SD3Y)bY^sRI6Yi z>J2KGlF`2QI`(Sa6~+`B?zi2|!x7A+WM2^(oeMf99p{ISSIhEfgD`S_4? z*}ZTIR1a~J!C4z8W1)6>_1a2*EGFF<=X(tF0WR*N7o1jiEESDG-Iff;8*;oNWt*SH z=~6N@&8c>n+A1dgRds4?gyS{+1d=jqSXB2hN(XJz`R`XXn=*D%=;{2c*mr{AKV>OB z(IyfB-=@~Ric6F-h6Yv346>O@&u!5HQrc?u)(Q$YmS1;=mZ(Rc92ZP6Pgl0sEbH`? zs+xs+pql(2g_KFZc>5Fg#?MQfjHGELGplbrYS%G+vh9}VfIfFI!z~?B$D|2B8*r)J zWHHimpvhtPe6YK+<$g4&(P#Pkt`3OVdnL4m2I(r|#xK9MmxF0ikXtVi`pyxN5i+u6 z4qVp6NH}2SWTRnHyI47vcprmg)6=l935n(MQ42qm;cIVIg^Rw*)bR7%uw~GD<}>kI zcarDmpeW64;Y6knjj3X1$_}ufzveYWlEB^ZTRpnkr|>g+S6)ywfyqU-q<#uQi=x zbe7OuEt*kLdGqN(`labuxHosdz{J3Ji5$cyi?3Uv`YTP^TcKT|AW!(^`EmeRu zYJ>N&2VsDCo=W~UH(#uh?eGrsd;HWYHNB61j!lWG2(LoYPy_Mg0J5&XuU|b-^I%Y! zV1<3C>4#=^bQhr!4p%WJ4N#(((Nb>e9JZb&y+zABE=T}RlKNB0X9;7;g9|0noY=mG zJB0Oj^$J3nD#_CIT`V+3Y+3M4)3eHxKL&_#?DfPkOXZiiN6m&j;?La%a0{}yXRhj_ zb*keN%FnoLt6J4fJ@WeRxaspco*N^qlZNK7xK1g*Fyo)lQQ%Ty!}S_#=c*!!2vj9u z53Gq{okEx^C1EE)q9d!MA`*HoMnLqcG%k`5dm_jQx9emoRZr|~0YdZ&X{nTs1mPGH zG+WoL&KVjXOv7_U&%nMGq(2~g3%V`y7YI9fiEbMedH}V>OHnMuYDFw6)X#SaIWY(Q z<)q}Lxuz%yLV6RI?2G(K9dIb7x6nczUwt>y@4F4lbQR0M76d9}63Ht?sFxcU>Al{7 zDSU@yHSLjv?656KIi#tPIPvX6Q@3u%K9R+bXC%4Z|giDJP*VLi7dX3w6s`y z$;K6F7@?HN;=N;>h_+#E?}>)%c>al@)xu8;pd;f|MuRkTK=yk3Q4jaHoT$0mjsA+Z zYUtR>3U)Rr#%-b1ts>0~E!#5yk6G>-xD(F)dP=%?=vx(s|gML>|Go?IGvgvTWkct-~B){K*-n&G*%ycS2t0ck!U$GkE zCQB*F+3YtY7Cv?2fbM`ZvwrcNdXLvnVx53w@++52VlDW#E0UrF7UQ4a-_)Zs7X;A(ANx(@eCiT4+?Ne3tN@dZfne^ zSl>r6sWYCU5k_x*#4jWR6bt0jsk~Vg9SsX4AG!>5gv~3f_y|rYC*KroNmY`7TSpqs zq9grTO_|OPz5?{)^Hcm+er~;t&!nIAFNb=(vrGnPhQOW6Bofe;(t!3(`#d`Kdj7h- zpKIBiEHbn91b*0jZ%$Qx^&f2mSGNyr6fg7y_iXOp`}DZ;T-l##av7#1DA~f4OVbK- zj#p;Wfc-UF2Or}TE+)g9x3bG{Y!hKu=D5b$`<3P=+w60TX<7`E)2}Z>XER-R#${P` z{eBMH)F~o^=v)as`x%O#!k+Uw>81@9-IJBZ$4B+fNW@E{7ggR@sl7&`Zx%Rl z!pV-%?}ZDD_y8Bauc_KB7L|`rs>1#t?;m{P-lqR3*3*qUd zG(fzHsl)s!f|-|`SuU|i?#Wf;pmx0Kbd0iL**v>SrB`Xq zop(X+*e~S`gzyWvG)K^yV$j<-=?nnp5C)@g*mW(KHizXbZ9=1u!Y^s(Gkc#qx2791Bf$xGSfD=E za&3)4H!wh()0`)q4xEom56VeON5&uxUP6WnN~o$>bt)W>gVlCj6%jwlPw_(buzoESf?s71S;9I^WrUbq&qGkVj@-F!t(N-P$zi)(7;;W0loYHYs6#XN3W?NE<>>ydLsDy zM;YOkxOAN~ji_1c1@Y5iUOY0saLo6`rp8hxA<%76&V_G})LJy>vYSWwIk7~he36Cx zn(k_H{est4v=(4mx@Luah%rg!;O5nnEg>*FecSRUe`uO39|>UZH+*Fyva5CVpU%-# zrM1Y9Gc-gh*1b^hfSFh$7?0*^dcbki+nMFju&TYyLc{1e<4jKD`ly9p8-nSrUC#+c zP}q*1k9>yk?E>;OglB}Szl9m*Zfk7li=($JP0%hg9*pw0kJ;L19`A2D4fxt5O0OrU z61=ks^gag_MAmcB-Cg@L@yjrxhEl60o)vaNM>HzIMqZ6tK6{YQ^3NzOMDE=^mYhIf zh?K5e8SBxsQKvaZwYu(lU>`j=r9_sqbqstDpD;_JsL!|8=nkp6*^>)8>lCn6cXSe2 zTl{F!L^DcuY3qCN4L+T6Ew4AkrYlo5Y7~!cCSV4da70)=V*}5TEX8BU0*LRmF)~?G z7=SCDC-U4gI62g38QRc0PULfXdH(QZRHw_|=ajN6b;_WYLJ%rYCJ>wS#1Y99tKp1g zL%lvLD+g^T^;0p++l=(&k=z;YLzkqKw6si#q@87HsfDdvxnw8gyr!gCOQxU?lWX#L zmeAmMoo+JYYST1OV!rtR8fft~oxm8|1m9wQYbP%5yGG+X5*BVYQZBxuH|MbUFzvbV zdnZQk#E;&|H22|>gsc*}yB`ht>}^~N_~I=D=4Dz*s3WJ(DcQO(2Ms}_Lu9`{Jsm!C z2)YI(jlK*Scj;}Xci-BK6SU9bTU&Fv5&1?{7PN+^o~5%94vS8}C1oB;6u;rej{9;q zk<2-wcyL!Jw(ZHiU#DR;t4U}upH}N&^P#YFw;MyVNQq%ESsywczqY*2lAMB0%R+PE zz=79d57uk=2p>ArhLyeR-Qvxj|HY_Z0s#*pkpH$W2OPf(4ByO0u?pJloe_`tMpr3U zE6kUDE+sg2PI(>DMDutjLQMqC*~Cv%lY12KlA~!n4_dH^Svh+8uBn+feK<>u2)kN? zGAF3*GZhD$g2?b=!mtr4o{1fw%o2`3Od5MT)P>%0I20O#3O;Qo1Gx1Vj}Gbh8#4Pd z8V^m?B6hNxz z4+god)}M7?algm(d)~(i-ZoVW!of@oQ z6UA;4>*0baRu|Np}=Df{G{YHXtIi=Cts(uDxj3xA=hJAW|C8R_&x`qMqY`YLnU=mszRW$ zDI2avqlv9fR~JY`^tO0?xSzp}3+I#fL~^zZQ_&=Luz$g_i`Riyg3umiMBD?X9;B9D z8;mvM4itg{T;c6l;=R7&W9w5S%d=1BJH#Ic8H%cd0%!v&6ocrKGS`II4jas(s=11~ zy~E{di~hJXvq@P_1zikz43<(?i|hm+#xp~?CbUObL{$aJ8Mg-W+qPv;SM#tG%~a+p zstPCE@>b$XO-5jvJPm{D620LoKUxlaG_!eUI=!G2$|v;As)DG*;I30C26jd#zeu?K zZLMY_Njjq0OD}3sK`;4CF-s%cOhY{d`x|H+FtjHQVy{NM5r$TYgqv8xF?Pv*nR&+3 zsm`(|@T8xeA7R?|A!D{h#0alr1TX{u;4C{FdGelaAz6}y&}N+iCT9Kn54IAJ_wb0Z z75-O~*1iTnvty`RDO4&l=hZaU+;3e*jJr@7mnw`4?pw^~PDWX^8^d+_b&1PRwWDdu zELZOmtA$(DIJU%U=WuIY%h3vvTYhy1S=9-^dC2VI#}mp8FKtG9dUq zC5*oBp66`ti-R?Z5XK`KqTCSMf4RBiz3UQQl_%zLpYG@XY5ty{L5v{zM6Yu5_N6fY z1S{uT+j@iR*2a#NI@|=3^MvNmh(kt1^jKrE?z&klnXQp+sPqQ<7`Z}u)o5$d+zF!V z#F^LGPb#Kq1?<6o--S=nnlf~QVMG$&TwWE0*QmP&J02C!;cy0VrL0FwP&K=)Q_k$N zD$cmr_Yh*Qh9QLOw({<~MXWcFH4vKG-Q??aA+P&`47~DtC#eS^Nc9#|9}V{dBdeH+ z4Ts$~H;Q0W%u?M`dNex;-jYvJqQhq1b-UIFIR1P9Up~(eX{~bl6c`MDAGDR(R1n#G z9|oPOZQYdqkO2ufAeA$J7`^hr>FVv~2#*QZdhQ#vFQ0VsVeoQxsUv5;e{&)sz28W^#>N0GjsIXwMFl@W! zao~KnL$}UtWIM2;+K?z;2GQfdM#0PR z*YMvQBk?ACVlGYL%D+ZY+Kqi3pOnr`jd+7B_)aHk&k3T+I!BS?aKoFm4e{+ z+uqY#27V*!T5afA%*rC9P}tcm%H5?@Za2-SplnKsDRla>k+Y{>HCMsmAR#npS?@FN zpy0_ZJC3cSk*CDwFatgWG;4R17AHBzsucOroD6m{%ZTt%3?eBu+ppFe={(Yb&O+#9 zO&<{n47AEnBK3wZ77vq>61X-Z8T*Ubn{}GL{bZ1Np4oe`o`<#f&*k9Hv^s-iKcGBK z#v+@8ZB;w|LjK&6arVe+SUD{5gJ~}_w3P&|nD_qP4%tvHSG{A$ti7*!>jO4)+W{{r zsTUh;6kogIirWFk+D+Fv6n88a8iAh8~ZuC)=s4lo~ktABgjv^Waj&?hZbqwEs zH)g;3w3T*!)^n8pfq>6;nDF8?%42GG>UCvQ+({KCeyt!R@CoJ-|3&jt{qKQ;GcsA7C$&g*P)uH>VB)clduRyTXau_ZVw#c20U^keThWAjt;cOr3 zk)PU4Pi)r}7RCmnsvID+!Y;cjHEWGm{a!{QFuS-Pu4s2(scuP!M8sB85m1}#<|GDmrIe~aPqX#1#~shJiet22I!owNv$&D-bW)4%F1Eb_G4)_;d{OqR}he}>WcFAVVXd;(^CqdmwcWR zU-~>mFzwdRkmpKL<1oD&G$^PDVbDaU)EuxHKnc^H->9<=zpQE?Z?FCn8{~ywiX8$p1kU|5tqBKPlw@i^5SuR_34ljZDnU|K)b&;dcii z13(OvB!(tt7Ph>UXRY5TNi2+cDb-nJ8D;H-P0TGMJRMDxJ>^u4Jgtm4jVby0;Cc8B zKnWX6=-mzM=}j%HL6o3QBp_l(INRA-TUj`h02w$LnCO|9=}1f+LG+()c8*pgObl$4peh}W zO}Ugni6;K65cG|g(%jkEo(lkQb8};GV`i{(Gy^bka&iI~fdC+o9;89<Ge>U_h(%=`7I>^yZ@~dG3Lpv8|UP>1i z3u7)rW*{f00jCK)v!Nj;Jrk2DJ3WXYn30}^os|>F$i!^IVa)o^=IsB{&EMJs-2gSn z3>pW}6&EOzhOvv0i6bwixPlCcxVfE^^PlaLa5AtmQUd<*@BeT03N$zWeiT3x`j27Y z0qJnbg1FF4Jw!lxK=^=+Kqh)d4tgL^1<1_B$jk*~*5U#DHzm-#gGvcInt)3DA4>g2 z=`W@1992LM0-u?qovA5_E9kNMHU3NtKp+FlpN;)d>>pY@fL}B7mofR@9wh^NS=s-2 zoNR1wpvXUbIFOSLp_RJa^{j0C9@E6K;N4~gwRWXv3F>>$?Y-(*b8jK6Yz{4N6mf3cPQCSzn|;s6cE?=m1K zD~LAyHyNm1_Wxd%i52*3L;Fn+$jJnP;QcORV&V9ebmezF7IqNh+3zwY7SL-;8TVr1v|TmL{^{+k{%>)*=)IoSR-28HbY XT#{H+0xn35Er8jMOI6j?-;E0Z=M_3C diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive-formats.5.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive-formats.5.pdf deleted file mode 100644 index b4f1b57845e3ad0f92afdf73ee435c99b79c62d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42891 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive.3.pdf deleted file mode 100644 index 6450684b53fd3423ae72a8431008206f30ba5318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31661 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 diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive_changes.3.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/libarchive_changes.3.pdf deleted file mode 100644 index 566bd8d1ffd776bb14bf19a3335df9bd3bb8f09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35697 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 Yu~E#v$?B#(4DkPkd~kE~?&ECm3jaRX%m4rY diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/mtree.5.pdf b/src/dependencies/libarchive-3.5.2/doc/pdf/mtree.5.pdf deleted file mode 100644 index 13b63f0330991d27d8f0a905c1c27cb66da9e7ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32505 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 diff --git a/src/dependencies/libarchive-3.5.2/test_utils/test_utils.c b/src/dependencies/libarchive-3.5.2/test_utils/test_utils.c deleted file mode 100644 index 8ea3d3c..0000000 --- a/src/dependencies/libarchive-3.5.2/test_utils/test_utils.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2003-2012 Tim Kientzle - * Copyright (c) 2012 Andres Mejia - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "test_utils.h" - -#include -#include - -/* Filter tests against a glob pattern. Returns non-zero if test matches - * pattern, zero otherwise. A '^' at the beginning of the pattern negates - * the return values (i.e. returns zero for a match, non-zero otherwise. - */ -static int -test_filter(const char *pattern, const char *test) -{ - int retval = 0; - int negate = 0; - const char *p = pattern; - const char *t = test; - - if (p[0] == '^') - { - negate = 1; - p++; - } - - while (1) - { - if (p[0] == '\\') - p++; - else if (p[0] == '*') - { - while (p[0] == '*') - p++; - if (p[0] == '\\') - p++; - if ((t = strchr(t, p[0])) == 0) - break; - } - if (p[0] != t[0]) - break; - if (p[0] == '\0') { - retval = 1; - break; - } - p++; - t++; - } - - return (negate) ? !retval : retval; -} - -int get_test_set(int *test_set, int limit, const char *test, - struct test_list_t *tests) -{ - int start, end; - int idx = 0; - - if (test == NULL) { - /* Default: Run all tests. */ - for (;idx < limit; idx++) - test_set[idx] = idx; - return (limit); - } - if (*test >= '0' && *test <= '9') { - const char *vp = test; - start = 0; - while (*vp >= '0' && *vp <= '9') { - start *= 10; - start += *vp - '0'; - ++vp; - } - if (*vp == '\0') { - end = start; - } else if (*vp == '-') { - ++vp; - if (*vp == '\0') { - end = limit - 1; - } else { - end = 0; - while (*vp >= '0' && *vp <= '9') { - end *= 10; - end += *vp - '0'; - ++vp; - } - } - } else - return (-1); - if (start < 0 || end >= limit || start > end) - return (-1); - while (start <= end) - test_set[idx++] = start++; - } else { - for (start = 0; start < limit; ++start) { - const char *name = tests[start].name; - if (test_filter(test, name)) - test_set[idx++] = start; - } - } - return ((idx == 0)?-1:idx); -} diff --git a/src/dependencies/libarchive-3.5.2/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/CMakeLists.txt similarity index 95% rename from src/dependencies/libarchive-3.5.2/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/CMakeLists.txt index 9a1aeb2..713e3bc 100644 --- a/src/dependencies/libarchive-3.5.2/CMakeLists.txt +++ b/src/dependencies/libarchive-3.6.2/CMakeLists.txt @@ -1,5 +1,8 @@ # CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR) +if(POLICY CMP0065) + cmake_policy(SET CMP0065 NEW) #3.4 don't use `-rdynamic` with executables +endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) #3.12.0 `find_package()`` uses ``_ROOT`` variables. endif() @@ -96,24 +99,8 @@ endif () # Especially for early development, we want to be a little # aggressive about diagnosing build problems; this can get # relaxed somewhat in final shipping versions. -IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$") - SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security") - ################################################################# - # Set compile flags for all build types. - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security") - if (ENABLE_WERROR) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") - endif () - ################################################################# - # Set compile flags for debug build. - # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug" - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual") -ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$") -IF (CMAKE_C_COMPILER_ID MATCHES "^Clang$") +IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR + CMAKE_C_COMPILER_ID MATCHES "^Clang$") SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security") ################################################################# # Set compile flags for all build types. @@ -130,7 +117,26 @@ IF (CMAKE_C_COMPILER_ID MATCHES "^Clang$") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual") -ENDIF (CMAKE_C_COMPILER_ID MATCHES "^Clang$") + # Ideally this will be a compile/link time check, yet there's no obvious way + # how considering how old our minimum required cmake version is. The official + # cmake.org side does not host the manual pages even. Normally we can use + # either of the following two, yet neither is supported as of 3.0.2 + # - check_linker_flag - does not exist + # - try_compile - does not support linker flags + # + # The CI fails with this on MacOS + IF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") + # Place the functions and data into separate sections, allowing the linker + # to garbage collect the unused ones. + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections") + # Printing the discarded section is "too much", so enable on demand. + #SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") + #SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") + ENDIF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") +ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR + CMAKE_C_COMPILER_ID MATCHES "^Clang$") IF (CMAKE_C_COMPILER_ID MATCHES "^XL$") SET(CMAKE_C_COMPILER "xlc_r") SET(CMAKE_REQUIRED_FLAGS "-qflag=e:e -qformat=sec") @@ -207,7 +213,7 @@ OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON) OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON) OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON) OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON) -OPTION(ENABLE_LibGCC "Enable the use of the system LibGCC library if found" ON) +OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON) # CNG is used for encrypt/decrypt Zip archives on Windows. OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON) @@ -226,7 +232,7 @@ OPTION(ENABLE_INSTALL "Enable installing of libraries" ON) SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support") SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)") -SET(WINDOWS_VERSION "WIN7" CACHE STRING "Set Windows version to use (Windows only)") +SET(WINDOWS_VERSION "WIN10" CACHE STRING "Set Windows version to use (Windows only)") IF(ENABLE_COVERAGE) include(LibarchiveCodeCoverage) @@ -237,7 +243,11 @@ IF(ENABLE_TEST) ENDIF(ENABLE_TEST) IF(WIN32) - IF(WINDOWS_VERSION STREQUAL "WIN8") + IF(WINDOWS_VERSION STREQUAL "WIN10") + SET(NTDDI_VERSION 0x0A000000) + SET(_WIN32_WINNT 0x0A00) + SET(WINVER 0x0A00) + ELSEIF(WINDOWS_VERSION STREQUAL "WIN8") SET(NTDDI_VERSION 0x06020000) SET(_WIN32_WINNT 0x0602) SET(WINVER 0x0602) @@ -261,12 +271,12 @@ IF(WIN32) SET(NTDDI_VERSION 0x05010000) SET(_WIN32_WINNT 0x0501) SET(WINVER 0x0501) - ELSE(WINDOWS_VERSION STREQUAL "WIN8") + ELSE(WINDOWS_VERSION STREQUAL "WIN10") # Default to Windows Server 2003 API if we don't recognize the specifier SET(NTDDI_VERSION 0x05020000) SET(_WIN32_WINNT 0x0502) SET(WINVER 0x0502) - ENDIF(WINDOWS_VERSION STREQUAL "WIN8") + ENDIF(WINDOWS_VERSION STREQUAL "WIN10") ENDIF(WIN32) IF(MSVC) @@ -604,8 +614,13 @@ IF(ENABLE_ZSTD) SET(ZSTD_FIND_QUIETLY TRUE) ENDIF (ZSTD_INCLUDE_DIR) - FIND_PATH(ZSTD_INCLUDE_DIR zstd.h) - FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd) + IF(UNIX) + FIND_PACKAGE(PkgConfig QUIET) + PKG_SEARCH_MODULE(PC_ZSTD libzstd) + ENDIF() + + FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS}) + FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS}) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR) ELSE(ENABLE_ZSTD) @@ -618,10 +633,8 @@ IF(ZSTD_FOUND) CMAKE_PUSH_CHECK_STATE() SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY}) SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR}) - #CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD) - # rpi-imager: cannot check since static lib is not build yet - SET(HAVE_LIBZSTD 1) - + CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD) + CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD_COMPRESSOR) # # TODO: test for static library. # @@ -1251,9 +1264,10 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$" # # If requested, try finding library for PCREPOSIX # - IF(ENABLE_LibGCC) - FIND_PACKAGE(LibGCC) + IF(ENABLE_LIBGCC) + FIND_PACKAGE(LIBGCC) ELSE() + MESSAGE(FATAL_ERROR "libgcc not found.") SET(LIBGCC_FOUND FALSE) # Override cached value ENDIF() IF(ENABLE_PCREPOSIX) @@ -1551,15 +1565,15 @@ CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec # Check for integer types # # -CHECK_TYPE_SIZE("short" SIZE_OF_SHORT) -CHECK_TYPE_SIZE("int" SIZE_OF_INT) -CHECK_TYPE_SIZE("long" SIZE_OF_LONG) -CHECK_TYPE_SIZE("long long" SIZE_OF_LONG_LONG) +CHECK_TYPE_SIZE("short" SIZEOF_SHORT) +CHECK_TYPE_SIZE("int" SIZEOF_INT) +CHECK_TYPE_SIZE("long" SIZEOF_LONG) +CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG) -CHECK_TYPE_SIZE("unsigned short" SIZE_OF_UNSIGNED_SHORT) -CHECK_TYPE_SIZE("unsigned" SIZE_OF_UNSIGNED) -CHECK_TYPE_SIZE("unsigned long" SIZE_OF_UNSIGNED_LONG) -CHECK_TYPE_SIZE("unsigned long long" SIZE_OF_UNSIGNED_LONG_LONG) +CHECK_TYPE_SIZE("unsigned short" SIZEOF_UNSIGNED_SHORT) +CHECK_TYPE_SIZE("unsigned" SIZEOF_UNSIGNED) +CHECK_TYPE_SIZE("unsigned long" SIZEOF_UNSIGNED_LONG) +CHECK_TYPE_SIZE("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG) CHECK_TYPE_SIZE("__int64" __INT64) CHECK_TYPE_SIZE("unsigned __int64" UNSIGNED___INT64) @@ -2020,6 +2034,17 @@ CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD) CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512") +# Check visibility annotations +SET(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") +SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror") +CHECK_C_SOURCE_COMPILES("void __attribute__((visibility(\"default\"))) foo(void); +int main() { return 0; }" HAVE_VISIBILITY_ATTR) +IF (HAVE_VISIBILITY_ATTR) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") + ADD_DEFINITIONS(-D__LIBARCHIVE_ENABLE_VISIBILITY) +ENDIF(HAVE_VISIBILITY_ATTR) +SET(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}") + # Generate "config.h" from "build/cmake/config.h.in" CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) diff --git a/src/dependencies/libarchive-3.5.2/COPYING b/src/dependencies/libarchive-3.6.2/COPYING similarity index 100% rename from src/dependencies/libarchive-3.5.2/COPYING rename to src/dependencies/libarchive-3.6.2/COPYING diff --git a/src/dependencies/libarchive-3.5.2/INSTALL b/src/dependencies/libarchive-3.6.2/INSTALL similarity index 100% rename from src/dependencies/libarchive-3.5.2/INSTALL rename to src/dependencies/libarchive-3.6.2/INSTALL diff --git a/src/dependencies/libarchive-3.5.2/Makefile.am b/src/dependencies/libarchive-3.6.2/Makefile.am similarity index 98% rename from src/dependencies/libarchive-3.5.2/Makefile.am rename to src/dependencies/libarchive-3.6.2/Makefile.am index c93a82e..3fd2fdb 100644 --- a/src/dependencies/libarchive-3.5.2/Makefile.am +++ b/src/dependencies/libarchive-3.6.2/Makefile.am @@ -284,7 +284,7 @@ endif # -no-undefined marks that libarchive doesn't rely on symbols # defined in the application. This is mandatory for cygwin. -libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) +libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(GC_SECTIONS) libarchive_la_LIBADD= $(LTLIBICONV) # Manpages to install @@ -414,6 +414,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_compat_solaris_tar_acl.c \ libarchive/test/test_compat_solaris_pax_sparse.c \ libarchive/test/test_compat_star_acl.c \ + libarchive/test/test_compat_tar_directory.c \ libarchive/test/test_compat_tar_hardlink.c \ libarchive/test/test_compat_uudecode.c \ libarchive/test/test_compat_uudecode_large.c \ @@ -502,6 +503,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_rar_encryption_data.c \ libarchive/test/test_read_format_rar_encryption_partially.c \ libarchive/test/test_read_format_rar_encryption_header.c \ + libarchive/test/test_read_format_rar_filter.c \ libarchive/test/test_read_format_rar_invalid1.c \ libarchive/test/test_read_format_rar5.c \ libarchive/test/test_read_format_raw.c \ @@ -511,6 +513,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_tar_empty_filename.c \ libarchive/test/test_read_format_tar_empty_with_gnulabel.c \ libarchive/test/test_read_format_tar_filename.c \ + libarchive/test/test_read_format_tar_invalid_pax_size.c \ libarchive/test/test_read_format_tbz.c \ libarchive/test/test_read_format_tgz.c \ libarchive/test/test_read_format_tlz.c \ @@ -625,6 +628,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_write_format_xar_empty.c \ libarchive/test/test_write_format_zip.c \ libarchive/test/test_write_format_zip_compression_store.c \ + libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_empty.c \ libarchive/test/test_write_format_zip_empty_zip64.c \ libarchive/test/test_write_format_zip_file.c \ @@ -695,6 +699,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_compat_solaris_tar_acl.tar.uu \ libarchive/test/test_compat_star_acl_nfs4.tar.uu \ libarchive/test/test_compat_star_acl_posix1e.tar.uu \ + libarchive/test/test_compat_tar_directory_1.tar.uu \ libarchive/test/test_compat_tar_hardlink_1.tar.uu \ libarchive/test/test_compat_uudecode_large.tar.Z.uu \ libarchive/test/test_compat_xz_1.txz.uu \ @@ -835,6 +840,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_rar_encryption_data.rar.uu \ libarchive/test/test_read_format_rar_encryption_header.rar.uu \ libarchive/test/test_read_format_rar_encryption_partially.rar.uu \ + libarchive/test/test_read_format_rar_filter.rar.uu \ libarchive/test/test_read_format_rar_invalid1.rar.uu \ libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu \ libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu \ @@ -878,6 +884,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu \ libarchive/test/test_read_format_rar5_owner.rar.uu \ libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu \ + libarchive/test/test_read_format_rar5_sfx.exe.uu \ libarchive/test/test_read_format_rar5_solid.rar.uu \ libarchive/test/test_read_format_rar5_stored.rar.uu \ libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu \ @@ -887,6 +894,9 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_rar5_arm_filter_on_window_boundary.rar.uu \ libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu \ libarchive/test/test_read_format_rar5_block_size_is_too_small.rar.uu \ + libarchive/test/test_read_format_rar5_decode_number_out_of_bounds_read.rar.uu \ + libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu \ + libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu \ libarchive/test/test_read_format_raw.bufr.uu \ libarchive/test/test_read_format_raw.data.gz.uu \ libarchive/test/test_read_format_raw.data.Z.uu \ @@ -896,6 +906,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu \ libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu \ libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu \ + libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu \ libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu \ @@ -950,6 +961,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_zip_xz_multi.zipx.uu \ libarchive/test/test_read_format_zip_zip64a.zip.uu \ libarchive/test/test_read_format_zip_zip64b.zip.uu \ + libarchive/test/test_read_format_zip_zstd.zipx.uu \ + libarchive/test/test_read_format_zip_zstd_multi.zipx.uu \ libarchive/test/test_read_large_splitted_rar_aa.uu \ libarchive/test/test_read_large_splitted_rar_ab.uu \ libarchive/test/test_read_large_splitted_rar_ac.uu \ @@ -1020,7 +1033,7 @@ endif bsdtar_LDADD= libarchive.la libarchive_fe.la $(LTLIBICONV) bsdtar_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdtar_ccstatic) $(PLATFORMCPPFLAGS) -bsdtar_LDFLAGS= $(bsdtar_ldstatic) +bsdtar_LDFLAGS= $(bsdtar_ldstatic) $(GC_SECTIONS) bsdtar_EXTRA_DIST= \ tar/bsdtar.1 \ @@ -1081,6 +1094,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_fflags.c \ tar/test/test_option_gid_gname.c \ tar/test/test_option_grzip.c \ + tar/test/test_option_ignore_zeros.c \ tar/test/test_option_j.c \ tar/test/test_option_k.c \ tar/test/test_option_keep_newer_files.c \ @@ -1185,7 +1199,7 @@ endif bsdcpio_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcpio_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcpio_ccstatic) $(PLATFORMCPPFLAGS) -bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) +bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) $(GC_SECTIONS) bsdcpio_EXTRA_DIST= \ cpio/bsdcpio.1 \ @@ -1339,7 +1353,7 @@ endif bsdcat_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcat_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcat_ccstatic) $(PLATFORMCPPFLAGS) -bsdcat_LDFLAGS= $(bsdcat_ldstatic) +bsdcat_LDFLAGS= $(bsdcat_ldstatic) $(GC_SECTIONS) bsdcat_EXTRA_DIST= \ cat/bsdcat.1 \ diff --git a/src/dependencies/libarchive-3.5.2/Makefile.in b/src/dependencies/libarchive-3.6.2/Makefile.in similarity index 99% rename from src/dependencies/libarchive-3.5.2/Makefile.in rename to src/dependencies/libarchive-3.6.2/Makefile.in index ba651eb..be13f91 100644 --- a/src/dependencies/libarchive-3.5.2/Makefile.in +++ b/src/dependencies/libarchive-3.6.2/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -136,6 +136,7 @@ am__aclocal_m4_deps = \ $(top_srcdir)/build/autoconf/lib-ld.m4 \ $(top_srcdir)/build/autoconf/lib-link.m4 \ $(top_srcdir)/build/autoconf/lib-prefix.m4 \ + $(top_srcdir)/build/autoconf/m4_ax_compile_check_sizeof.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) @@ -623,6 +624,7 @@ am_bsdtar_test_OBJECTS = $(am__objects_12) \ tar/test/bsdtar_test-test_option_fflags.$(OBJEXT) \ tar/test/bsdtar_test-test_option_gid_gname.$(OBJEXT) \ tar/test/bsdtar_test-test_option_grzip.$(OBJEXT) \ + tar/test/bsdtar_test-test_option_ignore_zeros.$(OBJEXT) \ tar/test/bsdtar_test-test_option_j.$(OBJEXT) \ tar/test/bsdtar_test-test_option_k.$(OBJEXT) \ tar/test/bsdtar_test-test_option_keep_newer_files.$(OBJEXT) \ @@ -858,6 +860,7 @@ am__libarchive_test_SOURCES_DIST = libarchive/archive_acl.c \ libarchive/test/test_compat_solaris_tar_acl.c \ libarchive/test/test_compat_solaris_pax_sparse.c \ libarchive/test/test_compat_star_acl.c \ + libarchive/test/test_compat_tar_directory.c \ libarchive/test/test_compat_tar_hardlink.c \ libarchive/test/test_compat_uudecode.c \ libarchive/test/test_compat_uudecode_large.c \ @@ -946,6 +949,7 @@ am__libarchive_test_SOURCES_DIST = libarchive/archive_acl.c \ libarchive/test/test_read_format_rar_encryption_data.c \ libarchive/test/test_read_format_rar_encryption_partially.c \ libarchive/test/test_read_format_rar_encryption_header.c \ + libarchive/test/test_read_format_rar_filter.c \ libarchive/test/test_read_format_rar_invalid1.c \ libarchive/test/test_read_format_rar5.c \ libarchive/test/test_read_format_raw.c \ @@ -955,6 +959,7 @@ am__libarchive_test_SOURCES_DIST = libarchive/archive_acl.c \ libarchive/test/test_read_format_tar_empty_filename.c \ libarchive/test/test_read_format_tar_empty_with_gnulabel.c \ libarchive/test/test_read_format_tar_filename.c \ + libarchive/test/test_read_format_tar_invalid_pax_size.c \ libarchive/test/test_read_format_tbz.c \ libarchive/test/test_read_format_tgz.c \ libarchive/test/test_read_format_tlz.c \ @@ -1069,6 +1074,7 @@ am__libarchive_test_SOURCES_DIST = libarchive/archive_acl.c \ libarchive/test/test_write_format_xar_empty.c \ libarchive/test/test_write_format_zip.c \ libarchive/test/test_write_format_zip_compression_store.c \ + libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_empty.c \ libarchive/test/test_write_format_zip_empty_zip64.c \ libarchive/test/test_write_format_zip_file.c \ @@ -1270,6 +1276,7 @@ am_libarchive_test_OBJECTS = $(am__objects_19) $(am__objects_20) \ libarchive/test/test-test_compat_solaris_tar_acl.$(OBJEXT) \ libarchive/test/test-test_compat_solaris_pax_sparse.$(OBJEXT) \ libarchive/test/test-test_compat_star_acl.$(OBJEXT) \ + libarchive/test/test-test_compat_tar_directory.$(OBJEXT) \ libarchive/test/test-test_compat_tar_hardlink.$(OBJEXT) \ libarchive/test/test-test_compat_uudecode.$(OBJEXT) \ libarchive/test/test-test_compat_uudecode_large.$(OBJEXT) \ @@ -1358,6 +1365,7 @@ am_libarchive_test_OBJECTS = $(am__objects_19) $(am__objects_20) \ libarchive/test/test-test_read_format_rar_encryption_data.$(OBJEXT) \ libarchive/test/test-test_read_format_rar_encryption_partially.$(OBJEXT) \ libarchive/test/test-test_read_format_rar_encryption_header.$(OBJEXT) \ + libarchive/test/test-test_read_format_rar_filter.$(OBJEXT) \ libarchive/test/test-test_read_format_rar_invalid1.$(OBJEXT) \ libarchive/test/test-test_read_format_rar5.$(OBJEXT) \ libarchive/test/test-test_read_format_raw.$(OBJEXT) \ @@ -1367,6 +1375,7 @@ am_libarchive_test_OBJECTS = $(am__objects_19) $(am__objects_20) \ libarchive/test/test-test_read_format_tar_empty_filename.$(OBJEXT) \ libarchive/test/test-test_read_format_tar_empty_with_gnulabel.$(OBJEXT) \ libarchive/test/test-test_read_format_tar_filename.$(OBJEXT) \ + libarchive/test/test-test_read_format_tar_invalid_pax_size.$(OBJEXT) \ libarchive/test/test-test_read_format_tbz.$(OBJEXT) \ libarchive/test/test-test_read_format_tgz.$(OBJEXT) \ libarchive/test/test-test_read_format_tlz.$(OBJEXT) \ @@ -1481,6 +1490,7 @@ am_libarchive_test_OBJECTS = $(am__objects_19) $(am__objects_20) \ libarchive/test/test-test_write_format_xar_empty.$(OBJEXT) \ libarchive/test/test-test_write_format_zip.$(OBJEXT) \ libarchive/test/test-test_write_format_zip_compression_store.$(OBJEXT) \ + libarchive/test/test-test_write_format_zip_entry_size_unset.$(OBJEXT) \ libarchive/test/test-test_write_format_zip_empty.$(OBJEXT) \ libarchive/test/test-test_write_format_zip_empty_zip64.$(OBJEXT) \ libarchive/test/test-test_write_format_zip_file.$(OBJEXT) \ @@ -1897,6 +1907,7 @@ am__depfiles_remade = cat/$(DEPDIR)/bsdcat-bsdcat.Po \ libarchive/test/$(DEPDIR)/test-test_compat_solaris_pax_sparse.Po \ libarchive/test/$(DEPDIR)/test-test_compat_solaris_tar_acl.Po \ libarchive/test/$(DEPDIR)/test-test_compat_star_acl.Po \ + libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po \ libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Po \ libarchive/test/$(DEPDIR)/test-test_compat_uudecode.Po \ libarchive/test/$(DEPDIR)/test-test_compat_uudecode_large.Po \ @@ -1986,6 +1997,7 @@ am__depfiles_remade = cat/$(DEPDIR)/bsdcat-bsdcat.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_data.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_header.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_partially.Po \ + libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_raw.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tar.Po \ @@ -1994,6 +2006,7 @@ am__depfiles_remade = cat/$(DEPDIR)/bsdcat-bsdcat.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_pax.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_with_gnulabel.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tar_filename.Po \ + libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tgz.Po \ libarchive/test/$(DEPDIR)/test-test_read_format_tlz.Po \ @@ -2110,6 +2123,7 @@ am__depfiles_remade = cat/$(DEPDIR)/bsdcat-bsdcat.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_compression_store.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty_zip64.Po \ + libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_file.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_file_zip64.Po \ libarchive/test/$(DEPDIR)/test-test_write_format_zip_large.Po \ @@ -2163,6 +2177,7 @@ am__depfiles_remade = cat/$(DEPDIR)/bsdcat-bsdcat.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_fflags.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_gid_gname.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_grzip.Po \ + tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_k.Po \ tar/test/$(DEPDIR)/bsdtar_test-test_option_keep_newer_files.Po \ @@ -2240,8 +2255,8 @@ NROFF = nroff MANS = $(man_MANS) DATA = $(pkgconfig_DATA) HEADERS = $(include_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)config.h.in +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. @@ -2258,9 +2273,6 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope check recheck am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ @@ -2417,6 +2429,7 @@ am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test @@ -2449,10 +2462,11 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/build/autoconf/missing \ $(top_srcdir)/build/autoconf/test-driver \ $(top_srcdir)/build/pkgconfig/libarchive.pc.in COPYING INSTALL \ - NEWS build/autoconf/compile build/autoconf/config.guess \ - build/autoconf/config.rpath build/autoconf/config.sub \ - build/autoconf/depcomp build/autoconf/install-sh \ - build/autoconf/ltmain.sh build/autoconf/missing + NEWS README.md build/autoconf/compile \ + build/autoconf/config.guess build/autoconf/config.rpath \ + build/autoconf/config.sub build/autoconf/depcomp \ + build/autoconf/install-sh build/autoconf/ltmain.sh \ + build/autoconf/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -2466,6 +2480,8 @@ am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.xz $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-xz dist-gzip dist-zip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -2488,6 +2504,8 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -2498,8 +2516,10 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +GC_SECTIONS = @GC_SECTIONS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ @@ -2513,6 +2533,7 @@ LIBARCHIVE_VERSION_STRING = @LIBARCHIVE_VERSION_STRING@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ +LIBSREQUIRED = @LIBSREQUIRED@ LIBTOOL = @LIBTOOL@ LIBXML2_PC_CFLAGS = @LIBXML2_PC_CFLAGS@ LIBXML2_PC_LIBS = @LIBXML2_PC_LIBS@ @@ -2802,7 +2823,7 @@ libarchive_la_SOURCES = libarchive/archive_acl.c \ # -no-undefined marks that libarchive doesn't rely on symbols # defined in the application. This is mandatory for cygwin. -libarchive_la_LDFLAGS = -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) +libarchive_la_LDFLAGS = -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(GC_SECTIONS) libarchive_la_LIBADD = $(LTLIBICONV) # Manpages to install @@ -2935,6 +2956,7 @@ libarchive_test_SOURCES = \ libarchive/test/test_compat_solaris_tar_acl.c \ libarchive/test/test_compat_solaris_pax_sparse.c \ libarchive/test/test_compat_star_acl.c \ + libarchive/test/test_compat_tar_directory.c \ libarchive/test/test_compat_tar_hardlink.c \ libarchive/test/test_compat_uudecode.c \ libarchive/test/test_compat_uudecode_large.c \ @@ -3023,6 +3045,7 @@ libarchive_test_SOURCES = \ libarchive/test/test_read_format_rar_encryption_data.c \ libarchive/test/test_read_format_rar_encryption_partially.c \ libarchive/test/test_read_format_rar_encryption_header.c \ + libarchive/test/test_read_format_rar_filter.c \ libarchive/test/test_read_format_rar_invalid1.c \ libarchive/test/test_read_format_rar5.c \ libarchive/test/test_read_format_raw.c \ @@ -3032,6 +3055,7 @@ libarchive_test_SOURCES = \ libarchive/test/test_read_format_tar_empty_filename.c \ libarchive/test/test_read_format_tar_empty_with_gnulabel.c \ libarchive/test/test_read_format_tar_filename.c \ + libarchive/test/test_read_format_tar_invalid_pax_size.c \ libarchive/test/test_read_format_tbz.c \ libarchive/test/test_read_format_tgz.c \ libarchive/test/test_read_format_tlz.c \ @@ -3146,6 +3170,7 @@ libarchive_test_SOURCES = \ libarchive/test/test_write_format_xar_empty.c \ libarchive/test/test_write_format_zip.c \ libarchive/test/test_write_format_zip_compression_store.c \ + libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_empty.c \ libarchive/test/test_write_format_zip_empty_zip64.c \ libarchive/test/test_write_format_zip_file.c \ @@ -3207,6 +3232,7 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_compat_solaris_tar_acl.tar.uu \ libarchive/test/test_compat_star_acl_nfs4.tar.uu \ libarchive/test/test_compat_star_acl_posix1e.tar.uu \ + libarchive/test/test_compat_tar_directory_1.tar.uu \ libarchive/test/test_compat_tar_hardlink_1.tar.uu \ libarchive/test/test_compat_uudecode_large.tar.Z.uu \ libarchive/test/test_compat_xz_1.txz.uu \ @@ -3347,6 +3373,7 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_read_format_rar_encryption_data.rar.uu \ libarchive/test/test_read_format_rar_encryption_header.rar.uu \ libarchive/test/test_read_format_rar_encryption_partially.rar.uu \ + libarchive/test/test_read_format_rar_filter.rar.uu \ libarchive/test/test_read_format_rar_invalid1.rar.uu \ libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu \ libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu \ @@ -3390,6 +3417,7 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu \ libarchive/test/test_read_format_rar5_owner.rar.uu \ libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu \ + libarchive/test/test_read_format_rar5_sfx.exe.uu \ libarchive/test/test_read_format_rar5_solid.rar.uu \ libarchive/test/test_read_format_rar5_stored.rar.uu \ libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu \ @@ -3399,6 +3427,9 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_read_format_rar5_arm_filter_on_window_boundary.rar.uu \ libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu \ libarchive/test/test_read_format_rar5_block_size_is_too_small.rar.uu \ + libarchive/test/test_read_format_rar5_decode_number_out_of_bounds_read.rar.uu \ + libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu \ + libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu \ libarchive/test/test_read_format_raw.bufr.uu \ libarchive/test/test_read_format_raw.data.gz.uu \ libarchive/test/test_read_format_raw.data.Z.uu \ @@ -3408,6 +3439,7 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu \ libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu \ libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu \ + libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu \ libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu \ @@ -3462,6 +3494,8 @@ libarchive_test_EXTRA_DIST = \ libarchive/test/test_read_format_zip_xz_multi.zipx.uu \ libarchive/test/test_read_format_zip_zip64a.zip.uu \ libarchive/test/test_read_format_zip_zip64b.zip.uu \ + libarchive/test/test_read_format_zip_zstd.zipx.uu \ + libarchive/test/test_read_format_zip_zstd_multi.zipx.uu \ libarchive/test/test_read_large_splitted_rar_aa.uu \ libarchive/test/test_read_large_splitted_rar_ab.uu \ libarchive/test/test_read_large_splitted_rar_ac.uu \ @@ -3513,7 +3547,7 @@ bsdtar_DEPENDENCIES = libarchive.la libarchive_fe.la @STATIC_BSDTAR_TRUE@bsdtar_ccstatic = -DLIBARCHIVE_STATIC bsdtar_LDADD = libarchive.la libarchive_fe.la $(LTLIBICONV) bsdtar_CPPFLAGS = -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdtar_ccstatic) $(PLATFORMCPPFLAGS) -bsdtar_LDFLAGS = $(bsdtar_ldstatic) +bsdtar_LDFLAGS = $(bsdtar_ldstatic) $(GC_SECTIONS) bsdtar_EXTRA_DIST = \ tar/bsdtar.1 \ tar/bsdtar_windows.h \ @@ -3568,6 +3602,7 @@ bsdtar_test_SOURCES = \ tar/test/test_option_fflags.c \ tar/test/test_option_gid_gname.c \ tar/test/test_option_grzip.c \ + tar/test/test_option_ignore_zeros.c \ tar/test/test_option_j.c \ tar/test/test_option_k.c \ tar/test/test_option_keep_newer_files.c \ @@ -3647,7 +3682,7 @@ bsdcpio_DEPENDENCIES = libarchive.la libarchive_fe.la @STATIC_BSDCPIO_TRUE@bsdcpio_ccstatic = -DLIBARCHIVE_STATIC bsdcpio_LDADD = libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcpio_CPPFLAGS = -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcpio_ccstatic) $(PLATFORMCPPFLAGS) -bsdcpio_LDFLAGS = $(bsdcpio_ldstatic) +bsdcpio_LDFLAGS = $(bsdcpio_ldstatic) $(GC_SECTIONS) bsdcpio_EXTRA_DIST = \ cpio/bsdcpio.1 \ cpio/cpio_windows.h \ @@ -3774,7 +3809,7 @@ bsdcat_DEPENDENCIES = libarchive.la libarchive_fe.la @STATIC_BSDCAT_TRUE@bsdcat_ccstatic = -DLIBARCHIVE_STATIC bsdcat_LDADD = libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcat_CPPFLAGS = -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcat_ccstatic) $(PLATFORMCPPFLAGS) -bsdcat_LDFLAGS = $(bsdcat_ldstatic) +bsdcat_LDFLAGS = $(bsdcat_ldstatic) $(GC_SECTIONS) bsdcat_EXTRA_DIST = \ cat/bsdcat.1 \ cat/CMakeLists.txt @@ -4662,6 +4697,8 @@ tar/test/bsdtar_test-test_option_gid_gname.$(OBJEXT): \ tar/test/$(am__dirstamp) tar/test/$(DEPDIR)/$(am__dirstamp) tar/test/bsdtar_test-test_option_grzip.$(OBJEXT): \ tar/test/$(am__dirstamp) tar/test/$(DEPDIR)/$(am__dirstamp) +tar/test/bsdtar_test-test_option_ignore_zeros.$(OBJEXT): \ + tar/test/$(am__dirstamp) tar/test/$(DEPDIR)/$(am__dirstamp) tar/test/bsdtar_test-test_option_j.$(OBJEXT): \ tar/test/$(am__dirstamp) tar/test/$(DEPDIR)/$(am__dirstamp) tar/test/bsdtar_test-test_option_k.$(OBJEXT): \ @@ -5274,6 +5311,9 @@ libarchive/test/test-test_compat_solaris_pax_sparse.$(OBJEXT): \ libarchive/test/test-test_compat_star_acl.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) +libarchive/test/test-test_compat_tar_directory.$(OBJEXT): \ + libarchive/test/$(am__dirstamp) \ + libarchive/test/$(DEPDIR)/$(am__dirstamp) libarchive/test/test-test_compat_tar_hardlink.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) @@ -5538,6 +5578,9 @@ libarchive/test/test-test_read_format_rar_encryption_partially.$(OBJEXT): \ libarchive/test/test-test_read_format_rar_encryption_header.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) +libarchive/test/test-test_read_format_rar_filter.$(OBJEXT): \ + libarchive/test/$(am__dirstamp) \ + libarchive/test/$(DEPDIR)/$(am__dirstamp) libarchive/test/test-test_read_format_rar_invalid1.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) @@ -5565,6 +5608,9 @@ libarchive/test/test-test_read_format_tar_empty_with_gnulabel.$(OBJEXT): \ libarchive/test/test-test_read_format_tar_filename.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) +libarchive/test/test-test_read_format_tar_invalid_pax_size.$(OBJEXT): \ + libarchive/test/$(am__dirstamp) \ + libarchive/test/$(DEPDIR)/$(am__dirstamp) libarchive/test/test-test_read_format_tbz.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) @@ -5907,6 +5953,9 @@ libarchive/test/test-test_write_format_zip.$(OBJEXT): \ libarchive/test/test-test_write_format_zip_compression_store.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) +libarchive/test/test-test_write_format_zip_entry_size_unset.$(OBJEXT): \ + libarchive/test/$(am__dirstamp) \ + libarchive/test/$(DEPDIR)/$(am__dirstamp) libarchive/test/test-test_write_format_zip_empty.$(OBJEXT): \ libarchive/test/$(am__dirstamp) \ libarchive/test/$(DEPDIR)/$(am__dirstamp) @@ -6349,6 +6398,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_solaris_pax_sparse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_solaris_tar_acl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_star_acl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_uudecode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_compat_uudecode_large.Po@am__quote@ # am--include-marker @@ -6438,6 +6488,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_header.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_partially.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_raw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tar.Po@am__quote@ # am--include-marker @@ -6446,6 +6497,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_pax.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_with_gnulabel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tar_filename.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tgz.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_read_format_tlz.Po@am__quote@ # am--include-marker @@ -6562,6 +6614,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_compression_store.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty_zip64.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_file_zip64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libarchive/test/$(DEPDIR)/test-test_write_format_zip_large.Po@am__quote@ # am--include-marker @@ -6617,6 +6670,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_fflags.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_gid_gname.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_grzip.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_k.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tar/test/$(DEPDIR)/bsdtar_test-test_option_keep_newer_files.Po@am__quote@ # am--include-marker @@ -8414,6 +8468,20 @@ tar/test/bsdtar_test-test_option_grzip.obj: tar/test/test_option_grzip.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tar/test/bsdtar_test-test_option_grzip.obj `if test -f 'tar/test/test_option_grzip.c'; then $(CYGPATH_W) 'tar/test/test_option_grzip.c'; else $(CYGPATH_W) '$(srcdir)/tar/test/test_option_grzip.c'; fi` +tar/test/bsdtar_test-test_option_ignore_zeros.o: tar/test/test_option_ignore_zeros.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tar/test/bsdtar_test-test_option_ignore_zeros.o -MD -MP -MF tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Tpo -c -o tar/test/bsdtar_test-test_option_ignore_zeros.o `test -f 'tar/test/test_option_ignore_zeros.c' || echo '$(srcdir)/'`tar/test/test_option_ignore_zeros.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Tpo tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tar/test/test_option_ignore_zeros.c' object='tar/test/bsdtar_test-test_option_ignore_zeros.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tar/test/bsdtar_test-test_option_ignore_zeros.o `test -f 'tar/test/test_option_ignore_zeros.c' || echo '$(srcdir)/'`tar/test/test_option_ignore_zeros.c + +tar/test/bsdtar_test-test_option_ignore_zeros.obj: tar/test/test_option_ignore_zeros.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tar/test/bsdtar_test-test_option_ignore_zeros.obj -MD -MP -MF tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Tpo -c -o tar/test/bsdtar_test-test_option_ignore_zeros.obj `if test -f 'tar/test/test_option_ignore_zeros.c'; then $(CYGPATH_W) 'tar/test/test_option_ignore_zeros.c'; else $(CYGPATH_W) '$(srcdir)/tar/test/test_option_ignore_zeros.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Tpo tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tar/test/test_option_ignore_zeros.c' object='tar/test/bsdtar_test-test_option_ignore_zeros.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tar/test/bsdtar_test-test_option_ignore_zeros.obj `if test -f 'tar/test/test_option_ignore_zeros.c'; then $(CYGPATH_W) 'tar/test/test_option_ignore_zeros.c'; else $(CYGPATH_W) '$(srcdir)/tar/test/test_option_ignore_zeros.c'; fi` + tar/test/bsdtar_test-test_option_j.o: tar/test/test_option_j.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bsdtar_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tar/test/bsdtar_test-test_option_j.o -MD -MP -MF tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Tpo -c -o tar/test/bsdtar_test-test_option_j.o `test -f 'tar/test/test_option_j.c' || echo '$(srcdir)/'`tar/test/test_option_j.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Tpo tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Po @@ -11452,6 +11520,20 @@ libarchive/test/test-test_compat_star_acl.obj: libarchive/test/test_compat_star_ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_compat_star_acl.obj `if test -f 'libarchive/test/test_compat_star_acl.c'; then $(CYGPATH_W) 'libarchive/test/test_compat_star_acl.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_compat_star_acl.c'; fi` +libarchive/test/test-test_compat_tar_directory.o: libarchive/test/test_compat_tar_directory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_compat_tar_directory.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Tpo -c -o libarchive/test/test-test_compat_tar_directory.o `test -f 'libarchive/test/test_compat_tar_directory.c' || echo '$(srcdir)/'`libarchive/test/test_compat_tar_directory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Tpo libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_compat_tar_directory.c' object='libarchive/test/test-test_compat_tar_directory.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_compat_tar_directory.o `test -f 'libarchive/test/test_compat_tar_directory.c' || echo '$(srcdir)/'`libarchive/test/test_compat_tar_directory.c + +libarchive/test/test-test_compat_tar_directory.obj: libarchive/test/test_compat_tar_directory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_compat_tar_directory.obj -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Tpo -c -o libarchive/test/test-test_compat_tar_directory.obj `if test -f 'libarchive/test/test_compat_tar_directory.c'; then $(CYGPATH_W) 'libarchive/test/test_compat_tar_directory.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_compat_tar_directory.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Tpo libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_compat_tar_directory.c' object='libarchive/test/test-test_compat_tar_directory.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_compat_tar_directory.obj `if test -f 'libarchive/test/test_compat_tar_directory.c'; then $(CYGPATH_W) 'libarchive/test/test_compat_tar_directory.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_compat_tar_directory.c'; fi` + libarchive/test/test-test_compat_tar_hardlink.o: libarchive/test/test_compat_tar_hardlink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_compat_tar_hardlink.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Tpo -c -o libarchive/test/test-test_compat_tar_hardlink.o `test -f 'libarchive/test/test_compat_tar_hardlink.c' || echo '$(srcdir)/'`libarchive/test/test_compat_tar_hardlink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Tpo libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Po @@ -12684,6 +12766,20 @@ libarchive/test/test-test_read_format_rar_encryption_header.obj: libarchive/test @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_rar_encryption_header.obj `if test -f 'libarchive/test/test_read_format_rar_encryption_header.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_rar_encryption_header.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_rar_encryption_header.c'; fi` +libarchive/test/test-test_read_format_rar_filter.o: libarchive/test/test_read_format_rar_filter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_rar_filter.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Tpo -c -o libarchive/test/test-test_read_format_rar_filter.o `test -f 'libarchive/test/test_read_format_rar_filter.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_rar_filter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_read_format_rar_filter.c' object='libarchive/test/test-test_read_format_rar_filter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_rar_filter.o `test -f 'libarchive/test/test_read_format_rar_filter.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_rar_filter.c + +libarchive/test/test-test_read_format_rar_filter.obj: libarchive/test/test_read_format_rar_filter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_rar_filter.obj -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Tpo -c -o libarchive/test/test-test_read_format_rar_filter.obj `if test -f 'libarchive/test/test_read_format_rar_filter.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_rar_filter.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_rar_filter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_read_format_rar_filter.c' object='libarchive/test/test-test_read_format_rar_filter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_rar_filter.obj `if test -f 'libarchive/test/test_read_format_rar_filter.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_rar_filter.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_rar_filter.c'; fi` + libarchive/test/test-test_read_format_rar_invalid1.o: libarchive/test/test_read_format_rar_invalid1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_rar_invalid1.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Tpo -c -o libarchive/test/test-test_read_format_rar_invalid1.o `test -f 'libarchive/test/test_read_format_rar_invalid1.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_rar_invalid1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Po @@ -12810,6 +12906,20 @@ libarchive/test/test-test_read_format_tar_filename.obj: libarchive/test/test_rea @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_tar_filename.obj `if test -f 'libarchive/test/test_read_format_tar_filename.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_tar_filename.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_tar_filename.c'; fi` +libarchive/test/test-test_read_format_tar_invalid_pax_size.o: libarchive/test/test_read_format_tar_invalid_pax_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_tar_invalid_pax_size.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Tpo -c -o libarchive/test/test-test_read_format_tar_invalid_pax_size.o `test -f 'libarchive/test/test_read_format_tar_invalid_pax_size.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_tar_invalid_pax_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_read_format_tar_invalid_pax_size.c' object='libarchive/test/test-test_read_format_tar_invalid_pax_size.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_tar_invalid_pax_size.o `test -f 'libarchive/test/test_read_format_tar_invalid_pax_size.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_tar_invalid_pax_size.c + +libarchive/test/test-test_read_format_tar_invalid_pax_size.obj: libarchive/test/test_read_format_tar_invalid_pax_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_tar_invalid_pax_size.obj -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Tpo -c -o libarchive/test/test-test_read_format_tar_invalid_pax_size.obj `if test -f 'libarchive/test/test_read_format_tar_invalid_pax_size.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_tar_invalid_pax_size.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_tar_invalid_pax_size.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_read_format_tar_invalid_pax_size.c' object='libarchive/test/test-test_read_format_tar_invalid_pax_size.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_read_format_tar_invalid_pax_size.obj `if test -f 'libarchive/test/test_read_format_tar_invalid_pax_size.c'; then $(CYGPATH_W) 'libarchive/test/test_read_format_tar_invalid_pax_size.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_read_format_tar_invalid_pax_size.c'; fi` + libarchive/test/test-test_read_format_tbz.o: libarchive/test/test_read_format_tbz.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_read_format_tbz.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Tpo -c -o libarchive/test/test-test_read_format_tbz.o `test -f 'libarchive/test/test_read_format_tbz.c' || echo '$(srcdir)/'`libarchive/test/test_read_format_tbz.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Tpo libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Po @@ -14406,6 +14516,20 @@ libarchive/test/test-test_write_format_zip_compression_store.obj: libarchive/tes @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_write_format_zip_compression_store.obj `if test -f 'libarchive/test/test_write_format_zip_compression_store.c'; then $(CYGPATH_W) 'libarchive/test/test_write_format_zip_compression_store.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_write_format_zip_compression_store.c'; fi` +libarchive/test/test-test_write_format_zip_entry_size_unset.o: libarchive/test/test_write_format_zip_entry_size_unset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_write_format_zip_entry_size_unset.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Tpo -c -o libarchive/test/test-test_write_format_zip_entry_size_unset.o `test -f 'libarchive/test/test_write_format_zip_entry_size_unset.c' || echo '$(srcdir)/'`libarchive/test/test_write_format_zip_entry_size_unset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Tpo libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_write_format_zip_entry_size_unset.c' object='libarchive/test/test-test_write_format_zip_entry_size_unset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_write_format_zip_entry_size_unset.o `test -f 'libarchive/test/test_write_format_zip_entry_size_unset.c' || echo '$(srcdir)/'`libarchive/test/test_write_format_zip_entry_size_unset.c + +libarchive/test/test-test_write_format_zip_entry_size_unset.obj: libarchive/test/test_write_format_zip_entry_size_unset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_write_format_zip_entry_size_unset.obj -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Tpo -c -o libarchive/test/test-test_write_format_zip_entry_size_unset.obj `if test -f 'libarchive/test/test_write_format_zip_entry_size_unset.c'; then $(CYGPATH_W) 'libarchive/test/test_write_format_zip_entry_size_unset.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_write_format_zip_entry_size_unset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Tpo libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libarchive/test/test_write_format_zip_entry_size_unset.c' object='libarchive/test/test-test_write_format_zip_entry_size_unset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libarchive/test/test-test_write_format_zip_entry_size_unset.obj `if test -f 'libarchive/test/test_write_format_zip_entry_size_unset.c'; then $(CYGPATH_W) 'libarchive/test/test_write_format_zip_entry_size_unset.c'; else $(CYGPATH_W) '$(srcdir)/libarchive/test/test_write_format_zip_entry_size_unset.c'; fi` + libarchive/test/test-test_write_format_zip_empty.o: libarchive/test/test_write_format_zip_empty.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libarchive_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libarchive/test/test-test_write_format_zip_empty.o -MD -MP -MF libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Tpo -c -o libarchive/test/test-test_write_format_zip_empty.o `test -f 'libarchive/test/test_write_format_zip_empty.c' || echo '$(srcdir)/'`libarchive/test/test_write_format_zip_empty.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Tpo libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Po @@ -14894,7 +15018,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ @@ -14970,7 +15094,6 @@ bsdcat_test.log: bsdcat_test$(EXEEXT) @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -15031,6 +15154,10 @@ dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @@ -15072,6 +15199,8 @@ distcheck: dist eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) @@ -15087,7 +15216,7 @@ distcheck: dist $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -15147,13 +15276,16 @@ all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(DATA) $(HEADERS) \ config.h install-binPROGRAMS: install-libLTLIBRARIES +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -15604,6 +15736,7 @@ distclean: distclean-am -rm -f libarchive/test/$(DEPDIR)/test-test_compat_solaris_pax_sparse.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_solaris_tar_acl.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_star_acl.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_uudecode.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_uudecode_large.Po @@ -15693,6 +15826,7 @@ distclean: distclean-am -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_data.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_header.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_partially.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_raw.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar.Po @@ -15701,6 +15835,7 @@ distclean: distclean-am -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_pax.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_with_gnulabel.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_filename.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tgz.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tlz.Po @@ -15817,6 +15952,7 @@ distclean: distclean-am -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_compression_store.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty_zip64.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_file.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_file_zip64.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_large.Po @@ -15872,6 +16008,7 @@ distclean: distclean-am -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_fflags.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_gid_gname.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_grzip.Po + -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_k.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_keep_newer_files.Po @@ -16346,6 +16483,7 @@ maintainer-clean: maintainer-clean-am -rm -f libarchive/test/$(DEPDIR)/test-test_compat_solaris_pax_sparse.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_solaris_tar_acl.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_star_acl.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_compat_tar_directory.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_tar_hardlink.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_uudecode.Po -rm -f libarchive/test/$(DEPDIR)/test-test_compat_uudecode_large.Po @@ -16435,6 +16573,7 @@ maintainer-clean: maintainer-clean-am -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_data.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_header.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_encryption_partially.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_filter.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_rar_invalid1.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_raw.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar.Po @@ -16443,6 +16582,7 @@ maintainer-clean: maintainer-clean-am -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_pax.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_empty_with_gnulabel.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_filename.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tar_invalid_pax_size.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tbz.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tgz.Po -rm -f libarchive/test/$(DEPDIR)/test-test_read_format_tlz.Po @@ -16559,6 +16699,7 @@ maintainer-clean: maintainer-clean-am -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_compression_store.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_empty_zip64.Po + -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_entry_size_unset.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_file.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_file_zip64.Po -rm -f libarchive/test/$(DEPDIR)/test-test_write_format_zip_large.Po @@ -16614,6 +16755,7 @@ maintainer-clean: maintainer-clean-am -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_fflags.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_gid_gname.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_grzip.Po + -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_ignore_zeros.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_j.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_k.Po -rm -f tar/test/$(DEPDIR)/bsdtar_test-test_option_keep_newer_files.Po @@ -16672,7 +16814,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ uninstall-man: uninstall-man1 uninstall-man3 uninstall-man5 -.MAKE: all check check-am install install-am install-strip +.MAKE: all check check-am install install-am install-exec \ + install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS \ @@ -16680,7 +16823,7 @@ uninstall-man: uninstall-man1 uninstall-man3 uninstall-man5 clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ - dist-zip distcheck distclean distclean-compile \ + dist-zip dist-zstd distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ distclean-local distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ diff --git a/src/dependencies/libarchive-3.5.2/NEWS b/src/dependencies/libarchive-3.6.2/NEWS similarity index 99% rename from src/dependencies/libarchive-3.5.2/NEWS rename to src/dependencies/libarchive-3.6.2/NEWS index 0964106..d632448 100644 --- a/src/dependencies/libarchive-3.5.2/NEWS +++ b/src/dependencies/libarchive-3.6.2/NEWS @@ -1,3 +1,11 @@ +Wed 07, 2022: libarchive 3.6.2 released + +Apr 08, 2022: libarchive 3.6.1 released + +Feb 09, 2022: libarchive 3.6.0 released + +Feb 08, 2022: libarchive 3.5.3 released + Aug 22, 2021: libarchive 3.5.2 released Dec 26, 2020: libarchive 3.5.1 released diff --git a/src/dependencies/libarchive-3.5.2/README.md b/src/dependencies/libarchive-3.6.2/README.md similarity index 99% rename from src/dependencies/libarchive-3.5.2/README.md rename to src/dependencies/libarchive-3.6.2/README.md index d5ef70c..4040762 100644 --- a/src/dependencies/libarchive-3.5.2/README.md +++ b/src/dependencies/libarchive-3.6.2/README.md @@ -37,6 +37,7 @@ The top-level directory contains the following information files: * **configure** - configuration script, see INSTALL for details. If your copy of the source lacks a `configure` script, you can try to construct it by running the script in `build/autogen.sh` (or use `cmake`). The following files in the top-level directory are used by the 'configure' script: + * `Makefile.am`, `aclocal.m4`, `configure.ac` - used to build this distribution, only needed by maintainers * `Makefile.in`, `config.h.in` - templates used by configure script @@ -71,6 +72,7 @@ know about any errors or omissions you find. ## Supported Formats Currently, the library automatically detects and reads the following formats: + * Old V7 tar archives * POSIX ustar * GNU tar format (including GNU long filenames, long link names, and sparse files) @@ -92,6 +94,7 @@ Currently, the library automatically detects and reads the following formats: * XAR archives The library also detects and handles any of the following before evaluating the archive: + * uuencoded files * files with RPM wrapper * gzip compression @@ -103,6 +106,7 @@ The library also detects and handles any of the following before evaluating the * zstandard compression The library can create archives in any of the following formats: + * POSIX ustar * POSIX pax interchange format * "restricted" pax format, which will create ustar archives except for @@ -122,6 +126,7 @@ The library can create archives in any of the following formats: * XAR archives When creating archives, the result can be filtered with any of the following: + * uuencode * gzip compression * bzip2 compression diff --git a/src/dependencies/libarchive-3.5.2/aclocal.m4 b/src/dependencies/libarchive-3.6.2/aclocal.m4 similarity index 99% rename from src/dependencies/libarchive-3.5.2/aclocal.m4 rename to src/dependencies/libarchive-3.6.2/aclocal.m4 index e35d2fb..14646f7 100644 --- a/src/dependencies/libarchive-3.5.2/aclocal.m4 +++ b/src/dependencies/libarchive-3.6.2/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) @@ -1085,11 +1085,11 @@ _LT_EOF # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + 10.0,*86*-darwin8*|10.0,*-darwin[[912]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) + 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; @@ -9074,9 +9074,9 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) -dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) -dnl +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) + dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl @@ -9117,7 +9117,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) +[m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -9218,7 +9218,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $1]) +AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -9228,11 +9228,11 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -9249,7 +9249,7 @@ installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full @@ -9350,7 +9350,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR -# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9365,7 +9365,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.1], [], +m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -9381,14 +9381,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.1])dnl +[AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9440,7 +9440,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9471,7 +9471,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9662,7 +9662,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9701,7 +9701,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi @@ -9728,7 +9730,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9756,6 +9758,10 @@ m4_defn([AC_PROG_CC]) # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -9792,7 +9798,7 @@ m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl @@ -9844,6 +9850,20 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This @@ -9925,7 +9945,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9946,7 +9966,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9968,7 +9988,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10003,7 +10023,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10046,7 +10066,7 @@ AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10067,12 +10087,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then @@ -10085,7 +10100,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10114,7 +10129,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10161,7 +10176,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10180,7 +10195,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10261,7 +10276,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10321,7 +10336,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10349,7 +10364,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10368,7 +10383,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10509,3 +10524,4 @@ m4_include([build/autoconf/la_uid_t.m4]) m4_include([build/autoconf/lib-ld.m4]) m4_include([build/autoconf/lib-link.m4]) m4_include([build/autoconf/lib-prefix.m4]) +m4_include([build/autoconf/m4_ax_compile_check_sizeof.m4]) diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/ax_append_compile_flags.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/ax_append_compile_flags.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/ax_append_compile_flags.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/ax_append_compile_flags.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/ax_append_flag.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/ax_append_flag.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/ax_append_flag.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/ax_append_flag.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/ax_check_compile_flag.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/ax_check_compile_flag.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/ax_check_compile_flag.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/ax_check_compile_flag.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/ax_require_defined.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/ax_require_defined.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/ax_require_defined.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/ax_require_defined.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/check_stdcall_func.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/check_stdcall_func.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/check_stdcall_func.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/check_stdcall_func.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/compile b/src/dependencies/libarchive-3.6.2/build/autoconf/compile similarity index 98% rename from src/dependencies/libarchive-3.5.2/build/autoconf/compile rename to src/dependencies/libarchive-3.6.2/build/autoconf/compile index 99e5052..df363c8 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/compile +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/compile @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -53,7 +53,7 @@ func_file_conv () MINGW*) file_conv=mingw ;; - CYGWIN*) + CYGWIN* | MSYS*) file_conv=cygwin ;; *) @@ -67,7 +67,7 @@ func_file_conv () mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; - cygwin/*) + cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/config.guess b/src/dependencies/libarchive-3.6.2/build/autoconf/config.guess similarity index 54% rename from src/dependencies/libarchive-3.5.2/build/autoconf/config.guess rename to src/dependencies/libarchive-3.6.2/build/autoconf/config.guess index f50dcdb..7f76b62 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/config.guess +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/config.guess @@ -1,12 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2022 Free Software Foundation, Inc. -timestamp='2018-02-24' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -27,11 +29,19 @@ timestamp='2018-02-24' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ @@ -50,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,7 +94,8 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 +# Just in case it came from the environment. +GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires @@ -96,73 +107,90 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > "$dummy.c" ; - for c in cc gcc c89 c99 ; do - if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "$UNAME_SYSTEM" in +case $UNAME_SYSTEM in Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu + LIBC=unknown - eval "$set_cc_for_build" + set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc - #else + #elif defined(__GLIBC__) LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -174,12 +202,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; @@ -188,18 +216,18 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown + machine=${arch}${endian}-unknown ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval "$set_cc_for_build" + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -215,7 +243,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ;; esac # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` @@ -226,7 +254,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; @@ -237,45 +265,57 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; + GUESS=$UNAME_MACHINE-unknown-redox + ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -289,7 +329,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") @@ -326,117 +366,121 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval "$set_cc_for_build" + set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in + case `/bin/arch` in sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -446,43 +490,43 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ @@ -508,78 +552,79 @@ EOF dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux"$UNAME_RELEASE" + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux"$UNAME_RELEASE" + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include @@ -593,16 +638,16 @@ EOF EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then @@ -610,57 +655,57 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; + GUESS=rs6000-ibm-aix + ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in + case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in + case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then - eval "$set_cc_for_build" + if test "$HP_ARCH" = ""; then + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE @@ -698,9 +743,9 @@ EOF test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if test "$HP_ARCH" = hppa2.0w then - eval "$set_cc_for_build" + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -719,14 +764,14 @@ EOF HP_ARCH=hppa64 fi fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int @@ -754,36 +799,36 @@ EOF EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo "$UNAME_MACHINE"-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -791,17 +836,18 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ @@ -809,103 +855,129 @@ EOF -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case "$UNAME_PROCESSOR" in + case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case "$UNAME_MACHINE" in + case $UNAME_MACHINE in x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" - exit ;; - i*86:Minix:*:*) - echo "$UNAME_MACHINE"-pc-minix - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -916,187 +988,225 @@ EOF esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" - test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; + GUESS=or1k-unknown-linux-$LIBC + ;; or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64le-unknown-linux-$LIBC + ;; ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - if objdump -f /bin/sh | grep -q elf32-x86-64; then - echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 - else - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi fi - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1104,12 +1214,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1119,11 +1229,11 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about @@ -1131,31 +1241,31 @@ EOF # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1180,249 +1290,404 @@ EOF /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv"$UNAME_RELEASE" + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; + GUESS=x86_64-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval "$set_cc_for_build" - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build fi - if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; + GUESS=i386-pc-qnx + ;; NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = 386; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; - i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + echo "$0: unable to guess system type" >&2 -case "$UNAME_MACHINE:$UNAME_SYSTEM" in +case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2022 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/depcomp b/src/dependencies/libarchive-3.6.2/build/autoconf/depcomp similarity index 99% rename from src/dependencies/libarchive-3.5.2/build/autoconf/depcomp rename to src/dependencies/libarchive-3.6.2/build/autoconf/depcomp index 65cbf70..715e343 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/depcomp +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/depcomp @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/iconv.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/iconv.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/iconv.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/iconv.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/install-sh b/src/dependencies/libarchive-3.6.2/build/autoconf/install-sh similarity index 79% rename from src/dependencies/libarchive-3.5.2/build/autoconf/install-sh rename to src/dependencies/libarchive-3.6.2/build/autoconf/install-sh index 8175c64..ec298b5 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/install-sh +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -99,18 +104,28 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,8 +152,13 @@ while test $# -ne 0; do -o) chowncmd="$chownprog $2" shift;; + -p) cpprog="$cpprog -p";; + -s) stripcmd=$stripprog;; + -S) backupsuffix="$2" + shift;; + -t) is_target_a_directory=always dst_arg=$2 @@ -255,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -301,22 +325,6 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -326,52 +334,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # Note that $RANDOM variable is not portable (e.g. dash); Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p' feature. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -382,7 +387,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -411,7 +416,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 @@ -451,7 +456,18 @@ do trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -477,6 +493,13 @@ do then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -491,9 +514,9 @@ do # file should still install successfully. { test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || + $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/la_uid_t.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/la_uid_t.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/la_uid_t.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/la_uid_t.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/lib-ld.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/lib-ld.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/lib-ld.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/lib-ld.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/lib-link.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/lib-link.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/lib-link.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/lib-link.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/lib-prefix.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/lib-prefix.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autoconf/lib-prefix.m4 rename to src/dependencies/libarchive-3.6.2/build/autoconf/lib-prefix.m4 diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/ltmain.sh b/src/dependencies/libarchive-3.6.2/build/autoconf/ltmain.sh old mode 100644 new mode 100755 similarity index 99% rename from src/dependencies/libarchive-3.5.2/build/autoconf/ltmain.sh rename to src/dependencies/libarchive-3.6.2/build/autoconf/ltmain.sh index 0cb7f90..540a92a --- a/src/dependencies/libarchive-3.5.2/build/autoconf/ltmain.sh +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-14" +VERSION="2.4.6 Debian-2.4.6-15build2" package_revision=2.4.6 @@ -2141,7 +2141,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.6-14 + version: $progname $scriptversion Debian-2.4.6-15build2 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/src/dependencies/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 b/src/dependencies/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 new file mode 100644 index 0000000..f834df6 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 @@ -0,0 +1,115 @@ +# ============================================================================ +# https://www.gnu.org/software/autoconf-archive/ax_compile_check_sizeof.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_COMPILE_CHECK_SIZEOF(TYPE [, HEADERS [, EXTRA_SIZES...]]) +# +# DESCRIPTION +# +# This macro checks for the size of TYPE using compile checks, not run +# checks. You can supply extra HEADERS to look into. the check will cycle +# through 1 2 4 8 16 and any EXTRA_SIZES the user supplies. If a match is +# found, it will #define SIZEOF_`TYPE' to that value. Otherwise it will +# emit a configure time error indicating the size of the type could not be +# determined. +# +# The trick is that C will not allow duplicate case labels. While this is +# valid C code: +# +# switch (0) case 0: case 1:; +# +# The following is not: +# +# switch (0) case 0: case 0:; +# +# Thus, the AC_COMPILE_IFELSE will fail if the currently tried size does +# not match. +# +# Here is an example skeleton configure.in script, demonstrating the +# macro's usage: +# +# AC_PROG_CC +# AC_CHECK_HEADERS(stddef.h unistd.h) +# AC_TYPE_SIZE_T +# AC_CHECK_TYPE(ssize_t, int) +# +# headers='#ifdef HAVE_STDDEF_H +# #include +# #endif +# #ifdef HAVE_UNISTD_H +# #include +# #endif +# ' +# +# AX_COMPILE_CHECK_SIZEOF(char) +# AX_COMPILE_CHECK_SIZEOF(short) +# AX_COMPILE_CHECK_SIZEOF(int) +# AX_COMPILE_CHECK_SIZEOF(long) +# AX_COMPILE_CHECK_SIZEOF(unsigned char *) +# AX_COMPILE_CHECK_SIZEOF(void *) +# AX_COMPILE_CHECK_SIZEOF(size_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(ssize_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(ptrdiff_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(off_t, $headers) +# +# LICENSE +# +# Copyright (c) 2008 Kaveh Ghazi +# Copyright (c) 2017 Reini Urban +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AU_ALIAS([AC_COMPILE_CHECK_SIZEOF], [AX_COMPILE_CHECK_SIZEOF]) +AC_DEFUN([AX_COMPILE_CHECK_SIZEOF], +[changequote(<<, >>)dnl +dnl The name to #define. +define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +dnl The cache variable name. +define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl +changequote([, ])dnl +AC_MSG_CHECKING(size of $1) +AC_CACHE_VAL(AC_CV_NAME, +[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence. + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +$2 +]], [[switch (0) case 0: case (sizeof ($1) == $ac_size):;]])], [AC_CV_NAME=$ac_size]) + if test x$AC_CV_NAME != x ; then break; fi +done +]) +if test x$AC_CV_NAME = x ; then + AC_MSG_ERROR([cannot determine a size for $1]) +fi +AC_MSG_RESULT($AC_CV_NAME) +AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) +undefine([AC_TYPE_NAME])dnl +undefine([AC_CV_NAME])dnl +]) diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/missing b/src/dependencies/libarchive-3.6.2/build/autoconf/missing similarity index 99% rename from src/dependencies/libarchive-3.5.2/build/autoconf/missing rename to src/dependencies/libarchive-3.6.2/build/autoconf/missing index 625aeb1..1fe1611 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/missing +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/missing @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify diff --git a/src/dependencies/libarchive-3.5.2/build/autoconf/test-driver b/src/dependencies/libarchive-3.6.2/build/autoconf/test-driver similarity index 88% rename from src/dependencies/libarchive-3.5.2/build/autoconf/test-driver rename to src/dependencies/libarchive-3.6.2/build/autoconf/test-driver index b8521a4..be73b80 100755 --- a/src/dependencies/libarchive-3.5.2/build/autoconf/test-driver +++ b/src/dependencies/libarchive-3.6.2/build/autoconf/test-driver @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,11 +42,13 @@ print_usage () { cat <$log_file 2>&1 +# Test script is run here. We create the file first, then append to it, +# to ameliorate tests themselves also writing to the log file. Our tests +# don't, but others can (automake bug#35762). +: >"$log_file" +"$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then @@ -126,7 +131,7 @@ esac # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). -echo "$res $test_name (exit status: $estatus)" >>$log_file +echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" diff --git a/src/dependencies/libarchive-3.5.2/build/autogen.sh b/src/dependencies/libarchive-3.6.2/build/autogen.sh similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/autogen.sh rename to src/dependencies/libarchive-3.6.2/build/autogen.sh diff --git a/src/dependencies/libarchive-3.5.2/build/bump-version.sh b/src/dependencies/libarchive-3.6.2/build/bump-version.sh similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/bump-version.sh rename to src/dependencies/libarchive-3.6.2/build/bump-version.sh diff --git a/src/dependencies/libarchive-3.5.2/build/clean.sh b/src/dependencies/libarchive-3.6.2/build/clean.sh similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/clean.sh rename to src/dependencies/libarchive-3.6.2/build/clean.sh diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckFileOffsetBits.c b/src/dependencies/libarchive-3.6.2/build/cmake/CheckFileOffsetBits.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckFileOffsetBits.c rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckFileOffsetBits.c diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckFileOffsetBits.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/CheckFileOffsetBits.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckFileOffsetBits.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckFileOffsetBits.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckFuncs.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/CheckFuncs.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckFuncs.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckFuncs.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckFuncs_stub.c.in b/src/dependencies/libarchive-3.6.2/build/cmake/CheckFuncs_stub.c.in similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckFuncs_stub.c.in rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckFuncs_stub.c.in diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckHeaderDirent.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/CheckHeaderDirent.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckHeaderDirent.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckHeaderDirent.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CheckTypeExists.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/CheckTypeExists.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CheckTypeExists.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/CheckTypeExists.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/CreatePkgConfigFile.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/CreatePkgConfigFile.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/CreatePkgConfigFile.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/CreatePkgConfigFile.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/FindLibGCC.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/FindLIBGCC.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/FindLibGCC.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/FindLIBGCC.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/FindMbedTLS.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/FindMbedTLS.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/FindMbedTLS.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/FindMbedTLS.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/FindNettle.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/FindNettle.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/FindNettle.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/FindNettle.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/FindPCREPOSIX.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/FindPCREPOSIX.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/FindPCREPOSIX.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/FindPCREPOSIX.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/LibarchiveCodeCoverage.cmake b/src/dependencies/libarchive-3.6.2/build/cmake/LibarchiveCodeCoverage.cmake similarity index 100% rename from src/dependencies/libarchive-3.5.2/build/cmake/LibarchiveCodeCoverage.cmake rename to src/dependencies/libarchive-3.6.2/build/cmake/LibarchiveCodeCoverage.cmake diff --git a/src/dependencies/libarchive-3.5.2/build/cmake/config.h.in b/src/dependencies/libarchive-3.6.2/build/cmake/config.h.in similarity index 94% rename from src/dependencies/libarchive-3.5.2/build/cmake/config.h.in rename to src/dependencies/libarchive-3.6.2/build/cmake/config.h.in index 5ddd2f3..5012ad2 100644 --- a/src/dependencies/libarchive-3.5.2/build/cmake/config.h.in +++ b/src/dependencies/libarchive-3.6.2/build/cmake/config.h.in @@ -23,14 +23,14 @@ #cmakedefine HAVE_UNSIGNED___INT64 /* The sizes of various standard integer types. */ -@SIZE_OF_SHORT_CODE@ -@SIZE_OF_INT_CODE@ -@SIZE_OF_LONG_CODE@ -@SIZE_OF_LONG_LONG_CODE@ -@SIZE_OF_UNSIGNED_SHORT_CODE@ -@SIZE_OF_UNSIGNED_CODE@ -@SIZE_OF_UNSIGNED_LONG_CODE@ -@SIZE_OF_UNSIGNED_LONG_LONG_CODE@ +@SIZEOF_SHORT_CODE@ +@SIZEOF_INT_CODE@ +@SIZEOF_LONG_CODE@ +@SIZEOF_LONG_LONG_CODE@ +@SIZEOF_UNSIGNED_SHORT_CODE@ +@SIZEOF_UNSIGNED_CODE@ +@SIZEOF_UNSIGNED_LONG_CODE@ +@SIZEOF_UNSIGNED_LONG_LONG_CODE@ /* * If we lack int64_t, define it to the first of __int64, int, long, and long long @@ -41,17 +41,17 @@ typedef __int64 int64_t; #define HAVE_INT64_T #endif -#if !defined(HAVE_INT64_T) && SIZE_OF_INT == 8 +#if !defined(HAVE_INT64_T) && SIZEOF_INT == 8 typedef int int64_t; #define HAVE_INT64_T #endif -#if !defined(HAVE_INT64_T) && SIZE_OF_LONG == 8 +#if !defined(HAVE_INT64_T) && SIZEOF_LONG == 8 typedef long int64_t; #define HAVE_INT64_T #endif -#if !defined(HAVE_INT64_T) && SIZE_OF_LONG_LONG == 8 +#if !defined(HAVE_INT64_T) && SIZEOF_LONG_LONG == 8 typedef long long int64_t; #define HAVE_INT64_T #endif @@ -63,12 +63,12 @@ typedef long long int64_t; /* * Similarly for int32_t */ -#if !defined(HAVE_INT32_T) && SIZE_OF_INT == 4 +#if !defined(HAVE_INT32_T) && SIZEOF_INT == 4 typedef int int32_t; #define HAVE_INT32_T #endif -#if !defined(HAVE_INT32_T) && SIZE_OF_LONG == 4 +#if !defined(HAVE_INT32_T) && SIZEOF_LONG == 4 typedef long int32_t; #define HAVE_INT32_T #endif @@ -80,12 +80,12 @@ typedef long int32_t; /* * Similarly for int16_t */ -#if !defined(HAVE_INT16_T) && SIZE_OF_INT == 2 +#if !defined(HAVE_INT16_T) && SIZEOF_INT == 2 typedef int int16_t; #define HAVE_INT16_T #endif -#if !defined(HAVE_INT16_T) && SIZE_OF_SHORT == 2 +#if !defined(HAVE_INT16_T) && SIZEOF_SHORT == 2 typedef short int16_t; #define HAVE_INT16_T #endif @@ -102,17 +102,17 @@ typedef unsigned __int64 uint64_t; #define HAVE_UINT64_T #endif -#if !defined(HAVE_UINT64_T) && SIZE_OF_UNSIGNED == 8 +#if !defined(HAVE_UINT64_T) && SIZEOF_UNSIGNED == 8 typedef unsigned uint64_t; #define HAVE_UINT64_T #endif -#if !defined(HAVE_UINT64_T) && SIZE_OF_UNSIGNED_LONG == 8 +#if !defined(HAVE_UINT64_T) && SIZEOF_UNSIGNED_LONG == 8 typedef unsigned long uint64_t; #define HAVE_UINT64_T #endif -#if !defined(HAVE_UINT64_T) && SIZE_OF_UNSIGNED_LONG_LONG == 8 +#if !defined(HAVE_UINT64_T) && SIZEOF_UNSIGNED_LONG_LONG == 8 typedef unsigned long long uint64_t; #define HAVE_UINT64_T #endif @@ -125,12 +125,12 @@ typedef unsigned long long uint64_t; /* * Similarly for uint32_t */ -#if !defined(HAVE_UINT32_T) && SIZE_OF_UNSIGNED == 4 +#if !defined(HAVE_UINT32_T) && SIZEOF_UNSIGNED == 4 typedef unsigned uint32_t; #define HAVE_UINT32_T #endif -#if !defined(HAVE_UINT32_T) && SIZE_OF_UNSIGNED_LONG == 4 +#if !defined(HAVE_UINT32_T) && SIZEOF_UNSIGNED_LONG == 4 typedef unsigned long uint32_t; #define HAVE_UINT32_T #endif @@ -142,12 +142,12 @@ typedef unsigned long uint32_t; /* * Similarly for uint16_t */ -#if !defined(HAVE_UINT16_T) && SIZE_OF_UNSIGNED == 2 +#if !defined(HAVE_UINT16_T) && SIZEOF_UNSIGNED == 2 typedef unsigned uint16_t; #define HAVE_UINT16_T #endif -#if !defined(HAVE_UINT16_T) && SIZE_OF_UNSIGNED_SHORT == 2 +#if !defined(HAVE_UINT16_T) && SIZEOF_UNSIGNED_SHORT == 2 typedef unsigned short uint16_t; #define HAVE_UINT16_T #endif @@ -316,13 +316,13 @@ typedef uint64_t uintmax_t; #cmakedefine ARCHIVE_XATTR_LINUX 1 /* Version number of bsdcpio */ -#cmakedefine BSDCPIO_VERSION_STRING "${BSDCPIO_VERSION_STRING}" +#cmakedefine BSDCPIO_VERSION_STRING "@BSDCPIO_VERSION_STRING@" /* Version number of bsdtar */ -#cmakedefine BSDTAR_VERSION_STRING "${BSDTAR_VERSION_STRING}" +#cmakedefine BSDTAR_VERSION_STRING "@BSDTAR_VERSION_STRING@" /* Version number of bsdcat */ -#cmakedefine BSDCAT_VERSION_STRING "${BSDCAT_VERSION_STRING}" +#cmakedefine BSDCAT_VERSION_STRING "@BSDCAT_VERSION_STRING@" /* Define to 1 if you have the `acl_create_entry' function. */ #cmakedefine HAVE_ACL_CREATE_ENTRY 1 @@ -738,6 +738,10 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `zstd' library (-lzstd). */ #cmakedefine HAVE_LIBZSTD 1 +/* Define to 1 if you have the `zstd' library (-lzstd) with compression + support. */ +#cmakedefine HAVE_LIBZSTD_COMPRESSOR 1 + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LIMITS_H 1 @@ -1227,13 +1231,13 @@ typedef uint64_t uintmax_t; #cmakedefine HAVE__MKGMTIME64 1 /* Define as const if the declaration of iconv() needs const. */ -#define ICONV_CONST ${ICONV_CONST} +#define ICONV_CONST @ICONV_CONST@ /* Version number of libarchive as a single integer */ -#cmakedefine LIBARCHIVE_VERSION_NUMBER "${LIBARCHIVE_VERSION_NUMBER}" +#cmakedefine LIBARCHIVE_VERSION_NUMBER "@LIBARCHIVE_VERSION_NUMBER@" /* Version number of libarchive */ -#cmakedefine LIBARCHIVE_VERSION_STRING "${LIBARCHIVE_VERSION_STRING}" +#cmakedefine LIBARCHIVE_VERSION_STRING "@LIBARCHIVE_VERSION_STRING@" /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ @@ -1251,7 +1255,7 @@ typedef uint64_t uintmax_t; #cmakedefine NO_MINUS_C_MINUS_O 1 /* The size of `wchar_t', as computed by sizeof. */ -#cmakedefine SIZEOF_WCHAR_T ${SIZEOF_WCHAR_T} +#cmakedefine SIZEOF_WCHAR_T @SIZEOF_WCHAR_T@ /* Define to 1 if strerror_r returns char *. */ #cmakedefine STRERROR_R_CHAR_P 1 @@ -1287,59 +1291,59 @@ typedef uint64_t uintmax_t; #endif /* SAFE_TO_DEFINE_EXTENSIONS */ /* Version number of package */ -#cmakedefine VERSION "${VERSION}" +#cmakedefine VERSION "@VERSION@" /* Number of bits in a file offset, on hosts where this is settable. */ -#cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} +#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #cmakedefine _LARGEFILE_SOURCE 1 /* Define for large files, on AIX-style hosts. */ -#cmakedefine _LARGE_FILES ${_LARGE_FILES} +#cmakedefine _LARGE_FILES @_LARGE_FILES@ /* Define to control Windows SDK version */ #ifndef NTDDI_VERSION -#cmakedefine NTDDI_VERSION ${NTDDI_VERSION} +#cmakedefine NTDDI_VERSION @NTDDI_VERSION@ #endif // NTDDI_VERSION #ifndef _WIN32_WINNT -#cmakedefine _WIN32_WINNT ${_WIN32_WINNT} +#cmakedefine _WIN32_WINNT @_WIN32_WINNT@ #endif // _WIN32_WINNT #ifndef WINVER -#cmakedefine WINVER ${WINVER} +#cmakedefine WINVER @WINVER@ #endif // WINVER /* Define to empty if `const' does not conform to ANSI C. */ -#cmakedefine const ${const} +#cmakedefine const @const@ /* Define to `int' if doesn't define. */ -#cmakedefine gid_t ${gid_t} +#cmakedefine gid_t @gid_t@ /* Define to `unsigned long' if does not define. */ -#cmakedefine id_t ${id_t} +#cmakedefine id_t @id_t@ /* Define to `int' if does not define. */ -#cmakedefine mode_t ${mode_t} +#cmakedefine mode_t @mode_t@ /* Define to `long long' if does not define. */ -#cmakedefine off_t ${off_t} +#cmakedefine off_t @off_t@ /* Define to `int' if doesn't define. */ -#cmakedefine pid_t ${pid_t} +#cmakedefine pid_t @pid_t@ /* Define to `unsigned int' if does not define. */ -#cmakedefine size_t ${size_t} +#cmakedefine size_t @size_t@ /* Define to `int' if does not define. */ -#cmakedefine ssize_t ${ssize_t} +#cmakedefine ssize_t @ssize_t@ /* Define to `int' if doesn't define. */ -#cmakedefine uid_t ${uid_t} +#cmakedefine uid_t @uid_t@ /* Define to `int' if does not define. */ -#cmakedefine intptr_t ${intptr_t} +#cmakedefine intptr_t @intptr_t@ /* Define to `unsigned int' if does not define. */ -#cmakedefine uintptr_t ${uintptr_t} +#cmakedefine uintptr_t @uintptr_t@ diff --git a/src/dependencies/libarchive-3.5.2/build/pkgconfig/libarchive.pc.in b/src/dependencies/libarchive-3.6.2/build/pkgconfig/libarchive.pc.in similarity index 90% rename from src/dependencies/libarchive-3.5.2/build/pkgconfig/libarchive.pc.in rename to src/dependencies/libarchive-3.6.2/build/pkgconfig/libarchive.pc.in index 4b631e6..1f51e77 100644 --- a/src/dependencies/libarchive-3.5.2/build/pkgconfig/libarchive.pc.in +++ b/src/dependencies/libarchive-3.6.2/build/pkgconfig/libarchive.pc.in @@ -10,3 +10,4 @@ Cflags: -I${includedir} Cflags.private: -DLIBARCHIVE_STATIC Libs: -L${libdir} -larchive Libs.private: @LIBS@ +Requires.private: @LIBSREQUIRED@ diff --git a/src/dependencies/libarchive-3.6.2/build/version b/src/dependencies/libarchive-3.6.2/build/version new file mode 100644 index 0000000..1af1bec --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/build/version @@ -0,0 +1 @@ +3006002 diff --git a/src/dependencies/libarchive-3.5.2/cat/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/cat/CMakeLists.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/cat/CMakeLists.txt diff --git a/src/dependencies/libarchive-3.5.2/cat/bsdcat.1 b/src/dependencies/libarchive-3.6.2/cat/bsdcat.1 similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/bsdcat.1 rename to src/dependencies/libarchive-3.6.2/cat/bsdcat.1 diff --git a/src/dependencies/libarchive-3.5.2/cat/bsdcat.c b/src/dependencies/libarchive-3.6.2/cat/bsdcat.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/bsdcat.c rename to src/dependencies/libarchive-3.6.2/cat/bsdcat.c diff --git a/src/dependencies/libarchive-3.5.2/cat/bsdcat.h b/src/dependencies/libarchive-3.6.2/cat/bsdcat.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/bsdcat.h rename to src/dependencies/libarchive-3.6.2/cat/bsdcat.h diff --git a/src/dependencies/libarchive-3.5.2/cat/bsdcat_platform.h b/src/dependencies/libarchive-3.6.2/cat/bsdcat_platform.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/bsdcat_platform.h rename to src/dependencies/libarchive-3.6.2/cat/bsdcat_platform.h diff --git a/src/dependencies/libarchive-3.5.2/cat/cmdline.c b/src/dependencies/libarchive-3.6.2/cat/cmdline.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/cmdline.c rename to src/dependencies/libarchive-3.6.2/cat/cmdline.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/cat/test/CMakeLists.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/cat/test/CMakeLists.txt diff --git a/src/dependencies/libarchive-3.5.2/cat/test/list.h b/src/dependencies/libarchive-3.6.2/cat/test/list.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/list.h rename to src/dependencies/libarchive-3.6.2/cat/test/list.h index 5246122..57f2f2a 100644 --- a/src/dependencies/libarchive-3.5.2/cat/test/list.h +++ b/src/dependencies/libarchive-3.6.2/cat/test/list.h @@ -5,13 +5,13 @@ DEFINE_TEST(test_empty_xz) DEFINE_TEST(test_empty_zstd) DEFINE_TEST(test_error) DEFINE_TEST(test_error_mixed) +DEFINE_TEST(test_expand_Z) DEFINE_TEST(test_expand_bz2) DEFINE_TEST(test_expand_gz) DEFINE_TEST(test_expand_lz4) DEFINE_TEST(test_expand_mixed) DEFINE_TEST(test_expand_plain) DEFINE_TEST(test_expand_xz) -DEFINE_TEST(test_expand_Z) DEFINE_TEST(test_expand_zstd) DEFINE_TEST(test_help) DEFINE_TEST(test_stdin) diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test.h b/src/dependencies/libarchive-3.6.2/cat/test/test.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test.h rename to src/dependencies/libarchive-3.6.2/cat/test/test.h diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_0.c b/src/dependencies/libarchive-3.6.2/cat/test/test_0.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_0.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_0.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty.gz.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_empty.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty.gz.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty.lz4.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_empty.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty.lz4.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty.xz.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_empty.xz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty.xz.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty.xz.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty.zst.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_empty.zst.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty.zst.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty.zst.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty_gz.c b/src/dependencies/libarchive-3.6.2/cat/test/test_empty_gz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty_gz.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty_gz.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty_lz4.c b/src/dependencies/libarchive-3.6.2/cat/test/test_empty_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty_lz4.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty_xz.c b/src/dependencies/libarchive-3.6.2/cat/test/test_empty_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty_xz.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty_xz.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_empty_zstd.c b/src/dependencies/libarchive-3.6.2/cat/test/test_empty_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_empty_zstd.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_empty_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_error.c b/src/dependencies/libarchive-3.6.2/cat/test/test_error.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_error.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_error.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_error_mixed.c b/src/dependencies/libarchive-3.6.2/cat/test/test_error_mixed.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_error_mixed.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_error_mixed.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.Z.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.Z.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.bz2.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.bz2.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.bz2.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.bz2.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.gz.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.gz.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.lz4.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.lz4.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.plain.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.plain.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.plain.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.plain.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.xz.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.xz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.xz.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.xz.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand.zst.uu b/src/dependencies/libarchive-3.6.2/cat/test/test_expand.zst.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand.zst.uu rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand.zst.uu diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_Z.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_Z.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_Z.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_Z.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_bz2.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_bz2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_bz2.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_bz2.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_gz.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_gz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_gz.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_gz.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_lz4.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_lz4.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_mixed.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_mixed.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_mixed.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_mixed.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_plain.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_plain.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_plain.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_plain.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_xz.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_xz.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_xz.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_expand_zstd.c b/src/dependencies/libarchive-3.6.2/cat/test/test_expand_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_expand_zstd.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_expand_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_help.c b/src/dependencies/libarchive-3.6.2/cat/test/test_help.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_help.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_help.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_stdin.c b/src/dependencies/libarchive-3.6.2/cat/test/test_stdin.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_stdin.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_stdin.c diff --git a/src/dependencies/libarchive-3.5.2/cat/test/test_version.c b/src/dependencies/libarchive-3.6.2/cat/test/test_version.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cat/test/test_version.c rename to src/dependencies/libarchive-3.6.2/cat/test/test_version.c diff --git a/src/dependencies/libarchive-3.5.2/config.h.in b/src/dependencies/libarchive-3.6.2/config.h.in similarity index 93% rename from src/dependencies/libarchive-3.5.2/config.h.in rename to src/dependencies/libarchive-3.6.2/config.h.in index 8abfedc..7ba4650 100644 --- a/src/dependencies/libarchive-3.5.2/config.h.in +++ b/src/dependencies/libarchive-3.6.2/config.h.in @@ -631,12 +631,6 @@ /* Define to 1 if you have the `crypto' library (-lcrypto). */ #undef HAVE_LIBCRYPTO -/* Define to 1 if you have the `eay32' library (-leay32). */ -#undef HAVE_LIBEAY32 - -/* Define to 1 if you have the `eay64' library (-leay64). */ -#undef HAVE_LIBEAY64 - /* Define to 1 if you have the `expat' library (-lexpat). */ #undef HAVE_LIBEXPAT @@ -685,6 +679,10 @@ /* Define to 1 if you have the `zstd' library (-lzstd). */ #undef HAVE_LIBZSTD +/* Define to 1 if you have the `zstd' library (-lzstd) with compression + support. */ +#undef HAVE_LIBZSTD_COMPRESSOR + /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H @@ -797,12 +795,12 @@ /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIX_CONFIG_H + /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR @@ -960,6 +958,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H @@ -972,7 +973,7 @@ /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR -/* Define to 1 if you have the `strerror_r' function. */ +/* Define if you have `strerror_r'. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strftime' function. */ @@ -1295,37 +1296,112 @@ /* Define to 1 if PCRE_STATIC needs to be defined. */ #undef PCRE_STATIC +/* The number of bytes in type int */ +#undef SIZEOF_INT + +/* The number of bytes in type long */ +#undef SIZEOF_LONG + /* The size of `wchar_t', as computed by sizeof. */ #undef SIZEOF_WCHAR_T -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P -/* Define to 1 if you can safely include both and . */ +/* Define to 1 if you can safely include both and . This + macro is obsolete. */ #undef TIME_WITH_SYS_TIME /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif +/* Enable general extensions on macOS. */ +#ifndef _DARWIN_C_SOURCE +# undef _DARWIN_C_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif -/* Enable threading extensions on Solaris. */ +/* Enable X/Open compliant socket functions that do not require linking + with -lxnet on HP-UX 11.11. */ +#ifndef _HPUX_ALT_XOPEN_SOCKET_API +# undef _HPUX_ALT_XOPEN_SOCKET_API +#endif +/* Identify the host operating system as Minix. + This macro does not affect the system headers' behavior. + A future release of Autoconf may stop defining this macro. */ +#ifndef _MINIX +# undef _MINIX +#endif +/* Enable general extensions on NetBSD. + Enable NetBSD compatibility extensions on Minix. */ +#ifndef _NETBSD_SOURCE +# undef _NETBSD_SOURCE +#endif +/* Enable OpenBSD compatibility extensions on NetBSD. + Oddly enough, this does nothing on OpenBSD. */ +#ifndef _OPENBSD_SOURCE +# undef _OPENBSD_SOURCE +#endif +/* Define to 1 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_SOURCE +# undef _POSIX_SOURCE +#endif +/* Define to 2 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_1_SOURCE +# undef _POSIX_1_SOURCE +#endif +/* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif +/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ +#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +# undef __STDC_WANT_IEC_60559_BFP_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ +#ifndef __STDC_WANT_IEC_60559_DFP_EXT__ +# undef __STDC_WANT_IEC_60559_DFP_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ +#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ +# undef __STDC_WANT_IEC_60559_FUNCS_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +# undef __STDC_WANT_IEC_60559_TYPES_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ +#ifndef __STDC_WANT_LIB_EXT2__ +# undef __STDC_WANT_LIB_EXT2__ +#endif +/* Enable extensions specified by ISO/IEC 24747:2009. */ +#ifndef __STDC_WANT_MATH_SPEC_FUNCS__ +# undef __STDC_WANT_MATH_SPEC_FUNCS__ +#endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# undef __EXTENSIONS__ +/* Enable X/Open extensions. Define to 500 only if necessary + to make mbstate_t available. */ +#ifndef _XOPEN_SOURCE +# undef _XOPEN_SOURCE #endif @@ -1335,11 +1411,6 @@ /* Define to '0x0502' for Windows Server 2003 APIs. */ #undef WINVER -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS @@ -1349,16 +1420,6 @@ /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES -/* Define to 1 if on MINIX. */ -#undef _MINIX - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -#undef _POSIX_1_SOURCE - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -#undef _POSIX_SOURCE - /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ diff --git a/src/dependencies/libarchive-3.5.2/configure b/src/dependencies/libarchive-3.6.2/configure similarity index 68% rename from src/dependencies/libarchive-3.5.2/configure rename to src/dependencies/libarchive-3.6.2/configure index e3190e2..ab8c099 100755 --- a/src/dependencies/libarchive-3.5.2/configure +++ b/src/dependencies/libarchive-3.6.2/configure @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libarchive 3.5.2. +# Generated by GNU Autoconf 2.71 for libarchive 3.6.2. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -187,18 +169,20 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' @@ -206,31 +190,40 @@ test \$(( 1 + 1 )) = 2 || exit 1 ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -238,14 +231,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -263,18 +263,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: libarchive-discuss@googlegroups.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run @@ -302,6 +303,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -319,6 +321,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -333,7 +343,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -342,7 +352,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -381,12 +391,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -398,18 +409,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -421,9 +441,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -450,7 +470,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -494,7 +514,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -508,6 +528,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -521,6 +545,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -590,51 +621,49 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libarchive' PACKAGE_TARNAME='libarchive' -PACKAGE_VERSION='3.5.2' -PACKAGE_STRING='libarchive 3.5.2' +PACKAGE_VERSION='3.6.2' +PACKAGE_STRING='libarchive 3.6.2' PACKAGE_BUGREPORT='libarchive-discuss@googlegroups.com' PACKAGE_URL='' ac_unique_file="libarchive" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= +ac_func_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS +LIBSREQUIRED INC_FREEBSD_ACL_FALSE INC_FREEBSD_ACL_TRUE INC_DARWIN_ACL_FALSE @@ -644,6 +673,7 @@ INC_SUNOS_ACL_TRUE INC_LINUX_ACL_FALSE INC_LINUX_ACL_TRUE LIBOBJS +GC_SECTIONS LIBXML2_PC_LIBS LIBXML2_PC_CFLAGS PKG_CONFIG_LIBDIR @@ -681,13 +711,13 @@ ac_ct_DUMPBIN DUMPBIN LD FGREP +EGREP +GREP SED LIBTOOL OBJDUMP DLLTOOL AS -EGREP -GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE @@ -731,6 +761,9 @@ AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V +CSCOPE +ETAGS +CTAGS am__untar am__tar AMTAR @@ -915,8 +948,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -957,9 +988,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -983,9 +1014,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1196,9 +1227,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1212,9 +1243,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1258,9 +1289,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1276,7 +1307,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1340,7 +1371,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1397,7 +1428,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libarchive 3.5.2 to adapt to many kinds of systems. +\`configure' configures libarchive 3.6.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1468,7 +1499,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libarchive 3.5.2:";; + short | recursive ) echo "Configuration of libarchive 3.6.2:";; esac cat <<\_ACEOF @@ -1588,9 +1619,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1618,7 +1649,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1626,7 +1658,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1635,10 +1667,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libarchive configure 3.5.2 -generated by GNU Autoconf 2.69 +libarchive configure 3.6.2 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1655,14 +1687,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1670,14 +1702,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1699,7 +1732,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1707,14 +1740,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1724,139 +1758,6 @@ fi } # ac_fn_c_try_cpp -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## -------------------------------------------------- ## -## Report this to libarchive-discuss@googlegroups.com ## -## -------------------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in @@ -1864,26 +1765,28 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1894,14 +1797,14 @@ $as_echo "$ac_res" >&6; } ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1909,17 +1812,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1940,11 +1844,12 @@ fi ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. @@ -1952,16 +1857,9 @@ else #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif + which can conflict with char $2 (); below. */ +#include #undef $2 /* Override any GCC internal prototype to avoid an error. @@ -1979,28 +1877,72 @@ choke me #endif int -main () +main (void) { return $2 (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache @@ -2008,17 +1950,18 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -2026,12 +1969,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -2039,18 +1983,19 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -2062,16 +2007,17 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +printf %s "checking for $2.$3... " >&6; } +if eval test \${$4+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main () +main (void) { static $2 ac_aggr; if (ac_aggr.$3) @@ -2080,14 +2026,15 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$4=yes" -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main () +main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) @@ -2096,18 +2043,19 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$4=yes" -else +else $as_nop eval "$4=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$4 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member @@ -2119,11 +2067,12 @@ $as_echo "$ac_res" >&6; } ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 -$as_echo_n "checking for int$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +printf %s "checking for int$2_t... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. @@ -2134,7 +2083,7 @@ else $ac_includes_default enum { N = $2 / 2 - 1 }; int -main () +main (void) { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; @@ -2144,13 +2093,14 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int -main () +main (void) { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; @@ -2161,9 +2111,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( @@ -2171,19 +2122,20 @@ else eval "$3=\$ac_type" ;; esac fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no" +then : -else +else $as_nop break fi done fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t @@ -2195,11 +2147,12 @@ $as_echo "$ac_res" >&6; } ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 -$as_echo_n "checking for uint$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +printf %s "checking for uint$2_t... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. @@ -2209,7 +2162,7 @@ else /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; @@ -2219,7 +2172,8 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( @@ -2227,40 +2181,44 @@ if ac_fn_c_try_compile "$LINENO"; then : eval "$3=\$ac_type" ;; esac fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no" +then : -else +else $as_nop break fi done fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -# accordingly. -ac_fn_c_check_decl () +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { #ifndef $as_decl_name #ifdef __cplusplus @@ -2274,19 +2232,22 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_decl +} # ac_fn_check_decl # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- @@ -2302,7 +2263,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; @@ -2312,14 +2273,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2329,9 +2291,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid; break -else +else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= @@ -2339,14 +2302,14 @@ else fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; @@ -2356,14 +2319,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; @@ -2373,9 +2337,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=$ac_mid; break -else +else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= @@ -2383,14 +2348,14 @@ else fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop ac_lo= ac_hi= fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val @@ -2398,7 +2363,7 @@ while test "x$ac_lo" != "x$ac_hi"; do /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2408,12 +2373,13 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid -else +else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; @@ -2423,12 +2389,12 @@ esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } #include #include int -main () +main (void) { FILE *f = fopen ("conftest.val", "w"); @@ -2456,9 +2422,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libarchive $as_me 3.5.2, which was -generated by GNU Autoconf 2.69. Invocation command line was +It was created by libarchive $as_me 3.6.2, which was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -2510,8 +2497,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2546,7 +2537,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2581,11 +2572,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2596,8 +2589,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2621,7 +2614,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2629,14 +2622,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2644,15 +2637,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2660,8 +2653,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2675,63 +2668,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2741,19 +2719,438 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" +as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" +as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H" +as_fn_append ac_func_c_list " vprintf HAVE_VPRINTF" + +# Auxiliary files required by this configure script. +ac_aux_files="config.rpath ltmain.sh compile config.guess config.sub missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/build/autoconf" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false @@ -2764,12 +3161,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2778,24 +3175,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -2805,11 +3202,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2825,41 +3223,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure the srcdir contains "libarchive" directory # Use auxiliary subscripts from this subdirectory (cleans up root) -ac_aux_dir= -for ac_dir in build/autoconf "$srcdir"/build/autoconf; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build/autoconf \"$srcdir\"/build/autoconf" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - # M4 scripts # Must follow AC_CONFIG macros above... am__api_version='1.16' -# Find a good install program. We prefer a C program (faster), + + + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install @@ -2873,20 +3245,25 @@ am__api_version='1.16' # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; @@ -2896,13 +3273,13 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else @@ -2910,12 +3287,12 @@ case $as_dir/ in #(( echo one > conftest.one echo two > conftest.two mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi @@ -2931,7 +3308,7 @@ IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi - if test "${ac_cv_path_install+set}" = set; then + if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a @@ -2941,8 +3318,8 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -2952,8 +3329,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -3007,8 +3384,8 @@ else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= @@ -3027,26 +3404,23 @@ test "$program_suffix" != NONE && # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then @@ -3066,11 +3440,12 @@ if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -3078,11 +3453,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3093,11 +3472,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3106,11 +3485,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -3118,11 +3498,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3133,11 +3517,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -3145,8 +3529,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -3158,25 +3542,31 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done @@ -3187,7 +3577,7 @@ IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then + if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a @@ -3197,18 +3587,19 @@ fi MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -3216,11 +3607,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3231,24 +3626,25 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @@ -3264,12 +3660,12 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -3283,7 +3679,8 @@ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : +if test ${enable_silent_rules+y} +then : enableval=$enable_silent_rules; fi @@ -3293,12 +3690,13 @@ case $enable_silent_rules in # ((( *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3310,8 +3708,8 @@ else am_cv_make_support_nested_variables=no fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' @@ -3343,17 +3741,13 @@ fi # Define the identity of the package. PACKAGE='libarchive' - VERSION='3.5.2' + VERSION='3.6.2' -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. @@ -3393,6 +3787,20 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile @@ -3437,17 +3845,18 @@ END fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 -$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then : +if test ${enable_maintainer_mode+y} +then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else +else $as_nop USE_MAINTAINER_MODE=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' @@ -3460,7 +3869,8 @@ fi # Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : +if test ${enable_silent_rules+y} +then : enableval=$enable_silent_rules; fi @@ -3470,12 +3880,13 @@ case $enable_silent_rules in # ((( *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3487,8 +3898,8 @@ else am_cv_make_support_nested_variables=no fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' @@ -3503,7 +3914,7 @@ AM_BACKSLASH='\' # Libtool interface version bumps on any API change, so increments # whenever libarchive minor version does. -ARCHIVE_MINOR=$(( (3005002 / 1000) % 1000 )) +ARCHIVE_MINOR=$(( (3006002 / 1000) % 1000 )) # Libarchive 2.7 == libtool interface 9 = 2 + 7 # Libarchive 2.8 == libtool interface 10 = 2 + 8 # Libarchive 2.9 == libtool interface 11 = 2 + 8 @@ -3511,40 +3922,38 @@ ARCHIVE_MINOR=$(( (3005002 / 1000) % 1000 )) # Libarchive 3.1 == libtool interface 13 ARCHIVE_INTERFACE=`echo $((13 + ${ARCHIVE_MINOR}))` # Libarchive revision is bumped on any source change === libtool revision -ARCHIVE_REVISION=$(( 3005002 % 1000 )) +ARCHIVE_REVISION=$(( 3006002 % 1000 )) # Libarchive minor is bumped on any interface addition === libtool age ARCHIVE_LIBTOOL_VERSION=$ARCHIVE_INTERFACE:$ARCHIVE_REVISION:$ARCHIVE_MINOR # Stick the version numbers into config.h -$as_echo "#define __LIBARCHIVE_CONFIG_H_INCLUDED 1" >>confdefs.h +printf "%s\n" "#define __LIBARCHIVE_CONFIG_H_INCLUDED 1" >>confdefs.h -$as_echo "#define LIBARCHIVE_VERSION_STRING \"3.5.2\"" >>confdefs.h +printf "%s\n" "#define LIBARCHIVE_VERSION_STRING \"3.6.2\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define LIBARCHIVE_VERSION_NUMBER "3005002" -_ACEOF +printf "%s\n" "#define LIBARCHIVE_VERSION_NUMBER \"3006002\"" >>confdefs.h -$as_echo "#define BSDCPIO_VERSION_STRING \"3.5.2\"" >>confdefs.h +printf "%s\n" "#define BSDCPIO_VERSION_STRING \"3.6.2\"" >>confdefs.h -$as_echo "#define BSDTAR_VERSION_STRING \"3.5.2\"" >>confdefs.h +printf "%s\n" "#define BSDTAR_VERSION_STRING \"3.6.2\"" >>confdefs.h -$as_echo "#define BSDCAT_VERSION_STRING \"3.5.2\"" >>confdefs.h +printf "%s\n" "#define BSDCAT_VERSION_STRING \"3.6.2\"" >>confdefs.h # The shell variables here must be the same as the AC_SUBST() variables # below, but the shell variable names apparently cannot be the same as # the m4 macro names above. Why? Ask autoconf. -BSDCPIO_VERSION_STRING=3.5.2 -BSDTAR_VERSION_STRING=3.5.2 -BSDCAT_VERSION_STRING=3.5.2 -LIBARCHIVE_VERSION_STRING=3.5.2 -LIBARCHIVE_VERSION_NUMBER=3005002 +BSDCPIO_VERSION_STRING=3.6.2 +BSDTAR_VERSION_STRING=3.6.2 +BSDCAT_VERSION_STRING=3.6.2 +LIBARCHIVE_VERSION_STRING=3.6.2 +LIBARCHIVE_VERSION_NUMBER=3006002 # Substitute the above version numbers into the various files below. # Yes, I believe this is the fourth time we define what are essentially @@ -3564,26 +3973,29 @@ ac_config_files="$ac_config_files build/pkgconfig/libarchive.pc" # Check for host type -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; @@ -3602,21 +4014,22 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; @@ -3666,6 +4079,15 @@ esac # Checks for programs. + + + + + + + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3674,11 +4096,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3686,11 +4109,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3701,11 +4128,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3714,11 +4141,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3726,11 +4154,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3741,11 +4173,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -3753,8 +4185,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3767,11 +4199,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3779,11 +4212,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3794,11 +4231,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3807,11 +4244,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3820,15 +4258,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3844,18 +4286,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3866,11 +4308,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3878,11 +4321,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3893,11 +4340,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3910,11 +4357,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3922,11 +4370,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3937,11 +4389,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3953,8 +4405,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3962,25 +4414,129 @@ esac fi fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3990,7 +4546,7 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -3998,7 +4554,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4010,9 +4566,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" @@ -4033,11 +4589,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -4054,7 +4611,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -4070,44 +4627,46 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else +else $as_nop ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -4121,15 +4680,15 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -4138,7 +4697,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -4150,8 +4709,8 @@ _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -4159,10 +4718,10 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -4170,39 +4729,40 @@ $as_echo "$ac_try_echo"; } >&5 *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4216,11 +4776,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -4229,31 +4790,32 @@ $as_echo "$ac_try_echo"; } >&5 break;; esac done -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -4263,29 +4825,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -4294,57 +4860,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -4359,94 +4928,144 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi ac_ext=c @@ -4455,21 +5074,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4497,8 +5118,8 @@ _ACEOF rm -f core conftest* unset am_i fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. @@ -4517,8 +5138,8 @@ DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 -$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out @@ -4554,11 +5175,12 @@ esac fi done rm -f confinc.* confmf.* -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 -$as_echo "${_am_result}" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test ${enable_dependency_tracking+y} +then : enableval=$enable_dependency_tracking; fi @@ -4579,11 +5201,12 @@ fi depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -4690,8 +5313,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -4705,182 +5328,6 @@ else fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 -$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } -if ${ac_cv_prog_cc_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#include - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -#define debug(...) fprintf (stderr, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) -{ - int x = 1234; - int y = 5678; - debug ("Flag"); - debug ("X = %d\n", x); - showlist (The first, second, and third items.); - report (x>y, "x is %d but y is %d", x, y); -} - -// Check long long types. -#define BIG64 18446744073709551615ull -#define BIG32 4294967295ul -#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) -#if !BIG_OK - your preprocessor is broken; -#endif -#if BIG_OK -#else - your preprocessor is broken; -#endif -static long long int bignum = -9223372036854775807LL; -static unsigned long long int ubignum = BIG64; - -struct incomplete_array -{ - int datasize; - double data[]; -}; - -struct named_init { - int number; - const wchar_t *name; - double average; -}; - -typedef const char *ccp; - -static inline int -test_restrict (ccp restrict text) -{ - // See if C++-style comments work. - // Iterate through items via the restricted pointer. - // Also check for declarations in for loops. - for (unsigned int i = 0; *(text+i) != '\0'; ++i) - continue; - return 0; -} - -// Check varargs and va_copy. -static void -test_varargs (const char *format, ...) -{ - va_list args; - va_start (args, format); - va_list args_copy; - va_copy (args_copy, args); - - const char *str; - int number; - float fnumber; - - while (*format) - { - switch (*format++) - { - case 's': // string - str = va_arg (args_copy, const char *); - break; - case 'd': // int - number = va_arg (args_copy, int); - break; - case 'f': // float - fnumber = va_arg (args_copy, double); - break; - default: - break; - } - } - va_end (args_copy); - va_end (args); -} - -int -main () -{ - - // Check bool. - _Bool success = false; - - // Check restrict. - if (test_restrict ("String literal") == 0) - success = true; - char *restrict newvar = "Another string"; - - // Check varargs. - test_varargs ("s, d' f .", "string", 65, 34.234); - test_varargs_macros (); - - // Check flexible array members. - struct incomplete_array *ia = - malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); - ia->datasize = 10; - for (int i = 0; i < ia->datasize; ++i) - ia->data[i] = i * 1.234; - - // Check named initializers. - struct named_init ni = { - .number = 34, - .name = L"Test wide string", - .average = 543.34343, - }; - - ni.number = 58; - - int dynamic_array[ni.number]; - dynamic_array[ni.number - 1] = 543; - - // work around unused variable warnings - return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' - || dynamic_array[ni.number - 1] != 543); - - ; - return 0; -} -_ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c99=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c99" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c99" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c99" != xno; then : - -fi - ac_ext=c @@ -4888,40 +5335,36 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -4933,10 +5376,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -4946,7 +5390,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : break fi @@ -4958,29 +5403,24 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -4992,10 +5432,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -5005,11 +5446,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi @@ -5021,326 +5463,175 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +ac_header= ac_cache= +for ac_item in $ac_header_c_list do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - done - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = xyes; then : - MINIX=yes -else - MINIX= + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + fi - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h -$as_echo "#define _MINIX 1" >>confdefs.h - - fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if ${ac_cv_safe_to_define___extensions__+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test ${ac_cv_safe_to_define___extensions__+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_safe_to_define___extensions__=yes -else +else $as_nop ac_cv_safe_to_define___extensions__=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 +printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } +if test ${ac_cv_should_define__xopen_source+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_should_define__xopen_source=no + if test $ac_cv_header_wchar_h = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + #include + mbstate_t x; +int +main (void) +{ - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #define _XOPEN_SOURCE 500 + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_should_define__xopen_source=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 +printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } + + printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h + + printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h + + printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h + + if test $ac_cv_header_minix_config_h = yes +then : + MINIX=yes + printf "%s\n" "#define _MINIX 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h + +else $as_nop + MINIX= +fi + if test $ac_cv_safe_to_define___extensions__ = yes +then : + printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h + +fi + if test $ac_cv_should_define__xopen_source = yes +then : + printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h + +fi enable_win32_dll=yes @@ -5349,11 +5640,12 @@ case $host in if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else @@ -5361,11 +5653,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5376,11 +5672,11 @@ fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5389,11 +5685,12 @@ if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else @@ -5401,11 +5698,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5416,11 +5717,11 @@ fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then @@ -5428,8 +5729,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS @@ -5441,11 +5742,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -5453,11 +5755,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5468,11 +5774,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5481,11 +5787,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -5493,11 +5800,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5508,11 +5819,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -5520,8 +5831,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -5533,11 +5844,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -5545,11 +5857,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5560,11 +5876,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5573,11 +5889,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -5585,11 +5902,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5600,11 +5921,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -5612,8 +5933,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -5647,8 +5968,8 @@ test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac @@ -5668,6 +5989,7 @@ macro_revision='2.4.6' + ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within @@ -5691,8 +6013,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then @@ -5718,12 +6040,12 @@ func_echo_all () } case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; esac @@ -5739,11 +6061,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -5757,10 +6080,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -5769,13 +6097,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" + printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5803,8 +6131,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -5821,11 +6149,154 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else @@ -5836,10 +6307,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP @@ -5848,13 +6324,13 @@ case `"$ac_path_FGREP" --version 2>&1` in ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5883,8 +6359,8 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -5909,17 +6385,18 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -5948,15 +6425,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -5985,18 +6463,19 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -6019,11 +6498,12 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM @@ -6073,8 +6553,8 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else @@ -6087,11 +6567,12 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -6099,11 +6580,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6114,11 +6599,11 @@ fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6131,11 +6616,12 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -6143,11 +6629,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6158,11 +6648,11 @@ fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6174,8 +6664,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN @@ -6203,11 +6693,12 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -6223,26 +6714,27 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop i=0 teststring=ABCD @@ -6369,11 +6861,11 @@ else fi if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -6417,11 +6909,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $host in *-*-mingw* ) case $build in @@ -6457,18 +6950,19 @@ esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -6484,22 +6978,23 @@ esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -6532,11 +7027,12 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -6544,11 +7040,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6559,11 +7059,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6572,11 +7072,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -6584,11 +7085,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6599,11 +7104,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -6611,8 +7116,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -6628,11 +7133,12 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' @@ -6828,8 +7334,8 @@ os2*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -6873,11 +7379,12 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -6885,11 +7392,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6900,11 +7411,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6913,11 +7424,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -6925,11 +7437,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6940,11 +7456,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -6952,8 +7468,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -6970,11 +7486,12 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in @@ -6997,8 +7514,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -7013,11 +7530,12 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -7025,11 +7543,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7040,11 +7562,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7057,11 +7579,12 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -7069,11 +7592,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7084,11 +7611,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7100,8 +7627,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -7121,30 +7648,32 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. @@ -7152,7 +7681,7 @@ if ac_fn_c_try_compile "$LINENO"; then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ @@ -7161,11 +7690,11 @@ if ac_fn_c_try_compile "$LINENO"; then : rm -f conftest.* libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= @@ -7182,11 +7711,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -7194,11 +7724,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7209,11 +7743,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7222,11 +7756,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -7234,11 +7769,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7249,11 +7788,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -7261,8 +7800,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -7281,11 +7820,12 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -7293,11 +7833,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7308,11 +7852,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7321,11 +7865,12 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -7333,11 +7878,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7348,11 +7897,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -7360,8 +7909,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -7450,11 +7999,12 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7606,7 +8156,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm @@ -7679,7 +8229,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi @@ -7714,11 +8264,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi # Response file support. @@ -7764,13 +8314,14 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : +if test ${with_sysroot+y} +then : withval=$with_sysroot; -else +else $as_nop with_sysroot=no fi @@ -7788,24 +8339,25 @@ case $with_sysroot in #( no|'') ;; #( *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -$as_echo_n "checking for a working dd... " >&6; } -if ${ac_cv_path_lt_DD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} @@ -7816,10 +8368,15 @@ if test -z "$lt_DD"; then for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in dd; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ @@ -7839,15 +8396,16 @@ fi rm -f conftest.i conftest2.i conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -$as_echo "$ac_cv_path_lt_DD" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -$as_echo_n "checking how to truncate binary pipes... " >&6; } -if ${lt_cv_truncate_bin+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= @@ -7858,8 +8416,8 @@ fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -$as_echo "$lt_cv_truncate_bin" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -7882,7 +8440,8 @@ func_cc_basename () } # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : +if test ${enable_libtool_lock+y} +then : enableval=$enable_libtool_lock; fi @@ -7898,7 +8457,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) @@ -7918,7 +8477,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in @@ -7956,7 +8515,7 @@ mips64*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in @@ -7997,7 +8556,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) @@ -8060,11 +8619,12 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8075,19 +8635,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_cc_needs_belf=yes -else +else $as_nop lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -8096,8 +8657,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS @@ -8110,7 +8671,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) @@ -8147,11 +8708,12 @@ need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -8159,11 +8721,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8174,11 +8740,11 @@ fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8187,11 +8753,12 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else @@ -8199,11 +8766,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8214,11 +8785,11 @@ fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -8226,8 +8797,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -8237,11 +8808,12 @@ else fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -8251,8 +8823,8 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -8267,11 +8839,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -8279,11 +8852,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8294,11 +8871,11 @@ fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8307,11 +8884,12 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -8319,11 +8897,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8334,11 +8916,11 @@ fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -8346,8 +8928,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -8359,11 +8941,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -8371,11 +8954,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8386,11 +8973,11 @@ fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8399,11 +8986,12 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -8411,11 +8999,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8426,11 +9018,11 @@ fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -8438,8 +9030,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -8451,11 +9043,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -8463,11 +9056,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8478,11 +9075,11 @@ fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8491,11 +9088,12 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -8503,11 +9101,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8518,11 +9120,11 @@ fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -8530,8 +9132,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -8543,11 +9145,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -8555,11 +9158,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8570,11 +9177,11 @@ fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8583,11 +9190,12 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -8595,11 +9203,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8610,11 +9222,11 @@ fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -8622,8 +9234,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -8635,11 +9247,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -8647,11 +9260,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8662,11 +9279,11 @@ fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8675,11 +9292,12 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -8687,11 +9305,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8702,11 +9324,11 @@ fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -8714,8 +9336,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -8750,11 +9372,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override @@ -8783,14 +9406,15 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -8799,31 +9423,33 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_ld_exported_symbols_list=yes -else +else $as_nop lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} @@ -8851,8 +9477,8 @@ _LT_EOF rm -rf conftest.dSYM fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; @@ -8863,11 +9489,11 @@ $as_echo "$lt_cv_ld_force_load" >&6; } # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + 10.0,*86*-darwin8*|10.0,*-darwin[912]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) + 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; @@ -8923,19 +9549,14 @@ func_munge_path_list () esac } -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi -done - @@ -8949,7 +9570,8 @@ done # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : +if test ${enable_shared+y} +then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -8967,7 +9589,7 @@ if test "${enable_shared+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_shared=yes fi @@ -8980,7 +9602,8 @@ fi # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : +if test ${enable_static+y} +then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -8998,7 +9621,7 @@ if test "${enable_static+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_static=yes fi @@ -9012,7 +9635,8 @@ fi # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : +if test ${with_pic+y} +then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; @@ -9029,7 +9653,7 @@ if test "${with_pic+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop pic_mode=default fi @@ -9041,7 +9665,8 @@ fi # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : +if test ${enable_fast_install+y} +then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -9059,7 +9684,7 @@ if test "${enable_fast_install+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_fast_install=yes fi @@ -9073,11 +9698,12 @@ fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. -if test "${with_aix_soname+set}" = set; then : +if test ${with_aix_soname+y} +then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; @@ -9086,18 +9712,19 @@ if test "${with_aix_soname+set}" = set; then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else - if ${lt_cv_with_aix_soname+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -$as_echo "$with_aix_soname" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', @@ -9179,11 +9806,12 @@ if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -9194,17 +9822,15 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h @@ -9250,11 +9876,12 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9303,11 +9930,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9316,11 +9943,12 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9369,11 +9997,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9454,11 +10082,12 @@ if test yes = "$GCC"; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9489,8 +10118,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -9853,26 +10482,28 @@ case $host_os in ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9903,8 +10534,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in @@ -9932,11 +10563,12 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -9960,8 +10592,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : @@ -9975,11 +10607,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -10022,19 +10655,20 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -10077,8 +10711,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10086,19 +10720,19 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -10110,8 +10744,8 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -10669,21 +11303,23 @@ _LT_EOF if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -10698,7 +11334,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -10722,21 +11358,23 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -10751,7 +11389,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -11002,11 +11640,12 @@ fi # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" @@ -11030,8 +11669,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' @@ -11071,28 +11710,30 @@ fi # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_irix_exported_symbol=yes -else +else $as_nop lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi @@ -11373,8 +12014,8 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -11410,18 +12051,19 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -11439,7 +12081,7 @@ else if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -11453,8 +12095,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -11613,8 +12255,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in @@ -12175,9 +12817,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -12187,19 +12830,21 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -12443,8 +13088,8 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -12565,8 +13210,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -12590,8 +13235,8 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then @@ -12635,11 +13280,12 @@ else darwin*) # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12648,32 +13294,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else +else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= @@ -12693,14 +13338,16 @@ fi *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : +if test "x$ac_cv_func_shl_load" = xyes +then : lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12709,41 +13356,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char shl_load (); int -main () +main (void) { return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_shl_load=yes -else +else $as_nop ac_cv_lib_dld_shl_load=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else +else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = xyes +then : lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12752,37 +13400,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12791,37 +13439,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_svld_dlopen=yes -else +else $as_nop ac_cv_lib_svld_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12830,30 +13478,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dld_link (); int -main () +main (void) { return dld_link (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_dld_link=yes -else +else $as_nop ac_cv_lib_dld_dld_link=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi @@ -12892,11 +13539,12 @@ fi save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else @@ -12975,7 +13623,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -12993,16 +13641,17 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else @@ -13081,7 +13730,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -13099,8 +13748,8 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS @@ -13138,13 +13787,13 @@ fi striplib= old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in @@ -13152,16 +13801,16 @@ else if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac fi @@ -13178,13 +13827,13 @@ fi # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -13208,15 +13857,15 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } fi ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } @@ -13255,11 +13904,12 @@ CC=$lt_save_CC if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -13267,11 +13917,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13282,11 +13936,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -13295,11 +13949,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -13307,11 +13962,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13322,11 +13981,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -13334,8 +13993,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -13352,9 +14011,10 @@ fi # Default is to build bsdtar, but allow people to override that. # # Check whether --enable-bsdtar was given. -if test "${enable_bsdtar+set}" = set; then : +if test ${enable_bsdtar+y} +then : enableval=$enable_bsdtar; -else +else $as_nop enable_bsdtar=yes fi @@ -13370,8 +14030,8 @@ yes) ;; dynamic|shared) if test "$enable_shared" = "no"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Shared linking of bsdtar requires shared libarchive See \`config.log' for more details" "$LINENO" 5; } fi @@ -13387,8 +14047,8 @@ no) static_bsdtar=no ;; *) - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Unsupported value for --enable-bsdtar See \`config.log' for more details" "$LINENO" 5; } ;; @@ -13417,9 +14077,10 @@ fi # Default is to build bsdcat, but allow people to override that. # # Check whether --enable-bsdcat was given. -if test "${enable_bsdcat+set}" = set; then : +if test ${enable_bsdcat+y} +then : enableval=$enable_bsdcat; -else +else $as_nop enable_bsdcat=yes fi @@ -13435,8 +14096,8 @@ yes) ;; dynamic|shared) if test "$enable_shared" = "no"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Shared linking of bsdcat requires shared libarchive See \`config.log' for more details" "$LINENO" 5; } fi @@ -13452,8 +14113,8 @@ no) static_bsdcat=no ;; *) - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Unsupported value for --enable-bsdcat See \`config.log' for more details" "$LINENO" 5; } ;; @@ -13482,9 +14143,10 @@ fi # Default is not to build bsdcpio, but that can be overridden. # # Check whether --enable-bsdcpio was given. -if test "${enable_bsdcpio+set}" = set; then : +if test ${enable_bsdcpio+y} +then : enableval=$enable_bsdcpio; -else +else $as_nop enable_bsdcpio=yes fi @@ -13500,8 +14162,8 @@ yes) ;; dynamic|shared) if test "$enabled_shared" = "no"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Shared linking of bsdcpio requires shared libarchive See \`config.log' for more details" "$LINENO" 5; } fi @@ -13516,8 +14178,8 @@ no) static_bsdcpio=no ;; *) - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Unsupported value for --enable-bsdcpio See \`config.log' for more details" "$LINENO" 5; } ;; @@ -13543,14 +14205,15 @@ fi # Set up defines needed before including any headers case $host in *mingw* | *cygwin* | *msys* ) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32_WINNT # error _WIN32_WINNT already defined #endif int -main () +main (void) { ; ; @@ -13558,13 +14221,14 @@ main () } _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : -$as_echo "#define _WIN32_WINNT 0x0502" >>confdefs.h +printf "%s\n" "#define _WIN32_WINNT 0x0502" >>confdefs.h -$as_echo "#define NTDDI_VERSION 0x05020000" >>confdefs.h +printf "%s\n" "#define NTDDI_VERSION 0x05020000" >>confdefs.h fi @@ -13576,7 +14240,7 @@ rm -f conftest.err conftest.i conftest.$ac_ext #endif int -main () +main (void) { ; ; @@ -13584,10 +14248,11 @@ main () } _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : -$as_echo "#define WINVER 0x0502" >>confdefs.h +printf "%s\n" "#define WINVER 0x0502" >>confdefs.h fi @@ -13598,19 +14263,20 @@ esac # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 -$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if eval \${$as_ac_Header+:} false; then : - $as_echo_n "(cached) " >&6 -else + as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +printf %s "checking for $ac_hdr that defines DIR... " >&6; } +if eval test \${$as_ac_Header+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int -main () +main (void) { if ((DIR *) 0) return 0; @@ -13618,19 +14284,21 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$as_ac_Header=yes" -else +else $as_nop eval "$as_ac_Header=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$as_ac_Header - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -13639,11 +14307,12 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13651,56 +14320,59 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char opendir (); int -main () +main (void) { return opendir (); ; return 0; } _ACEOF -for ac_lib in '' dir; do +for ac_lib in '' dir +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_opendir=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : + if test ${ac_cv_search_opendir+y} +then : break fi done -if ${ac_cv_search_opendir+:} false; then : +if test ${ac_cv_search_opendir+y} +then : -else +else $as_nop ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13708,57 +14380,60 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char opendir (); int -main () +main (void) { return opendir (); ; return 0; } _ACEOF -for ac_lib in '' x; do +for ac_lib in '' x +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_opendir=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : + if test ${ac_cv_search_opendir+y} +then : break fi done -if ${ac_cv_search_opendir+:} false; then : +if test ${ac_cv_search_opendir+y} +then : -else +else $as_nop ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 -$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } -if ${ac_cv_header_sys_wait_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 +printf %s "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } +if test ${ac_cv_header_sys_wait_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -13771,7 +14446,7 @@ else #endif int -main () +main (void) { int s; wait (&s); @@ -13780,332 +14455,481 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_header_sys_wait_h=yes -else +else $as_nop ac_cv_header_sys_wait_h=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 -$as_echo "$ac_cv_header_sys_wait_h" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 +printf "%s\n" "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then -$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi -for ac_header in acl/libacl.h attr/xattr.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "acl/libacl.h" "ac_cv_header_acl_libacl_h" "$ac_includes_default" +if test "x$ac_cv_header_acl_libacl_h" = xyes +then : + printf "%s\n" "#define HAVE_ACL_LIBACL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "attr/xattr.h" "ac_cv_header_attr_xattr_h" "$ac_includes_default" +if test "x$ac_cv_header_attr_xattr_h" = xyes +then : + printf "%s\n" "#define HAVE_ATTR_XATTR_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "copyfile.h" "ac_cv_header_copyfile_h" "$ac_includes_default" +if test "x$ac_cv_header_copyfile_h" = xyes +then : + printf "%s\n" "#define HAVE_COPYFILE_H 1" >>confdefs.h -for ac_header in copyfile.h ctype.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "ctype.h" "ac_cv_header_ctype_h" "$ac_includes_default" +if test "x$ac_cv_header_ctype_h" = xyes +then : + printf "%s\n" "#define HAVE_CTYPE_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_errno_h" = xyes +then : + printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h -for ac_header in errno.h ext2fs/ext2_fs.h fcntl.h grp.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "ext2fs/ext2_fs.h" "ac_cv_header_ext2fs_ext2_fs_h" "$ac_includes_default" +if test "x$ac_cv_header_ext2fs_ext2_fs_h" = xyes +then : + printf "%s\n" "#define HAVE_EXT2FS_EXT2_FS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "grp.h" "ac_cv_header_grp_h" "$ac_includes_default" +if test "x$ac_cv_header_grp_h" = xyes +then : + printf "%s\n" "#define HAVE_GRP_H 1" >>confdefs.h fi -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether EXT2_IOC_GETFLAGS is usable" >&5 -$as_echo_n "checking whether EXT2_IOC_GETFLAGS is usable... " >&6; } -if ${ac_cv_have_decl_EXT2_IOC_GETFLAGS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether EXT2_IOC_GETFLAGS is usable" >&5 +printf %s "checking whether EXT2_IOC_GETFLAGS is usable... " >&6; } +if test ${ac_cv_have_decl_EXT2_IOC_GETFLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int -main () +main (void) { int x = EXT2_IOC_GETFLAGS ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_have_decl_EXT2_IOC_GETFLAGS=yes -else +else $as_nop ac_cv_have_decl_EXT2_IOC_GETFLAGS=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_EXT2_IOC_GETFLAGS" >&5 -$as_echo "$ac_cv_have_decl_EXT2_IOC_GETFLAGS" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_EXT2_IOC_GETFLAGS" >&5 +printf "%s\n" "$ac_cv_have_decl_EXT2_IOC_GETFLAGS" >&6; } -if test "x$ac_cv_have_decl_EXT2_IOC_GETFLAGS" = xyes; then : +if test "x$ac_cv_have_decl_EXT2_IOC_GETFLAGS" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_WORKING_EXT2_IOC_GETFLAGS 1 -_ACEOF +printf "%s\n" "#define HAVE_WORKING_EXT2_IOC_GETFLAGS 1" >>confdefs.h fi -for ac_header in inttypes.h io.h langinfo.h limits.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h" = xyes +then : + printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "io.h" "ac_cv_header_io_h" "$ac_includes_default" +if test "x$ac_cv_header_io_h" = xyes +then : + printf "%s\n" "#define HAVE_IO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_langinfo_h" = xyes +then : + printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "linux/fiemap.h" "ac_cv_header_linux_fiemap_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_fiemap_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_FIEMAP_H 1" >>confdefs.h -for ac_header in linux/fiemap.h linux/fs.h linux/magic.h linux/types.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "linux/fs.h" "ac_cv_header_linux_fs_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_fs_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_FS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "linux/magic.h" "ac_cv_header_linux_magic_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_magic_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_MAGIC_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "linux/types.h" "ac_cv_header_linux_types_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_types_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_TYPES_H 1" >>confdefs.h fi -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether FS_IOC_GETFLAGS is usable" >&5 -$as_echo_n "checking whether FS_IOC_GETFLAGS is usable... " >&6; } -if ${ac_cv_have_decl_FS_IOC_GETFLAGS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether FS_IOC_GETFLAGS is usable" >&5 +printf %s "checking whether FS_IOC_GETFLAGS is usable... " >&6; } +if test ${ac_cv_have_decl_FS_IOC_GETFLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int -main () +main (void) { int x = FS_IOC_GETFLAGS ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_have_decl_FS_IOC_GETFLAGS=yes -else +else $as_nop ac_cv_have_decl_FS_IOC_GETFLAGS=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_FS_IOC_GETFLAGS" >&5 -$as_echo "$ac_cv_have_decl_FS_IOC_GETFLAGS" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_FS_IOC_GETFLAGS" >&5 +printf "%s\n" "$ac_cv_have_decl_FS_IOC_GETFLAGS" >&6; } -if test "x$ac_cv_have_decl_FS_IOC_GETFLAGS" = xyes; then : +if test "x$ac_cv_have_decl_FS_IOC_GETFLAGS" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_WORKING_FS_IOC_GETFLAGS 1 -_ACEOF +printf "%s\n" "#define HAVE_WORKING_FS_IOC_GETFLAGS 1" >>confdefs.h fi -for ac_header in locale.h membership.h paths.h poll.h pthread.h pwd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "membership.h" "ac_cv_header_membership_h" "$ac_includes_default" +if test "x$ac_cv_header_membership_h" = xyes +then : + printf "%s\n" "#define HAVE_MEMBERSHIP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default" +if test "x$ac_cv_header_paths_h" = xyes +then : + printf "%s\n" "#define HAVE_PATHS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes +then : + printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default" +if test "x$ac_cv_header_pwd_h" = xyes +then : + printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "readpassphrase.h" "ac_cv_header_readpassphrase_h" "$ac_includes_default" +if test "x$ac_cv_header_readpassphrase_h" = xyes +then : + printf "%s\n" "#define HAVE_READPASSPHRASE_H 1" >>confdefs.h -for ac_header in readpassphrase.h signal.h spawn.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default" +if test "x$ac_cv_header_signal_h" = xyes +then : + printf "%s\n" "#define HAVE_SIGNAL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default" +if test "x$ac_cv_header_spawn_h" = xyes +then : + printf "%s\n" "#define HAVE_SPAWN_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" +if test "x$ac_cv_header_stdarg_h" = xyes +then : + printf "%s\n" "#define HAVE_STDARG_H 1" >>confdefs.h -for ac_header in stdarg.h stdint.h stdlib.h string.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/acl.h" "ac_cv_header_sys_acl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_acl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_ACL_H 1" >>confdefs.h -for ac_header in sys/acl.h sys/cdefs.h sys/ea.h sys/extattr.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/cdefs.h" "ac_cv_header_sys_cdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_cdefs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CDEFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ea.h" "ac_cv_header_sys_ea_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ea_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_EA_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/extattr.h" "ac_cv_header_sys_extattr_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_extattr_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_EXTATTR_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h -for ac_header in sys/ioctl.h sys/mkdev.h sys/mount.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mkdev_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MKDEV_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mount_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h -for ac_header in sys/param.h sys/poll.h sys/richacl.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/poll.h" "ac_cv_header_sys_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_poll_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_POLL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/richacl.h" "ac_cv_header_sys_richacl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_richacl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RICHACL_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h -for ac_header in sys/select.h sys/statfs.h sys/statvfs.h sys/sysmacros.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/statfs.h" "ac_cv_header_sys_statfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_statfs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STATFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_statvfs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sysmacros_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SYSMACROS_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h -for ac_header in sys/time.h sys/utime.h sys/utsname.h sys/vfs.h sys/xattr.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/utime.h" "ac_cv_header_sys_utime_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_utime_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UTIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_utsname_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UTSNAME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_vfs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_VFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/xattr.h" "ac_cv_header_sys_xattr_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_xattr_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_XATTR_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default" +if test "x$ac_cv_header_time_h" = xyes +then : + printf "%s\n" "#define HAVE_TIME_H 1" >>confdefs.h -for ac_header in time.h unistd.h utime.h wchar.h wctype.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" +if test "x$ac_cv_header_utime_h" = xyes +then : + printf "%s\n" "#define HAVE_UTIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" +if test "x$ac_cv_header_wchar_h" = xyes +then : + printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default" +if test "x$ac_cv_header_wctype_h" = xyes +then : + printf "%s\n" "#define HAVE_WCTYPE_H 1" >>confdefs.h fi -done - -for ac_header in windows.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" -if test "x$ac_cv_header_windows_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_WINDOWS_H 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes +then : + printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h fi -done - # check windows.h first; the other headers require it. -for ac_header in wincrypt.h winioctl.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_WINDOWS_H +ac_fn_c_check_header_compile "$LINENO" "wincrypt.h" "ac_cv_header_wincrypt_h" "#ifdef HAVE_WINDOWS_H # include #endif " -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +if test "x$ac_cv_header_wincrypt_h" = xyes +then : + printf "%s\n" "#define HAVE_WINCRYPT_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "winioctl.h" "ac_cv_header_winioctl_h" "#ifdef HAVE_WINDOWS_H +# include +#endif -done +" +if test "x$ac_cv_header_winioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_WINIOCTL_H 1" >>confdefs.h + +fi # Checks for libraries. # Check whether --with-zlib was given. -if test "${with_zlib+set}" = set; then : +if test ${with_zlib+y} +then : withval=$with_zlib; fi if test "x$with_zlib" != "xno"; then - for ac_header in zlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes +then : + printf "%s\n" "#define HAVE_ZLIB_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 -$as_echo_n "checking for inflate in -lz... " >&6; } -if ${ac_cv_lib_z_inflate+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +printf %s "checking for inflate in -lz... " >&6; } +if test ${ac_cv_lib_z_inflate+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14114,33 +14938,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char inflate (); int -main () +main (void) { return inflate (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_z_inflate=yes -else +else $as_nop ac_cv_lib_z_inflate=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 -$as_echo "$ac_cv_lib_z_inflate" >&6; } -if test "x$ac_cv_lib_z_inflate" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBZ 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +printf "%s\n" "$ac_cv_lib_z_inflate" >&6; } +if test "x$ac_cv_lib_z_inflate" = xyes +then : + printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h LIBS="-lz $LIBS" @@ -14150,28 +14971,24 @@ fi # Check whether --with-bz2lib was given. -if test "${with_bz2lib+set}" = set; then : +if test ${with_bz2lib+y} +then : withval=$with_bz2lib; fi if test "x$with_bz2lib" != "xno"; then - for ac_header in bzlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" -if test "x$ac_cv_header_bzlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BZLIB_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes +then : + printf "%s\n" "#define HAVE_BZLIB_H 1" >>confdefs.h fi -done - case "$host_os" in *mingw* | *cygwin* | *msys*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressInit in -lbz2" >&5 -$as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressInit in -lbz2" >&5 +printf %s "checking for BZ2_bzDecompressInit in -lbz2... " >&6; } old_LIBS="$LIBS" LIBS="-lbz2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14179,29 +14996,31 @@ $as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; } #include int main() { return BZ2_bzDecompressInit(NULL, 0, 0); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_bz2_BZ2_bzDecompressInit=yes -else +else $as_nop ac_cv_lib_bz2_BZ2_bzDecompressInit=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$old_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompressInit" >&5 -$as_echo "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompressInit" >&5 +printf "%s\n" "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; } if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" = xyes; then -$as_echo "#define HAVE_LIBBZ2 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBBZ2 1" >>confdefs.h LIBS="-lbz2 $LIBS" fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressInit in -lbz2" >&5 -$as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; } -if ${ac_cv_lib_bz2_BZ2_bzDecompressInit+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressInit in -lbz2" >&5 +printf %s "checking for BZ2_bzDecompressInit in -lbz2... " >&6; } +if test ${ac_cv_lib_bz2_BZ2_bzDecompressInit+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lbz2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14210,33 +15029,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char BZ2_bzDecompressInit (); int -main () +main (void) { return BZ2_bzDecompressInit (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_bz2_BZ2_bzDecompressInit=yes -else +else $as_nop ac_cv_lib_bz2_BZ2_bzDecompressInit=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompressInit" >&5 -$as_echo "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; } -if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBBZ2 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompressInit" >&5 +printf "%s\n" "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; } +if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" = xyes +then : + printf "%s\n" "#define HAVE_LIBBZ2 1" >>confdefs.h LIBS="-lbz2 $LIBS" @@ -14248,29 +15064,26 @@ fi # Check whether --with-libb2 was given. -if test "${with_libb2+set}" = set; then : +if test ${with_libb2+y} +then : withval=$with_libb2; fi if test "x$with_libb2" != "xno"; then - for ac_header in blake2.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "blake2.h" "ac_cv_header_blake2_h" "$ac_includes_default" -if test "x$ac_cv_header_blake2_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BLAKE2_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "blake2.h" "ac_cv_header_blake2_h" "$ac_includes_default" +if test "x$ac_cv_header_blake2_h" = xyes +then : + printf "%s\n" "#define HAVE_BLAKE2_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for blake2sp_init in -lb2" >&5 -$as_echo_n "checking for blake2sp_init in -lb2... " >&6; } -if ${ac_cv_lib_b2_blake2sp_init+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for blake2sp_init in -lb2" >&5 +printf %s "checking for blake2sp_init in -lb2... " >&6; } +if test ${ac_cv_lib_b2_blake2sp_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lb2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14279,33 +15092,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char blake2sp_init (); int -main () +main (void) { return blake2sp_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_b2_blake2sp_init=yes -else +else $as_nop ac_cv_lib_b2_blake2sp_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_b2_blake2sp_init" >&5 -$as_echo "$ac_cv_lib_b2_blake2sp_init" >&6; } -if test "x$ac_cv_lib_b2_blake2sp_init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBB2 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_b2_blake2sp_init" >&5 +printf "%s\n" "$ac_cv_lib_b2_blake2sp_init" >&6; } +if test "x$ac_cv_lib_b2_blake2sp_init" = xyes +then : + printf "%s\n" "#define HAVE_LIBB2 1" >>confdefs.h LIBS="-lb2 $LIBS" @@ -14324,7 +15134,8 @@ fi # Check whether --with-iconv was given. -if test "${with_iconv+set}" = set; then : +if test ${with_iconv+y} +then : withval=$with_iconv; fi @@ -14348,9 +15159,10 @@ if test "x$with_iconv" != "xno"; then # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi @@ -14369,8 +15181,8 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 -$as_echo_n "checking for ld used by GCC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +printf %s "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -14399,15 +15211,16 @@ $as_echo_n "checking for ld used by GCC... " >&6; } ;; esac elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${acl_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${acl_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do @@ -14433,18 +15246,19 @@ fi LD="$acl_cv_path_LD" if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${acl_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${acl_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$acl_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 +printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 -$as_echo_n "checking for shared library run path origin... " >&6; } -if ${acl_cv_rpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +printf %s "checking for shared library run path origin... " >&6; } +if test ${acl_cv_rpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh @@ -14473,8 +15289,8 @@ else acl_cv_rpath=done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 -$as_echo "$acl_cv_rpath" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +printf "%s\n" "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" @@ -14485,9 +15301,10 @@ $as_echo "$acl_cv_rpath" >&6; } acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. -if test "${enable_rpath+set}" = set; then : +if test ${enable_rpath+y} +then : enableval=$enable_rpath; : -else +else $as_nop enable_rpath=yes fi @@ -14498,11 +15315,12 @@ fi acl_libdirstem2= case "$host_os" in solaris*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 -$as_echo_n "checking for 64-bit host... " >&6; } -if ${gl_cv_solaris_64bit+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 +printf %s "checking for 64-bit host... " >&6; } +if test ${gl_cv_solaris_64bit+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14512,17 +15330,18 @@ sixtyfour bits _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "sixtyfour bits" >/dev/null 2>&1; then : + $EGREP "sixtyfour bits" >/dev/null 2>&1 +then : gl_cv_solaris_64bit=yes -else +else $as_nop gl_cv_solaris_64bit=no fi -rm -f conftest* +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 -$as_echo "$gl_cv_solaris_64bit" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 +printf "%s\n" "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in @@ -14581,7 +15400,8 @@ $as_echo "$gl_cv_solaris_64bit" >&6; } # Check whether --with-libiconv-prefix was given. -if test "${with_libiconv_prefix+set}" = set; then : +if test ${with_libiconv_prefix+y} +then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -15051,11 +15871,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 -$as_echo_n "checking for iconv... " >&6; } -if ${am_cv_func_iconv+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +printf %s "checking for iconv... " >&6; } +if test ${am_cv_func_iconv+y} +then : + printf %s "(cached) " >&6 +else $as_nop am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no @@ -15066,7 +15887,7 @@ else #include int -main () +main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); @@ -15075,10 +15896,11 @@ iconv_t cd = iconv_open("",""); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : am_cv_func_iconv=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" @@ -15090,7 +15912,7 @@ rm -f core conftest.err conftest.$ac_objext \ #include int -main () +main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); @@ -15099,24 +15921,26 @@ iconv_t cd = iconv_open("",""); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 -$as_echo "$am_cv_func_iconv" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +printf "%s\n" "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 -$as_echo_n "checking for working iconv... " >&6; } -if ${am_cv_func_iconv_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +printf %s "checking for working iconv... " >&6; } +if test ${am_cv_func_iconv_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then @@ -15124,12 +15948,13 @@ else fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15141,7 +15966,7 @@ else #endif int -main () +main (void) { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful @@ -15241,7 +16066,8 @@ int result = 0; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -15253,8 +16079,8 @@ fi LIBS="$am_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 -$as_echo "$am_cv_func_iconv_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +printf "%s\n" "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; @@ -15264,14 +16090,14 @@ $as_echo "$am_cv_func_iconv_works" >&6; } fi if test "$am_func_iconv" = yes; then -$as_echo "#define HAVE_ICONV 1" >>confdefs.h +printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 -$as_echo_n "checking how to link with libiconv... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 -$as_echo "$LIBICONV" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +printf %s "checking how to link with libiconv... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +printf "%s\n" "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= @@ -15281,11 +16107,12 @@ $as_echo "$LIBICONV" >&6; } if test "$am_cv_func_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 -$as_echo_n "checking for iconv declaration... " >&6; } - if ${am_cv_proto_iconv+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 +printf %s "checking for iconv declaration... " >&6; } + if test ${am_cv_proto_iconv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15303,82 +16130,69 @@ size_t iconv(); #endif int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : am_cv_proto_iconv_arg1="" -else +else $as_nop am_cv_proto_iconv_arg1="const" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_proto_iconv" >&5 -$as_echo " +printf "%s\n" " $am_cv_proto_iconv" >&6; } -cat >>confdefs.h <<_ACEOF -#define ICONV_CONST $am_cv_proto_iconv_arg1 -_ACEOF +printf "%s\n" "#define ICONV_CONST $am_cv_proto_iconv_arg1" >>confdefs.h fi - for ac_header in iconv.h -do : ac_fn_c_check_header_compile "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "#include " -if test "x$ac_cv_header_iconv_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ICONV_H 1 -_ACEOF +if test "x$ac_cv_header_iconv_h" = xyes +then : + printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h fi -done - if test "x$am_cv_func_iconv" = "xyes"; then - for ac_header in localcharset.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "localcharset.h" "ac_cv_header_localcharset_h" "$ac_includes_default" -if test "x$ac_cv_header_localcharset_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LOCALCHARSET_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "localcharset.h" "ac_cv_header_localcharset_h" "$ac_includes_default" +if test "x$ac_cv_header_localcharset_h" = xyes +then : + printf "%s\n" "#define HAVE_LOCALCHARSET_H 1" >>confdefs.h fi -done - am_save_LIBS="$LIBS" LIBS="${LIBS} ${LIBICONV}" - for ac_func in locale_charset -do : - ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset" -if test "x$ac_cv_func_locale_charset" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LOCALE_CHARSET 1 -_ACEOF + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }iconv" + ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset" +if test "x$ac_cv_func_locale_charset" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_CHARSET 1" >>confdefs.h fi -done LIBS="${am_save_LIBS}" if test "x$ac_cv_func_locale_charset" != "xyes"; then # If locale_charset() is not in libiconv, we have to find libcharset. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for locale_charset in -lcharset" >&5 -$as_echo_n "checking for locale_charset in -lcharset... " >&6; } -if ${ac_cv_lib_charset_locale_charset+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for locale_charset in -lcharset" >&5 +printf %s "checking for locale_charset in -lcharset... " >&6; } +if test ${ac_cv_lib_charset_locale_charset+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lcharset $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15387,33 +16201,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char locale_charset (); int -main () +main (void) { return locale_charset (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_charset_locale_charset=yes -else +else $as_nop ac_cv_lib_charset_locale_charset=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_charset_locale_charset" >&5 -$as_echo "$ac_cv_lib_charset_locale_charset" >&6; } -if test "x$ac_cv_lib_charset_locale_charset" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBCHARSET 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_charset_locale_charset" >&5 +printf "%s\n" "$ac_cv_lib_charset_locale_charset" >&6; } +if test "x$ac_cv_lib_charset_locale_charset" = xyes +then : + printf "%s\n" "#define HAVE_LIBCHARSET 1" >>confdefs.h LIBS="-lcharset $LIBS" @@ -15425,30 +16236,32 @@ fi # Check whether --with-lz4 was given. -if test "${with_lz4+set}" = set; then : +if test ${with_lz4+y} +then : withval=$with_lz4; fi if test "x$with_lz4" != "xno"; then - for ac_header in lz4.h lz4hc.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "lz4.h" "ac_cv_header_lz4_h" "$ac_includes_default" +if test "x$ac_cv_header_lz4_h" = xyes +then : + printf "%s\n" "#define HAVE_LZ4_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "lz4hc.h" "ac_cv_header_lz4hc_h" "$ac_includes_default" +if test "x$ac_cv_header_lz4hc_h" = xyes +then : + printf "%s\n" "#define HAVE_LZ4HC_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LZ4_decompress_safe in -llz4" >&5 -$as_echo_n "checking for LZ4_decompress_safe in -llz4... " >&6; } -if ${ac_cv_lib_lz4_LZ4_decompress_safe+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LZ4_decompress_safe in -llz4" >&5 +printf %s "checking for LZ4_decompress_safe in -llz4... " >&6; } +if test ${ac_cv_lib_lz4_LZ4_decompress_safe+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-llz4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15457,33 +16270,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char LZ4_decompress_safe (); int -main () +main (void) { return LZ4_decompress_safe (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_lz4_LZ4_decompress_safe=yes -else +else $as_nop ac_cv_lib_lz4_LZ4_decompress_safe=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lz4_LZ4_decompress_safe" >&5 -$as_echo "$ac_cv_lib_lz4_LZ4_decompress_safe" >&6; } -if test "x$ac_cv_lib_lz4_LZ4_decompress_safe" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBLZ4 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lz4_LZ4_decompress_safe" >&5 +printf "%s\n" "$ac_cv_lib_lz4_LZ4_decompress_safe" >&6; } +if test "x$ac_cv_lib_lz4_LZ4_decompress_safe" = xyes +then : + printf "%s\n" "#define HAVE_LIBLZ4 1" >>confdefs.h LIBS="-llz4 $LIBS" @@ -15493,29 +16303,69 @@ fi # Check whether --with-zstd was given. -if test "${with_zstd+set}" = set; then : +if test ${with_zstd+y} +then : withval=$with_zstd; fi if test "x$with_zstd" != "xno"; then - for ac_header in zstd.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default" -if test "x$ac_cv_header_zstd_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZSTD_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default" +if test "x$ac_cv_header_zstd_h" = xyes +then : + printf "%s\n" "#define HAVE_ZSTD_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZSTD_compressStream in -lzstd" >&5 -$as_echo_n "checking for ZSTD_compressStream in -lzstd... " >&6; } -if ${ac_cv_lib_zstd_ZSTD_compressStream+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZSTD_decompressStream in -lzstd" >&5 +printf %s "checking for ZSTD_decompressStream in -lzstd... " >&6; } +if test ${ac_cv_lib_zstd_ZSTD_decompressStream+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzstd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char ZSTD_decompressStream (); +int +main (void) +{ +return ZSTD_decompressStream (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_zstd_ZSTD_decompressStream=yes +else $as_nop + ac_cv_lib_zstd_ZSTD_decompressStream=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_decompressStream" >&5 +printf "%s\n" "$ac_cv_lib_zstd_ZSTD_decompressStream" >&6; } +if test "x$ac_cv_lib_zstd_ZSTD_decompressStream" = xyes +then : + printf "%s\n" "#define HAVE_LIBZSTD 1" >>confdefs.h + + LIBS="-lzstd $LIBS" + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZSTD_compressStream in -lzstd" >&5 +printf %s "checking for ZSTD_compressStream in -lzstd... " >&6; } +if test ${ac_cv_lib_zstd_ZSTD_compressStream+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lzstd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15524,35 +16374,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char ZSTD_compressStream (); int -main () +main (void) { return ZSTD_compressStream (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_zstd_ZSTD_compressStream=yes -else +else $as_nop ac_cv_lib_zstd_ZSTD_compressStream=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_compressStream" >&5 -$as_echo "$ac_cv_lib_zstd_ZSTD_compressStream" >&6; } -if test "x$ac_cv_lib_zstd_ZSTD_compressStream" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBZSTD 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_compressStream" >&5 +printf "%s\n" "$ac_cv_lib_zstd_ZSTD_compressStream" >&6; } +if test "x$ac_cv_lib_zstd_ZSTD_compressStream" = xyes +then : - LIBS="-lzstd $LIBS" +printf "%s\n" "#define HAVE_LIBZSTD_COMPRESSOR 1" >>confdefs.h fi @@ -15560,29 +16406,26 @@ fi # Check whether --with-lzma was given. -if test "${with_lzma+set}" = set; then : +if test ${with_lzma+y} +then : withval=$with_lzma; fi if test "x$with_lzma" != "xno"; then - for ac_header in lzma.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default" -if test "x$ac_cv_header_lzma_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LZMA_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default" +if test "x$ac_cv_header_lzma_h" = xyes +then : + printf "%s\n" "#define HAVE_LZMA_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_stream_decoder in -llzma" >&5 -$as_echo_n "checking for lzma_stream_decoder in -llzma... " >&6; } -if ${ac_cv_lib_lzma_lzma_stream_decoder+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lzma_stream_decoder in -llzma" >&5 +printf %s "checking for lzma_stream_decoder in -llzma... " >&6; } +if test ${ac_cv_lib_lzma_lzma_stream_decoder+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-llzma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15591,33 +16434,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char lzma_stream_decoder (); int -main () +main (void) { return lzma_stream_decoder (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_lzma_lzma_stream_decoder=yes -else +else $as_nop ac_cv_lib_lzma_lzma_stream_decoder=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_stream_decoder" >&5 -$as_echo "$ac_cv_lib_lzma_lzma_stream_decoder" >&6; } -if test "x$ac_cv_lib_lzma_lzma_stream_decoder" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBLZMA 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_stream_decoder" >&5 +printf "%s\n" "$ac_cv_lib_lzma_lzma_stream_decoder" >&6; } +if test "x$ac_cv_lib_lzma_lzma_stream_decoder" = xyes +then : + printf "%s\n" "#define HAVE_LIBLZMA 1" >>confdefs.h LIBS="-llzma $LIBS" @@ -15627,11 +16467,12 @@ fi # included a disabled version of lzma_stream_encoder_mt that # fools a naive AC_CHECK_LIB or AC_CHECK_FUNC, so we need # to do something more complex here: - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have multithread support in lzma" >&5 -$as_echo_n "checking whether we have multithread support in lzma... " >&6; } -if ${ac_cv_lzma_has_mt+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we have multithread support in lzma" >&5 +printf %s "checking whether we have multithread support in lzma... " >&6; } +if test ${ac_cv_lzma_has_mt+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15640,56 +16481,59 @@ else #error unsupported #endif int -main () +main (void) { lzma_stream_encoder_mt(0, 0); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lzma_has_mt=yes -else +else $as_nop ac_cv_lzma_has_mt=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lzma_has_mt" >&5 -$as_echo "$ac_cv_lzma_has_mt" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lzma_has_mt" >&5 +printf "%s\n" "$ac_cv_lzma_has_mt" >&6; } if test "x$ac_cv_lzma_has_mt" != xno; then -$as_echo "#define HAVE_LZMA_STREAM_ENCODER_MT 1" >>confdefs.h +printf "%s\n" "#define HAVE_LZMA_STREAM_ENCODER_MT 1" >>confdefs.h fi fi # Check whether --with-lzo2 was given. -if test "${with_lzo2+set}" = set; then : +if test ${with_lzo2+y} +then : withval=$with_lzo2; fi if test "x$with_lzo2" = "xyes"; then - for ac_header in lzo/lzoconf.h lzo/lzo1x.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "lzo/lzoconf.h" "ac_cv_header_lzo_lzoconf_h" "$ac_includes_default" +if test "x$ac_cv_header_lzo_lzoconf_h" = xyes +then : + printf "%s\n" "#define HAVE_LZO_LZOCONF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "lzo/lzo1x.h" "ac_cv_header_lzo_lzo1x_h" "$ac_includes_default" +if test "x$ac_cv_header_lzo_lzo1x_h" = xyes +then : + printf "%s\n" "#define HAVE_LZO_LZO1X_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_decompress_safe in -llzo2" >&5 -$as_echo_n "checking for lzo1x_decompress_safe in -llzo2... " >&6; } -if ${ac_cv_lib_lzo2_lzo1x_decompress_safe+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lzo1x_decompress_safe in -llzo2" >&5 +printf %s "checking for lzo1x_decompress_safe in -llzo2... " >&6; } +if test ${ac_cv_lib_lzo2_lzo1x_decompress_safe+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-llzo2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15698,33 +16542,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char lzo1x_decompress_safe (); int -main () +main (void) { return lzo1x_decompress_safe (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_lzo2_lzo1x_decompress_safe=yes -else +else $as_nop ac_cv_lib_lzo2_lzo1x_decompress_safe=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_decompress_safe" >&5 -$as_echo "$ac_cv_lib_lzo2_lzo1x_decompress_safe" >&6; } -if test "x$ac_cv_lib_lzo2_lzo1x_decompress_safe" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBLZO2 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_decompress_safe" >&5 +printf "%s\n" "$ac_cv_lib_lzo2_lzo1x_decompress_safe" >&6; } +if test "x$ac_cv_lib_lzo2_lzo1x_decompress_safe" = xyes +then : + printf "%s\n" "#define HAVE_LIBLZO2 1" >>confdefs.h LIBS="-llzo2 $LIBS" @@ -15734,26 +16575,30 @@ fi # Check whether --with-cng was given. -if test "${with_cng+set}" = set; then : +if test ${with_cng+y} +then : withval=$with_cng; fi # Check whether --with-mbedtls was given. -if test "${with_mbedtls+set}" = set; then : +if test ${with_mbedtls+y} +then : withval=$with_mbedtls; fi # Check whether --with-nettle was given. -if test "${with_nettle+set}" = set; then : +if test ${with_nettle+y} +then : withval=$with_nettle; fi # Check whether --with-openssl was given. -if test "${with_openssl+set}" = set; then : +if test ${with_openssl+y} +then : withval=$with_openssl; fi @@ -15763,13 +16608,15 @@ esac # Check whether --with-xml2 was given. -if test "${with_xml2+set}" = set; then : +if test ${with_xml2+y} +then : withval=$with_xml2; fi # Check whether --with-expat was given. -if test "${with_expat+set}" = set; then : +if test ${with_expat+y} +then : withval=$with_expat; fi @@ -15786,11 +16633,12 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. @@ -15800,11 +16648,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -15816,11 +16668,11 @@ esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +printf "%s\n" "$PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -15829,11 +16681,12 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. @@ -15843,11 +16696,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -15859,11 +16716,11 @@ esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then @@ -15871,8 +16728,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG @@ -15884,30 +16741,30 @@ fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXML2_PC" >&5 -$as_echo_n "checking for LIBXML2_PC... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0" >&5 +printf %s "checking for libxml-2.0... " >&6; } if test -n "$LIBXML2_PC_CFLAGS"; then pkg_cv_LIBXML2_PC_CFLAGS="$LIBXML2_PC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_PC_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -15921,10 +16778,10 @@ if test -n "$LIBXML2_PC_LIBS"; then pkg_cv_LIBXML2_PC_LIBS="$LIBXML2_PC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_PC_LIBS=`$PKG_CONFIG --libs "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -15938,8 +16795,8 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -15955,11 +16812,12 @@ fi echo "$LIBXML2_PC_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 -$as_echo_n "checking for xmlInitParser in -lxml2... " >&6; } -if ${ac_cv_lib_xml2_xmlInitParser+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 +printf %s "checking for xmlInitParser in -lxml2... " >&6; } +if test ${ac_cv_lib_xml2_xmlInitParser+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15968,33 +16826,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char xmlInitParser (); int -main () +main (void) { return xmlInitParser (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_xml2_xmlInitParser=yes -else +else $as_nop ac_cv_lib_xml2_xmlInitParser=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 -$as_echo "$ac_cv_lib_xml2_xmlInitParser" >&6; } -if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBXML2 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 +printf "%s\n" "$ac_cv_lib_xml2_xmlInitParser" >&6; } +if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes +then : + printf "%s\n" "#define HAVE_LIBXML2 1" >>confdefs.h LIBS="-lxml2 $LIBS" @@ -16002,14 +16857,15 @@ fi elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 -$as_echo_n "checking for xmlInitParser in -lxml2... " >&6; } -if ${ac_cv_lib_xml2_xmlInitParser+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 +printf %s "checking for xmlInitParser in -lxml2... " >&6; } +if test ${ac_cv_lib_xml2_xmlInitParser+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16018,33 +16874,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char xmlInitParser (); int -main () +main (void) { return xmlInitParser (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_xml2_xmlInitParser=yes -else +else $as_nop ac_cv_lib_xml2_xmlInitParser=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 -$as_echo "$ac_cv_lib_xml2_xmlInitParser" >&6; } -if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBXML2 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 +printf "%s\n" "$ac_cv_lib_xml2_xmlInitParser" >&6; } +if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes +then : + printf "%s\n" "#define HAVE_LIBXML2 1" >>confdefs.h LIBS="-lxml2 $LIBS" @@ -16054,16 +16907,17 @@ fi else LIBXML2_PC_CFLAGS=$pkg_cv_LIBXML2_PC_CFLAGS LIBXML2_PC_LIBS=$pkg_cv_LIBXML2_PC_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } CPPFLAGS="${CPPFLAGS} ${LIBXML2_PC_CFLAGS}" LIBS="${LIBS} ${LIBXML2_PC_LIBS}" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 -$as_echo_n "checking for xmlInitParser in -lxml2... " >&6; } -if ${ac_cv_lib_xml2_xmlInitParser+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 +printf %s "checking for xmlInitParser in -lxml2... " >&6; } +if test ${ac_cv_lib_xml2_xmlInitParser+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16072,73 +16926,68 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char xmlInitParser (); int -main () +main (void) { return xmlInitParser (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_xml2_xmlInitParser=yes -else +else $as_nop ac_cv_lib_xml2_xmlInitParser=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 -$as_echo "$ac_cv_lib_xml2_xmlInitParser" >&6; } -if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 +printf "%s\n" "$ac_cv_lib_xml2_xmlInitParser" >&6; } +if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes +then : true -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Missing xml2 library See \`config.log' for more details" "$LINENO" 5; } fi fi - for ac_header in libxml/xmlreader.h libxml/xmlwriter.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "libxml/xmlreader.h" "ac_cv_header_libxml_xmlreader_h" "$ac_includes_default" +if test "x$ac_cv_header_libxml_xmlreader_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBXML_XMLREADER_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "libxml/xmlwriter.h" "ac_cv_header_libxml_xmlwriter_h" "$ac_includes_default" +if test "x$ac_cv_header_libxml_xmlwriter_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBXML_XMLWRITER_H 1" >>confdefs.h -done +fi fi if test "x$ac_cv_header_libxml_xmlreader_h" != "xyes"; then if test "x$with_expat" != "xno"; then - for ac_header in expat.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" -if test "x$ac_cv_header_expat_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EXPAT_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" +if test "x$ac_cv_header_expat_h" = xyes +then : + printf "%s\n" "#define HAVE_EXPAT_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 -$as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } -if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 +printf %s "checking for XML_ParserCreate in -lexpat... " >&6; } +if test ${ac_cv_lib_expat_XML_ParserCreate+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lexpat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16147,33 +16996,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char XML_ParserCreate (); int -main () +main (void) { return XML_ParserCreate (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_expat_XML_ParserCreate=yes -else +else $as_nop ac_cv_lib_expat_XML_ParserCreate=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 -$as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } -if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBEXPAT 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 +printf "%s\n" "$ac_cv_lib_expat_XML_ParserCreate" >&6; } +if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes +then : + printf "%s\n" "#define HAVE_LIBEXPAT 1" >>confdefs.h LIBS="-lexpat $LIBS" @@ -16183,41 +17029,39 @@ fi fi # Check whether --enable-posix-regex-lib was given. -if test "${enable_posix_regex_lib+set}" = set; then : +if test ${enable_posix_regex_lib+y} +then : enableval=$enable_posix_regex_lib; -else +else $as_nop enable_posix_regex_lib=auto fi posix_regex_lib_found= if test "$enable_posix_regex_lib" = "auto" || test "$enable_posix_regex_lib" = "libc" || test "$enable_posix_regex_lib" = "libregex"; then - for ac_header in regex.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default" -if test "x$ac_cv_header_regex_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_REGEX_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default" +if test "x$ac_cv_header_regex_h" = xyes +then : + printf "%s\n" "#define HAVE_REGEX_H 1" >>confdefs.h fi -done - if test "x$ac_cv_header_regex_h" != "xno"; then ac_fn_c_check_func "$LINENO" "regcomp" "ac_cv_func_regcomp" -if test "x$ac_cv_func_regcomp" = xyes; then : +if test "x$ac_cv_func_regcomp" = xyes +then : fi if test "x$ac_cv_func_regcomp" = xyes; then posix_regex_lib_found=1 else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lregex" >&5 -$as_echo_n "checking for regcomp in -lregex... " >&6; } -if ${ac_cv_lib_regex_regcomp+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lregex" >&5 +printf %s "checking for regcomp in -lregex... " >&6; } +if test ${ac_cv_lib_regex_regcomp+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lregex $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16226,33 +17070,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char regcomp (); int -main () +main (void) { return regcomp (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_regex_regcomp=yes -else +else $as_nop ac_cv_lib_regex_regcomp=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_regex_regcomp" >&5 -$as_echo "$ac_cv_lib_regex_regcomp" >&6; } -if test "x$ac_cv_lib_regex_regcomp" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBREGEX 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_regex_regcomp" >&5 +printf "%s\n" "$ac_cv_lib_regex_regcomp" >&6; } +if test "x$ac_cv_lib_regex_regcomp" = xyes +then : + printf "%s\n" "#define HAVE_LIBREGEX 1" >>confdefs.h LIBS="-lregex $LIBS" @@ -16265,23 +17106,19 @@ fi fi fi if test -z $posix_regex_lib_found && (test "$enable_posix_regex_lib" = "auto" || test "$enable_posix_regex_lib" = "libpcreposix"); then - for ac_header in pcreposix.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "pcreposix.h" "ac_cv_header_pcreposix_h" "$ac_includes_default" -if test "x$ac_cv_header_pcreposix_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_PCREPOSIX_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "pcreposix.h" "ac_cv_header_pcreposix_h" "$ac_includes_default" +if test "x$ac_cv_header_pcreposix_h" = xyes +then : + printf "%s\n" "#define HAVE_PCREPOSIX_H 1" >>confdefs.h fi -done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lpcreposix" >&5 -$as_echo_n "checking for regcomp in -lpcreposix... " >&6; } -if ${ac_cv_lib_pcreposix_regcomp+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lpcreposix" >&5 +printf %s "checking for regcomp in -lpcreposix... " >&6; } +if test ${ac_cv_lib_pcreposix_regcomp+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpcreposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16290,47 +17127,45 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char regcomp (); int -main () +main (void) { return regcomp (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_pcreposix_regcomp=yes -else +else $as_nop ac_cv_lib_pcreposix_regcomp=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regcomp" >&5 -$as_echo "$ac_cv_lib_pcreposix_regcomp" >&6; } -if test "x$ac_cv_lib_pcreposix_regcomp" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPCREPOSIX 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regcomp" >&5 +printf "%s\n" "$ac_cv_lib_pcreposix_regcomp" >&6; } +if test "x$ac_cv_lib_pcreposix_regcomp" = xyes +then : + printf "%s\n" "#define HAVE_LIBPCREPOSIX 1" >>confdefs.h LIBS="-lpcreposix $LIBS" fi if test "x$ac_cv_lib_pcreposix_regcomp" != xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: trying libpcreposix check again with libpcre" >&5 -$as_echo "$as_me: trying libpcreposix check again with libpcre" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying libpcreposix check again with libpcre" >&5 +printf "%s\n" "$as_me: trying libpcreposix check again with libpcre" >&6;} unset ac_cv_lib_pcreposix_regcomp - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre_exec in -lpcre" >&5 -$as_echo_n "checking for pcre_exec in -lpcre... " >&6; } -if ${ac_cv_lib_pcre_pcre_exec+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcre_exec in -lpcre" >&5 +printf %s "checking for pcre_exec in -lpcre... " >&6; } +if test ${ac_cv_lib_pcre_pcre_exec+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpcre $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16339,43 +17174,41 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char pcre_exec (); int -main () +main (void) { return pcre_exec (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_pcre_pcre_exec=yes -else +else $as_nop ac_cv_lib_pcre_pcre_exec=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_exec" >&5 -$as_echo "$ac_cv_lib_pcre_pcre_exec" >&6; } -if test "x$ac_cv_lib_pcre_pcre_exec" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPCRE 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_exec" >&5 +printf "%s\n" "$ac_cv_lib_pcre_pcre_exec" >&6; } +if test "x$ac_cv_lib_pcre_pcre_exec" = xyes +then : + printf "%s\n" "#define HAVE_LIBPCRE 1" >>confdefs.h LIBS="-lpcre $LIBS" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lpcreposix" >&5 -$as_echo_n "checking for regcomp in -lpcreposix... " >&6; } -if ${ac_cv_lib_pcreposix_regcomp+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lpcreposix" >&5 +printf %s "checking for regcomp in -lpcreposix... " >&6; } +if test ${ac_cv_lib_pcreposix_regcomp+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpcreposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16384,52 +17217,50 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char regcomp (); int -main () +main (void) { return regcomp (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_pcreposix_regcomp=yes -else +else $as_nop ac_cv_lib_pcreposix_regcomp=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regcomp" >&5 -$as_echo "$ac_cv_lib_pcreposix_regcomp" >&6; } -if test "x$ac_cv_lib_pcreposix_regcomp" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPCREPOSIX 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regcomp" >&5 +printf "%s\n" "$ac_cv_lib_pcreposix_regcomp" >&6; } +if test "x$ac_cv_lib_pcreposix_regcomp" = xyes +then : + printf "%s\n" "#define HAVE_LIBPCREPOSIX 1" >>confdefs.h LIBS="-lpcreposix $LIBS" fi if test "x$ac_cv_lib_pcre_pcre_exec" = xyes && test "x$ac_cv_lib_pcreposix_regcomp" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PCRE_STATIC needs to be defined" >&5 -$as_echo_n "checking if PCRE_STATIC needs to be defined... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if PCRE_STATIC needs to be defined" >&5 +printf %s "checking if PCRE_STATIC needs to be defined... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { return regcomp(NULL, NULL, 0); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : without_pcre_static=yes -else +else $as_nop without_pcre_static=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16437,22 +17268,23 @@ rm -f core conftest.err conftest.$ac_objext \ #include int main() { return regcomp(NULL, NULL, 0); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : with_pcre_static=yes -else +else $as_nop with_pcre_static=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "x$without_pcre_static" != xyes && test "x$with_pcre_static" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define PCRE_STATIC 1" >>confdefs.h +printf "%s\n" "#define PCRE_STATIC 1" >>confdefs.h elif test "x$without_pcre_static" = xyes || test "x$with_pcre_static" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi posix_regex_lib_found=1 fi @@ -16474,12 +17306,13 @@ fi for flag in -Wall -Wformat -Wformat-security; do - as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -$as_echo_n "checking whether C compiler accepts $flag... " >&6; } -if eval \${$as_CACHEVAR+:} false; then : - $as_echo_n "(cached) " >&6 -else + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +printf %s "checking whether C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS $flag" @@ -16487,75 +17320,184 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$as_CACHEVAR=yes" -else +else $as_nop eval "$as_CACHEVAR=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$ax_check_save_flags fi eval ac_res=\$$as_CACHEVAR - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : -if ${CFLAGS+:} false; then : +if test ${CFLAGS+y} +then : case " $CFLAGS " in #( *" $flag "*) : - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 (: CFLAGS already contains $flag) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; #( *) : as_fn_append CFLAGS " $flag" - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 (: CFLAGS="$CFLAGS") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; esac -else +else $as_nop CFLAGS=$flag - { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 (: CFLAGS="$CFLAGS") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } fi -else +else $as_nop : fi done -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else +# Place the functions and data into separate sections, allowing the linker +# to garbage collect the unused ones. +save_LDFLAGS=$LDFLAGS +LDFLAGS="$LDFLAGS -Wl,--gc-sections" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ld supports --gc-sections" >&5 +printf %s "checking whether ld supports --gc-sections... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +static char UnusedFunc() { return 5; } int main() { return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + GC_SECTIONS="-Wl,--gc-sections"; + + + + +for flag in -ffunction-sections -fdata-sections; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +printf %s "checking whether C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${CFLAGS+y} +then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else $as_nop + + CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else $as_nop + : +fi + +done + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + GC_SECTIONS=""; +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LDFLAGS=$save_LDFLAGS + + + +# Checks for typedefs, structures, and compiler characteristics. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) { #ifndef __cplusplus @@ -16568,7 +17510,7 @@ main () /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. + /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ @@ -16596,7 +17538,7 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; @@ -16612,115 +17554,109 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_const=yes -else +else $as_nop ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -$as_echo "#define const /**/" >>confdefs.h +printf "%s\n" "#define const /**/" >>confdefs.h fi # la_TYPE_UID_T defaults to "int", which is incorrect for MinGW # and MSVC. Use a customized version. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 -$as_echo_n "checking for uid_t in sys/types.h... " >&6; } -if ${la_cv_type_uid_t+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +printf %s "checking for uid_t in sys/types.h... " >&6; } +if test ${la_cv_type_uid_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "uid_t" >/dev/null 2>&1; then : + $EGREP "uid_t" >/dev/null 2>&1 +then : la_cv_type_uid_t=yes -else +else $as_nop la_cv_type_uid_t=no fi -rm -f conftest* +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $la_cv_type_uid_t" >&5 -$as_echo "$la_cv_type_uid_t" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $la_cv_type_uid_t" >&5 +printf "%s\n" "$la_cv_type_uid_t" >&6; } if test $la_cv_type_uid_t = no; then case $host in *mingw*) def_uid_t=short ;; *) def_uid_t=int ;; esac -cat >>confdefs.h <<_ACEOF -#define uid_t $def_uid_t -_ACEOF +printf "%s\n" "#define uid_t $def_uid_t" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define gid_t $def_uid_t -_ACEOF +printf "%s\n" "#define gid_t $def_uid_t" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" -if test "x$ac_cv_type_mode_t" = xyes; then : +if test "x$ac_cv_type_mode_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define mode_t int -_ACEOF +printf "%s\n" "#define mode_t int" >>confdefs.h fi # AC_TYPE_OFF_T defaults to "long", which limits us to 4GB files on # most systems... default to "long long" instead. ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : +if test "x$ac_cv_type_off_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define off_t long long -_ACEOF +printf "%s\n" "#define off_t long long" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +if test "x$ac_cv_type_size_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "id_t" "ac_cv_type_id_t" "$ac_includes_default" -if test "x$ac_cv_type_id_t" = xyes; then : +if test "x$ac_cv_type_id_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define id_t unsigned long -_ACEOF +printf "%s\n" "#define id_t unsigned long" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" -if test "x$ac_cv_type_uintptr_t" = xyes; then : +if test "x$ac_cv_type_uintptr_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define uintptr_t unsigned int -_ACEOF +printf "%s\n" "#define uintptr_t unsigned int" >>confdefs.h fi @@ -16730,11 +17666,10 @@ ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_t #include " -if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : +if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_TM_TM_GMTOFF 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_TM_TM_GMTOFF 1" >>confdefs.h fi @@ -16742,11 +17677,10 @@ ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm #include " -if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : +if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_TM___TM_GMTOFF 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_TM___TM_GMTOFF 1" >>confdefs.h fi @@ -16758,11 +17692,10 @@ ac_fn_c_check_member "$LINENO" "struct statfs" "f_namemax" "ac_cv_member_struct_ #include " -if test "x$ac_cv_member_struct_statfs_f_namemax" = xyes; then : +if test "x$ac_cv_member_struct_statfs_f_namemax" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STATFS_F_NAMEMAX 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STATFS_F_NAMEMAX 1" >>confdefs.h fi @@ -16774,11 +17707,10 @@ ac_fn_c_check_member "$LINENO" "struct statfs" "f_iosize" "ac_cv_member_struct_s #include " -if test "x$ac_cv_member_struct_statfs_f_iosize" = xyes; then : +if test "x$ac_cv_member_struct_statfs_f_iosize" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STATFS_F_IOSIZE 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STATFS_F_IOSIZE 1" >>confdefs.h fi @@ -16789,11 +17721,10 @@ ac_fn_c_check_member "$LINENO" "struct statvfs" "f_iosize" "ac_cv_member_struct_ #include " -if test "x$ac_cv_member_struct_statvfs_f_iosize" = xyes; then : +if test "x$ac_cv_member_struct_statvfs_f_iosize" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STATVFS_F_IOSIZE 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STATVFS_F_IOSIZE 1" >>confdefs.h fi @@ -16801,11 +17732,10 @@ fi # Check for birthtime in struct stat ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1" >>confdefs.h fi @@ -16813,83 +17743,75 @@ fi # Check for high-resolution timestamps in struct stat ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimespec.tv_nsec" "ac_cv_member_struct_stat_st_mtimespec_tv_nsec" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_mtimespec_tv_nsec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_mtimespec_tv_nsec" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim.tv_nsec" "ac_cv_member_struct_stat_st_mtim_tv_nsec" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_mtim_tv_nsec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_mtim_tv_nsec" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct stat" "st_mtime_n" "ac_cv_member_struct_stat_st_mtime_n" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_mtime_n" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_mtime_n" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_MTIME_N 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIME_N 1" >>confdefs.h fi # AIX ac_fn_c_check_member "$LINENO" "struct stat" "st_umtime" "ac_cv_member_struct_stat_st_umtime" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_umtime" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_umtime" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_UMTIME 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_UMTIME 1" >>confdefs.h fi # Tru64 ac_fn_c_check_member "$LINENO" "struct stat" "st_mtime_usec" "ac_cv_member_struct_stat_st_mtime_usec" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_mtime_usec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_mtime_usec" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_MTIME_USEC 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIME_USEC 1" >>confdefs.h fi # Hurd # Check for block size support in struct stat ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_blksize" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLKSIZE 1" >>confdefs.h fi # Check for st_flags in struct stat (BSD fflags) ac_fn_c_check_member "$LINENO" "struct stat" "st_flags" "ac_cv_member_struct_stat_st_flags" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_flags" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_flags" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STAT_ST_FLAGS 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_FLAGS 1" >>confdefs.h fi @@ -16899,20 +17821,18 @@ fi # If you have unsigned long long, we assume printf supports %llu # TODO: Check for %ju and %llu support directly. ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" -if test "x$ac_cv_type_uintmax_t" = xyes; then : +if test "x$ac_cv_type_uintmax_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UINTMAX_T 1 -_ACEOF +printf "%s\n" "#define HAVE_UINTMAX_T 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" -if test "x$ac_cv_type_unsigned_long_long" = xyes; then : +if test "x$ac_cv_type_unsigned_long_long" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UNSIGNED_LONG_LONG 1 -_ACEOF +printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h fi @@ -16921,14 +17841,17 @@ fi # We use C99-style integer types # Declare them if the local platform doesn't already do so. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 -$as_echo_n "checking for unsigned long long int... " >&6; } -if ${ac_cv_type_unsigned_long_long_int+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 +printf %s "checking for unsigned long long int... " >&6; } +if test ${ac_cv_type_unsigned_long_long_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_type_unsigned_long_long_int=yes - if test "x${ac_cv_prog_cc_c99-no}" = xno; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + case $ac_prog_cc_stdc in + no | c89) ;; + *) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* For now, do not test the preprocessor; as of 2007 there are too many @@ -16946,7 +17869,7 @@ else ? 1 : -1)]; int i = 63; int -main () +main (void) { /* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; @@ -16960,98 +17883,103 @@ main () } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : -else +else $as_nop ac_cv_type_unsigned_long_long_int=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext;; + esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 -$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 +printf "%s\n" "$ac_cv_type_unsigned_long_long_int" >&6; } if test $ac_cv_type_unsigned_long_long_int = yes; then -$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h +printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 -$as_echo_n "checking for long long int... " >&6; } -if ${ac_cv_type_long_long_int+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +printf %s "checking for long long int... " >&6; } +if test ${ac_cv_type_long_long_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_type_long_long_int=yes - if test "x${ac_cv_prog_cc_c99-no}" = xno; then - ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int - if test $ac_cv_type_long_long_int = yes; then - if test "$cross_compiling" = yes; then : + case $ac_prog_cc_stdc in + no | c89) ;; + *) + ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int + if test $ac_cv_type_long_long_int = yes; then + if test "$cross_compiling" = yes +then : : -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - #ifndef LLONG_MAX - # define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - # define LLONG_MAX (HALF - 1 + HALF) - #endif + #ifndef LLONG_MAX + # define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + # define LLONG_MAX (HALF - 1 + HALF) + #endif int -main () +main (void) { long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0; ; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : -else +else $as_nop ac_cv_type_long_long_int=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi - fi + fi;; + esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 -$as_echo "$ac_cv_type_long_long_int" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 +printf "%s\n" "$ac_cv_type_long_long_int" >&6; } if test $ac_cv_type_long_long_int = yes; then -$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h +printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default" -if test "x$ac_cv_type_intmax_t" = xyes; then : +if test "x$ac_cv_type_intmax_t" = xyes +then : -$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h +printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h -else +else $as_nop test $ac_cv_type_long_long_int = yes \ && ac_type='long long int' \ || ac_type='long int' -cat >>confdefs.h <<_ACEOF -#define intmax_t $ac_type -_ACEOF +printf "%s\n" "#define intmax_t $ac_type" >>confdefs.h fi @@ -17059,18 +17987,17 @@ fi ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" -if test "x$ac_cv_type_uintmax_t" = xyes; then : +if test "x$ac_cv_type_uintmax_t" = xyes +then : -$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h +printf "%s\n" "#define HAVE_UINTMAX_T 1" >>confdefs.h -else +else $as_nop test $ac_cv_type_unsigned_long_long_int = yes \ && ac_type='unsigned long long int' \ || ac_type='unsigned long int' -cat >>confdefs.h <<_ACEOF -#define uintmax_t $ac_type -_ACEOF +printf "%s\n" "#define uintmax_t $ac_type" >>confdefs.h fi @@ -17080,9 +18007,7 @@ case $ac_cv_c_int64_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<_ACEOF -#define int64_t $ac_cv_c_int64_t -_ACEOF +printf "%s\n" "#define int64_t $ac_cv_c_int64_t" >>confdefs.h ;; esac @@ -17091,12 +18016,10 @@ case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT64_T 1" >>confdefs.h +printf "%s\n" "#define _UINT64_T 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define uint64_t $ac_cv_c_uint64_t -_ACEOF +printf "%s\n" "#define uint64_t $ac_cv_c_uint64_t" >>confdefs.h ;; esac @@ -17105,9 +18028,7 @@ case $ac_cv_c_int32_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<_ACEOF -#define int32_t $ac_cv_c_int32_t -_ACEOF +printf "%s\n" "#define int32_t $ac_cv_c_int32_t" >>confdefs.h ;; esac @@ -17116,12 +18037,10 @@ case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT32_T 1" >>confdefs.h +printf "%s\n" "#define _UINT32_T 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define uint32_t $ac_cv_c_uint32_t -_ACEOF +printf "%s\n" "#define uint32_t $ac_cv_c_uint32_t" >>confdefs.h ;; esac @@ -17130,9 +18049,7 @@ case $ac_cv_c_int16_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<_ACEOF -#define int16_t $ac_cv_c_int16_t -_ACEOF +printf "%s\n" "#define int16_t $ac_cv_c_int16_t" >>confdefs.h ;; esac @@ -17142,9 +18059,7 @@ case $ac_cv_c_uint16_t in #( *) -cat >>confdefs.h <<_ACEOF -#define uint16_t $ac_cv_c_uint16_t -_ACEOF +printf "%s\n" "#define uint16_t $ac_cv_c_uint16_t" >>confdefs.h ;; esac @@ -17153,166 +18068,225 @@ case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT8_T 1" >>confdefs.h +printf "%s\n" "#define _UINT8_T 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define uint8_t $ac_cv_c_uint8_t -_ACEOF +printf "%s\n" "#define uint8_t $ac_cv_c_uint8_t" >>confdefs.h ;; esac -ac_fn_c_check_decl "$LINENO" "SIZE_MAX" "ac_cv_have_decl_SIZE_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_SIZE_MAX" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_fn_check_decl "$LINENO" "SIZE_MAX" "ac_cv_have_decl_SIZE_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SIZE_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SIZE_MAX $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "INT32_MAX" "ac_cv_have_decl_INT32_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_INT32_MAX" = xyes; then : +printf "%s\n" "#define HAVE_DECL_SIZE_MAX $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "INT32_MAX" "ac_cv_have_decl_INT32_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INT32_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INT32_MAX $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "INT32_MIN" "ac_cv_have_decl_INT32_MIN" "$ac_includes_default" -if test "x$ac_cv_have_decl_INT32_MIN" = xyes; then : +printf "%s\n" "#define HAVE_DECL_INT32_MAX $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "INT32_MIN" "ac_cv_have_decl_INT32_MIN" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INT32_MIN" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_INT32_MIN $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INT32_MIN $ac_have_decl -_ACEOF - -ac_fn_c_check_decl "$LINENO" "INT64_MAX" "ac_cv_have_decl_INT64_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_INT64_MAX" = xyes; then : +ac_fn_check_decl "$LINENO" "INT64_MAX" "ac_cv_have_decl_INT64_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INT64_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INT64_MAX $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "INT64_MIN" "ac_cv_have_decl_INT64_MIN" "$ac_includes_default" -if test "x$ac_cv_have_decl_INT64_MIN" = xyes; then : +printf "%s\n" "#define HAVE_DECL_INT64_MAX $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "INT64_MIN" "ac_cv_have_decl_INT64_MIN" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INT64_MIN" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INT64_MIN $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "UINT64_MAX" "ac_cv_have_decl_UINT64_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_UINT64_MAX" = xyes; then : +printf "%s\n" "#define HAVE_DECL_INT64_MIN $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "UINT64_MAX" "ac_cv_have_decl_UINT64_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_UINT64_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_UINT64_MAX $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "UINT32_MAX" "ac_cv_have_decl_UINT32_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_UINT32_MAX" = xyes; then : +printf "%s\n" "#define HAVE_DECL_UINT64_MAX $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "UINT32_MAX" "ac_cv_have_decl_UINT32_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_UINT32_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_UINT32_MAX $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_UINT32_MAX $ac_have_decl -_ACEOF - -ac_fn_c_check_decl "$LINENO" "INTMAX_MAX" "ac_cv_have_decl_INTMAX_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_INTMAX_MAX" = xyes; then : +ac_fn_check_decl "$LINENO" "INTMAX_MAX" "ac_cv_have_decl_INTMAX_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INTMAX_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INTMAX_MAX $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "INTMAX_MIN" "ac_cv_have_decl_INTMAX_MIN" "$ac_includes_default" -if test "x$ac_cv_have_decl_INTMAX_MIN" = xyes; then : +printf "%s\n" "#define HAVE_DECL_INTMAX_MAX $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "INTMAX_MIN" "ac_cv_have_decl_INTMAX_MIN" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INTMAX_MIN" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_INTMAX_MIN $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "UINTMAX_MAX" "ac_cv_have_decl_UINTMAX_MAX" "$ac_includes_default" -if test "x$ac_cv_have_decl_UINTMAX_MAX" = xyes; then : +printf "%s\n" "#define HAVE_DECL_INTMAX_MIN $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "UINTMAX_MAX" "ac_cv_have_decl_UINTMAX_MAX" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_UINTMAX_MAX" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_UINTMAX_MAX $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DECL_UINTMAX_MAX $ac_have_decl" >>confdefs.h -ac_fn_c_check_decl "$LINENO" "SSIZE_MAX" "ac_cv_have_decl_SSIZE_MAX" "#include -" -if test "x$ac_cv_have_decl_SSIZE_MAX" = xyes; then : +ac_fn_check_decl "$LINENO" "SSIZE_MAX" "ac_cv_have_decl_SSIZE_MAX" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SSIZE_MAX" = xyes +then : -$as_echo "#define HAVE_DECL_SSIZE_MAX 1" >>confdefs.h +printf "%s\n" "#define HAVE_DECL_SSIZE_MAX 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "EFTYPE" "ac_cv_have_decl_EFTYPE" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_EFTYPE" = xyes +then : -ac_fn_c_check_decl "$LINENO" "EFTYPE" "ac_cv_have_decl_EFTYPE" "#include -" -if test "x$ac_cv_have_decl_EFTYPE" = xyes; then : - -$as_echo "#define HAVE_EFTYPE 1" >>confdefs.h +printf "%s\n" "#define HAVE_EFTYPE 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "EILSEQ" "ac_cv_have_decl_EILSEQ" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_EILSEQ" = xyes +then : -ac_fn_c_check_decl "$LINENO" "EILSEQ" "ac_cv_have_decl_EILSEQ" "#include -" -if test "x$ac_cv_have_decl_EILSEQ" = xyes; then : - -$as_echo "#define HAVE_EILSEQ 1" >>confdefs.h +printf "%s\n" "#define HAVE_EILSEQ 1" >>confdefs.h fi - ac_fn_c_check_type "$LINENO" "wchar_t" "ac_cv_type_wchar_t" "$ac_includes_default" -if test "x$ac_cv_type_wchar_t" = xyes; then : +if test "x$ac_cv_type_wchar_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_WCHAR_T 1 -_ACEOF +printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 -$as_echo_n "checking size of wchar_t... " >&6; } -if ${ac_cv_sizeof_wchar_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default"; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 +printf %s "checking size of wchar_t... " >&6; } +if test ${ac_cv_sizeof_wchar_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default" +then : -else +else $as_nop if test "$ac_cv_type_wchar_t" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (wchar_t) See \`config.log' for more details" "$LINENO" 5; } else @@ -17321,62 +18295,117 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5 -$as_echo "$ac_cv_sizeof_wchar_t" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5 +printf "%s\n" "$ac_cv_sizeof_wchar_t" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t -_ACEOF +printf "%s\n" "#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +printf %s "checking size of int... " >&6; } +if test ${ac_cv_sizeof_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #include -#include -#include + int -main () +main (void) { -if ((struct tm *) 0) -return 0; +switch (0) case 0: case (sizeof (int) == $ac_size):; ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sizeof_int=$ac_size fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test x$ac_cv_sizeof_int != x ; then break; fi +done fi +if test x$ac_cv_sizeof_int = x ; then + as_fn_error $? "cannot determine a size for int" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +printf "%s\n" "$ac_cv_sizeof_int" >&6; } + +printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +printf %s "checking size of long... " >&6; } +if test ${ac_cv_sizeof_long+y} +then : + printf %s "(cached) " >&6 +else $as_nop + for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + + +int +main (void) +{ +switch (0) case 0: case (sizeof (long) == $ac_size):; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sizeof_long=$ac_size +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test x$ac_cv_sizeof_long != x ; then break; fi +done + +fi + +if test x$ac_cv_sizeof_long = x ; then + as_fn_error $? "cannot determine a size for long" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +printf "%s\n" "$ac_cv_sizeof_long" >&6; } + +printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h + + + + + +# Obsolete code to be removed. +if test $ac_cv_header_sys_time_h = yes; then + +printf "%s\n" "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi +# End of obsolete code. + # Checks for library functions. if test $ac_cv_c_compiler_gnu = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 -$as_echo_n "checking whether $CC needs -traditional... " >&6; } -if ${ac_cv_prog_gcc_traditional+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +printf %s "checking whether $CC needs -traditional... " >&6; } +if test ${ac_cv_prog_gcc_traditional+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -17384,12 +18413,13 @@ else Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then : + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : ac_cv_prog_gcc_traditional=yes -else +else $as_nop ac_cv_prog_gcc_traditional=no fi -rm -f conftest* +rm -rf conftest* if test $ac_cv_prog_gcc_traditional = no; then @@ -17399,82 +18429,54 @@ rm -f conftest* Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then : + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : ac_cv_prog_gcc_traditional=yes fi -rm -f conftest* +rm -rf conftest* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 -$as_echo "$ac_cv_prog_gcc_traditional" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5 -$as_echo_n "checking whether sys/types.h defines makedev... " >&6; } -if ${ac_cv_header_sys_types_h_makedev+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -return makedev(0, 0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_header_sys_types_h_makedev=yes -else - ac_cv_header_sys_types_h_makedev=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_types_h_makedev" >&5 -$as_echo "$ac_cv_header_sys_types_h_makedev" >&6; } +ac_fn_c_check_header_compile "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mkdev_h" = xyes +then : -if test $ac_cv_header_sys_types_h_makedev = no; then -ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mkdev_h" = xyes; then : - -$as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h +printf "%s\n" "#define MAJOR_IN_MKDEV 1" >>confdefs.h fi +if test $ac_cv_header_sys_mkdev_h = no; then + ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sysmacros_h" = xyes +then : - - if test $ac_cv_header_sys_mkdev_h = no; then - ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then : - -$as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h +printf "%s\n" "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h fi - - fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 -$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } -if ${ac_cv_sys_largefile_source+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 +printf %s "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_source+y} +then : + printf %s "(cached) " >&6 +else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int -main () +main (void) { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); @@ -17482,10 +18484,11 @@ int (*fp) (FILE *, off_t, int) = fseeko; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_sys_largefile_source=no; break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -17493,7 +18496,7 @@ rm -f core conftest.err conftest.$ac_objext \ #include /* for off_t */ #include int -main () +main (void) { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); @@ -17501,23 +18504,22 @@ int (*fp) (FILE *, off_t, int) = fseeko; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_sys_largefile_source=1; break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 -$as_echo "$ac_cv_sys_largefile_source" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 +printf "%s\n" "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) -cat >>confdefs.h <<_ACEOF -#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source -_ACEOF +printf "%s\n" "#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source" >>confdefs.h ;; esac rm -rf conftest* @@ -17527,23 +18529,25 @@ rm -rf conftest* # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then -$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h +printf "%s\n" "#define HAVE_FSEEKO 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 -$as_echo_n "checking for working memcmp... " >&6; } -if ${ac_cv_func_memcmp_working+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 +printf %s "checking for working memcmp... " >&6; } +if test ${ac_cv_func_memcmp_working+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_func_memcmp_working=no -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { /* Some versions of memcmp are not 8-bit clean. */ @@ -17574,9 +18578,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_memcmp_working=yes -else +else $as_nop ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -17584,8 +18589,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 -$as_echo "$ac_cv_func_memcmp_working" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 +printf "%s\n" "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" @@ -17593,22 +18598,29 @@ test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 -$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } -if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 +printf %s "checking whether lstat correctly handles trailing slash... " >&6; } +if test ${ac_cv_func_lstat_dereferences_slashed_symlink+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then - if test "$cross_compiling" = yes; then : - ac_cv_func_lstat_dereferences_slashed_symlink=no -else + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on glibc systems. + *-gnu*) ac_cv_func_lstat_dereferences_slashed_symlink=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_lstat_dereferences_slashed_symlink=no ;; + esac +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. @@ -17619,9 +18631,10 @@ struct stat sbuf; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_lstat_dereferences_slashed_symlink=yes -else +else $as_nop ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -17636,14 +18649,12 @@ fi rm -f conftest.sym conftest.file fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 -$as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +printf "%s\n" "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && -cat >>confdefs.h <<_ACEOF -#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 -_ACEOF +printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then @@ -17655,19 +18666,21 @@ esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat accepts an empty string" >&5 -$as_echo_n "checking whether lstat accepts an empty string... " >&6; } -if ${ac_cv_func_lstat_empty_string_bug+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat accepts an empty string" >&5 +printf %s "checking whether lstat accepts an empty string... " >&6; } +if test ${ac_cv_func_lstat_empty_string_bug+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_func_lstat_empty_string_bug=yes -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { struct stat sbuf; return lstat ("", &sbuf) == 0; @@ -17675,9 +18688,10 @@ struct stat sbuf; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_lstat_empty_string_bug=no -else +else $as_nop ac_cv_func_lstat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -17685,8 +18699,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_empty_string_bug" >&5 -$as_echo "$ac_cv_func_lstat_empty_string_bug" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_empty_string_bug" >&5 +printf "%s\n" "$ac_cv_func_lstat_empty_string_bug" >&6; } if test $ac_cv_func_lstat_empty_string_bug = yes; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; @@ -17695,25 +18709,25 @@ if test $ac_cv_func_lstat_empty_string_bug = yes; then esac -cat >>confdefs.h <<_ACEOF -#define HAVE_LSTAT_EMPTY_STRING_BUG 1 -_ACEOF +printf "%s\n" "#define HAVE_LSTAT_EMPTY_STRING_BUG 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 -$as_echo_n "checking whether stat accepts an empty string... " >&6; } -if ${ac_cv_func_stat_empty_string_bug+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 +printf %s "checking whether stat accepts an empty string... " >&6; } +if test ${ac_cv_func_stat_empty_string_bug+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_func_stat_empty_string_bug=yes -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { struct stat sbuf; return stat ("", &sbuf) == 0; @@ -17721,9 +18735,10 @@ struct stat sbuf; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_stat_empty_string_bug=no -else +else $as_nop ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -17731,8 +18746,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 -$as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 +printf "%s\n" "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; @@ -17741,47 +18756,43 @@ if test $ac_cv_func_stat_empty_string_bug = yes; then esac -cat >>confdefs.h <<_ACEOF -#define HAVE_STAT_EMPTY_STRING_BUG 1 -_ACEOF +printf "%s\n" "#define HAVE_STAT_EMPTY_STRING_BUG 1" >>confdefs.h fi -ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" -if test "x$ac_cv_have_decl_strerror_r" = xyes; then : +ac_fn_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strerror_r" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_STRERROR_R $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_STRERROR_R $ac_have_decl -_ACEOF -for ac_func in strerror_r -do : - ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" -if test "x$ac_cv_func_strerror_r" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STRERROR_R 1 -_ACEOF +if test $ac_cv_have_decl_strerror_r = yes; then + # For backward compatibility's sake, define HAVE_STRERROR_R. + # (We used to run AC_CHECK_FUNCS_ONCE for strerror_r, as well + # as AC_CHECK_DECLS_ONCE.) + +printf "%s\n" "#define HAVE_STRERROR_R 1" >>confdefs.h fi -done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 -$as_echo_n "checking whether strerror_r returns char *... " >&6; } -if ${ac_cv_func_strerror_r_char_p+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 +printf %s "checking whether strerror_r returns char *... " >&6; } +if test ${ac_cv_func_strerror_r_char_p+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_includes_default +#include int -main () +main (void) { char buf[100]; @@ -17793,67 +18804,39 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_strerror_r_char_p=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - else - # strerror_r is not declared. Choose between - # systems that have relatively inaccessible declarations for the - # function. BeOS and DEC UNIX 4.0 fall in this category, but the - # former has a strerror_r that returns char*, while the latter - # has a strerror_r that returns `int'. - # This test should segfault on the DEC system. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default - extern char *strerror_r (); -int -main () -{ -char buf[100]; - char x = *strerror_r (0, buf, sizeof buf); - return ! isalpha (x); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_strerror_r_char_p=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 -$as_echo "$ac_cv_func_strerror_r_char_p" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 +printf "%s\n" "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then -$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h +printf "%s\n" "#define STRERROR_R_CHAR_P 1" >>confdefs.h fi -for ac_func in strftime + + for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" -if test "x$ac_cv_func_strftime" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STRFTIME 1 -_ACEOF +if test "x$ac_cv_func_strftime" = xyes +then : + printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h -else +else $as_nop # strftime is in -lintl on SCO UNIX. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 -$as_echo_n "checking for strftime in -lintl... " >&6; } -if ${ac_cv_lib_intl_strftime+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 +printf %s "checking for strftime in -lintl... " >&6; } +if test ${ac_cv_lib_intl_strftime+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -17862,66 +18845,72 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char strftime (); int -main () +main (void) { return strftime (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_intl_strftime=yes -else +else $as_nop ac_cv_lib_intl_strftime=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 -$as_echo "$ac_cv_lib_intl_strftime" >&6; } -if test "x$ac_cv_lib_intl_strftime" = xyes; then : - $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 +printf "%s\n" "$ac_cv_lib_intl_strftime" >&6; } +if test "x$ac_cv_lib_intl_strftime" = xyes +then : + printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi + +done +ac_func= +for ac_item in $ac_func_c_list +do + if test $ac_func; then + ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func + if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then + echo "#define $ac_item 1" >> confdefs.h + fi + ac_func= + else + ac_func=$ac_item + fi done -for ac_func in vprintf -do : - ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" -if test "x$ac_cv_func_vprintf" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VPRINTF 1 -_ACEOF +if test "x$ac_cv_func_vprintf" = xno +then : + ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = xyes +then : -ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" -if test "x$ac_cv_func__doprnt" = xyes; then : - -$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h +printf "%s\n" "#define HAVE_DOPRNT 1" >>confdefs.h fi fi -done - - # check for: # CreateHardLinkA(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES) # To avoid necessity for including windows.h or special forward declaration # workarounds, we use 'void *' for 'struct SECURITY_ATTRIBUTES *' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CreateHardLinkA" >&5 -$as_echo_n "checking for CreateHardLinkA... " >&6; } -if ${ac_cv_func_CreateHardLinkA+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CreateHardLinkA" >&5 +printf %s "checking for CreateHardLinkA... " >&6; } +if test ${ac_cv_func_CreateHardLinkA+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, @@ -17937,7 +18926,7 @@ char __stdcall CreateHardLinkA ( const char *, const char *, void * ); char (*f) ( const char *, const char *, void * ); int -main () +main (void) { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named @@ -17952,233 +18941,561 @@ f = CreateHardLinkA; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_func_CreateHardLinkA=yes -else +else $as_nop ac_cv_func_CreateHardLinkA=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_CreateHardLinkA" >&5 -$as_echo "$ac_cv_func_CreateHardLinkA" >&6; } -if test $ac_cv_func_CreateHardLinkA = yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_CreateHardLinkA" >&5 +printf "%s\n" "$ac_cv_func_CreateHardLinkA" >&6; } +if test $ac_cv_func_CreateHardLinkA = yes +then : fi -for ac_func in arc4random_buf chflags chown chroot ctime_r -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "arc4random_buf" "ac_cv_func_arc4random_buf" +if test "x$ac_cv_func_arc4random_buf" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h fi -done - -for ac_func in fchdir fchflags fchmod fchown fcntl fdopendir fork -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "chflags" "ac_cv_func_chflags" +if test "x$ac_cv_func_chflags" = xyes +then : + printf "%s\n" "#define HAVE_CHFLAGS 1" >>confdefs.h fi -done - -for ac_func in fstat fstatat fstatfs fstatvfs ftruncate -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "chown" "ac_cv_func_chown" +if test "x$ac_cv_func_chown" = xyes +then : + printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h fi -done - -for ac_func in futimens futimes futimesat -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "chroot" "ac_cv_func_chroot" +if test "x$ac_cv_func_chroot" = xyes +then : + printf "%s\n" "#define HAVE_CHROOT 1" >>confdefs.h fi -done - -for ac_func in geteuid getpid getgrgid_r getgrnam_r -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "ctime_r" "ac_cv_func_ctime_r" +if test "x$ac_cv_func_ctime_r" = xyes +then : + printf "%s\n" "#define HAVE_CTIME_R 1" >>confdefs.h fi -done -for ac_func in getpwnam_r getpwuid_r getvfsbyname gmtime_r -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fchdir" "ac_cv_func_fchdir" +if test "x$ac_cv_func_fchdir" = xyes +then : + printf "%s\n" "#define HAVE_FCHDIR 1" >>confdefs.h fi -done - -for ac_func in lchflags lchmod lchown link linkat localtime_r lstat lutimes -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fchflags" "ac_cv_func_fchflags" +if test "x$ac_cv_func_fchflags" = xyes +then : + printf "%s\n" "#define HAVE_FCHFLAGS 1" >>confdefs.h fi -done - -for ac_func in mbrtowc memmove memset -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fchmod" "ac_cv_func_fchmod" +if test "x$ac_cv_func_fchmod" = xyes +then : + printf "%s\n" "#define HAVE_FCHMOD 1" >>confdefs.h fi -done - -for ac_func in mkdir mkfifo mknod mkstemp -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" +if test "x$ac_cv_func_fchown" = xyes +then : + printf "%s\n" "#define HAVE_FCHOWN 1" >>confdefs.h fi -done - -for ac_func in nl_langinfo openat pipe poll posix_spawnp readlink readlinkat -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl" +if test "x$ac_cv_func_fcntl" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h fi -done - -for ac_func in readpassphrase -do : - ac_fn_c_check_func "$LINENO" "readpassphrase" "ac_cv_func_readpassphrase" -if test "x$ac_cv_func_readpassphrase" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_READPASSPHRASE 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fdopendir" "ac_cv_func_fdopendir" +if test "x$ac_cv_func_fdopendir" = xyes +then : + printf "%s\n" "#define HAVE_FDOPENDIR 1" >>confdefs.h fi -done - -for ac_func in select setenv setlocale sigaction statfs statvfs -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fork" "ac_cv_func_fork" +if test "x$ac_cv_func_fork" = xyes +then : + printf "%s\n" "#define HAVE_FORK 1" >>confdefs.h fi -done -for ac_func in strchr strdup strerror strncpy_s strnlen strrchr symlink -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fstat" "ac_cv_func_fstat" +if test "x$ac_cv_func_fstat" = xyes +then : + printf "%s\n" "#define HAVE_FSTAT 1" >>confdefs.h fi -done - -for ac_func in timegm tzset unlinkat unsetenv utime utimensat utimes vfork -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fstatat" "ac_cv_func_fstatat" +if test "x$ac_cv_func_fstatat" = xyes +then : + printf "%s\n" "#define HAVE_FSTATAT 1" >>confdefs.h fi -done - -for ac_func in wcrtomb wcscmp wcscpy wcslen wctomb wmemcmp wmemcpy wmemmove -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fstatfs" "ac_cv_func_fstatfs" +if test "x$ac_cv_func_fstatfs" = xyes +then : + printf "%s\n" "#define HAVE_FSTATFS 1" >>confdefs.h fi -done - -for ac_func in _ctime64_s _fseeki64 -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "fstatvfs" "ac_cv_func_fstatvfs" +if test "x$ac_cv_func_fstatvfs" = xyes +then : + printf "%s\n" "#define HAVE_FSTATVFS 1" >>confdefs.h fi -done - -for ac_func in _get_timezone _gmtime64_s _localtime64_s _mkgmtime64 -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "ftruncate" "ac_cv_func_ftruncate" +if test "x$ac_cv_func_ftruncate" = xyes +then : + printf "%s\n" "#define HAVE_FTRUNCATE 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "futimens" "ac_cv_func_futimens" +if test "x$ac_cv_func_futimens" = xyes +then : + printf "%s\n" "#define HAVE_FUTIMENS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "futimes" "ac_cv_func_futimes" +if test "x$ac_cv_func_futimes" = xyes +then : + printf "%s\n" "#define HAVE_FUTIMES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "futimesat" "ac_cv_func_futimesat" +if test "x$ac_cv_func_futimesat" = xyes +then : + printf "%s\n" "#define HAVE_FUTIMESAT 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" +if test "x$ac_cv_func_geteuid" = xyes +then : + printf "%s\n" "#define HAVE_GETEUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpid" "ac_cv_func_getpid" +if test "x$ac_cv_func_getpid" = xyes +then : + printf "%s\n" "#define HAVE_GETPID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getgrgid_r" "ac_cv_func_getgrgid_r" +if test "x$ac_cv_func_getgrgid_r" = xyes +then : + printf "%s\n" "#define HAVE_GETGRGID_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getgrnam_r" "ac_cv_func_getgrnam_r" +if test "x$ac_cv_func_getgrnam_r" = xyes +then : + printf "%s\n" "#define HAVE_GETGRNAM_R 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "getpwnam_r" "ac_cv_func_getpwnam_r" +if test "x$ac_cv_func_getpwnam_r" = xyes +then : + printf "%s\n" "#define HAVE_GETPWNAM_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpwuid_r" "ac_cv_func_getpwuid_r" +if test "x$ac_cv_func_getpwuid_r" = xyes +then : + printf "%s\n" "#define HAVE_GETPWUID_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getvfsbyname" "ac_cv_func_getvfsbyname" +if test "x$ac_cv_func_getvfsbyname" = xyes +then : + printf "%s\n" "#define HAVE_GETVFSBYNAME 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r" +if test "x$ac_cv_func_gmtime_r" = xyes +then : + printf "%s\n" "#define HAVE_GMTIME_R 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "lchflags" "ac_cv_func_lchflags" +if test "x$ac_cv_func_lchflags" = xyes +then : + printf "%s\n" "#define HAVE_LCHFLAGS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "lchmod" "ac_cv_func_lchmod" +if test "x$ac_cv_func_lchmod" = xyes +then : + printf "%s\n" "#define HAVE_LCHMOD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "lchown" "ac_cv_func_lchown" +if test "x$ac_cv_func_lchown" = xyes +then : + printf "%s\n" "#define HAVE_LCHOWN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "link" "ac_cv_func_link" +if test "x$ac_cv_func_link" = xyes +then : + printf "%s\n" "#define HAVE_LINK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "linkat" "ac_cv_func_linkat" +if test "x$ac_cv_func_linkat" = xyes +then : + printf "%s\n" "#define HAVE_LINKAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" +if test "x$ac_cv_func_localtime_r" = xyes +then : + printf "%s\n" "#define HAVE_LOCALTIME_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" +if test "x$ac_cv_func_lstat" = xyes +then : + printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "lutimes" "ac_cv_func_lutimes" +if test "x$ac_cv_func_lutimes" = xyes +then : + printf "%s\n" "#define HAVE_LUTIMES 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc" +if test "x$ac_cv_func_mbrtowc" = xyes +then : + printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes +then : + printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset" +if test "x$ac_cv_func_memset" = xyes +then : + printf "%s\n" "#define HAVE_MEMSET 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mkdir" "ac_cv_func_mkdir" +if test "x$ac_cv_func_mkdir" = xyes +then : + printf "%s\n" "#define HAVE_MKDIR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo" +if test "x$ac_cv_func_mkfifo" = xyes +then : + printf "%s\n" "#define HAVE_MKFIFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mknod" "ac_cv_func_mknod" +if test "x$ac_cv_func_mknod" = xyes +then : + printf "%s\n" "#define HAVE_MKNOD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" +if test "x$ac_cv_func_mkstemp" = xyes +then : + printf "%s\n" "#define HAVE_MKSTEMP 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" +if test "x$ac_cv_func_nl_langinfo" = xyes +then : + printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "openat" "ac_cv_func_openat" +if test "x$ac_cv_func_openat" = xyes +then : + printf "%s\n" "#define HAVE_OPENAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pipe" "ac_cv_func_pipe" +if test "x$ac_cv_func_pipe" = xyes +then : + printf "%s\n" "#define HAVE_PIPE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = xyes +then : + printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "posix_spawnp" "ac_cv_func_posix_spawnp" +if test "x$ac_cv_func_posix_spawnp" = xyes +then : + printf "%s\n" "#define HAVE_POSIX_SPAWNP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink" +if test "x$ac_cv_func_readlink" = xyes +then : + printf "%s\n" "#define HAVE_READLINK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "readlinkat" "ac_cv_func_readlinkat" +if test "x$ac_cv_func_readlinkat" = xyes +then : + printf "%s\n" "#define HAVE_READLINKAT 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "readpassphrase" "ac_cv_func_readpassphrase" +if test "x$ac_cv_func_readpassphrase" = xyes +then : + printf "%s\n" "#define HAVE_READPASSPHRASE 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes +then : + printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +if test "x$ac_cv_func_setenv" = xyes +then : + printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes +then : + printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" +if test "x$ac_cv_func_sigaction" = xyes +then : + printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "statfs" "ac_cv_func_statfs" +if test "x$ac_cv_func_statfs" = xyes +then : + printf "%s\n" "#define HAVE_STATFS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs" +if test "x$ac_cv_func_statvfs" = xyes +then : + printf "%s\n" "#define HAVE_STATVFS 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr" +if test "x$ac_cv_func_strchr" = xyes +then : + printf "%s\n" "#define HAVE_STRCHR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" +if test "x$ac_cv_func_strdup" = xyes +then : + printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = xyes +then : + printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strncpy_s" "ac_cv_func_strncpy_s" +if test "x$ac_cv_func_strncpy_s" = xyes +then : + printf "%s\n" "#define HAVE_STRNCPY_S 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" +if test "x$ac_cv_func_strnlen" = xyes +then : + printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr" +if test "x$ac_cv_func_strrchr" = xyes +then : + printf "%s\n" "#define HAVE_STRRCHR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "symlink" "ac_cv_func_symlink" +if test "x$ac_cv_func_symlink" = xyes +then : + printf "%s\n" "#define HAVE_SYMLINK 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = xyes +then : + printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "tzset" "ac_cv_func_tzset" +if test "x$ac_cv_func_tzset" = xyes +then : + printf "%s\n" "#define HAVE_TZSET 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "unlinkat" "ac_cv_func_unlinkat" +if test "x$ac_cv_func_unlinkat" = xyes +then : + printf "%s\n" "#define HAVE_UNLINKAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" +if test "x$ac_cv_func_unsetenv" = xyes +then : + printf "%s\n" "#define HAVE_UNSETENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "utime" "ac_cv_func_utime" +if test "x$ac_cv_func_utime" = xyes +then : + printf "%s\n" "#define HAVE_UTIME 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "utimensat" "ac_cv_func_utimensat" +if test "x$ac_cv_func_utimensat" = xyes +then : + printf "%s\n" "#define HAVE_UTIMENSAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" +if test "x$ac_cv_func_utimes" = xyes +then : + printf "%s\n" "#define HAVE_UTIMES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "vfork" "ac_cv_func_vfork" +if test "x$ac_cv_func_vfork" = xyes +then : + printf "%s\n" "#define HAVE_VFORK 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" +if test "x$ac_cv_func_wcrtomb" = xyes +then : + printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcscmp" "ac_cv_func_wcscmp" +if test "x$ac_cv_func_wcscmp" = xyes +then : + printf "%s\n" "#define HAVE_WCSCMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcscpy" "ac_cv_func_wcscpy" +if test "x$ac_cv_func_wcscpy" = xyes +then : + printf "%s\n" "#define HAVE_WCSCPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen" +if test "x$ac_cv_func_wcslen" = xyes +then : + printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wctomb" "ac_cv_func_wctomb" +if test "x$ac_cv_func_wctomb" = xyes +then : + printf "%s\n" "#define HAVE_WCTOMB 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wmemcmp" "ac_cv_func_wmemcmp" +if test "x$ac_cv_func_wmemcmp" = xyes +then : + printf "%s\n" "#define HAVE_WMEMCMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wmemcpy" "ac_cv_func_wmemcpy" +if test "x$ac_cv_func_wmemcpy" = xyes +then : + printf "%s\n" "#define HAVE_WMEMCPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wmemmove" "ac_cv_func_wmemmove" +if test "x$ac_cv_func_wmemmove" = xyes +then : + printf "%s\n" "#define HAVE_WMEMMOVE 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "_ctime64_s" "ac_cv_func__ctime64_s" +if test "x$ac_cv_func__ctime64_s" = xyes +then : + printf "%s\n" "#define HAVE__CTIME64_S 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_fseeki64" "ac_cv_func__fseeki64" +if test "x$ac_cv_func__fseeki64" = xyes +then : + printf "%s\n" "#define HAVE__FSEEKI64 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "_get_timezone" "ac_cv_func__get_timezone" +if test "x$ac_cv_func__get_timezone" = xyes +then : + printf "%s\n" "#define HAVE__GET_TIMEZONE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_gmtime64_s" "ac_cv_func__gmtime64_s" +if test "x$ac_cv_func__gmtime64_s" = xyes +then : + printf "%s\n" "#define HAVE__GMTIME64_S 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_localtime64_s" "ac_cv_func__localtime64_s" +if test "x$ac_cv_func__localtime64_s" = xyes +then : + printf "%s\n" "#define HAVE__LOCALTIME64_S 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_mkgmtime64" "ac_cv_func__mkgmtime64" +if test "x$ac_cv_func__mkgmtime64" = xyes +then : + printf "%s\n" "#define HAVE__MKGMTIME64 1" >>confdefs.h fi -done # detects cygwin-1.7, as opposed to older versions -for ac_func in cygwin_conv_path -do : - ac_fn_c_check_func "$LINENO" "cygwin_conv_path" "ac_cv_func_cygwin_conv_path" -if test "x$ac_cv_func_cygwin_conv_path" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_CYGWIN_CONV_PATH 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "cygwin_conv_path" "ac_cv_func_cygwin_conv_path" +if test "x$ac_cv_func_cygwin_conv_path" = xyes +then : + printf "%s\n" "#define HAVE_CYGWIN_CONV_PATH 1" >>confdefs.h fi -done # DragonFly uses vfsconf, FreeBSD xvfsconf. @@ -18188,11 +19505,10 @@ ac_fn_c_check_type "$LINENO" "struct vfsconf" "ac_cv_type_struct_vfsconf" "#if H #include " -if test "x$ac_cv_type_struct_vfsconf" = xyes; then : +if test "x$ac_cv_type_struct_vfsconf" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_VFSCONF 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_VFSCONF 1" >>confdefs.h fi @@ -18204,11 +19520,10 @@ ac_fn_c_check_type "$LINENO" "struct xvfsconf" "ac_cv_type_struct_xvfsconf" "#if #include " -if test "x$ac_cv_type_struct_xvfsconf" = xyes; then : +if test "x$ac_cv_type_struct_xvfsconf" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_XVFSCONF 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_XVFSCONF 1" >>confdefs.h fi @@ -18220,11 +19535,10 @@ ac_fn_c_check_type "$LINENO" "struct statfs" "ac_cv_type_struct_statfs" "#if HAV #include " -if test "x$ac_cv_type_struct_statfs" = xyes; then : +if test "x$ac_cv_type_struct_statfs" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_STATFS 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_STATFS 1" >>confdefs.h fi @@ -18236,7 +19550,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { DIR *dir; struct dirent e, *r; return(readdir_r(dir, &e, &r)); @@ -18244,49 +19558,53 @@ DIR *dir; struct dirent e, *r; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : -$as_echo "#define HAVE_READDIR_R 1" >>confdefs.h +printf "%s\n" "#define HAVE_READDIR_R 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext # dirfd can be either a function or a macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include DIR *dir; int -main () +main (void) { return(dirfd(dir)); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : -$as_echo "#define HAVE_DIRFD 1" >>confdefs.h +printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext # FreeBSD's nl_langinfo supports an option to specify whether the # current locale uses month/day or day/month ordering. It makes the # output a little prettier... -ac_fn_c_check_decl "$LINENO" "D_MD_ORDER" "ac_cv_have_decl_D_MD_ORDER" "#if HAVE_LANGINFO_H +ac_fn_check_decl "$LINENO" "D_MD_ORDER" "ac_cv_have_decl_D_MD_ORDER" "#if HAVE_LANGINFO_H #include #endif -" -if test "x$ac_cv_have_decl_D_MD_ORDER" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_D_MD_ORDER" = xyes +then : -$as_echo "#define HAVE_D_MD_ORDER 1" >>confdefs.h +printf "%s\n" "#define HAVE_D_MD_ORDER 1" >>confdefs.h fi - # Check for dirent.d_namlen field explicitly # (This is a bit more straightforward than, if not quite as portable as, # the recipe given by the autoconf maintainers.) @@ -18295,24 +19613,27 @@ ac_fn_c_check_member "$LINENO" "struct dirent" "d_namlen" "ac_cv_member_struct_d #endif " -if test "x$ac_cv_member_struct_dirent_d_namlen" = xyes; then : +if test "x$ac_cv_member_struct_dirent_d_namlen" = xyes +then : fi # Check for Extended Attributes support # Check whether --enable-xattr was given. -if test "${enable_xattr+set}" = set; then : +if test ${enable_xattr+y} +then : enableval=$enable_xattr; fi if test "x$enable_xattr" != "xno"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setxattr" >&5 -$as_echo_n "checking for library containing setxattr... " >&6; } -if ${ac_cv_search_setxattr+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing setxattr" >&5 +printf %s "checking for library containing setxattr... " >&6; } +if test ${ac_cv_search_setxattr+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18320,102 +19641,98 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char setxattr (); int -main () +main (void) { return setxattr (); ; return 0; } _ACEOF -for ac_lib in '' attr gnu; do +for ac_lib in '' attr gnu +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_setxattr=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_setxattr+:} false; then : + if test ${ac_cv_search_setxattr+y} +then : break fi done -if ${ac_cv_search_setxattr+:} false; then : +if test ${ac_cv_search_setxattr+y} +then : -else +else $as_nop ac_cv_search_setxattr=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setxattr" >&5 -$as_echo "$ac_cv_search_setxattr" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setxattr" >&5 +printf "%s\n" "$ac_cv_search_setxattr" >&6; } ac_res=$ac_cv_search_setxattr -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi - ac_fn_c_check_decl "$LINENO" "EXTATTR_NAMESPACE_USER" "ac_cv_have_decl_EXTATTR_NAMESPACE_USER" "#include + ac_fn_check_decl "$LINENO" "EXTATTR_NAMESPACE_USER" "ac_cv_have_decl_EXTATTR_NAMESPACE_USER" "#include #include -" -if test "x$ac_cv_have_decl_EXTATTR_NAMESPACE_USER" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_EXTATTR_NAMESPACE_USER" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_EXTATTR_NAMESPACE_USER $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_EXTATTR_NAMESPACE_USER $ac_have_decl -_ACEOF + ac_fn_check_decl "$LINENO" "XATTR_NOFOLLOW" "ac_cv_have_decl_XATTR_NOFOLLOW" "#include - ac_fn_c_check_decl "$LINENO" "XATTR_NOFOLLOW" "ac_cv_have_decl_XATTR_NOFOLLOW" "#include - -" -if test "x$ac_cv_have_decl_XATTR_NOFOLLOW" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_XATTR_NOFOLLOW" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_XATTR_NOFOLLOW $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DECL_XATTR_NOFOLLOW $ac_have_decl" >>confdefs.h if test "x$ac_cv_header_sys_xattr_h" = "xyes" \ -a "x$ac_cv_have_decl_XATTR_NOFOLLOW" = "xyes"; then # Darwin extended attributes support - if ${ac_cv_archive_xattr_darwin+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in fgetxattr \ - flistxattr \ - fsetxattr \ - getxattr \ - listxattr \ - setxattr + if test ${ac_cv_archive_xattr_darwin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in fgetxattr flistxattr fsetxattr getxattr listxattr setxattr do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_archive_xattr_darwin=yes -else +else $as_nop ac_cv_archive_xattr_darwin=no fi -done +done fi @@ -18423,30 +19740,26 @@ fi elif test "x$ac_cv_header_sys_extattr_h" = "xyes" \ -a "x$ac_cv_have_decl_EXTATTR_NAMESPACE_USER" = "xyes"; then # FreeBSD extended attributes support - if ${ac_cv_archive_xattr_freebsd+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in extattr_get_fd \ - extattr_get_file \ - extattr_get_link \ - extattr_list_fd \ - extattr_list_file \ - extattr_list_link \ - extattr_set_fd \ - extattr_set_link + if test ${ac_cv_archive_xattr_freebsd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in extattr_get_fd extattr_get_file extattr_get_link extattr_list_fd extattr_list_file extattr_list_link extattr_set_fd extattr_set_link do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_archive_xattr_freebsd=yes -else +else $as_nop ac_cv_archive_xattr_freebsd=no fi -done +done fi @@ -18454,95 +19767,87 @@ fi elif test "x$ac_cv_header_sys_xattr_h" = "xyes" \ -o "x$ac_cv_header_attr_xattr_h" = "xyes"; then # Linux extended attributes support - if ${ac_cv_archive_xattr_linux+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in fgetxattr \ - flistxattr \ - fsetxattr \ - getxattr \ - lgetxattr \ - listxattr \ - llistxattr \ - lsetxattr + if test ${ac_cv_archive_xattr_linux+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in fgetxattr flistxattr fsetxattr getxattr lgetxattr listxattr llistxattr lsetxattr do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_archive_xattr_linux=yes -else +else $as_nop ac_cv_archive_xattr_linux=no fi -done +done fi elif test "x$ac_cv_header_sys_ea_h" = "xyes"; then # AIX extended attributes support - if ${ac_cv_archive_xattr_aix+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in fgetea \ - flistea \ - fsetea \ - getea \ - lgetea \ - listea \ - llistea \ - lsetea + if test ${ac_cv_archive_xattr_aix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in fgetea flistea fsetea getea lgetea listea llistea lsetea do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_archive_xattr_aix=yes -else +else $as_nop ac_cv_archive_xattr_aix=no fi -done +done fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extended attributes support" >&5 -$as_echo_n "checking for extended attributes support... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for extended attributes support" >&5 +printf %s "checking for extended attributes support... " >&6; } if test "x$ac_cv_archive_xattr_linux" = "xyes"; then -$as_echo "#define ARCHIVE_XATTR_LINUX 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_XATTR_LINUX 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5 -$as_echo "Linux" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Linux" >&5 +printf "%s\n" "Linux" >&6; } elif test "x$ac_cv_archive_xattr_darwin" = "xyes"; then -$as_echo "#define ARCHIVE_XATTR_DARWIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_XATTR_DARWIN 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5 -$as_echo "Darwin" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5 +printf "%s\n" "Darwin" >&6; } elif test "x$ac_cv_archive_xattr_freebsd" = "xyes"; then -$as_echo "#define ARCHIVE_XATTR_FREEBSD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_XATTR_FREEBSD 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: FreeBSD" >&5 -$as_echo "FreeBSD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FreeBSD" >&5 +printf "%s\n" "FreeBSD" >&6; } elif test "x$ac_cv_archive_xattr_aix" = "xyes"; then -$as_echo "#define ARCHIVE_XATTR_AIX 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_XATTR_AIX 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: AIX" >&5 -$as_echo "AIX" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: AIX" >&5 +printf "%s\n" "AIX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi fi @@ -18554,18 +19859,20 @@ fi # which makes the following checks rather more complex than I would like. # # Check whether --enable-acl was given. -if test "${enable_acl+set}" = set; then : +if test ${enable_acl+y} +then : enableval=$enable_acl; fi if test "x$enable_acl" != "xno"; then # Libacl - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for acl_get_file in -lacl" >&5 -$as_echo_n "checking for acl_get_file in -lacl... " >&6; } -if ${ac_cv_lib_acl_acl_get_file+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for acl_get_file in -lacl" >&5 +printf %s "checking for acl_get_file in -lacl... " >&6; } +if test ${ac_cv_lib_acl_acl_get_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lacl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18574,33 +19881,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char acl_get_file (); int -main () +main (void) { return acl_get_file (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_acl_acl_get_file=yes -else +else $as_nop ac_cv_lib_acl_acl_get_file=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_acl_acl_get_file" >&5 -$as_echo "$ac_cv_lib_acl_acl_get_file" >&6; } -if test "x$ac_cv_lib_acl_acl_get_file" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBACL 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_acl_acl_get_file" >&5 +printf "%s\n" "$ac_cv_lib_acl_acl_get_file" >&6; } +if test "x$ac_cv_lib_acl_acl_get_file" = xyes +then : + printf "%s\n" "#define HAVE_LIBACL 1" >>confdefs.h LIBS="-lacl $LIBS" @@ -18616,11 +19920,10 @@ fi #endif " -if test "x$ac_cv_type_acl_t" = xyes; then : +if test "x$ac_cv_type_acl_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACL_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACL_T 1" >>confdefs.h fi @@ -18633,11 +19936,10 @@ ac_fn_c_check_type "$LINENO" "acl_entry_t" "ac_cv_type_acl_entry_t" " #endif " -if test "x$ac_cv_type_acl_entry_t" = xyes; then : +if test "x$ac_cv_type_acl_entry_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACL_ENTRY_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACL_ENTRY_T 1" >>confdefs.h fi @@ -18650,11 +19952,10 @@ ac_fn_c_check_type "$LINENO" "acl_permset_t" "ac_cv_type_acl_permset_t" " #endif " -if test "x$ac_cv_type_acl_permset_t" = xyes; then : +if test "x$ac_cv_type_acl_permset_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACL_PERMSET_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACL_PERMSET_T 1" >>confdefs.h fi @@ -18667,21 +19968,21 @@ ac_fn_c_check_type "$LINENO" "acl_tag_t" "ac_cv_type_acl_tag_t" " #endif " -if test "x$ac_cv_type_acl_tag_t" = xyes; then : +if test "x$ac_cv_type_acl_tag_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACL_TAG_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACL_TAG_T 1" >>confdefs.h fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for richacl_get_file in -lrichacl" >&5 -$as_echo_n "checking for richacl_get_file in -lrichacl... " >&6; } -if ${ac_cv_lib_richacl_richacl_get_file+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for richacl_get_file in -lrichacl" >&5 +printf %s "checking for richacl_get_file in -lrichacl... " >&6; } +if test ${ac_cv_lib_richacl_richacl_get_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lrichacl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18690,33 +19991,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char richacl_get_file (); int -main () +main (void) { return richacl_get_file (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_richacl_richacl_get_file=yes -else +else $as_nop ac_cv_lib_richacl_richacl_get_file=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_richacl_richacl_get_file" >&5 -$as_echo "$ac_cv_lib_richacl_richacl_get_file" >&6; } -if test "x$ac_cv_lib_richacl_richacl_get_file" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBRICHACL 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_richacl_richacl_get_file" >&5 +printf "%s\n" "$ac_cv_lib_richacl_richacl_get_file" >&6; } +if test "x$ac_cv_lib_richacl_richacl_get_file" = xyes +then : + printf "%s\n" "#define HAVE_LIBRICHACL 1" >>confdefs.h LIBS="-lrichacl $LIBS" @@ -18729,11 +20027,10 @@ fi #endif " -if test "x$ac_cv_type_struct_richace" = xyes; then : +if test "x$ac_cv_type_struct_richace" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_RICHACE 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_RICHACE 1" >>confdefs.h fi @@ -18743,56 +20040,53 @@ ac_fn_c_check_type "$LINENO" "struct richacl" "ac_cv_type_struct_richacl" " #endif " -if test "x$ac_cv_type_struct_richacl" = xyes; then : +if test "x$ac_cv_type_struct_richacl" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_RICHACL 1 -_ACEOF +printf "%s\n" "#define HAVE_STRUCT_RICHACL 1" >>confdefs.h fi # Solaris and derivates ACLs - for ac_func in acl facl -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "acl" "ac_cv_func_acl" +if test "x$ac_cv_func_acl" = xyes +then : + printf "%s\n" "#define HAVE_ACL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "facl" "ac_cv_func_facl" +if test "x$ac_cv_func_facl" = xyes +then : + printf "%s\n" "#define HAVE_FACL 1" >>confdefs.h fi -done if test "x$ac_cv_lib_richacl_richacl_get_file" = "xyes" \ -a "x$ac_cv_type_struct_richace" = "xyes" \ -a "x$ac_cv_type_struct_richacl" = "xyes"; then - if ${ac_cv_archive_acl_librichacl+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in richacl_alloc \ - richacl_equiv_mode \ - richacl_free \ - richacl_get_fd \ - richacl_get_file \ - richacl_set_fd \ - richacl_set_file + if test ${ac_cv_archive_acl_librichacl+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in richacl_alloc richacl_equiv_mode richacl_free richacl_get_fd richacl_get_file richacl_set_fd richacl_set_file do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_archive_acl_librichacl=yes -else +else $as_nop ac_cv_archive_acl_librichacl=no fi -done +done fi fi @@ -18801,65 +20095,62 @@ fi -a "x$ac_cv_func_facl" = "xyes"; then ac_fn_c_check_type "$LINENO" "aclent_t" "ac_cv_type_aclent_t" "#include " -if test "x$ac_cv_type_aclent_t" = xyes; then : +if test "x$ac_cv_type_aclent_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACLENT_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACLENT_T 1" >>confdefs.h fi if test "x$ac_cv_type_aclent_t" = "xyes"; then - if ${ac_cv_archive_acl_sunos+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_fn_c_check_decl "$LINENO" "GETACL" "ac_cv_have_decl_GETACL" "#include -" -if test "x$ac_cv_have_decl_GETACL" = xyes; then : + if test ${ac_cv_archive_acl_sunos+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_fn_check_decl "$LINENO" "GETACL" "ac_cv_have_decl_GETACL" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_GETACL" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_GETACL $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_GETACL $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos=yes -else +else $as_nop ac_cv_archive_acl_sunos=no fi -ac_fn_c_check_decl "$LINENO" "SETACL" "ac_cv_have_decl_SETACL" "#include -" -if test "x$ac_cv_have_decl_SETACL" = xyes; then : +ac_fn_check_decl "$LINENO" "SETACL" "ac_cv_have_decl_SETACL" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SETACL" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SETACL $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_SETACL $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos=yes -else +else $as_nop ac_cv_archive_acl_sunos=no fi -ac_fn_c_check_decl "$LINENO" "GETACLCNT" "ac_cv_have_decl_GETACLCNT" "#include -" -if test "x$ac_cv_have_decl_GETACLCNT" = xyes; then : +ac_fn_check_decl "$LINENO" "GETACLCNT" "ac_cv_have_decl_GETACLCNT" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_GETACLCNT" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_GETACLCNT $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_GETACLCNT $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos=yes -else +else $as_nop ac_cv_archive_acl_sunos=no fi @@ -18867,65 +20158,62 @@ fi ac_fn_c_check_type "$LINENO" "ace_t" "ac_cv_type_ace_t" "#include " -if test "x$ac_cv_type_ace_t" = xyes; then : +if test "x$ac_cv_type_ace_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ACE_T 1 -_ACEOF +printf "%s\n" "#define HAVE_ACE_T 1" >>confdefs.h fi if test "x$ac_cv_type_ace_t" = "xyes"; then - if ${ac_cv_archive_acl_sunos_nfs4+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_fn_c_check_decl "$LINENO" "ACE_GETACL" "ac_cv_have_decl_ACE_GETACL" "#include -" -if test "x$ac_cv_have_decl_ACE_GETACL" = xyes; then : + if test ${ac_cv_archive_acl_sunos_nfs4+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_fn_check_decl "$LINENO" "ACE_GETACL" "ac_cv_have_decl_ACE_GETACL" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACE_GETACL" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACE_GETACL $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_ACE_GETACL $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos_nfs4=yes -else +else $as_nop ac_cv_archive_acl_sonos_nfs4=no fi -ac_fn_c_check_decl "$LINENO" "ACE_SETACL" "ac_cv_have_decl_ACE_SETACL" "#include -" -if test "x$ac_cv_have_decl_ACE_SETACL" = xyes; then : +ac_fn_check_decl "$LINENO" "ACE_SETACL" "ac_cv_have_decl_ACE_SETACL" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACE_SETACL" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACE_SETACL $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_ACE_SETACL $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos_nfs4=yes -else +else $as_nop ac_cv_archive_acl_sonos_nfs4=no fi -ac_fn_c_check_decl "$LINENO" "ACE_GETACLCNT" "ac_cv_have_decl_ACE_GETACLCNT" "#include -" -if test "x$ac_cv_have_decl_ACE_GETACLCNT" = xyes; then : +ac_fn_check_decl "$LINENO" "ACE_GETACLCNT" "ac_cv_have_decl_ACE_GETACLCNT" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACE_GETACLCNT" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACE_GETACLCNT $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : +printf "%s\n" "#define HAVE_DECL_ACE_GETACLCNT $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : ac_cv_archive_acl_sunos_nfs4=yes -else +else $as_nop ac_cv_archive_acl_sonos_nfs4=no fi @@ -18938,157 +20226,194 @@ fi -a "x$ac_cv_type_acl_permset_t" = "xyes" \ -a "x$ac_cv_type_acl_tag_t" = "xyes"; then # POSIX.1e ACL functions - if ${ac_cv_posix_acl_funcs+:} false; then : - $as_echo_n "(cached) " >&6 -else - for ac_func in acl_add_perm \ - acl_clear_perms \ - acl_create_entry \ - acl_delete_def_file \ - acl_free \ - acl_get_entry \ - acl_get_fd \ - acl_get_file \ - acl_get_permset \ - acl_get_qualifier \ - acl_get_tag_type \ - acl_init \ - acl_set_fd \ - acl_set_file \ - acl_set_qualifier \ - acl_set_tag_type + if test ${ac_cv_posix_acl_funcs+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + for ac_func in acl_add_perm acl_clear_perms acl_create_entry acl_delete_def_file acl_free acl_get_entry acl_get_fd acl_get_file acl_get_permset acl_get_qualifier acl_get_tag_type acl_init acl_set_fd acl_set_file acl_set_qualifier acl_set_tag_type do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ac_cv_posix_acl_funcs=yes -else +else $as_nop ac_cv_posix_acl_funcs=no fi -done +done fi - for ac_func in acl_get_perm -do : - ac_fn_c_check_func "$LINENO" "acl_get_perm" "ac_cv_func_acl_get_perm" -if test "x$ac_cv_func_acl_get_perm" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ACL_GET_PERM 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "acl_get_perm" "ac_cv_func_acl_get_perm" +if test "x$ac_cv_func_acl_get_perm" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_PERM 1" >>confdefs.h fi -done if test "x$ac_cv_posix_acl_funcs" = "xyes" \ -a "x$ac_cv_header_acl_libacl_h" = "xyes" \ -a "x$ac_cv_lib_acl_acl_get_file" = "xyes" \ -a "x$ac_cv_func_acl_get_perm"; then - if ${ac_cv_archive_acl_libacl+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_archive_acl_libacl+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_archive_acl_libacl=yes fi -$as_echo "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h else # FreeBSD/Darwin - for ac_func in acl_add_flag_np \ - acl_clear_flags_np \ - acl_get_brand_np \ - acl_get_entry_type_np \ - acl_get_flag_np \ - acl_get_flagset_np \ - acl_get_fd_np \ - acl_get_link_np \ - acl_get_perm_np \ - acl_is_trivial_np \ - acl_set_entry_type_np \ - acl_set_fd_np \ - acl_set_link_np -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "acl_add_flag_np" "ac_cv_func_acl_add_flag_np" +if test "x$ac_cv_func_acl_add_flag_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_ADD_FLAG_NP 1" >>confdefs.h fi -done - - - for ac_func in mbr_uid_to_uuid \ - mbr_uuid_to_id \ - mbr_gid_to_uuid -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "acl_clear_flags_np" "ac_cv_func_acl_clear_flags_np" +if test "x$ac_cv_func_acl_clear_flags_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_CLEAR_FLAGS_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_brand_np" "ac_cv_func_acl_get_brand_np" +if test "x$ac_cv_func_acl_get_brand_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_BRAND_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_entry_type_np" "ac_cv_func_acl_get_entry_type_np" +if test "x$ac_cv_func_acl_get_entry_type_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_ENTRY_TYPE_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_flag_np" "ac_cv_func_acl_get_flag_np" +if test "x$ac_cv_func_acl_get_flag_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_FLAG_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_flagset_np" "ac_cv_func_acl_get_flagset_np" +if test "x$ac_cv_func_acl_get_flagset_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_FLAGSET_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_fd_np" "ac_cv_func_acl_get_fd_np" +if test "x$ac_cv_func_acl_get_fd_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_FD_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_link_np" "ac_cv_func_acl_get_link_np" +if test "x$ac_cv_func_acl_get_link_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_LINK_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_get_perm_np" "ac_cv_func_acl_get_perm_np" +if test "x$ac_cv_func_acl_get_perm_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_GET_PERM_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_is_trivial_np" "ac_cv_func_acl_is_trivial_np" +if test "x$ac_cv_func_acl_is_trivial_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_IS_TRIVIAL_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_set_entry_type_np" "ac_cv_func_acl_set_entry_type_np" +if test "x$ac_cv_func_acl_set_entry_type_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_SET_ENTRY_TYPE_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_set_fd_np" "ac_cv_func_acl_set_fd_np" +if test "x$ac_cv_func_acl_set_fd_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_SET_FD_NP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "acl_set_link_np" "ac_cv_func_acl_set_link_np" +if test "x$ac_cv_func_acl_set_link_np" = xyes +then : + printf "%s\n" "#define HAVE_ACL_SET_LINK_NP 1" >>confdefs.h fi -done - ac_fn_c_check_decl "$LINENO" "ACL_TYPE_EXTENDED" "ac_cv_have_decl_ACL_TYPE_EXTENDED" "#include + ac_fn_c_check_func "$LINENO" "mbr_uid_to_uuid" "ac_cv_func_mbr_uid_to_uuid" +if test "x$ac_cv_func_mbr_uid_to_uuid" = xyes +then : + printf "%s\n" "#define HAVE_MBR_UID_TO_UUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mbr_uuid_to_id" "ac_cv_func_mbr_uuid_to_id" +if test "x$ac_cv_func_mbr_uuid_to_id" = xyes +then : + printf "%s\n" "#define HAVE_MBR_UUID_TO_ID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mbr_gid_to_uuid" "ac_cv_func_mbr_gid_to_uuid" +if test "x$ac_cv_func_mbr_gid_to_uuid" = xyes +then : + printf "%s\n" "#define HAVE_MBR_GID_TO_UUID 1" >>confdefs.h + +fi + + + ac_fn_check_decl "$LINENO" "ACL_TYPE_EXTENDED" "ac_cv_have_decl_ACL_TYPE_EXTENDED" "#include #include -" -if test "x$ac_cv_have_decl_ACL_TYPE_EXTENDED" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACL_TYPE_EXTENDED" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACL_TYPE_EXTENDED $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "ACL_TYPE_NFS4" "ac_cv_have_decl_ACL_TYPE_NFS4" "#include +printf "%s\n" "#define HAVE_DECL_ACL_TYPE_EXTENDED $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "ACL_TYPE_NFS4" "ac_cv_have_decl_ACL_TYPE_NFS4" "#include #include -" -if test "x$ac_cv_have_decl_ACL_TYPE_NFS4" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACL_TYPE_NFS4" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACL_TYPE_NFS4 $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "ACL_USER" "ac_cv_have_decl_ACL_USER" "#include +printf "%s\n" "#define HAVE_DECL_ACL_TYPE_NFS4 $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "ACL_USER" "ac_cv_have_decl_ACL_USER" "#include #include -" -if test "x$ac_cv_have_decl_ACL_USER" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACL_USER" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACL_USER $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "ACL_SYNCHRONIZE" "ac_cv_have_decl_ACL_SYNCHRONIZE" "#include +printf "%s\n" "#define HAVE_DECL_ACL_USER $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "ACL_SYNCHRONIZE" "ac_cv_have_decl_ACL_SYNCHRONIZE" "#include #include -" -if test "x$ac_cv_have_decl_ACL_SYNCHRONIZE" = xyes; then : +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ACL_SYNCHRONIZE" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ACL_SYNCHRONIZE $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DECL_ACL_SYNCHRONIZE $ac_have_decl" >>confdefs.h if test "x$ac_cv_posix_acl_funcs" = "xyes" \ -a "x$ac_cv_func_acl_get_fd_np" = "xyes" \ @@ -19096,9 +20421,10 @@ _ACEOF -a "x$ac_cv_func_acl_get_perm_np" = "xyes" \ -a "x$ac_cv_func_acl_set_fd_np" = "xyes"; then if test "x$ac_cv_have_decl_ACL_USER" = "xyes"; then - if ${ac_cv_archive_acl_freebsd+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_archive_acl_freebsd+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_archive_acl_freebsd=yes fi @@ -19108,9 +20434,10 @@ fi -a "x$ac_cv_func_acl_get_entry_type_np" = "xyes" \ -a "x$ac_cv_func_acl_get_flagset_np" = "xyes" \ -a "x$ac_cv_func_acl_set_entry_type_np" = "xyes"; then - if ${ac_cv_archive_acl_freebsd_nfs4+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_archive_acl_freebsd_nfs4+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_archive_acl_freebsd_nfs4=yes fi @@ -19123,9 +20450,10 @@ fi -a "x$ac_cv_func_mbr_uid_to_uuid" = "xyes" \ -a "x$ac_cv_func_mbr_uuid_to_id" = "xyes" \ -a "x$ac_cv_func_mbr_gid_to_uuid" = "xyes"; then - if ${ac_cv_archive_acl_darwin+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_archive_acl_darwin+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_archive_acl_darwin=yes fi @@ -19133,67 +20461,67 @@ fi fi fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ACL support" >&5 -$as_echo_n "checking for ACL support... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ACL support" >&5 +printf %s "checking for ACL support... " >&6; } if test "x$ac_cv_archive_acl_libacl" = "xyes" \ -a "x$ac_cv_archive_acl_librichacl" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libacl (POSIX.1e) + librichacl (NFSv4)" >&5 -$as_echo "libacl (POSIX.1e) + librichacl (NFSv4)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libacl (POSIX.1e) + librichacl (NFSv4)" >&5 +printf "%s\n" "libacl (POSIX.1e) + librichacl (NFSv4)" >&6; } -$as_echo "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h -$as_echo "#define ARCHIVE_ACL_LIBRICHACL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_LIBRICHACL 1" >>confdefs.h elif test "x$ac_cv_archive_acl_libacl" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libacl (POSIX.1e)" >&5 -$as_echo "libacl (POSIX.1e)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libacl (POSIX.1e)" >&5 +printf "%s\n" "libacl (POSIX.1e)" >&6; } -$as_echo "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_LIBACL 1" >>confdefs.h elif test "x$ac_cv_archive_acl_librichacl" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: librichacl (NFSv4)" >&5 -$as_echo "librichacl (NFSv4)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: librichacl (NFSv4)" >&5 +printf "%s\n" "librichacl (NFSv4)" >&6; } -$as_echo "#define ARCHIVE_ACL_LIBRICHACL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_LIBRICHACL 1" >>confdefs.h elif test "x$ac_cv_archive_acl_darwin" = "xyes"; then -$as_echo "#define ARCHIVE_ACL_DARWIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_DARWIN 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin (limited NFSv4)" >&5 -$as_echo "Darwin (limited NFSv4)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Darwin (limited NFSv4)" >&5 +printf "%s\n" "Darwin (limited NFSv4)" >&6; } elif test "x$ac_cv_archive_acl_sunos" = "xyes"; then -$as_echo "#define ARCHIVE_ACL_SUNOS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_SUNOS 1" >>confdefs.h if test "x$ac_cv_archive_acl_sunos_nfs4" = "xyes"; then -$as_echo "#define ARCHIVE_ACL_SUNOS_NFS4 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_SUNOS_NFS4 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris (POSIX.1e and NFSv4)" >&5 -$as_echo "Solaris (POSIX.1e and NFSv4)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Solaris (POSIX.1e and NFSv4)" >&5 +printf "%s\n" "Solaris (POSIX.1e and NFSv4)" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris (POSIX.1e)" >&5 -$as_echo "Solaris (POSIX.1e)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Solaris (POSIX.1e)" >&5 +printf "%s\n" "Solaris (POSIX.1e)" >&6; } fi elif test "x$ac_cv_archive_acl_freebsd" = "xyes"; then -$as_echo "#define ARCHIVE_ACL_FREEBSD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_FREEBSD 1" >>confdefs.h if test "x$ac_cv_archive_acl_freebsd_nfs4" = "xyes"; then -$as_echo "#define ARCHIVE_ACL_FREEBSD_NFS4 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_ACL_FREEBSD_NFS4 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: FreeBSD (POSIX.1e and NFSv4)" >&5 -$as_echo "FreeBSD (POSIX.1e and NFSv4)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FreeBSD (POSIX.1e and NFSv4)" >&5 +printf "%s\n" "FreeBSD (POSIX.1e and NFSv4)" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: FreeBSD (POSIX.1e)" >&5 -$as_echo "FreeBSD (POSIX.1e)" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FreeBSD (POSIX.1e)" >&5 +printf "%s\n" "FreeBSD (POSIX.1e)" >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi fi @@ -19234,17 +20562,19 @@ fi # Additional requirements # Check whether --enable-largefile was given. -if test "${enable_largefile+set}" = set; then : +if test ${enable_largefile+y} +then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 -$as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if ${ac_cv_sys_largefile_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC @@ -19258,44 +20588,47 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : break fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam CC="$CC -n32" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_largefile_CC=' -n32'; break fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 -$as_echo "$ac_cv_sys_largefile_CC" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if ${ac_cv_sys_file_offset_bits+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19304,22 +20637,23 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_file_offset_bits=no; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 @@ -19328,43 +20662,43 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_file_offset_bits=64; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 -$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) -cat >>confdefs.h <<_ACEOF -#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits -_ACEOF +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 -$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if ${ac_cv_sys_large_files+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19373,22 +20707,23 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_large_files=no; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 @@ -19397,40 +20732,37 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_large_files=1; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 -$as_echo "$ac_cv_sys_large_files" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) -cat >>confdefs.h <<_ACEOF -#define _LARGE_FILES $ac_cv_sys_large_files -_ACEOF +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h ;; esac rm -rf conftest* fi - - fi @@ -19447,8 +20779,8 @@ case "$host_os" in saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19469,20 +20801,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19493,8 +20826,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBSYSTEM" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_LIBSYSTEM... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBSYSTEM" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_LIBSYSTEM... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19515,20 +20848,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_LIBSYSTEM=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_LIBSYSTEM 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_LIBSYSTEM 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19539,8 +20873,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_RMD160_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_RMD160_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19561,20 +20895,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_RMD160=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_RMD160_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_RMD160_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19585,8 +20920,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19607,20 +20942,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19631,8 +20967,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBSYSTEM" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_LIBSYSTEM... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBSYSTEM" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_LIBSYSTEM... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19653,20 +20989,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_LIBSYSTEM=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_LIBSYSTEM 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_LIBSYSTEM 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19677,8 +21014,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19699,20 +21036,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19723,8 +21061,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC2" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_LIBC2... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC2" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_LIBC2... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19745,20 +21083,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_LIBC2=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_LIBC2 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_LIBC2 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19769,8 +21108,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC3" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_LIBC3... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBC3" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_LIBC3... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19791,20 +21130,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_LIBC3=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_LIBC3 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_LIBC3 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19815,8 +21155,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBSYSTEM" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_LIBSYSTEM... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBSYSTEM" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_LIBSYSTEM... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19837,20 +21177,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_LIBSYSTEM=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_LIBSYSTEM 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_LIBSYSTEM 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19861,8 +21202,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19883,20 +21224,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19907,8 +21249,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC2" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_LIBC2... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC2" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_LIBC2... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19929,20 +21271,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_LIBC2=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_LIBC2 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_LIBC2 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19953,8 +21296,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC3" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_LIBC3... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBC3" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_LIBC3... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19975,20 +21318,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_LIBC3=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_LIBC3 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_LIBC3 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -19999,8 +21343,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBSYSTEM" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_LIBSYSTEM... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_LIBSYSTEM" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_LIBSYSTEM... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20021,20 +21365,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_LIBSYSTEM=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_LIBSYSTEM 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_LIBSYSTEM 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20045,8 +21390,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_LIBC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_LIBC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20067,20 +21412,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_LIBC=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_LIBC 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_LIBC 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20091,8 +21437,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC2" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_LIBC2... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC2" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_LIBC2... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20113,20 +21459,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_LIBC2=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_LIBC2 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_LIBC2 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20137,8 +21484,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC3" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_LIBC3... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBC3" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_LIBC3... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20159,20 +21506,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_LIBC3=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_LIBC3 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_LIBC3 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20183,8 +21531,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBSYSTEM" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_LIBSYSTEM... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBSYSTEM" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_LIBSYSTEM... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20205,20 +21553,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_LIBSYSTEM=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_LIBSYSTEM 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_LIBSYSTEM 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20228,46 +21577,51 @@ rm -f core conftest.err conftest.$ac_objext \ esac if test "x$with_cng" != "xno"; then - for ac_header in bcrypt.h + for ac_header in bcrypt.h do : ac_fn_c_check_header_compile "$LINENO" "bcrypt.h" "ac_cv_header_bcrypt_h" "#ifdef HAVE_WINDOWS_H # include #endif " -if test "x$ac_cv_header_bcrypt_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BCRYPT_H 1 -_ACEOF +if test "x$ac_cv_header_bcrypt_h" = xyes +then : + printf "%s\n" "#define HAVE_BCRYPT_H 1" >>confdefs.h LIBS="$LIBS -lbcrypt" fi done - fi if test "x$with_mbedtls" = "xyes"; then - for ac_header in mbedtls/aes.h mbedtls/md.h mbedtls/pkcs5.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "mbedtls/aes.h" "ac_cv_header_mbedtls_aes_h" "$ac_includes_default" +if test "x$ac_cv_header_mbedtls_aes_h" = xyes +then : + printf "%s\n" "#define HAVE_MBEDTLS_AES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "mbedtls/md.h" "ac_cv_header_mbedtls_md_h" "$ac_includes_default" +if test "x$ac_cv_header_mbedtls_md_h" = xyes +then : + printf "%s\n" "#define HAVE_MBEDTLS_MD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "mbedtls/pkcs5.h" "ac_cv_header_mbedtls_pkcs5_h" "$ac_includes_default" +if test "x$ac_cv_header_mbedtls_pkcs5_h" = xyes +then : + printf "%s\n" "#define HAVE_MBEDTLS_PKCS5_H 1" >>confdefs.h fi -done - saved_LIBS=$LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbedtls_sha1_init in -lmbedcrypto" >&5 -$as_echo_n "checking for mbedtls_sha1_init in -lmbedcrypto... " >&6; } -if ${ac_cv_lib_mbedcrypto_mbedtls_sha1_init+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbedtls_sha1_init in -lmbedcrypto" >&5 +printf %s "checking for mbedtls_sha1_init in -lmbedcrypto... " >&6; } +if test ${ac_cv_lib_mbedcrypto_mbedtls_sha1_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lmbedcrypto $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -20276,33 +21630,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char mbedtls_sha1_init (); int -main () +main (void) { return mbedtls_sha1_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_mbedcrypto_mbedtls_sha1_init=yes -else +else $as_nop ac_cv_lib_mbedcrypto_mbedtls_sha1_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedcrypto_mbedtls_sha1_init" >&5 -$as_echo "$ac_cv_lib_mbedcrypto_mbedtls_sha1_init" >&6; } -if test "x$ac_cv_lib_mbedcrypto_mbedtls_sha1_init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBMBEDCRYPTO 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedcrypto_mbedtls_sha1_init" >&5 +printf "%s\n" "$ac_cv_lib_mbedcrypto_mbedtls_sha1_init" >&6; } +if test "x$ac_cv_lib_mbedcrypto_mbedtls_sha1_init" = xyes +then : + printf "%s\n" "#define HAVE_LIBMBEDCRYPTO 1" >>confdefs.h LIBS="-lmbedcrypto $LIBS" @@ -20313,8 +21664,8 @@ fi saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20335,20 +21686,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20359,8 +21711,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_RMD160_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_RMD160_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20381,20 +21733,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_RMD160=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_RMD160_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_RMD160_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20405,8 +21758,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20427,20 +21780,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20451,8 +21805,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20473,20 +21827,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20497,8 +21852,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20519,20 +21874,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20543,8 +21899,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_MBEDTLS" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_MBEDTLS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_MBEDTLS" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_MBEDTLS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20565,20 +21921,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_MBEDTLS=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_MBEDTLS 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20590,38 +21947,51 @@ rm -f core conftest.err conftest.$ac_objext \ fi if test "x$with_nettle" = "xyes"; then - for ac_header in nettle/md5.h nettle/ripemd160.h nettle/sha.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "nettle/md5.h" "ac_cv_header_nettle_md5_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_md5_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_MD5_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "nettle/ripemd160.h" "ac_cv_header_nettle_ripemd160_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_ripemd160_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_RIPEMD160_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "nettle/sha.h" "ac_cv_header_nettle_sha_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_sha_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_SHA_H 1" >>confdefs.h fi -done - - for ac_header in nettle/pbkdf2.h nettle/aes.h nettle/hmac.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "nettle/pbkdf2.h" "ac_cv_header_nettle_pbkdf2_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_pbkdf2_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_PBKDF2_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "nettle/aes.h" "ac_cv_header_nettle_aes_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_aes_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_AES_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "nettle/hmac.h" "ac_cv_header_nettle_hmac_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_hmac_h" = xyes +then : + printf "%s\n" "#define HAVE_NETTLE_HMAC_H 1" >>confdefs.h + +fi saved_LIBS=$LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nettle_sha1_init in -lnettle" >&5 -$as_echo_n "checking for nettle_sha1_init in -lnettle... " >&6; } -if ${ac_cv_lib_nettle_nettle_sha1_init+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nettle_sha1_init in -lnettle" >&5 +printf %s "checking for nettle_sha1_init in -lnettle... " >&6; } +if test ${ac_cv_lib_nettle_nettle_sha1_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lnettle $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -20630,33 +22000,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char nettle_sha1_init (); int -main () +main (void) { return nettle_sha1_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_nettle_nettle_sha1_init=yes -else +else $as_nop ac_cv_lib_nettle_nettle_sha1_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nettle_nettle_sha1_init" >&5 -$as_echo "$ac_cv_lib_nettle_nettle_sha1_init" >&6; } -if test "x$ac_cv_lib_nettle_nettle_sha1_init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBNETTLE 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nettle_nettle_sha1_init" >&5 +printf "%s\n" "$ac_cv_lib_nettle_nettle_sha1_init" >&6; } +if test "x$ac_cv_lib_nettle_nettle_sha1_init" = xyes +then : + printf "%s\n" "#define HAVE_LIBNETTLE 1" >>confdefs.h LIBS="-lnettle $LIBS" @@ -20667,8 +22034,8 @@ fi saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20689,20 +22056,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20713,8 +22081,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_RMD160_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_RMD160_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20735,20 +22103,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_RMD160=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_RMD160_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_RMD160_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20759,8 +22128,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20781,20 +22150,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20805,8 +22175,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20827,20 +22197,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20851,8 +22222,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20873,20 +22244,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20897,8 +22269,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_NETTLE" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_NETTLE... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_NETTLE" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_NETTLE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20919,20 +22291,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_NETTLE=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_NETTLE 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_NETTLE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -20944,171 +22317,21 @@ rm -f core conftest.err conftest.$ac_objext \ fi if test "x$with_openssl" != "xno"; then - for ac_header in openssl/evp.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "openssl/evp.h" "ac_cv_header_openssl_evp_h" "$ac_includes_default" -if test "x$ac_cv_header_openssl_evp_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENSSL_EVP_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "openssl/evp.h" "ac_cv_header_openssl_evp_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_evp_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_EVP_H 1" >>confdefs.h fi -done - saved_LIBS=$LIBS - case "$host_os" in - *mingw* | *cygwin* | *msys*) - case "$host_cpu" in - x86_64) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_config in -leay64" >&5 -$as_echo_n "checking for OPENSSL_config in -leay64... " >&6; } -if ${ac_cv_lib_eay64_OPENSSL_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-leay64 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char OPENSSL_config (); -int -main () -{ -return OPENSSL_config (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_eay64_OPENSSL_config=yes -else - ac_cv_lib_eay64_OPENSSL_config=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_eay64_OPENSSL_config" >&5 -$as_echo "$ac_cv_lib_eay64_OPENSSL_config" >&6; } -if test "x$ac_cv_lib_eay64_OPENSSL_config" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBEAY64 1 -_ACEOF - - LIBS="-leay64 $LIBS" - -fi - - if test "x$ac_cv_lib_eay64_main" != "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_config in -leay32" >&5 -$as_echo_n "checking for OPENSSL_config in -leay32... " >&6; } -if ${ac_cv_lib_eay32_OPENSSL_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-leay32 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char OPENSSL_config (); -int -main () -{ -return OPENSSL_config (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_eay32_OPENSSL_config=yes -else - ac_cv_lib_eay32_OPENSSL_config=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_eay32_OPENSSL_config" >&5 -$as_echo "$ac_cv_lib_eay32_OPENSSL_config" >&6; } -if test "x$ac_cv_lib_eay32_OPENSSL_config" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBEAY32 1 -_ACEOF - - LIBS="-leay32 $LIBS" - -fi - - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_config in -leay32" >&5 -$as_echo_n "checking for OPENSSL_config in -leay32... " >&6; } -if ${ac_cv_lib_eay32_OPENSSL_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-leay32 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char OPENSSL_config (); -int -main () -{ -return OPENSSL_config (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_eay32_OPENSSL_config=yes -else - ac_cv_lib_eay32_OPENSSL_config=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_eay32_OPENSSL_config" >&5 -$as_echo "$ac_cv_lib_eay32_OPENSSL_config" >&6; } -if test "x$ac_cv_lib_eay32_OPENSSL_config" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBEAY32 1 -_ACEOF - - LIBS="-leay32 $LIBS" - -fi - - ;; - esac - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_config in -lcrypto" >&5 -$as_echo_n "checking for OPENSSL_config in -lcrypto... " >&6; } -if ${ac_cv_lib_crypto_OPENSSL_config+:} false; then : - $as_echo_n "(cached) " >&6 -else + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_config in -lcrypto" >&5 +printf %s "checking for OPENSSL_config in -lcrypto... " >&6; } +if test ${ac_cv_lib_crypto_OPENSSL_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypto $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -21117,47 +22340,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char OPENSSL_config (); int -main () +main (void) { return OPENSSL_config (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_crypto_OPENSSL_config=yes -else +else $as_nop ac_cv_lib_crypto_OPENSSL_config=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_config" >&5 -$as_echo "$ac_cv_lib_crypto_OPENSSL_config" >&6; } -if test "x$ac_cv_lib_crypto_OPENSSL_config" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBCRYPTO 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_config" >&5 +printf "%s\n" "$ac_cv_lib_crypto_OPENSSL_config" >&6; } +if test "x$ac_cv_lib_crypto_OPENSSL_config" = xyes +then : + printf "%s\n" "#define HAVE_LIBCRYPTO 1" >>confdefs.h LIBS="-lcrypto $LIBS" fi - ;; - esac if test "$found_MD5" != yes; then saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21178,20 +22396,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21202,8 +22421,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_RMD160_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_RMD160_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21224,20 +22443,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_RMD160=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_RMD160_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_RMD160_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21248,8 +22468,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21270,20 +22490,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21294,8 +22515,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21316,20 +22537,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21340,8 +22562,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21362,20 +22584,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21386,8 +22609,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_OPENSSL" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_OPENSSL... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_OPENSSL" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_OPENSSL... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21408,59 +22631,77 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_OPENSSL=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_OPENSSL 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" fi - for ac_func in PKCS5_PBKDF2_HMAC_SHA1 -do : - ac_fn_c_check_func "$LINENO" "PKCS5_PBKDF2_HMAC_SHA1" "ac_cv_func_PKCS5_PBKDF2_HMAC_SHA1" -if test "x$ac_cv_func_PKCS5_PBKDF2_HMAC_SHA1" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_PKCS5_PBKDF2_HMAC_SHA1 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "PKCS5_PBKDF2_HMAC_SHA1" "ac_cv_func_PKCS5_PBKDF2_HMAC_SHA1" +if test "x$ac_cv_func_PKCS5_PBKDF2_HMAC_SHA1" = xyes +then : + printf "%s\n" "#define HAVE_PKCS5_PBKDF2_HMAC_SHA1 1" >>confdefs.h fi -done fi + + # Probe libmd AFTER OpenSSL/libcrypto. # The two are incompatible and OpenSSL is more complete. -for ac_header in md5.h ripemd.h sha.h sha256.h sha512.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "md5.h" "ac_cv_header_md5_h" "$ac_includes_default" +if test "x$ac_cv_header_md5_h" = xyes +then : + printf "%s\n" "#define HAVE_MD5_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ripemd.h" "ac_cv_header_ripemd_h" "$ac_includes_default" +if test "x$ac_cv_header_ripemd_h" = xyes +then : + printf "%s\n" "#define HAVE_RIPEMD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sha.h" "ac_cv_header_sha_h" "$ac_includes_default" +if test "x$ac_cv_header_sha_h" = xyes +then : + printf "%s\n" "#define HAVE_SHA_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sha256.h" "ac_cv_header_sha256_h" "$ac_includes_default" +if test "x$ac_cv_header_sha256_h" = xyes +then : + printf "%s\n" "#define HAVE_SHA256_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sha512.h" "ac_cv_header_sha512_h" "$ac_includes_default" +if test "x$ac_cv_header_sha512_h" = xyes +then : + printf "%s\n" "#define HAVE_SHA512_H 1" >>confdefs.h fi -done - saved_LIBS=$LIBS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5Init in -lmd" >&5 -$as_echo_n "checking for MD5Init in -lmd... " >&6; } -if ${ac_cv_lib_md_MD5Init+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MD5Init in -lmd" >&5 +printf %s "checking for MD5Init in -lmd... " >&6; } +if test ${ac_cv_lib_md_MD5Init+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lmd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -21469,33 +22710,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char MD5Init (); int -main () +main (void) { return MD5Init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_md_MD5Init=yes -else +else $as_nop ac_cv_lib_md_MD5Init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_md_MD5Init" >&5 -$as_echo "$ac_cv_lib_md_MD5Init" >&6; } -if test "x$ac_cv_lib_md_MD5Init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBMD 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_md_MD5Init" >&5 +printf "%s\n" "$ac_cv_lib_md_MD5Init" >&6; } +if test "x$ac_cv_lib_md_MD5Init" = xyes +then : + printf "%s\n" "#define HAVE_LIBMD 1" >>confdefs.h LIBS="-lmd $LIBS" @@ -21506,8 +22744,8 @@ fi saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBMD" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_LIBMD... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_LIBMD" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_LIBMD... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21528,20 +22766,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_LIBMD=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_LIBMD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_LIBMD 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21552,8 +22791,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_LIBMD" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_RMD160_LIBMD... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_RMD160_LIBMD" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_RMD160_LIBMD... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21574,20 +22813,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_RMD160=yes found_LIBMD=yes -$as_echo "#define ARCHIVE_CRYPTO_RMD160_LIBMD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_RMD160_LIBMD 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21598,8 +22838,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBMD" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_LIBMD... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_LIBMD" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_LIBMD... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21620,20 +22860,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_LIBMD=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_LIBMD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_LIBMD 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21644,8 +22885,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBMD" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_LIBMD... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_LIBMD" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_LIBMD... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21666,20 +22907,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_LIBMD=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_LIBMD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_LIBMD 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21690,8 +22932,8 @@ rm -f core conftest.err conftest.$ac_objext \ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/libarchive" touch "check_crypto_md.h" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBMD" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_LIBMD... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_LIBMD" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_LIBMD... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21712,20 +22954,21 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_LIBMD=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_LIBMD 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_LIBMD 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" rm "check_crypto_md.h" @@ -21739,8 +22982,8 @@ case "$host_os" in *mingw* | *cygwin* | *msys*) if test "$found_MD5" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_WIN" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_MD5_WIN... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_MD5_WIN" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_MD5_WIN... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21758,27 +23001,28 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_MD5=yes found_WIN=yes -$as_echo "#define ARCHIVE_CRYPTO_MD5_WIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_MD5_WIN 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "$found_SHA1" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_WIN" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA1_WIN... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA1_WIN" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA1_WIN... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21796,27 +23040,28 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA1=yes found_WIN=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA1_WIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA1_WIN 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "$found_SHA256" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_WIN" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA256_WIN... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA256_WIN" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA256_WIN... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21834,27 +23079,28 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA256=yes found_WIN=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA256_WIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA256_WIN 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "$found_SHA384" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_WIN" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA384_WIN... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA384_WIN" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA384_WIN... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21872,27 +23118,28 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA384=yes found_WIN=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA384_WIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA384_WIN 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "$found_SHA512" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_WIN" >&5 -$as_echo_n "checking support for ARCHIVE_CRYPTO_SHA512_WIN... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for ARCHIVE_CRYPTO_SHA512_WIN" >&5 +printf %s "checking support for ARCHIVE_CRYPTO_SHA512_WIN... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21910,26 +23157,57 @@ main(int argc, char **argv) } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } found_SHA512=yes found_WIN=yes -$as_echo "#define ARCHIVE_CRYPTO_SHA512_WIN 1" >>confdefs.h +printf "%s\n" "#define ARCHIVE_CRYPTO_SHA512_WIN 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi ;; esac +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden -Werror" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports visibility annotations" >&5 +printf %s "checking whether compiler supports visibility annotations... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + int foo( void ) __attribute__((visibility("default"))); + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + CFLAGS="$saved_CFLAGS -fvisibility=hidden -D__LIBARCHIVE_ENABLE_VISIBILITY"; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + CFLAGS="$saved_CFLAGS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + # Ensure test directories are present if building out-of-tree ac_config_commands="$ac_config_commands mkdirs" @@ -21961,8 +23239,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -21992,15 +23270,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -22014,8 +23292,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -22032,7 +23310,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -22043,14 +23321,14 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -22128,8 +23406,8 @@ fi ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -22152,14 +23430,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -22169,46 +23449,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -22217,13 +23497,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -22232,8 +23505,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -22245,30 +23522,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -22281,13 +23538,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -22314,18 +23572,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -22337,12 +23597,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -22373,7 +23634,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -22395,6 +23656,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -22408,6 +23673,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -22449,7 +23720,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -22458,7 +23729,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -22520,8 +23791,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libarchive $as_me 3.5.2, which was -generated by GNU Autoconf 2.69. Invocation command line was +This file was extended by libarchive $as_me 3.6.2, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -22583,14 +23854,16 @@ $config_commands Report bugs to ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libarchive config.status 3.5.2 -configured by $0, generated by GNU Autoconf 2.69, +libarchive config.status 3.6.2 +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -22630,15 +23903,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -22646,7 +23919,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -22655,7 +23928,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -22683,7 +23956,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -22697,7 +23970,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -23017,9 +24290,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -23355,7 +24628,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -23363,17 +24636,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -23390,7 +24663,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -23414,9 +24687,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -23478,8 +24751,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -23523,9 +24796,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -23541,20 +24814,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi @@ -23574,7 +24847,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -23594,8 +24867,8 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -23621,7 +24894,7 @@ esac for am_mf do # Strip MF so we end up with the name of the file. - am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line @@ -23633,7 +24906,7 @@ $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$am_mf" | +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -23655,7 +24928,7 @@ $as_echo X"$am_mf" | $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$am_mf" | +printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -23680,10 +24953,12 @@ $as_echo X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } @@ -24225,6 +25500,7 @@ _LT_EOF esac + ltmain=$ac_aux_dir/ltmain.sh @@ -24275,7 +25551,8 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi + diff --git a/src/dependencies/libarchive-3.5.2/configure.ac b/src/dependencies/libarchive-3.6.2/configure.ac similarity index 96% rename from src/dependencies/libarchive-3.5.2/configure.ac rename to src/dependencies/libarchive-3.6.2/configure.ac index f59ada9..349e758 100644 --- a/src/dependencies/libarchive-3.5.2/configure.ac +++ b/src/dependencies/libarchive-3.6.2/configure.ac @@ -4,8 +4,8 @@ dnl First, define all of the version numbers up front. dnl In particular, this allows the version macro to be used in AC_INIT dnl These first two version numbers are updated automatically on each release. -m4_define([LIBARCHIVE_VERSION_S],[3.5.2]) -m4_define([LIBARCHIVE_VERSION_N],[3005002]) +m4_define([LIBARCHIVE_VERSION_S],[3.6.2]) +m4_define([LIBARCHIVE_VERSION_N],[3006002]) dnl bsdtar and bsdcpio versioning tracks libarchive m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) @@ -378,6 +378,7 @@ if test "x$with_iconv" != "xno"; then AC_CHECK_HEADERS([localcharset.h]) am_save_LIBS="$LIBS" LIBS="${LIBS} ${LIBICONV}" + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }iconv" AC_CHECK_FUNCS([locale_charset]) LIBS="${am_save_LIBS}" if test "x$ac_cv_func_locale_charset" != "xyes"; then @@ -400,7 +401,9 @@ AC_ARG_WITH([zstd], if test "x$with_zstd" != "xno"; then AC_CHECK_HEADERS([zstd.h]) - AC_CHECK_LIB(zstd,ZSTD_compressStream) + AC_CHECK_LIB(zstd,ZSTD_decompressStream) + AC_CHECK_LIB(zstd,ZSTD_compressStream, + AC_DEFINE([HAVE_LIBZSTD_COMPRESSOR], [1], [Define to 1 if you have the `zstd' library (-lzstd) with compression support.])) fi AC_ARG_WITH([lzma], @@ -540,6 +543,22 @@ fi # Checks for supported compiler flags AX_APPEND_COMPILE_FLAGS([-Wall -Wformat -Wformat-security]) +# Place the functions and data into separate sections, allowing the linker +# to garbage collect the unused ones. +save_LDFLAGS=$LDFLAGS +LDFLAGS="$LDFLAGS -Wl,--gc-sections" +AC_MSG_CHECKING([whether ld supports --gc-sections]) +AC_LINK_IFELSE( + [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])], + [AC_MSG_RESULT([yes]) + GC_SECTIONS="-Wl,--gc-sections"; + AX_APPEND_COMPILE_FLAGS([-ffunction-sections -fdata-sections])], + [AC_MSG_RESULT([no]) + GC_SECTIONS="";]) +LDFLAGS=$save_LDFLAGS + +AC_SUBST(GC_SECTIONS) + # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST # la_TYPE_UID_T defaults to "int", which is incorrect for MinGW @@ -633,6 +652,9 @@ AC_CHECK_TYPE([wchar_t], AC_CHECK_SIZEOF([wchar_t])], []) +AX_COMPILE_CHECK_SIZEOF(int) +AX_COMPILE_CHECK_SIZEOF(long) + AC_HEADER_TIME # Checks for library functions. @@ -694,14 +716,14 @@ AC_CHECK_TYPES(struct statfs,,, # There are several variants of readdir_r around; we only # accept the POSIX-compliant version. -AC_COMPILE_IFELSE( +AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[DIR *dir; struct dirent e, *r; return(readdir_r(dir, &e, &r));]])], [AC_DEFINE(HAVE_READDIR_R,1,[Define to 1 if you have a POSIX compatible readdir_r])] ) # dirfd can be either a function or a macro. -AC_COMPILE_IFELSE( +AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include DIR *dir;]], [[return(dirfd(dir));]])], @@ -1188,24 +1210,8 @@ fi if test "x$with_openssl" != "xno"; then AC_CHECK_HEADERS([openssl/evp.h]) saved_LIBS=$LIBS - case "$host_os" in - *mingw* | *cygwin* | *msys*) - case "$host_cpu" in - x86_64) - AC_CHECK_LIB(eay64,OPENSSL_config) - if test "x$ac_cv_lib_eay64_main" != "xyes"; then - AC_CHECK_LIB(eay32,OPENSSL_config) - fi - ;; - *) - AC_CHECK_LIB(eay32,OPENSSL_config) - ;; - esac - ;; - *) - AC_CHECK_LIB(crypto,OPENSSL_config) - ;; - esac + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + AC_CHECK_LIB(crypto,OPENSSL_config) CRYPTO_CHECK(MD5, OPENSSL, md5) CRYPTO_CHECK(RMD160, OPENSSL, rmd160) CRYPTO_CHECK(SHA1, OPENSSL, sha1) @@ -1215,6 +1221,8 @@ if test "x$with_openssl" != "xno"; then AC_CHECK_FUNCS([PKCS5_PBKDF2_HMAC_SHA1]) fi +AC_SUBST(LIBSREQUIRED) + # Probe libmd AFTER OpenSSL/libcrypto. # The two are incompatible and OpenSSL is more complete. AC_CHECK_HEADERS([md5.h ripemd.h sha.h sha256.h sha512.h]) @@ -1239,6 +1247,18 @@ case "$host_os" in ;; esac +dnl Visibility annotations... +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden -Werror" +AC_MSG_CHECKING(whether compiler supports visibility annotations) +AC_LINK_IFELSE([AC_LANG_PROGRAM([ + int foo( void ) __attribute__((visibility("default"))); + ])], + [CFLAGS="$saved_CFLAGS -fvisibility=hidden -D__LIBARCHIVE_ENABLE_VISIBILITY"; + AC_MSG_RESULT(yes)], + [CFLAGS="$saved_CFLAGS" + AC_MSG_RESULT(no)]) + # Ensure test directories are present if building out-of-tree AC_CONFIG_COMMANDS([mkdirs], [mkdir -p libarchive/test tar/test cat/test cpio/test]) diff --git a/src/dependencies/libarchive-3.5.2/contrib/README b/src/dependencies/libarchive-3.6.2/contrib/README similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/README rename to src/dependencies/libarchive-3.6.2/contrib/README diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/Android.mk b/src/dependencies/libarchive-3.6.2/contrib/android/Android.mk similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/Android.mk rename to src/dependencies/libarchive-3.6.2/contrib/android/Android.mk diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/config/android.h b/src/dependencies/libarchive-3.6.2/contrib/android/config/android.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/config/android.h rename to src/dependencies/libarchive-3.6.2/contrib/android/config/android.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/config/linux_host.h b/src/dependencies/libarchive-3.6.2/contrib/android/config/linux_host.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/config/linux_host.h rename to src/dependencies/libarchive-3.6.2/contrib/android/config/linux_host.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/config/windows_host.h b/src/dependencies/libarchive-3.6.2/contrib/android/config/windows_host.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/config/windows_host.h rename to src/dependencies/libarchive-3.6.2/contrib/android/config/windows_host.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/include/Bcrypt.h b/src/dependencies/libarchive-3.6.2/contrib/android/include/Bcrypt.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/include/Bcrypt.h rename to src/dependencies/libarchive-3.6.2/contrib/android/include/Bcrypt.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/include/Windows.h b/src/dependencies/libarchive-3.6.2/contrib/android/include/Windows.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/include/Windows.h rename to src/dependencies/libarchive-3.6.2/contrib/android/include/Windows.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/android/include/android_lf.h b/src/dependencies/libarchive-3.6.2/contrib/android/include/android_lf.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/android/include/android_lf.h rename to src/dependencies/libarchive-3.6.2/contrib/android/include/android_lf.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/archivetest.c b/src/dependencies/libarchive-3.6.2/contrib/archivetest.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/archivetest.c rename to src/dependencies/libarchive-3.6.2/contrib/archivetest.c diff --git a/src/dependencies/libarchive-3.5.2/contrib/libarchive.1aix53.spec b/src/dependencies/libarchive-3.6.2/contrib/libarchive.1aix53.spec similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/libarchive.1aix53.spec rename to src/dependencies/libarchive-3.6.2/contrib/libarchive.1aix53.spec diff --git a/src/dependencies/libarchive-3.5.2/contrib/libarchive.spec b/src/dependencies/libarchive-3.6.2/contrib/libarchive.spec similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/libarchive.spec rename to src/dependencies/libarchive-3.6.2/contrib/libarchive.spec diff --git a/src/dependencies/libarchive-3.5.2/contrib/libarchive_autodetect-st_lib_archive.m4 b/src/dependencies/libarchive-3.6.2/contrib/libarchive_autodetect-st_lib_archive.m4 similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/libarchive_autodetect-st_lib_archive.m4 rename to src/dependencies/libarchive-3.6.2/contrib/libarchive_autodetect-st_lib_archive.m4 diff --git a/src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/corpus.zip b/src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/corpus.zip similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/corpus.zip rename to src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/corpus.zip diff --git a/src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/libarchive_fuzzer.cc b/src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/libarchive_fuzzer.cc similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/libarchive_fuzzer.cc rename to src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/libarchive_fuzzer.cc diff --git a/src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/oss-fuzz-build.sh b/src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/oss-fuzz-build.sh similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/oss-fuzz/oss-fuzz-build.sh rename to src/dependencies/libarchive-3.6.2/contrib/oss-fuzz/oss-fuzz-build.sh diff --git a/src/dependencies/libarchive-3.5.2/contrib/psota-benchmark/results.txt b/src/dependencies/libarchive-3.6.2/contrib/psota-benchmark/results.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/psota-benchmark/results.txt rename to src/dependencies/libarchive-3.6.2/contrib/psota-benchmark/results.txt diff --git a/src/dependencies/libarchive-3.5.2/contrib/psota-benchmark/tcp.sh b/src/dependencies/libarchive-3.6.2/contrib/psota-benchmark/tcp.sh similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/psota-benchmark/tcp.sh rename to src/dependencies/libarchive-3.6.2/contrib/psota-benchmark/tcp.sh diff --git a/src/dependencies/libarchive-3.5.2/contrib/shar/shar.1 b/src/dependencies/libarchive-3.6.2/contrib/shar/shar.1 similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/shar/shar.1 rename to src/dependencies/libarchive-3.6.2/contrib/shar/shar.1 diff --git a/src/dependencies/libarchive-3.5.2/contrib/shar/shar.c b/src/dependencies/libarchive-3.6.2/contrib/shar/shar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/shar/shar.c rename to src/dependencies/libarchive-3.6.2/contrib/shar/shar.c diff --git a/src/dependencies/libarchive-3.5.2/contrib/shar/tree.c b/src/dependencies/libarchive-3.6.2/contrib/shar/tree.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/shar/tree.c rename to src/dependencies/libarchive-3.6.2/contrib/shar/tree.c diff --git a/src/dependencies/libarchive-3.5.2/contrib/shar/tree.h b/src/dependencies/libarchive-3.6.2/contrib/shar/tree.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/shar/tree.h rename to src/dependencies/libarchive-3.6.2/contrib/shar/tree.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/shar/tree_config.h b/src/dependencies/libarchive-3.6.2/contrib/shar/tree_config.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/contrib/shar/tree_config.h rename to src/dependencies/libarchive-3.6.2/contrib/shar/tree_config.h diff --git a/src/dependencies/libarchive-3.5.2/contrib/untar.c b/src/dependencies/libarchive-3.6.2/contrib/untar.c similarity index 95% rename from src/dependencies/libarchive-3.5.2/contrib/untar.c rename to src/dependencies/libarchive-3.6.2/contrib/untar.c index 3d954f6..2550e51 100644 --- a/src/dependencies/libarchive-3.5.2/contrib/untar.c +++ b/src/dependencies/libarchive-3.6.2/contrib/untar.c @@ -36,6 +36,10 @@ /* This is for mkdir(); this may need to be changed for some platforms. */ #include /* For mkdir() */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#endif + /* Parse an octal number, ignoring leading and trailing nonsense. */ static int parseoct(const char *p, size_t n) @@ -78,7 +82,11 @@ create_dir(char *pathname, int mode) pathname[strlen(pathname) - 1] = '\0'; /* Try creating the directory. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + r = _mkdir(pathname); +#else r = mkdir(pathname, mode); +#endif if (r != 0) { /* On failure, try creating parent directory. */ @@ -87,7 +95,11 @@ create_dir(char *pathname, int mode) *p = '\0'; create_dir(pathname, 0755); *p = '/'; +#if defined(_WIN32) && !defined(__CYGWIN__) + r = _mkdir(pathname); +#else r = mkdir(pathname, mode); +#endif } } if (r != 0) diff --git a/src/dependencies/libarchive-3.5.2/cpio/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/cpio/CMakeLists.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/cpio/CMakeLists.txt diff --git a/src/dependencies/libarchive-3.5.2/cpio/bsdcpio.1 b/src/dependencies/libarchive-3.6.2/cpio/bsdcpio.1 similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/bsdcpio.1 rename to src/dependencies/libarchive-3.6.2/cpio/bsdcpio.1 diff --git a/src/dependencies/libarchive-3.5.2/cpio/cmdline.c b/src/dependencies/libarchive-3.6.2/cpio/cmdline.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cmdline.c rename to src/dependencies/libarchive-3.6.2/cpio/cmdline.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/config_freebsd.h b/src/dependencies/libarchive-3.6.2/cpio/config_freebsd.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/config_freebsd.h rename to src/dependencies/libarchive-3.6.2/cpio/config_freebsd.h diff --git a/src/dependencies/libarchive-3.5.2/cpio/cpio.c b/src/dependencies/libarchive-3.6.2/cpio/cpio.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cpio.c rename to src/dependencies/libarchive-3.6.2/cpio/cpio.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/cpio.h b/src/dependencies/libarchive-3.6.2/cpio/cpio.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cpio.h rename to src/dependencies/libarchive-3.6.2/cpio/cpio.h diff --git a/src/dependencies/libarchive-3.5.2/cpio/cpio_platform.h b/src/dependencies/libarchive-3.6.2/cpio/cpio_platform.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cpio_platform.h rename to src/dependencies/libarchive-3.6.2/cpio/cpio_platform.h diff --git a/src/dependencies/libarchive-3.5.2/cpio/cpio_windows.c b/src/dependencies/libarchive-3.6.2/cpio/cpio_windows.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cpio_windows.c rename to src/dependencies/libarchive-3.6.2/cpio/cpio_windows.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/cpio_windows.h b/src/dependencies/libarchive-3.6.2/cpio/cpio_windows.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/cpio_windows.h rename to src/dependencies/libarchive-3.6.2/cpio/cpio_windows.h diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/cpio/test/CMakeLists.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/cpio/test/CMakeLists.txt diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/list.h b/src/dependencies/libarchive-3.6.2/cpio/test/list.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/list.h rename to src/dependencies/libarchive-3.6.2/cpio/test/list.h index 92f9ec8..9c170a0 100644 --- a/src/dependencies/libarchive-3.5.2/cpio/test/list.h +++ b/src/dependencies/libarchive-3.6.2/cpio/test/list.h @@ -1,34 +1,35 @@ DEFINE_TEST(test_0) DEFINE_TEST(test_basic) DEFINE_TEST(test_cmdline) +DEFINE_TEST(test_extract_cpio_Z) DEFINE_TEST(test_extract_cpio_bz2) DEFINE_TEST(test_extract_cpio_grz) DEFINE_TEST(test_extract_cpio_gz) DEFINE_TEST(test_extract_cpio_lrz) -DEFINE_TEST(test_extract_cpio_lz4) DEFINE_TEST(test_extract_cpio_lz) +DEFINE_TEST(test_extract_cpio_lz4) DEFINE_TEST(test_extract_cpio_lzma) DEFINE_TEST(test_extract_cpio_lzo) DEFINE_TEST(test_extract_cpio_xz) -DEFINE_TEST(test_extract_cpio_Z) DEFINE_TEST(test_extract_cpio_zstd) DEFINE_TEST(test_format_newc) DEFINE_TEST(test_gcpio_compat) DEFINE_TEST(test_missing_file) DEFINE_TEST(test_option_0) +DEFINE_TEST(test_option_B_upper) +DEFINE_TEST(test_option_C_upper) +DEFINE_TEST(test_option_J_upper) +DEFINE_TEST(test_option_L_upper) +DEFINE_TEST(test_option_Z_upper) DEFINE_TEST(test_option_a) DEFINE_TEST(test_option_b64encode) -DEFINE_TEST(test_option_B_upper) DEFINE_TEST(test_option_c) -DEFINE_TEST(test_option_C_upper) DEFINE_TEST(test_option_d) DEFINE_TEST(test_option_f) DEFINE_TEST(test_option_grzip) DEFINE_TEST(test_option_help) -DEFINE_TEST(test_option_J_upper) DEFINE_TEST(test_option_l) DEFINE_TEST(test_option_lrzip) -DEFINE_TEST(test_option_L_upper) DEFINE_TEST(test_option_lz4) DEFINE_TEST(test_option_lzma) DEFINE_TEST(test_option_lzop) @@ -42,7 +43,6 @@ DEFINE_TEST(test_option_xz) DEFINE_TEST(test_option_y) DEFINE_TEST(test_option_z) DEFINE_TEST(test_option_zstd) -DEFINE_TEST(test_option_Z_upper) DEFINE_TEST(test_owner_parse) DEFINE_TEST(test_passthrough_dotdot) DEFINE_TEST(test_passthrough_reverse) diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test.h b/src/dependencies/libarchive-3.6.2/cpio/test/test.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test.h rename to src/dependencies/libarchive-3.6.2/cpio/test/test.h diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_0.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_0.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_0.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_0.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_basic.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_basic.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_basic.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_basic.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_cmdline.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_cmdline.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_cmdline.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_cmdline.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.Z.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.Z.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.bz2.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.bz2.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.bz2.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.bz2.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.grz.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.grz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.grz.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.grz.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.gz.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.gz.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lrz.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lrz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lrz.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lrz.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lz.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lz.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lz.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lz4.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lz4.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lzma.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lzma.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lzma.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lzma.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lzo.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lzo.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.lzo.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.lzo.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.xz.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.xz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.xz.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.xz.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.zst.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.zst.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract.cpio.zst.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract.cpio.zst.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_Z.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_Z.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_Z.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_Z.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_bz2.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_bz2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_bz2.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_bz2.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_grz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_grz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_grz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_grz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_gz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_gz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_gz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_gz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lrz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lrz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lrz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lrz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lz4.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lz4.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lzma.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lzma.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lzma.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lzma.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lzo.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lzo.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_lzo.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_lzo.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_xz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_xz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_xz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_zstd.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_extract_cpio_zstd.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_extract_cpio_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_format_newc.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_format_newc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_format_newc.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_format_newc.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.bin.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.bin.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.bin.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.bin.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.crc.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.crc.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.crc.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.crc.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.newc.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.newc.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.newc.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.newc.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.ustar.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.ustar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref.ustar.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref.ustar.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.bin.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.bin.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.bin.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.bin.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.crc.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.crc.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.crc.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.crc.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.newc.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.newc.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.newc.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.newc.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_missing_file.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_missing_file.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_missing_file.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_missing_file.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_0.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_0.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_0.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_0.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_B_upper.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_B_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_B_upper.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_B_upper.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_C_upper.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_C_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_C_upper.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_C_upper.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_J_upper.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_J_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_J_upper.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_J_upper.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_L_upper.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_L_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_L_upper.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_L_upper.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_Z_upper.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_Z_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_Z_upper.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_Z_upper.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_a.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_a.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_a.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_a.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_b64encode.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_b64encode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_b64encode.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_b64encode.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_c.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_c.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_c.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_c.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_d.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_d.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_d.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_d.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_f.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_f.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_f.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_f.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_f.cpio.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_f.cpio.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_f.cpio.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_f.cpio.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_grzip.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_grzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_grzip.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_grzip.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_help.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_help.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_help.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_help.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_l.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_l.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_l.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_l.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_lrzip.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_lrzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_lrzip.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_lrzip.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_lz4.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_lz4.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_lzma.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_lzma.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_lzma.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_lzma.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_lzop.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_lzop.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_lzop.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_lzop.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_m.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_m.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_m.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_m.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_m.cpio.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_m.cpio.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_m.cpio.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_m.cpio.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_passphrase.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_passphrase.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_passphrase.zip.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_passphrase.zip.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_passphrase.zip.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_passphrase.zip.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.c similarity index 86% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.c index eaa73fa..0f2dda2 100644 --- a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.c +++ b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.c @@ -36,6 +36,14 @@ DEFINE_TEST(test_option_t) time_t mtime; char date[32]; char date2[32]; + struct tm *tmptr; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S) + struct tm tmbuf; +#endif +#if defined(HAVE__LOCALTIME64_S) + errno_t terr; + __time64_t tmptime; +#endif /* List reference archive, make sure the TOC is correct. */ extract_reference_file("test_option_t.cpio"); @@ -87,11 +95,23 @@ DEFINE_TEST(test_option_t) #ifdef HAVE_LOCALE_H setlocale(LC_ALL, ""); #endif +#if defined(HAVE_LOCALTIME_R) + tmptr = localtime_r(&mtime, &tmbuf); +#elif defined(HAVE__LOCALTIME64_S) + tmptime = mtime; + terr = _localtime64_s(&tmbuf, &tmptime); + if (terr) + tmptr = NULL; + else + tmptr = &tmbuf; +#else + tmptr = localtime(&mtime); +#endif #if defined(_WIN32) && !defined(__CYGWIN__) - strftime(date2, sizeof(date2)-1, "%b %d %Y", localtime(&mtime)); + strftime(date2, sizeof(date2)-1, "%b %d %Y", tmptr); _snprintf(date, sizeof(date)-1, "%12.12s file", date2); #else - strftime(date2, sizeof(date2)-1, "%b %e %Y", localtime(&mtime)); + strftime(date2, sizeof(date2)-1, "%b %e %Y", tmptr); snprintf(date, sizeof(date)-1, "%12.12s file", date2); #endif assertEqualMem(p + 42, date, strlen(date)); diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.cpio.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.cpio.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.cpio.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.cpio.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.stdout.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.stdout.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_t.stdout.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_t.stdout.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_tv.stdout.uu b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_tv.stdout.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_tv.stdout.uu rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_tv.stdout.uu diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_u.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_u.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_u.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_u.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_uuencode.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_uuencode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_uuencode.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_uuencode.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_version.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_version.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_version.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_version.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_xz.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_xz.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_xz.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_y.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_y.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_y.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_y.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_z.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_z.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_z.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_z.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_option_zstd.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_option_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_option_zstd.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_option_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_owner_parse.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_owner_parse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_owner_parse.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_owner_parse.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_passthrough_dotdot.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_passthrough_dotdot.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_passthrough_dotdot.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_passthrough_dotdot.c diff --git a/src/dependencies/libarchive-3.5.2/cpio/test/test_passthrough_reverse.c b/src/dependencies/libarchive-3.6.2/cpio/test/test_passthrough_reverse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/cpio/test/test_passthrough_reverse.c rename to src/dependencies/libarchive-3.6.2/cpio/test/test_passthrough_reverse.c diff --git a/src/dependencies/libarchive-3.5.2/doc/html/.ignore_me b/src/dependencies/libarchive-3.6.2/doc/html/.ignore_me similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/html/.ignore_me rename to src/dependencies/libarchive-3.6.2/doc/html/.ignore_me diff --git a/src/dependencies/libarchive-3.5.2/doc/html/Makefile b/src/dependencies/libarchive-3.6.2/doc/html/Makefile similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/Makefile rename to src/dependencies/libarchive-3.6.2/doc/html/Makefile index 5fdc652..d15a786 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/Makefile +++ b/src/dependencies/libarchive-3.6.2/doc/html/Makefile @@ -107,15 +107,15 @@ archive_write_set_passphrase.3.html: ../../libarchive/archive_write_set_passphra cpio.5.html: ../../libarchive/cpio.5 groff -mdoc -T html ../../libarchive/cpio.5 > cpio.5.html +libarchive-formats.5.html: ../../libarchive/libarchive-formats.5 + groff -mdoc -T html ../../libarchive/libarchive-formats.5 > libarchive-formats.5.html + libarchive.3.html: ../../libarchive/libarchive.3 groff -mdoc -T html ../../libarchive/libarchive.3 > libarchive.3.html libarchive_changes.3.html: ../../libarchive/libarchive_changes.3 groff -mdoc -T html ../../libarchive/libarchive_changes.3 > libarchive_changes.3.html -libarchive-formats.5.html: ../../libarchive/libarchive-formats.5 - groff -mdoc -T html ../../libarchive/libarchive-formats.5 > libarchive-formats.5.html - libarchive_internals.3.html: ../../libarchive/libarchive_internals.3 groff -mdoc -T html ../../libarchive/libarchive_internals.3 > libarchive_internals.3.html @@ -130,4 +130,4 @@ bsdtar.1.html: ../../tar/bsdtar.1 bsdcpio.1.html: ../../cpio/bsdcpio.1 groff -mdoc -T html ../../cpio/bsdcpio.1 > bsdcpio.1.html -all: archive_entry.3.html archive_entry_acl.3.html archive_entry_linkify.3.html archive_entry_misc.3.html archive_entry_paths.3.html archive_entry_perms.3.html archive_entry_stat.3.html archive_entry_time.3.html archive_read.3.html archive_read_add_passphrase.3.html archive_read_data.3.html archive_read_disk.3.html archive_read_extract.3.html archive_read_filter.3.html archive_read_format.3.html archive_read_free.3.html archive_read_header.3.html archive_read_new.3.html archive_read_open.3.html archive_read_set_options.3.html archive_util.3.html archive_write.3.html archive_write_blocksize.3.html archive_write_data.3.html archive_write_disk.3.html archive_write_filter.3.html archive_write_finish_entry.3.html archive_write_format.3.html archive_write_free.3.html archive_write_header.3.html archive_write_new.3.html archive_write_open.3.html archive_write_set_options.3.html archive_write_set_passphrase.3.html cpio.5.html libarchive.3.html libarchive_changes.3.html libarchive-formats.5.html libarchive_internals.3.html mtree.5.html tar.5.html bsdtar.1.html bsdcpio.1.html +all: archive_entry.3.html archive_entry_acl.3.html archive_entry_linkify.3.html archive_entry_misc.3.html archive_entry_paths.3.html archive_entry_perms.3.html archive_entry_stat.3.html archive_entry_time.3.html archive_read.3.html archive_read_add_passphrase.3.html archive_read_data.3.html archive_read_disk.3.html archive_read_extract.3.html archive_read_filter.3.html archive_read_format.3.html archive_read_free.3.html archive_read_header.3.html archive_read_new.3.html archive_read_open.3.html archive_read_set_options.3.html archive_util.3.html archive_write.3.html archive_write_blocksize.3.html archive_write_data.3.html archive_write_disk.3.html archive_write_filter.3.html archive_write_finish_entry.3.html archive_write_format.3.html archive_write_free.3.html archive_write_header.3.html archive_write_new.3.html archive_write_open.3.html archive_write_set_options.3.html archive_write_set_passphrase.3.html cpio.5.html libarchive-formats.5.html libarchive.3.html libarchive_changes.3.html libarchive_internals.3.html mtree.5.html tar.5.html bsdtar.1.html bsdcpio.1.html diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry.3.html index f0d0023..1a290a7 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_acl.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_acl.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_acl.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_acl.3.html index fe89601..38b01ab 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_acl.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_acl.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_linkify.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_linkify.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_linkify.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_linkify.3.html index c6f214c..c5d862d 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_linkify.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_linkify.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_misc.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_misc.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_misc.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_misc.3.html index a0365c1..9802419 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_misc.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_misc.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_paths.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_paths.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_paths.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_paths.3.html index 127c394..ba90e2c 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_paths.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_paths.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_perms.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_perms.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_perms.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_perms.3.html index 7a912cd..8190857 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_perms.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_perms.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_stat.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_stat.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_stat.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_stat.3.html index 5b0e476..7ea2698 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_stat.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_stat.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_time.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_time.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_entry_time.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_entry_time.3.html index fd62535..78e8048 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_entry_time.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_entry_time.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read.3.html index 13a14b1..2c5d8b9 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_add_passphrase.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_add_passphrase.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_add_passphrase.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_add_passphrase.3.html index d39b665..a706623 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_add_passphrase.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_add_passphrase.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_data.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_data.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_data.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_data.3.html index a610e15..375809a 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_data.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_data.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_disk.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_disk.3.html similarity index 71% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_disk.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_disk.3.html index c1dc2d6..710bb0a 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_disk.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_disk.3.html @@ -1,5 +1,5 @@ - + @@ -26,6 +26,8 @@ ARCHIVE_READ_DISK(3)

NAME

archive_read_disk_new, +archive_read_disk_open, +archive_read_disk_open_w, archive_read_disk_set_behavior, archive_read_disk_set_symlink_logical, archive_read_disk_set_symlink_physical, @@ -35,8 +37,15 @@ ARCHIVE_READ_DISK(3)

archive_read_disk_uname, archive_read_disk_set_uname_lookup, archive_read_disk_set_gname_lookup, -archive_read_disk_set_standard_lookup — -functions for reading objects from disk

+archive_read_disk_set_standard_lookup, +archive_read_disk_descend, +archive_read_disk_can_descend, +archive_read_disk_current_filesystem, +archive_read_disk_current_filesystem_is_synthetic, +archive_read_disk_current_filesystem_is_remote, +archive_read_disk_set_matching, +archive_read_disk_set_metadata_filter_callback, +— functions for reading objects from disk

LIBRARY

@@ -57,6 +66,18 @@ archive *

int

+

archive_read_disk_open(struct archive *, +const char *);

+ +

int

+ + +

archive_read_disk_open_w(struct archive *, +const wchar_t *);

+ +

int

+ +

archive_read_disk_set_behavior(struct archive *, int);

@@ -117,6 +138,46 @@ archive *

struct archive_entry *, int fd, const struct stat *);

+

int

+ + +

archive_read_disk_descend(struct archive *);

+ +

int

+ + +

archive_read_disk_can_descend(struct archive *);

+ +

int

+ + +

archive_read_disk_current_filesystem(struct archive *);

+ +

int

+ + +

archive_read_disk_current_filesystem_is_synthetic(struct archive *);

+ +

int

+ + +

archive_read_disk_current_filesystem_is_remote(struct archive *);

+ +

int

+ + +

archive_read_disk_set_matching(struct archive *, +struct archive *, +void (*excluded_func)(struct archive *, void *, struct archive entry *), +void *);

+ +

int

+ + +

archive_read_disk_set_metadata_filter_callback(struct archive *, +int (*metadata_filter_func)(struct archive *, void*, struct archive_entry *), +void *);

+

DESCRIPTION

These functions provide an API @@ -132,6 +193,20 @@ struct archive object suitable for reading object information from disk.

+

archive_read_disk_open()

+ +

Opens the file or directory +from the given path and prepares the struct archive to read +it from disk.

+ + +

archive_read_disk_open_w()

+ +

Opens the file or directory +from the given path as a wide character string and prepares +the struct archive to read it from disk.

+ +

archive_read_disk_set_behavior()

Configures various behavior @@ -182,6 +257,12 @@ extended file attributes.

traversed files. By default, access time of traversed files is not restored.

+

ARCHIVE_READDISK_NO_SPARSE

+ +

Do not read sparse file +information. By default, sparse file information is read +from disk.

+

archive_read_disk_set_symlink_logical(), archive_read_disk_set_symlink_physical(), @@ -255,6 +336,65 @@ group names using the currently-registered lookup functions above. This affects the file ownership fields and ACL values in the struct archive_entry object.

+ +

archive_read_disk_descend()

+ +

If the current entry can be +descended, this function will mark the directory as the next +entry for archive_read_header(3) to visit.

+ + +

archive_read_disk_can_descend()

+ +

Returns 1 if the current entry +is an unvisited directory and 0 otherwise.

+ + +

archive_read_disk_current_filesystem()

+ +

Returns the index of the most +recent filesystem entry that has been visited through +archive_read_disk

+ + +

archive_read_disk_current_filesystem_is_synthetic()

+ +

Returns 1 if the current +filesystem is a virtual filesystem. Returns 0 if the current +filesystem is not a virtual filesystem. Returns -1 if it is +unknown.

+ + +

archive_read_disk_current_filesystem_is_remote()

+ +

Returns 1 if the current +filesystem is a remote filesystem. Returns 0 if the current +filesystem is not a remote filesystem. Returns -1 if it is +unknown.

+ + +

archive_read_disk_set_matching()

+ +

Allows the caller to set struct +archive *_ma to compare each entry during +archive_read_header(3) calls. If matched based on calls to +archive_match_path_excluded, archive_match_time_excluded, or +archive_match_owner_excluded, then the callback function +specified by the _excluded_func parameter will execute. This +function will recieve data provided to the fourth parameter, +void *_client_data.

+ + +

archive_read_disk_set_metadata_filter_callback()

+ +

Allows the caller to set a +callback function during calls to archive_read_header(3) to +filter out metadata for each entry. The callback function +recieves the struct archive object, void* custom filter +data, and the struct archive_entry. If the callback function +returns an error, ARCHIVE_RETRY will be returned and the +entry will not be further processed.

+

More information about the struct archive object and the overall design of the library can be found in the libarchive(3) overview.

diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_extract.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_extract.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_extract.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_extract.3.html index c98352c..4518d58 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_extract.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_extract.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_filter.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_filter.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_filter.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_filter.3.html index d38e9df..3d5768e 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_filter.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_filter.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_format.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_format.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_format.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_format.3.html index cbc8261..18a5ed4 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_format.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_format.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_free.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_free.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_free.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_free.3.html index 2f54cca..8c8db9b 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_free.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_free.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_header.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_header.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_header.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_header.3.html index e6711d6..1ff31af 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_header.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_header.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_new.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_new.3.html similarity index 97% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_new.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_new.3.html index 3cd3b64..b8d0dd8 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_new.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_new.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_open.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_open.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_open.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_open.3.html index 0ed14df..0a98cf4 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_open.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_open.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_set_options.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_set_options.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_read_set_options.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_read_set_options.3.html index ce14464..8a5ad07 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_read_set_options.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_read_set_options.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_util.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_util.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_util.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_util.3.html index acd2ee7..61522d5 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_util.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_util.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write.3.html index 9657293..7bbe17f 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_blocksize.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_blocksize.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_blocksize.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_blocksize.3.html index e87406f..6f29624 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_blocksize.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_blocksize.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_data.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_data.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_data.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_data.3.html index 3a6c693..9f02ba9 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_data.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_data.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_disk.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_disk.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_disk.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_disk.3.html index 9d8aaad..a029620 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_disk.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_disk.3.html @@ -1,5 +1,5 @@ - + @@ -198,17 +198,17 @@ whose final location would be altered by a symlink on disk. This is intended to help guard against a variety of mischief caused by archives that (deliberately or otherwise) extract files outside of the current directory. The default is not -to perform this check. If

+to perform this check. If ARCHIVE_EXTRACT_UNLINK is +specified together with this option, the library will remove +any intermediate symlinks it finds and return an error only +if such symlink could not be removed.

ARCHIVE_EXTRACT_SPARSE

Scan data for blocks of NUL bytes and try to recreate them with holes. This results in sparse files, independent of whether the archive format -supports or uses them. ARCHIVE_EXTRACT_UNLINK is -specified together with this option, the library will remove -any intermediate symlinks it finds and return an error only -if such symlink could not be removed.

+supports or uses them.

ARCHIVE_EXTRACT_TIME

diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_filter.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_filter.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_filter.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_filter.3.html index a1b24ef..d1eebe9 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_filter.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_filter.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_finish_entry.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_finish_entry.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_finish_entry.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_finish_entry.3.html index 843e0b0..2c6cddd 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_finish_entry.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_finish_entry.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_format.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_format.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_format.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_format.3.html index 50f5bd1..30de938 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_format.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_format.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_free.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_free.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_free.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_free.3.html index e3c2621..6b941b3 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_free.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_free.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_header.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_header.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_header.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_header.3.html index 9195154..50c27df 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_header.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_header.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_new.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_new.3.html similarity index 97% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_new.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_new.3.html index c02916f..5aaa246 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_new.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_new.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_open.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_open.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_open.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_open.3.html index 01f3603..465ac6e 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_open.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_open.3.html @@ -1,5 +1,5 @@ - + @@ -221,7 +221,7 @@ processing is complete. If the open callback fails, the close callback is not invoked. The callback should return ARCHIVE_OK on success. On failure, the callback should invoke archive_set_error() to register an -error code and message and return

+error code and message and return ARCHIVE_FATAL.

typedef int archive_free_callback(struct archive diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_options.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_options.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_options.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_options.3.html index 1c23d5e..cf19860 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_options.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_options.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_passphrase.3.html b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_passphrase.3.html similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_passphrase.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_passphrase.3.html index 30734c9..be16d9c 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/archive_write_set_passphrase.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/archive_write_set_passphrase.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/bsdcpio.1.html b/src/dependencies/libarchive-3.6.2/doc/html/bsdcpio.1.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/bsdcpio.1.html rename to src/dependencies/libarchive-3.6.2/doc/html/bsdcpio.1.html index d68897c..9719392 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/bsdcpio.1.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/bsdcpio.1.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/bsdtar.1.html b/src/dependencies/libarchive-3.6.2/doc/html/bsdtar.1.html similarity index 97% rename from src/dependencies/libarchive-3.5.2/doc/html/bsdtar.1.html rename to src/dependencies/libarchive-3.6.2/doc/html/bsdtar.1.html index 7ae3e72..5507ce4 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/bsdtar.1.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/bsdtar.1.html @@ -1,5 +1,5 @@ - + @@ -534,6 +534,12 @@ attributes using copyfile(3) in AppleDouble format. This is the reverse of --mac-metadata. and the default behavior if tar is run as non-root in x mode.

+

--no-read-sparse

+ +

(c, r, u modes only) Do not +read sparse file information from disk. This is the reverse +of --read-sparse.

+

--no-safe-writes

(x mode only) Do not create @@ -736,6 +742,13 @@ improve compression ratio.

the zstd compression level. Supported values depend on the library version, common values are from 1 to 22.

+

zstd:threads

+ +

Specify the number of worker +threads to use. Setting threads to a special value 0 makes +zstd(1) use as many threads as there are CPU cores on the +system.

+

lzop:compression-level

A decimal integer from 1 to 9 @@ -746,6 +759,13 @@ specifying the lzop compression level.

A decimal integer from 0 to 9 specifying the xz compression level.

+

xz:threads

+ +

Specify the number of worker +threads to use. Setting threads to a special value 0 makes +xz(1) use as many threads as there are CPU cores on the +system.

+

mtree:keyword

The mtree writer module allows @@ -856,6 +876,12 @@ entries with the same name and, by convention, later entries overwrite earlier entries. This option is provided as a performance optimization.

+

--read-sparse

+ +

(c, r, u modes only) Read +sparse file information from disk. This is the reverse of +--no-read-sparse and the default behavior.

+

-S

(x mode only) @@ -1043,31 +1069,31 @@ variables affect the execution of tar:

TAR_READER_OPTIONS

-

The default options for format +

The default options for format readers and compression readers. The --options option overrides this.

TAR_WRITER_OPTIONS

-

The default options for format +

The default options for format writers and compression writers. The --options option overrides this.

LANG

-

The locale to +

The locale to use. See environ(7) for more information.

TAPE

-

The default +

The default device. The -f option overrides this. Please see the description of the -f option above for more details.

TZ

-

The timezone to +

The timezone to use when displaying dates. See environ(7) for more information.

diff --git a/src/dependencies/libarchive-3.5.2/doc/html/cpio.5.html b/src/dependencies/libarchive-3.6.2/doc/html/cpio.5.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/cpio.5.html rename to src/dependencies/libarchive-3.6.2/doc/html/cpio.5.html index 672be05..f1e897d 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/cpio.5.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/cpio.5.html @@ -1,5 +1,5 @@ - + @@ -434,7 +434,7 @@ part of the specification for the pax(1) utility.

written by Dick Haight while working in AT&T’s Unix Support Group. It appeared in 1977 as part of PWB/UNIX 1.0, the “Programmer’s Work Bench” derived -from AT&T UNIX 6th Edition UNIX that was used internally +from Version 6 AT&T UNIX that was used internally at AT&T. Both the new binary and old character formats were in use by 1980, according to the System III source released by SCO under their “Ancient Unix” diff --git a/src/dependencies/libarchive-3.5.2/doc/html/libarchive-formats.5.html b/src/dependencies/libarchive-3.6.2/doc/html/libarchive-formats.5.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/libarchive-formats.5.html rename to src/dependencies/libarchive-3.6.2/doc/html/libarchive-formats.5.html index 037207b..9a6b204 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/libarchive-formats.5.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/libarchive-formats.5.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/libarchive.3.html b/src/dependencies/libarchive-3.6.2/doc/html/libarchive.3.html similarity index 92% rename from src/dependencies/libarchive-3.5.2/doc/html/libarchive.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/libarchive.3.html index 647e86a..803d066 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/libarchive.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/libarchive.3.html @@ -1,5 +1,5 @@ - + @@ -71,12 +71,7 @@ formats,

-

ISO9660 CD images (including -RockRidge and Joliet extensions),

- -

- -

Zip archives,

+

7-Zip archives,

@@ -89,6 +84,11 @@ and BSD extensions),

+

ISO9660 CD images (including +RockRidge and Joliet extensions),

+ +

+

LHA archives,

@@ -98,17 +98,28 @@ descriptions,

-

RAR archives,

+

RAR and most RAR5 archives,

-

XAR archives.

+

WARC archives,

+ +

+ +

XAR archives,

+ +

+ +

Zip archives.

The library automatically -detects archives compressed with gzip(1), bzip2(1), xz(1), -lzip(1), or compress(1) and decompresses them transparently. -It can similarly detect and decode archives processed with -uuencode(1) or which have an rpm(1) header.

+detects archives compressed with compress(1), bzip2(1), +grzip(1), gzip(1), lrzip(1), lz4(1), lzip(1), lzop(1), +xz(1), or zstd(1) and decompresses them transparently. +Decompression of some formats requires external decompressor +utilities. It can similarly detect and decode archives +processed with uuencode(1) or which have an rpm(1) +header.

When writing an archive, you can specify the compression to be used and the @@ -130,7 +141,11 @@ format” archives,

-

Zip archive,

+

7-Zip archives,

+ +

+ +

ar archives,

@@ -143,20 +158,16 @@ archives,

-

7-Zip archives,

- -

- -

ar archives,

- -

-

mtree file tree descriptions,

-

XAR archives.

+

XAR archives,

+ +

+ +

Zip archive.

Pax interchange format is an extension of the tar archive format that eliminates diff --git a/src/dependencies/libarchive-3.5.2/doc/html/libarchive_changes.3.html b/src/dependencies/libarchive-3.6.2/doc/html/libarchive_changes.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/libarchive_changes.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/libarchive_changes.3.html index 0ac6352..d53a5ae 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/libarchive_changes.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/libarchive_changes.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/libarchive_internals.3.html b/src/dependencies/libarchive-3.6.2/doc/html/libarchive_internals.3.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/libarchive_internals.3.html rename to src/dependencies/libarchive-3.6.2/doc/html/libarchive_internals.3.html index 2220bca..2aabffc 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/libarchive_internals.3.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/libarchive_internals.3.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/mtree.5.html b/src/dependencies/libarchive-3.6.2/doc/html/mtree.5.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/mtree.5.html rename to src/dependencies/libarchive-3.6.2/doc/html/mtree.5.html index 812aba3..d33fc9f 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/mtree.5.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/mtree.5.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/html/tar.5.html b/src/dependencies/libarchive-3.6.2/doc/html/tar.5.html similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/html/tar.5.html rename to src/dependencies/libarchive-3.6.2/doc/html/tar.5.html index d009950..2ed3045 100644 --- a/src/dependencies/libarchive-3.5.2/doc/html/tar.5.html +++ b/src/dependencies/libarchive-3.6.2/doc/html/tar.5.html @@ -1,5 +1,5 @@ - + diff --git a/src/dependencies/libarchive-3.5.2/doc/man/.ignore_me b/src/dependencies/libarchive-3.6.2/doc/man/.ignore_me similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/.ignore_me rename to src/dependencies/libarchive-3.6.2/doc/man/.ignore_me diff --git a/src/dependencies/libarchive-3.5.2/doc/man/Makefile b/src/dependencies/libarchive-3.6.2/doc/man/Makefile similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/man/Makefile rename to src/dependencies/libarchive-3.6.2/doc/man/Makefile index 82bac3b..1d56a6d 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/Makefile +++ b/src/dependencies/libarchive-3.6.2/doc/man/Makefile @@ -107,15 +107,15 @@ archive_write_set_passphrase.3: ../mdoc2man.awk ../../libarchive/archive_write_s cpio.5: ../mdoc2man.awk ../../libarchive/cpio.5 awk -f ../mdoc2man.awk < ../../libarchive/cpio.5 > cpio.5 +libarchive-formats.5: ../mdoc2man.awk ../../libarchive/libarchive-formats.5 + awk -f ../mdoc2man.awk < ../../libarchive/libarchive-formats.5 > libarchive-formats.5 + libarchive.3: ../mdoc2man.awk ../../libarchive/libarchive.3 awk -f ../mdoc2man.awk < ../../libarchive/libarchive.3 > libarchive.3 libarchive_changes.3: ../mdoc2man.awk ../../libarchive/libarchive_changes.3 awk -f ../mdoc2man.awk < ../../libarchive/libarchive_changes.3 > libarchive_changes.3 -libarchive-formats.5: ../mdoc2man.awk ../../libarchive/libarchive-formats.5 - awk -f ../mdoc2man.awk < ../../libarchive/libarchive-formats.5 > libarchive-formats.5 - libarchive_internals.3: ../mdoc2man.awk ../../libarchive/libarchive_internals.3 awk -f ../mdoc2man.awk < ../../libarchive/libarchive_internals.3 > libarchive_internals.3 @@ -130,4 +130,4 @@ bsdtar.1: ../mdoc2man.awk ../../tar/bsdtar.1 bsdcpio.1: ../mdoc2man.awk ../../cpio/bsdcpio.1 awk -f ../mdoc2man.awk < ../../cpio/bsdcpio.1 > bsdcpio.1 -all: archive_entry.3 archive_entry_acl.3 archive_entry_linkify.3 archive_entry_misc.3 archive_entry_paths.3 archive_entry_perms.3 archive_entry_stat.3 archive_entry_time.3 archive_read.3 archive_read_add_passphrase.3 archive_read_data.3 archive_read_disk.3 archive_read_extract.3 archive_read_filter.3 archive_read_format.3 archive_read_free.3 archive_read_header.3 archive_read_new.3 archive_read_open.3 archive_read_set_options.3 archive_util.3 archive_write.3 archive_write_blocksize.3 archive_write_data.3 archive_write_disk.3 archive_write_filter.3 archive_write_finish_entry.3 archive_write_format.3 archive_write_free.3 archive_write_header.3 archive_write_new.3 archive_write_open.3 archive_write_set_options.3 archive_write_set_passphrase.3 cpio.5 libarchive.3 libarchive_changes.3 libarchive-formats.5 libarchive_internals.3 mtree.5 tar.5 bsdtar.1 bsdcpio.1 +all: archive_entry.3 archive_entry_acl.3 archive_entry_linkify.3 archive_entry_misc.3 archive_entry_paths.3 archive_entry_perms.3 archive_entry_stat.3 archive_entry_time.3 archive_read.3 archive_read_add_passphrase.3 archive_read_data.3 archive_read_disk.3 archive_read_extract.3 archive_read_filter.3 archive_read_format.3 archive_read_free.3 archive_read_header.3 archive_read_new.3 archive_read_open.3 archive_read_set_options.3 archive_util.3 archive_write.3 archive_write_blocksize.3 archive_write_data.3 archive_write_disk.3 archive_write_filter.3 archive_write_finish_entry.3 archive_write_format.3 archive_write_free.3 archive_write_header.3 archive_write_new.3 archive_write_open.3 archive_write_set_options.3 archive_write_set_passphrase.3 cpio.5 libarchive-formats.5 libarchive.3 libarchive_changes.3 libarchive_internals.3 mtree.5 tar.5 bsdtar.1 bsdcpio.1 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_acl.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_acl.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_acl.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_acl.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_linkify.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_linkify.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_linkify.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_linkify.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_misc.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_misc.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_misc.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_misc.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_paths.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_paths.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_paths.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_paths.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_perms.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_perms.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_perms.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_perms.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_stat.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_stat.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_stat.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_stat.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_entry_time.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_entry_time.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_entry_time.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_entry_time.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_add_passphrase.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_add_passphrase.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_add_passphrase.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_add_passphrase.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_data.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_data.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_data.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_data.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_disk.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_disk.3 similarity index 71% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_disk.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_disk.3 index bd02537..9d89316 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_disk.3 +++ b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_disk.3 @@ -2,6 +2,8 @@ .SH NAME .ad l \fB\%archive_read_disk_new\fP, +\fB\%archive_read_disk_open\fP, +\fB\%archive_read_disk_open_w\fP, \fB\%archive_read_disk_set_behavior\fP, \fB\%archive_read_disk_set_symlink_logical\fP, \fB\%archive_read_disk_set_symlink_physical\fP, @@ -11,7 +13,14 @@ \fB\%archive_read_disk_uname\fP, \fB\%archive_read_disk_set_uname_lookup\fP, \fB\%archive_read_disk_set_gname_lookup\fP, -\fB\%archive_read_disk_set_standard_lookup\fP +\fB\%archive_read_disk_set_standard_lookup\fP, +\fB\%archive_read_disk_descend\fP, +\fB\%archive_read_disk_can_descend\fP, +\fB\%archive_read_disk_current_filesystem\fP, +\fB\%archive_read_disk_current_filesystem_is_synthetic\fP, +\fB\%archive_read_disk_current_filesystem_is_remote\fP, +\fB\%archive_read_disk_set_matching\fP, +\fB\%archive_read_disk_set_metadata_filter_callback\fP, \- functions for reading objects from disk .SH LIBRARY .ad l @@ -26,6 +35,14 @@ Streaming Archive Library (libarchive, -larchive) .br \fIint\fP .br +\fB\%archive_read_disk_open\fP(\fI\%struct\ archive\ *\fP, \fI\%const\ char\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_open_w\fP(\fI\%struct\ archive\ *\fP, \fI\%const\ wchar_t\ *\fP, \fI\%\fP); +.br +\fIint\fP +.br \fB\%archive_read_disk_set_behavior\fP(\fI\%struct\ archive\ *\fP, \fI\%int\fP); .br \fIint\fP @@ -63,6 +80,34 @@ Streaming Archive Library (libarchive, -larchive) \fIint\fP .br \fB\%archive_read_disk_entry_from_file\fP(\fI\%struct\ archive\ *\fP, \fI\%struct\ archive_entry\ *\fP, \fI\%int\ fd\fP, \fI\%const\ struct\ stat\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_descend\fP(\fI\%struct\ archive\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_can_descend\fP(\fI\%struct\ archive\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_current_filesystem\fP(\fI\%struct\ archive\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_current_filesystem_is_synthetic\fP(\fI\%struct\ archive\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_current_filesystem_is_remote\fP(\fI\%struct\ archive\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_set_matching\fP(\fI\%struct\ archive\ *\fP, \fI\%struct\ archive\ *\fP, \fI\%void\ (*excluded_func)(struct\ archive\ *,\ void\ *,\ struct\ archive\ entry\ *)\fP, \fI\%void\ *\fP); +.br +\fIint\fP +.br +\fB\%archive_read_disk_set_metadata_filter_callback\fP(\fI\%struct\ archive\ *\fP, \fI\%int\ (*metadata_filter_func)(struct\ archive\ *,\ void*,\ struct\ archive_entry\ *)\fP, \fI\%void\ *\fP); .SH DESCRIPTION .ad l These functions provide an API for reading information about @@ -77,6 +122,16 @@ Allocates and initializes a Tn struct archive object suitable for reading object information from disk. .TP +\fB\%archive_read_disk_open\fP() +Opens the file or directory from the given path and prepares the +Tn struct archive +to read it from disk. +.TP +\fB\%archive_read_disk_open_w\fP() +Opens the file or directory from the given path as a wide character string and prepares the +Tn struct archive +to read it from disk. +.TP \fB\%archive_read_disk_set_behavior\fP() Configures various behavior options when reading entries from disk. The flags field consists of a bitwise OR of one or more of the @@ -129,6 +184,10 @@ for more information on extended file attributes. \fBARCHIVE_READDISK_RESTORE_ATIME\fP Restore access time of traversed files. By default, access time of traversed files is not restored. +.TP +\fBARCHIVE_READDISK_NO_SPARSE\fP +Do not read sparse file information. +By default, sparse file information is read from disk. .RE .TP \fB\%archive_read_disk_set_symlink_logical\fP(), @@ -212,6 +271,44 @@ using the currently-registered lookup functions above. This affects the file ownership fields and ACL values in the Tn struct archive_entry object. +.TP +\fB\%archive_read_disk_descend\fP() +If the current entry can be descended, this function will mark the directory as the next entry for +\fBarchive_read_header\fP(3) +to visit. +.TP +\fB\%archive_read_disk_can_descend\fP() +Returns 1 if the current entry is an unvisited directory and 0 otherwise. +.TP +\fB\%archive_read_disk_current_filesystem\fP() +Returns the index of the most recent filesystem entry that has been visited through archive_read_disk +.TP +\fB\%archive_read_disk_current_filesystem_is_synthetic\fP() +Returns 1 if the current filesystem is a virtual filesystem. Returns 0 if the current filesystem is not a virtual filesystem. Returns -1 if it is unknown. +.TP +\fB\%archive_read_disk_current_filesystem_is_remote\fP() +Returns 1 if the current filesystem is a remote filesystem. Returns 0 if the current filesystem is not a remote filesystem. Returns -1 if it is unknown. +.TP +\fB\%archive_read_disk_set_matching\fP() +Allows the caller to set +Tn struct archive +*_ma to compare each entry during +\fBarchive_read_header\fP(3) +calls. If matched based on calls to +Tn archive_match_path_excluded, +Tn archive_match_time_excluded, +or +Tn archive_match_owner_excluded, +then the callback function specified by the _excluded_func parameter will execute. This function will recieve data provided to the fourth parameter, void *_client_data. +.TP +\fB\%archive_read_disk_set_metadata_filter_callback\fP() +Allows the caller to set a callback function during calls to +\fBarchive_read_header\fP(3) +to filter out metadata for each entry. The callback function recieves the +Tn struct archive +object, void* custom filter data, and the +Tn struct archive_entry. +If the callback function returns an error, ARCHIVE_RETRY will be returned and the entry will not be further processed. .RE More information about the \fIstruct\fP archive diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_extract.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_extract.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_extract.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_extract.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_filter.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_filter.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_filter.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_filter.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_format.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_format.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_format.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_format.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_free.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_free.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_free.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_free.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_header.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_header.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_header.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_header.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_new.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_new.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_new.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_new.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_open.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_open.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_open.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_open.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_read_set_options.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_read_set_options.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_read_set_options.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_read_set_options.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_util.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_util.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_util.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_util.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_blocksize.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_blocksize.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_blocksize.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_blocksize.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_data.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_data.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_data.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_data.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_disk.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_disk.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_disk.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_disk.3 index a4ee482..fa13fe4 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_disk.3 +++ b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_disk.3 @@ -155,15 +155,15 @@ caused by archives that (deliberately or otherwise) extract files outside of the current directory. The default is not to perform this check. If +\fBARCHIVE_EXTRACT_UNLINK\fP +is specified together with this option, the library will +remove any intermediate symlinks it finds and return an +error only if such symlink could not be removed. .TP \fBARCHIVE_EXTRACT_SPARSE\fP Scan data for blocks of NUL bytes and try to recreate them with holes. This results in sparse files, independent of whether the archive format supports or uses them. -\fBARCHIVE_EXTRACT_UNLINK\fP -is specified together with this option, the library will -remove any intermediate symlinks it finds and return an -error only if such symlink could not be removed. .TP \fBARCHIVE_EXTRACT_TIME\fP The timestamps (mtime, ctime, and atime) should be restored. diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_filter.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_filter.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_filter.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_filter.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_finish_entry.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_finish_entry.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_finish_entry.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_finish_entry.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_format.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_format.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_format.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_format.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_free.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_free.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_free.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_free.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_header.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_header.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_header.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_header.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_new.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_new.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_new.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_new.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_open.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_open.3 similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_open.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_open.3 index f14f33d..9aeafc0 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_open.3 +++ b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_open.3 @@ -190,6 +190,7 @@ On failure, the callback should invoke \fB\%archive_set_error\fP() to register an error code and message and return +\fBARCHIVE_FATAL\fP. .RS 5 .IP \fItypedef int\fP diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_set_options.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_set_options.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_set_options.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_set_options.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/archive_write_set_passphrase.3 b/src/dependencies/libarchive-3.6.2/doc/man/archive_write_set_passphrase.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/archive_write_set_passphrase.3 rename to src/dependencies/libarchive-3.6.2/doc/man/archive_write_set_passphrase.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/bsdcpio.1 b/src/dependencies/libarchive-3.6.2/doc/man/bsdcpio.1 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/bsdcpio.1 rename to src/dependencies/libarchive-3.6.2/doc/man/bsdcpio.1 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/bsdtar.1 b/src/dependencies/libarchive-3.6.2/doc/man/bsdtar.1 similarity index 98% rename from src/dependencies/libarchive-3.5.2/doc/man/bsdtar.1 rename to src/dependencies/libarchive-3.6.2/doc/man/bsdtar.1 index 512db63..ab77947 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/bsdtar.1 +++ b/src/dependencies/libarchive-3.6.2/doc/man/bsdtar.1 @@ -519,6 +519,12 @@ and the default behavior if \fB\%tar\fP is run as non-root in x mode. .TP +\fB\-Fl\fP no-read-sparse +(c, r, u modes only) +Do not read sparse file information from disk. +This is the reverse of +\fB\-Fl\fP read-sparse. +.TP \fB\-Fl\fP no-safe-writes (x mode only) Do not create temporary files and use @@ -712,12 +718,24 @@ a compression dictionary to improve compression ratio. A decimal integer specifying the zstd compression level. Supported values depend on the library version, common values are from 1 to 22. .TP +\fBzstd:threads\fP +Specify the number of worker threads to use. +Setting threads to a special value 0 makes +\fBzstd\fP(1) +use as many threads as there are CPU cores on the system. +.TP \fBlzop:compression-level\fP A decimal integer from 1 to 9 specifying the lzop compression level. .TP \fBxz:compression-level\fP A decimal integer from 0 to 9 specifying the xz compression level. .TP +\fBxz:threads\fP +Specify the number of worker threads to use. +Setting threads to a special value 0 makes +\fBxz\fP(1) +use as many threads as there are CPU cores on the system. +.TP \fBmtree:\fP \fIkeyword\fP The mtree writer module allows you to specify which mtree keywords will be included in the output. @@ -824,6 +842,13 @@ there can be multiple entries with the same name and, by convention, later entries overwrite earlier entries. This option is provided as a performance optimization. .TP +\fB\-Fl\fP read-sparse +(c, r, u modes only) +Read sparse file information from disk. +This is the reverse of +\fB\-Fl\fP no-read-sparse +and the default behavior. +.TP \fB\-S\fP (x mode only) Extract files as sparse files. diff --git a/src/dependencies/libarchive-3.5.2/doc/man/cpio.5 b/src/dependencies/libarchive-3.6.2/doc/man/cpio.5 similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/man/cpio.5 rename to src/dependencies/libarchive-3.6.2/doc/man/cpio.5 index 4dd0bc8..f049dad 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/cpio.5 +++ b/src/dependencies/libarchive-3.6.2/doc/man/cpio.5 @@ -367,7 +367,7 @@ while working in AT&T's Unix Support Group. It appeared in 1977 as part of PWB/UNIX 1.0, the ``Programmer's Work Bench'' derived from -At 6th Edition UNIX +At v6 that was used internally at AT&T. Both the new binary and old character formats were in use by 1980, according to the System III source released diff --git a/src/dependencies/libarchive-3.5.2/doc/man/libarchive-formats.5 b/src/dependencies/libarchive-3.6.2/doc/man/libarchive-formats.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/libarchive-formats.5 rename to src/dependencies/libarchive-3.6.2/doc/man/libarchive-formats.5 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/libarchive.3 b/src/dependencies/libarchive-3.6.2/doc/man/libarchive.3 similarity index 95% rename from src/dependencies/libarchive-3.5.2/doc/man/libarchive.3 rename to src/dependencies/libarchive-3.6.2/doc/man/libarchive.3 index 310ad15..5e9fe79 100644 --- a/src/dependencies/libarchive-3.5.2/doc/man/libarchive.3 +++ b/src/dependencies/libarchive-3.6.2/doc/man/libarchive.3 @@ -36,30 +36,40 @@ GNU-format tar archives, .IP \(bu most common cpio archive formats, .IP \(bu -ISO9660 CD images (including RockRidge and Joliet extensions), -.IP \(bu -Zip archives, +7-Zip archives, .IP \(bu ar archives (including GNU/SysV and BSD extensions), .IP \(bu Microsoft CAB archives, .IP \(bu +ISO9660 CD images (including RockRidge and Joliet extensions), +.IP \(bu LHA archives, .IP \(bu mtree file tree descriptions, .IP \(bu -RAR archives, +RAR and most RAR5 archives, .IP \(bu -XAR archives. +WARC archives, +.IP \(bu +XAR archives, +.IP \(bu +Zip archives. .RE The library automatically detects archives compressed with -\fBgzip\fP(1), +\fBcompress\fP(1), \fBbzip2\fP(1), -\fBxz\fP(1), +\fBgrzip\fP(1), +\fBgzip\fP(1), +\fBlrzip\fP(1), +\fBlz4\fP(1), \fBlzip\fP(1), +\fBlzop\fP(1), +\fBxz\fP(1), or -\fBcompress\fP(1) -and decompresses them transparently. +\fBzstd\fP(1) +and decompresses them transparently. Decompression of some formats +requires external decompressor utilities. It can similarly detect and decode archives processed with \fBuuencode\fP(1) or which have an @@ -81,19 +91,19 @@ archives, .IP \(bu cpio archives, .IP \(bu -Zip archive, +7-Zip archives, +.IP \(bu +ar archives, .IP \(bu two different variants of shar archives, .IP \(bu ISO9660 CD images, .IP \(bu -7-Zip archives, -.IP \(bu -ar archives, -.IP \(bu mtree file tree descriptions, .IP \(bu -XAR archives. +XAR archives, +.IP \(bu +Zip archive. .RE Pax interchange format is an extension of the tar archive format that eliminates essentially all of the limitations of historic tar formats diff --git a/src/dependencies/libarchive-3.5.2/doc/man/libarchive_changes.3 b/src/dependencies/libarchive-3.6.2/doc/man/libarchive_changes.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/libarchive_changes.3 rename to src/dependencies/libarchive-3.6.2/doc/man/libarchive_changes.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/libarchive_internals.3 b/src/dependencies/libarchive-3.6.2/doc/man/libarchive_internals.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/libarchive_internals.3 rename to src/dependencies/libarchive-3.6.2/doc/man/libarchive_internals.3 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/mtree.5 b/src/dependencies/libarchive-3.6.2/doc/man/mtree.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/mtree.5 rename to src/dependencies/libarchive-3.6.2/doc/man/mtree.5 diff --git a/src/dependencies/libarchive-3.5.2/doc/man/tar.5 b/src/dependencies/libarchive-3.6.2/doc/man/tar.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/man/tar.5 rename to src/dependencies/libarchive-3.6.2/doc/man/tar.5 diff --git a/src/dependencies/libarchive-3.5.2/doc/mdoc2man.awk b/src/dependencies/libarchive-3.6.2/doc/mdoc2man.awk similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/mdoc2man.awk rename to src/dependencies/libarchive-3.6.2/doc/mdoc2man.awk diff --git a/src/dependencies/libarchive-3.5.2/doc/mdoc2wiki.awk b/src/dependencies/libarchive-3.6.2/doc/mdoc2wiki.awk similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/mdoc2wiki.awk rename to src/dependencies/libarchive-3.6.2/doc/mdoc2wiki.awk diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/.ignore_me b/src/dependencies/libarchive-3.6.2/doc/pdf/.ignore_me similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/pdf/.ignore_me rename to src/dependencies/libarchive-3.6.2/doc/pdf/.ignore_me diff --git a/src/dependencies/libarchive-3.5.2/doc/pdf/Makefile b/src/dependencies/libarchive-3.6.2/doc/pdf/Makefile similarity index 99% rename from src/dependencies/libarchive-3.5.2/doc/pdf/Makefile rename to src/dependencies/libarchive-3.6.2/doc/pdf/Makefile index 48a5311..b5bf21e 100644 --- a/src/dependencies/libarchive-3.5.2/doc/pdf/Makefile +++ b/src/dependencies/libarchive-3.6.2/doc/pdf/Makefile @@ -107,15 +107,15 @@ archive_write_set_passphrase.3.pdf: ../../libarchive/archive_write_set_passphras cpio.5.pdf: ../../libarchive/cpio.5 groff -mdoc -T ps ../../libarchive/cpio.5 | ps2pdf - - > cpio.5.pdf +libarchive-formats.5.pdf: ../../libarchive/libarchive-formats.5 + groff -mdoc -T ps ../../libarchive/libarchive-formats.5 | ps2pdf - - > libarchive-formats.5.pdf + libarchive.3.pdf: ../../libarchive/libarchive.3 groff -mdoc -T ps ../../libarchive/libarchive.3 | ps2pdf - - > libarchive.3.pdf libarchive_changes.3.pdf: ../../libarchive/libarchive_changes.3 groff -mdoc -T ps ../../libarchive/libarchive_changes.3 | ps2pdf - - > libarchive_changes.3.pdf -libarchive-formats.5.pdf: ../../libarchive/libarchive-formats.5 - groff -mdoc -T ps ../../libarchive/libarchive-formats.5 | ps2pdf - - > libarchive-formats.5.pdf - libarchive_internals.3.pdf: ../../libarchive/libarchive_internals.3 groff -mdoc -T ps ../../libarchive/libarchive_internals.3 | ps2pdf - - > libarchive_internals.3.pdf @@ -130,4 +130,4 @@ bsdtar.1.pdf: ../../tar/bsdtar.1 bsdcpio.1.pdf: ../../cpio/bsdcpio.1 groff -mdoc -T ps ../../cpio/bsdcpio.1 | ps2pdf - - > bsdcpio.1.pdf -all: archive_entry.3.pdf archive_entry_acl.3.pdf archive_entry_linkify.3.pdf archive_entry_misc.3.pdf archive_entry_paths.3.pdf archive_entry_perms.3.pdf archive_entry_stat.3.pdf archive_entry_time.3.pdf archive_read.3.pdf archive_read_add_passphrase.3.pdf archive_read_data.3.pdf archive_read_disk.3.pdf archive_read_extract.3.pdf archive_read_filter.3.pdf archive_read_format.3.pdf archive_read_free.3.pdf archive_read_header.3.pdf archive_read_new.3.pdf archive_read_open.3.pdf archive_read_set_options.3.pdf archive_util.3.pdf archive_write.3.pdf archive_write_blocksize.3.pdf archive_write_data.3.pdf archive_write_disk.3.pdf archive_write_filter.3.pdf archive_write_finish_entry.3.pdf archive_write_format.3.pdf archive_write_free.3.pdf archive_write_header.3.pdf archive_write_new.3.pdf archive_write_open.3.pdf archive_write_set_options.3.pdf archive_write_set_passphrase.3.pdf cpio.5.pdf libarchive.3.pdf libarchive_changes.3.pdf libarchive-formats.5.pdf libarchive_internals.3.pdf mtree.5.pdf tar.5.pdf bsdtar.1.pdf bsdcpio.1.pdf +all: archive_entry.3.pdf archive_entry_acl.3.pdf archive_entry_linkify.3.pdf archive_entry_misc.3.pdf archive_entry_paths.3.pdf archive_entry_perms.3.pdf archive_entry_stat.3.pdf archive_entry_time.3.pdf archive_read.3.pdf archive_read_add_passphrase.3.pdf archive_read_data.3.pdf archive_read_disk.3.pdf archive_read_extract.3.pdf archive_read_filter.3.pdf archive_read_format.3.pdf archive_read_free.3.pdf archive_read_header.3.pdf archive_read_new.3.pdf archive_read_open.3.pdf archive_read_set_options.3.pdf archive_util.3.pdf archive_write.3.pdf archive_write_blocksize.3.pdf archive_write_data.3.pdf archive_write_disk.3.pdf archive_write_filter.3.pdf archive_write_finish_entry.3.pdf archive_write_format.3.pdf archive_write_free.3.pdf archive_write_header.3.pdf archive_write_new.3.pdf archive_write_open.3.pdf archive_write_set_options.3.pdf archive_write_set_passphrase.3.pdf cpio.5.pdf libarchive-formats.5.pdf libarchive.3.pdf libarchive_changes.3.pdf libarchive_internals.3.pdf mtree.5.pdf tar.5.pdf bsdtar.1.pdf bsdcpio.1.pdf diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a070efdbf71ee77661aeecd3b3c493ae6ef2651 GIT binary patch literal 28602 zcmce-1z26l(l&|&$%YUtKnU)>ad&rj3GVLhlHd{`I0OssP9SJ-*Wm6J+_@W)naPEF=$l3s_r%GEDVMEleF;B@LYnEx14p;8ENDDkm)?%crCu1S-kT zrzjwbM{O@Cq%0;N#ARb(RJL^QU+9a zt!9NW?@B*oWblZ;S}~yck}CvG>LdrW(@<;VjY0*N3a4g{%{$U7efw!k;E<)gJ}Nf$ znVOCU#(SipewM|v6o%UX*xdKsxOW_jgRl+ho=I|ND%sxa8mAUa?iFF{xXR9zUJOEX z0=B)jF_{xi8(LK94{mpdg)db~mHV!CE?#%ap?*^04uwoAj0=GuzSLJA#|l?a0l`_XLj9EZXffMe%4Wq?P4{G zD1lU;$4ld`ovn@khzOy1DfE<==JFXs{kcKnPTd`zq%A5TkLdU}74$(~pVu-dmdopL znl2UD;|5e6wt^VPuJ}(^pDhc#4JkU1nMPGu-O$sc5VghHsm@O{BfWQK zaIQ{J$M1Pf>D3~DmG<166ldLu%rafrn5Jc8hvz^OAdq6if96MhsHK!;S<`nAI?pAK zzO^E27~eZ;J5P{Mh~|bU%36t3^ro^Pm~$IjJ(Q$0w5cIGvNt}l^Ld2AS|x9qZ(5^Q z%@@@{d`15DareT8-p=-5sTL`XPzy?~Ce~xd5L(9wRuyel6@3P>ru2r1MR!A6cPv-I z7VNEjZta(PQM;&>L{b*pp6-zFu%tCf>*aFLXeLP!VKMq2?gHQyzOf?ceV{+w*e{&2 zwkokE*{AOwckZMCHdgcUgeO5;drcbGZKEYrqcfD6?$TI~n4H|Y*V8e+NqoJ8o2y0f zv03-j%?IPMO=O#6Ti$!ANM<8unB=&t2Rn*ijrfS=YD1%$=6EQhbCKZqU4g2MZEU^~ zE4b=ndPm_`3WW2Ayo_&Cx^sKGD^7__B5JfRx+0i)(?WzJ&(|jgPS($oC(d?N^iizp zz$IgF7L?zNz&aSWa>BS+K=nGA2XA*aQ?7eYsU?5fId_h(ePPC;7HU>ry1Z5*L_f~Y zxK(b#(up9QwgiUoMLNdhnY!*_J8IpL#=DvfP1sr&$?E$&_SkmnNgKJC8s;JmM0lrS;l=j;07zJgnb%e%o>4BsP(g_pKVmpeitd^*PYSVugy z9Nj1SvjTw{dFxO3yRVda*nR1pB?`BXK-x1ZVe9n;~ zIv8q@FI41ah&g#D-%6}($F*zLK_v3VT_eN)*1Y3ZFO3M8#ei?-e51N{5*{Ax70W#4>I}rx0_uM2qEH(M3r_ zjko)oiWIeY#}+6=Rz-F0LZ=tg5JcjMiD*46#uT)lFgPGGF0gsFf;`xX-^BAO`<>2q z#CS1x&PmC&sp4KKr84pRHNFmlit(JS5uf--T%|?1gDp9co~c=w+0*o*KQ_sjte}Hk zmI{8sh8%A|-}T6yUCsQ1YR(6dsFy|#j4r&6#;7kSlDq^@<8^mivIVqdO;b7-1j?Z+ z8|-7%w5+ze$GPNjUbe$zm`^yz2rZp{F6riphk<1}EEhn-t}p@TL(rY*Sq{7@Jh6xFIQHLuVPQLZyYu_5Qxfs`7 z6A5^}Qh_mziV#M??P-KvYp*xqDLj%a8-JzHo&qtVUZwSdH^QpV;=&e{0}5

    u+m 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 O5)HiFOiD$X^nU=!-*znk literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_misc.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_misc.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e128b5da54dbcf8698f33352bdae3f178f8f629b GIT binary patch literal 21418 zcmb@u1whnG*Ep;+OG&4MASJNu(%s$N&C)F0p@@_qASzwbEufOpCEe299nu2+7u0*b z_qosWKHvMjyZqS6b7sz*-<)%1&dft)aY<$n3p?Op$97Z(;Ne3VsJnxiiL12(l$X-c z#MKID=|ah@%uLB_t|lTWp$hvIbFhbHSeshgS-X14L);;D0x$rS%uYYcDJm(8XsAiR zN{Wi8i%C;5yNF9@%7{q_IGS5{I9t0yU@0!H<_>PI0z$B$lAEieo2#U?9ponZUtt1p zP_j}wnA!mN`GN8fsHLkFB_}LJ6$pdk3UQ_cO4^yYLc}3v4(1R+L4b>^GsMIm;F;W} zY2dIZiRZVb6)_U>QR`sa_w0Q! zk~?y3@W%bqE_>CMebZ5)#?M19N9MYFpQPtDb==iZQn~s#o!)J=58doU9`sHpR9glu zBa(f)`$;asYq{yXAx)@AP{h*oa!;Mu&(-9V0R?z)w20}zk zcb>Q2_g~79M|4kckkCa*=zmH-t+ms6=%tyF#68uPZ#@y&4LYrLY>*PdjNdVtdT$i; zObcB?E{`s6tITfGOw`VNqJG*=KG>P+Wntb6Vl3bLqgALY;T~$Tq>NgNOwkunDm>c)JMBLVRT9w~vtf|!_aZ=p_eI~-qFkK<};gkW1 zmdwes3W<7ri8rA*E4EqXCDl2MJe!l_Q1E0pXXYI?q5Z8K;u?7c=_xWv?%)dDo>*J* zh=X-!-sD8Gm`p|E>B3ct=WAK^?L~~@pI&ZYDB(C8$YV9P=;K!sTKTSj8e7-WGJNC= z&FWmT4qypz6-Md62X7~T@ih5}BDk6yEvdI*t&D_ib?=j8(wAcpB%(#dik{8l^wm`D zgw+?dNo=(_nhEesF~UVXHTUJESY1fvkmw*$)n~@93TtGn$Cr-|AG>H?xnv?Y@+H64 zDAUu-!>yQ||L|F%sIpG^#q{FtpzYhJabKIYi$efblY8Nq>=Vc*EMH&qYIo@N%8u`?vV6i2X)>WO~Inak+=f`S6LcBg#=vJ@rf_vt! zzJ92~v8lafizBGEfjEj*h&kh1t>Z!WGOw>t;zl zZ*a>}y=N6~IoPfc4BOqXcWp<})3Z&HiF6^XBU1NPv$dVc{Pd!5t=z*u|H>%yjmGq; z{2@@)Rx;GDUq#=UOl)H|wgzd&MIkbIhhMMX-dUL(8cw6pf)wcVlsiQxk(V$OngfzR!`CaRv5&6TN*a80>xl)SbZ1Dn+aJJ089GWnj3&W zCTLh)SaT?E+v7qBl(RN>q0|H1v{n^hKna83b_4Ras-Qor{;Vlx;%Z{&VEGHg&$cQ+ zTusbjIh5erssDEXH|_f=9aKS_0MHNFpbFvufNt9fR0XjCK(}yUK@b3RgHjc!$^+o} z5#R!F-30#Z&Mk-R!N{Bv!^}yL0;(SXRafpkVv$dnEgEJ-Q7Q}5A zZnI#-vvziI6|*vNrsUxO%A5QQgTNr5mbJO7m5UxFCo3y}_2&N{&yUc};QdPd75-NL&a7)e=aQ912j1H-IjYG>`_2Kko(`qAv$Hr-VFeSp}&|2RNDiG4%b zfAfV6-+%o6|ICLC?@tE#`;h+`|Aqf2!`x#08UBNbez3`Ho&ODk{Pv3e!60I4B1(!% ze-K^N!Or|&C=P}ZNA-6e`tz0epD6yT#lL#@>-RSO-%|BQt^Zu+C!~K1<3~OW#(zQi z8%)1HtpD(O{>s0B3k&}*=zlXy{e3c$QxlaGQGBFsZ4Yr_{zu~9;QKF#&&~5|Is$+> ze$ob3^B=$e1I=zI#svmba&mIr{{9O8fW^jr(+?O8V7WZ(>_19yaRWGSr{kNl92}gt zxxaA3(*76Jx|xUnPAyFtZFLQ$pVU%yus4DJomX#V+<(EU?5zKRTx@J?lsC^!2X2UY z6TT%XfCI)Tzdt`>KRSAo4(8&%eSUWRH$wg*<_(!{2=s%*Kd{^q7?#crBkfHX_5gmA zxv6zaPFU{GoLi#*sQrt;x2=HTVuuaKO)Gx?y}|IS#W$_{(c+sB7wq|&bK9>U{k$38 zo7`V@Zm|9e|B3I0MgH{*Vuc}xA>iQrZMZeP2Npa08j>|3R#0(1qsLCqn~E@lqS5THBIi{ZAbH}*OkCFoXR`b`}FHZ}dQ#eX-&VeS20;}H90 zyMx$ycmxIiu+mf1ZIyAg@MeX}C$QCfNPM46j7L_WVB&p@lt+9c^#;525a$E;Q|z)& z2srX^IL(DlekP(QsPXfK^O?`@TjSR%m$lUoP#!m-XQpV%;lH6sN!?*;IijT;RLm8+ zaM-J}>_6{2^;_F#ttV|?Itbn8_Y#RMYCNcmKVB%Shi>zG;1l*nUaim?KTI9>S0dlp zQ1m&BItM@=Sf$+kmJ>LHw)EAr+l*6hR&hFhdu@;6UTWMsrq5l|Iy4xV-j@071`H{l zFC{+%-h*AT(FQ|AV^iYNsJoe;_jbv|5z3k!I)BX~UCbthBphzrBfguf0be(e5Ctpr z_X6peRPE%nEIzwiKpfgixwqk&$mJSw%FOLB2qLphv9<9kFvHtTOEuyN7ZH}sM)|3f zc2~D@oVGmX7H2!KR?-%tP`eQ7s*uSWF_p|htdYoBGsy4Jcs$K_AvnLM`M$f2s_N4x z(QL4dJ)YOQp!b&Z&M!2J3#2ULUra>=ONO_nr-Rc04Nhy%&XN351$9S@_zm@q#Mf~3 zy;2A8`&){SaSy8ZLHuK*Hr0~Sb6NR7NnZ@%$Xw{-*R-dR= zMl?rso#)_d?Msm+6YT5o<_q#G=hKtD5pG0x+7#?2P4!cPbrl0BV+s9m!RYY{=O%$A zmT2x_%z^uMpL-9)tqrddsba}|fYsPCY09t2_0@^z+xo-wK4Dyo%t2Kx$hcX~VN@r^ zge$lXavJj{(tWf?@lgawM-$uAwIyspILdCMWc7Y~{NzKo(QhlX*(zo^q@m#k%$467dX$8ic+y8~d)WuA zSSRz6M2E(5I11#tyX9QzhdYbd)iU~{4|4Iv zH!pfTw2A~gWEP*H3bFA=yVr=pJwP}UO{!1~xLQF7?rsDl@e`>y(7C$Owj}GA-zD7^ zSS)AOi2)#e63XZ{BB=9FdYbj2ru-=jwd@O$;f26&SP3*^Nh}-v1JCNH>0Ug?ZcjkN z%o#*jt7B)0fAI0G5RE{cTXFT4p7=H`QUGp9 z_Xz6e5nyzFr@|{*THKPz&FEq^ItR(!`Q#K^WTJ*1Su+# zGvu_u##IA9CL-Cfhar5Ba+DKp|?KH;vKViQqFLEyYd~I%51sH zbntn&&~t9jj_9Y~@^*y|xg*3VZIF3H`8Prb4Ye-WKL#0C+}*oSlJ{K0YtNjS-+}-zvTkxzBM<6hMJsy&3Y7}OAFQoX6_S8{D}$Wxa5WqgbTS-RYG5MzZ1TzfcDx-=%I*+(;Ht7wYo9&vH6e3hsg05o-r&Y1uqVS zpGj@VKThW(D|P*HnB5~|{_SX}Fu*B~DA>fOipAJZer0<`8-zopK_H=pLY3TX^`eqU zp_TaRWxlmlk;DE(Gk;#>_- ziC6hst>9UX2+Q;jwrdU3mi*~xhl%xvyHES{fzNoOX3fx>@AxdYEXaizR&ty;8|rCe z-Dmb0vY#Pv$m<>(>qDf~m0__{`y3msojGXEInFaN;NP2eB|)rxF`vURnOYF~a!%{C zUm;&Y_e zEEEg4E!Gb1oC!P=(!G(>-Wu&+4g*!mygH(Drbx zvdXOMT>kZtd799c%~OWv=-3x_{)|TNL77?3-xu8DlK3yNc@^efX@8rO(Y1BS92RG7 zexCZ=-*3FM-y0=0a4B$2u{9ROOo8FZjl?;Iz~Ld~!ged089EEyp|$y!bQ$mMO6Lcc zRIA;js@}n&Pc#8m0nrx{cvn%S*7xFa{rFsj%L)kNhd+z$Hlp$2f1mbsg=~Q9%93qM zr+P|X+8^oG@amdKJ^AJ_cOA(^#phpj0aO@Ruv>khs=p^-S?`u(94n);+$^vvN{05yeTn(&aBR3cML*~Fr+i0i%BchxJWCXwxExFgXo ziT6E@ag0CuVh5J4r~A2}&^`puS(GA02|R0GuUw;HMHO*ndtXV$7k2*a%GQ04jPpee`+5x8tSChA@-d$ygjANE$| z+Uh6}o^T%9b9~xzUkCY7r_Sr_saodx=zc=$wFgFR8j~f_E74LXB=Qz1fk`t>AD%#Q zRo~qs>v#vmX?WSc-aKD+dawruE|ixatYMZ=5BIcgEPI?%uoPeIHlH=UxAaP=_h-Iu zq)kth)cqCRFgRyL&9XwUxf_#_t@BK)K+!LfX3jwDh#6jwD*Yjx+i_NvaCGRJa@n-N z&}InL$z~>DDV`TzVBDv_e*D17TV6A zlFgY13pMy&*q$L?T7@s6x_>D_rI!65@sM5?Wrk0VUKGW|F>^&L*00;k&8Zvey>}nQ z=hJg8WTUSy8dZp(o1?f(ocEU8xr>=A>|3kkR@Wa0m`v9a-PM`$Wtod`dN+A#YVSnF zWm{!Lm58I&dU^7aXJx2rVKG^o-o2d0mF?hx{}U00#b^9c`44iy#JGy`IZRYsK{{TK z6l}b&+LY%Y8%t{FA_ohUvRi@!EhuOimG{5W(82HH4*IvR|AQiMvo!eo zD)GNl1peJJ;}0!>ofBp!^T1Y(U;$1Jwtq6QIc_Z8KTYhL=$|Gw59hx#v0)kiTN9h> zFDCX6Ex;1CBMn>7zBRRNVaB!{#Ki?@53{+UZuX`yW82#D#{71KEqObb|M#lG?LNkz z);RdLb=v=4Re&u}vHq?qXj&`ljS>679UVoiWCaxjGsPrl1`-QyIXwYenqud9uvV7(|8hrZB`@Hxw@}A5ec-p3Fx)o08j*v2{KeyNo!AO|$ zO5g*4JqW(M|2Q{&(#z{F$wWgYN{)giqRsBzk@yAYX!i8wsb|tHwL*lB?%Uo>lEKz&3%dAJ?{f5%;0b`g! zYqvN@SyCPqV`yC~TkHE)&P5(mz61UPxPu2x)XzitP*I&89nh#~Mqlx^6|VSc&eOlf z>%$k&II_IHSN%Mh@HK!%1%HIA(B`=oKAP4$!#d03kxds-|J6j(Y(wXRM zT2=;%>LKp?@98gnV4Ap>7dS)7Hp-<^B~ih7wa2cS>qS8g*Xxu5{U+?1<2LJvnO3`7 z*ex9@yI0dZd!-t9Ae^#{@MwARLlW{4`Y>{hev*G-zdu4==%1^1_r_|BGu zZ^U&HEam~IX2w=nEeoG#BcXH+XUpc!NKfbQqaRB}TnDf!594-j#6KLzee;>lJRq}P3*yZe)5IoN^S+elpaytszk$B8;z43P|Qv8bV< ztxH(mzKRs`t9qQ-UU^S4wZd4!2Htn$#Sr3s+g_uQNB1cbq@7+Hb;kKHK#OK(=_r+i z{}hvHMuPim>*`2?>FLX;$EtyvDOXJ3>zp%lCZcDkHoC8rPo}mliqA$*_nRMkO&~Xd|t? z5=+LLD5gFvZ_$azU`fuB3<`zpRG-8bSy<(a3i`U2Y@ICab;9b?a zo>@#1I!Cs)T3$+FQ6O%{Ny*EGDGqGL+>dF>ELAY5)S9ujLPXTq%sX4^JE~oSTS8kL z8Y2tE(RfsFJSxo5-BPAZNrojGDV{q`cUNg~fb`2Jr~T-Ohm(F3j|J+(Ci<3hQfp=0 zHv`@KYL-1W;T89sKh=Hch`<&WNKk-CNlBWq)}f%cG=1AwFobYeM?Of@13!9s(3MW+;FcuJ_KXvn@(q6 z*`!);Oy#Ekj1LA&bI7&YL0Z&9+65Gj(KmKnpg;o2X_{9_TuWC^3&wy~3zvLav)mSg zO44weaVyc+j;B;f9h)D;?cVO8r!mxlA_ZmR?bQK&&UfLt`nKPIwWDV)wXfHgv8cn0;M!c>U-;)}$- zCT~x&6PnRIY#D8?&3@z<2Zj1!GzUWk6ZI%DqTX2eN&aV?ACMbDWH zO{@1LF%9Zou2qvQ%4f$jUB!Xe=uPFc;od~+RFzs3>~r~c5vjga$cWzCR3aKqCzfBS z7Hyjl4rd`)+-0Gg2pQBBH(XVU(Iy^m(M(k8+YVk@(zpn>=kPrOacVMa zv(nW}Bdor*?&MY5(4MbhPdntiyc1VbGgaO@PaZT;F-*Ln#n0ZOa>*fe;Epcxh1^*( z4qo6?)$yR_=&{IpaBws{w)O54AJEC^cfyu^mU>N8Oe=5vs@12<&h^WOl^F(4H`GVM z_c(Sz9x~(a#}FRPC3~0qSXj1@Pun%ytIU}zWzL(9PB1HgGcyc|5}_~H#rUj>4_OqC z&jP!Kwf4nF%~P?@2fZzu6OtAK8Q1+_xN&d!bBIB8wUw^p7Q9DX$-E;xcm% zdltXa8)n+vlDy+Wd9ke~93-y=^$QQJ$t#^-5 zzKcPdX3exHHjb219gy_HIJ5S&pGZqqSfNF0*!M@7>*6*S$4k!>EW#q~ zURF|YN81QdEr{+y)fn2)9P&1lKGY7%}1-4Uw^FL_YH)~4&jkf*IyUMq^HtUV1 z4cmHxEw}Ofv6saO+p^>Sb35y1W9m0u`zHFEuKjORZP+FpYy<1}Ei0Ht`kM+Z0u%*` z0mXq5KpCJsPywh2R01jkVf%tWb)XLLc1i8`Eh^Zy<6qa$ezP?Gd!-n}#mf1+QmkRC ztiDDp7y{`(&AzAZ&MC@XJ0jUcKlnkNSu#3_!+G#7ekKdbE?hT+kbuzL&7<1LT_{?j z1PxtpVIEN@BSSQUcw2tx3y~SRtbFdyxJCO1wmxb09iJ}_kB^vghOc*%Db_gG{8C|m zmYCfLNUTiVNIRpk){L3B$JsXDcXUk<9~GhBn~lCV9B#Fzn4gYfAzk_m0Xecr+(#_H z2njnMWjw zuz>~a*%yc47rWZQ6-;y5#4q!K-NO=RW#3Pm9!p(4ZXpiVNsK=8S9R|4vECrAJvF!3 zd0`x{(bFHVy{cfr@jloqJj`O&f|Hdr!6V*?71RSHj@6+p2}CsqBoP<<+u*U;@3qRX zEehFe!HDk8oVnj_2$sB1dXaj))2L2F#M58vC($Y$QE~CW=Y7j+DR1dr@&`tbM!LS= zWk&lTL9#d_%z^^!3lR(<8b@i!0F2k`pM*4x8K(x?-{Zy_!ctI^SnA67IvMc#E|cD! z?P~Xxt+6!wvuE{%>6PfygvBkfCs*T^q9=CY%+;u3q`nV@`a7?$x0n3b=Zh~-&0M0e z6dnatG-ByrsR1UM>(Hb!wD7k!Vl-DW#P?LW(3VPN7H4*59^|ed?LxmA!w#OHX#@ybdaFl16g%-UZ785N#e13obtMQ{Xrl4atjjU8{z6gPYOk^J{YL_76Hn)BuQW_%1;@#a980m9n&h2?91 z!Vbj!(*CxGnBH%k2VddtOoXRySAL=4FbUkZWJk2gPkl6_Qw$u*2b`pYQhUZ#e^10o z#4cTaUK3@?j}-NY8*ODI=(Tl=u}IuSt)4xdHZ z#4XVh$mi{>ZZuW9_Y7MixxPE*`o7@UXeVPwaOD|Hkl>vSJwa}md8^Dk=F~P-AQvus zh*sV+h0?drh9j%;O-$=M_4lkjjP=O89DAo2>M7l%Y082GDJo!$(a_mKfg=H@w4wOd z!!zjM_BZX%!aG>{CDoV*E_4|oe%VK*%8c15NYE0m&$6v5-pij$M_bRuOqW!OhL_#> z8%05IxqD?t=*Wr-X{tta<(88+IITNP)GxgPChSkCg9XzFVshfTF+-X2SF6uhzLuI{ zqS;2iU?$OiGQr)Z$!ct9RR=hDK4#8EWPdKH`hqA=nuI}8f|I&0Fm?G-od;kEx`M{<@$tFu_RQlYV86|P z4vt9VRTIR06llVNDCNBi$K46);K!-k{@8EA?TFN*;w=U6N(O3pKA=mv4^PL(=Yy2O z-!x~yU(Pt1!IH14NjApW&gU5Fs5ZT{wM6T&{-G+A7Dbn3>Onk09a&eGvY3}zrp~rq zZ)bs;_KBmk#!$YYh!!*~vpjx+9i>a%U**t#)(UZgqJGI3I-MGLiSZ)iGQ(~0OrR)p znQV;b%P5C*jkLqoMmuQ-kW&#CT}6pPWZk##vII?*#7oG%>+`Fvg~}4c8a|g%_5FZm zHTFE0z2@ur20Mk^1`dHwzG_nT@2;o_B(a&S6ErXeDSac~2g+{xG=Efmb4134Ao8A~ zc?ffxRN~}pvZnW%##<%y%#sxY&C4&EuTkL=0Z#2%({i^*a*F6OV8ID*Au( zjs1^aEdRzs>X+yT!+cn7y>vLaxqq#)-7Jy)^kdx}IDxCkU21o*>VXA=KzbFG5Kuw?)OeOf?)?(&h=KuwoIoQK&%bR_;AAUYS3z(M= z?9Uwnw1h3jS$R2HL7*`Amzy=Y+vPZGC~WsMGE zZ~X(!uZ=xdD`yC7gU`d^?^}ExKu@3-&>Q0H@E2X>)+hP51-#$9TmO4qg_9NZ7k3(M zOHZ}2*gDaZx;SB!aTFR#92%;9(LB_<@KHGE0mg|wcl8_VJal4UQw&*e{X2-u>_&zuma2P%AOnW@9y;N=i(aklFEA&>ag~2G!-Qx zA{##8VMFC2u$@Vz+#0$wmoCJtcXDwu^5Ij&*?3h^kgaC1zl(|bY_p{nfwz=pdq)nF zFaG1sFhyAfxk$y%Ny0R;H!0PQ&T~QagJlykFNwcjRSIc-`(CVcuQjbQ`%?-@xj?Uv zRC`}fk-7qt+l(y&@?%me3P~k<62cammv$TeEqMHV@OZKWP6?N)wM!Llduviwps zxc#_np@gButxU~<1NTx}?M&GeF%~4naXoY%d|6>2&2cS_dtW$hQJq~g;}PY$M??5h zVwuN=!7Vm2y&)-)>v+&bF3mQjJuw!vv$jz`?2~GA{prMueW@L7%7`d|$78iqXPN00 z@C<$r>~j;6)O*3ad8PWc;iJkbHn`|5`MU#( zC&2eP#KQs4kip_X0lK;<-T7f~R;$7QPB9XW+J58b0k0O4E&afNI;n|K7vtmYrzb;D=4fyHC1au7-M}f1nU31Y6uL$RR+>#YI~l0#`+7Yd(?ZbL*g&cf z*T`fo(yB=1XxxCN;3lOB{YA`Icp^==FzbE?paqA-P6{%dbL9PA*`9F5X^eH{uzZ6% z-=@<;hel&xYitC&>i4HnO*v9~_VSl9a62c&wx@qiO5o@%ihXC?re$Yk{D9kPcM}pC zMc`YD;4K`r_c#ddv%&fOL}q&Fl?X$_U_)0mNY zKTk|LWk_AxUo?DPf4N`6L2Z%?@41EqQCc^q&5QcRj5?(jVVKzE(Q2?N63}aIA(9J@ zZ#XS;jGS0Pz-?7&v^ynJee(*~iwL0P43!fr6z#&g3oI41e)m1HZt&6FMA1x?&thoC zM6Tbh&xRjee%h?8^LY3UnV({QEn@vZDCG$M36y>MiaBdxF`SyG5>_okzmZeo0 zEFW9R##Z7veLrYIY1MmDRt1b)P}o__o3Hat5JO8XwfR{I?|Gvy_m1s45@AaMU%hWH zkbhW6-!V;f1KxQNa4GT0w=3&WOKxry=}HI!t`i>0>rSjZtA1QZ#Nl@9x&aQ~wIc%d zH+#epInSUo{+}xg-EdZ+tM8#-fM)2ZI@?`5rAg1&&ps|q29d_qHXsN+d8bN#mhyN_ ztaVcq2uCuC+8NSy*lhXQM~`u)Am=Uct6*-gzTp1(xATMCGc34^F*xx%NBSc*7$Hy9 zFlFZuj#LzrbC&YndnR zAja%)Psnp|zza5gteNes;p$>Zfq&!f94FWy>XHyVq5iEgVHNyJ7rHRjruh+L;P|9q zHImHI*WBjhP$}4sm3_;qYW_Ql7jm|r9LrQj`{lNyvL1R2V5fs!J|H|_YEm}L4SqJ1 z?%f;SgpY3ImhVK~>A5(WIy7T(OYBQ{5a+X~6Ba%Jd_FE8DmpA0k{5P3#F*S2^FMme z+LZmQZ@NG}x)n`H9%Ghxj4igUU#ie9YfwL!n%PU2>%grzXiDey z_}oL`)^GV5i{1mRTMo7)_2Y@9HIYK_6`fM?8#_gMnReQJ2+oEW}bAtn!4mGd!IQDADpY2udoEuYDhRCvK|P3Y#X;u-=Wu*KemcET+o_#9qAY?M3)t# zx~9jl@ly$Fzti<(&|)w6{la}{cQ4qi@UF+}c+08j)~V3^CE52lp-;5mFv#h>09S1p z$668HFf=qq)TNji?g@bl-8prDDHMWc)@+as9cNob@&D0l^6R z>XXZiy@$bidrk`={R;*Qp7(n|vX|lo1n|6aIv|=SB6vh9m7!bjYafsy->LJ}%TtP_ zuB@+b*U`&h9wk8}c~wD1w2^Z%SwF16aQD&=Pq!YZgpHk&@+b@$HGW@EY(XpJ!d9~6 zP{2MQd$juMYg8bKttD3dGflzOC*~iSq!OuQ9`)RH)!#f25kbwa1&_ezo(w;B%}J=5 z)>8#OFF3xR3|;l^?I0xZQ?e*$Ta5}MWwA^-b&4Qv(5z|*QKGUtz6J6-ewBor_o}AC zSEoCBMRRR4jdLQCSG=N2l`Cj&ueH4_9$w7HE zpN&_urUv1Kr$=^8lfh<)&&!ID#1#yh25}?Sqgz7H-8<_8ov5lWg)3)Y8Bq6PIGbQJ z2;`sKFHMo$E)_5ok+LB@FF_jWzFc;dVdmd(Mojsxdd!!vwr_umemEe9y%DM=zW0D@ z3k_qEB~d2lh+@hPOP1Ehp^M%HpHR4($DEB1*@vsqT||^f=Q`iSWfmjI-Xhqh!4*2Dg5J?k3?zt} zNQ&yU&-X5Tbv*F8yW93|YLa=?8@^xScq+mNt#Cmw$qTh)@!3vj?-AmWY?>0~are1i zn)}4^poNHzyO-?8Jc4}^TQWC7_hfxSl4MfShbX8@e#mxN*lP=b&w_(m6JOdK3S8JL z4Rb6nuP@o2mIue%Y^VA=E#OIJ9H9zySsv}ut4j+qmVZ9db~DUm4+n@FvM9=e=;T^C z5*vnlZ~(FL$*%7x--cDM2x5a}rWN|VhfiXj0(!IVY&q!JQ^YCK`aeq;>#^~Mb16%g z1v&vfFe*QjlQJPDVBK3{@un9tteAqRcDZFYBCJDS@ykBZR2kf{j?Em`RDKlA=Z)H1 z|CQFRqb|d`#F{hjRiwmq9Ary4&5f#)N^LqZFSt#rpufdGFUe z_$BZ@RhXCU1Nuq}p3z&MRjJOyCTYP;8G~9Q2qD-tnarZj_tf!D?q|@QTz9_$rt3cq z>^E#1c^PbEr-Ak2!y^@n=GX4hZe{Uf3*L(3v7xU88VSWeWa;;8sZ`jO4DK`Pc#6%& z45m)IRnek6dm`pFco32?^eKSw#aZQ;=;k{QpqS~CDDuWJo>=6L+ILS2(*;LQRCy{QXNG)ClVQZpOvGD8|WYN1lsH*0n;PUdt#mHsEr!Di+ZgzV6j?Mjd%A2&m zV!_jG%r*^wT)TTULRvS1Nu8wgxMSxsu@J|w@#?ZX^JDH8TBZC|tsK1-jd3CktuePC zuH92qS-uz+X(3gj!Wn6whk~LM(TT;*36-{=$|e|qfjw}$L;LXDf!;PRY%b;#pkI{C zSm#!NW%{!W>w;bKaWtiLe^2L|uIJ&NJQIw>(5Djw6T-VE z=|>3n#E@sPzF+SKwg+JQE9q(Qt=}EPJa%{_k_?7E5gbNf40xaUKL1nU_}jri=zyhz z?WR?Q$5Xa+2?ILo+?UR#(e4V(0#0#z$S&PGd9V0Fv#(-fT7%?>UE2+=Sx-6#Vq2W>+?_SaRagIM^#J1fh$4SPs7BS!Z$^Y9x5uwr0{C%S`E&xX^b>F z+GL@W=@J5N|^W|mogf=?bURxxIUMqrj&WT+~joM_oyJQved!f+cVteb(0)?i`4xgA3 zJG#J&r4(`sfq^H-y_whlX71XcPB31NM4_O$1 zI0ykR#QX<#8h6a7rARXr5VLtG1846$pY4qL^tTXGT{4y9w^fhDqzYoDd~6n+gDZGW zCi^L-Dz~B3Lolns^Q@ct`ziKm#e8=7OR;%=KmYV^lVNvF?C2Vp%O2Dn-XTY&&81!q zxl6!qYKgr)@A(E#+ev|SWsRPndnD8bJG_KW!}0yMRt?o4&f2k8ZqXWQhztUL(2V$z z5{=Je)d)MSY%ZnEo!;zSoP7a^?qDrK>&D2;BxFDOs(U*?71EJlQ^V@%bT}K`x5_f- zq9FOQR|~;3Qp-9Y$dH`%66cxLzo?(rBaw!oppF)P#0!8+SH_bD?5_(3b{FM7KkCS0 z02qOQ6K(uSeOWHO={ZkXo5V4*F_>6RVijbk@3n9r#G`%(wUT2wcD~n^p4FOiIes_) zHU@4lFGHf!+QcWO0?y%{Zkjvzoxub~$?*P?4A=Lt?p_bn{E&X%YYc$>w-GdGa8Ydv zm(Teze2&SJwR3>%_rmN&wP7`qvTM$+k_32&`%niZn=Npl$Af!%{*owx3n~G5Enzuo zA~Xbzoe$ti8A6h#@d;n=3DMvf5{{h`U#WA;( zVBD)w$HZnV4lcZJ)q7|Do@(xa9cvYm4P9`xJB|fw951;pQ?6qJg~$ABM=5P3$+uBk z{T%j|xhp8o6-9rrFQX-1B{;nLSO z_wC*ZqOOOJT5loJ#}1JxGhh|$E9AQ~8l-76z7I4ckI0yJ=_s)iBue&YeUjz@s%N-E zcGntl>vX__AzM(H2#Drd=Tt7}w=`nag@v0AmR-`KJm@H1@Yu^`y{w-_gg-&I932Hm zBROkWAF8vX`L#&spQV)7ROzcVtBvH5HNtIf^{nZ$atDn_6ze$onuQR0P;H98V;z1o zD)H)_waufhzSwy^cG1nE$<(nrG9-C252}w(Cs5{+$Je2BX~MN-NaYJYk=WrI0$-QK zM|$;rKR@kZ=A7>JZ4PKM$7fwfUlA~J#+P&|5e*8F#Z!1d5M#?BjK*`_b)ZW}*XP2fFEc*e9$$8Z%y8%FOG}tH(qqYJ)6GX;JQrjO8Aa8 zB3gm$uR6&$<}&7Bg}v6Y6sXmRe_^NJ|8l%&+q2%%Nwm0h%4%ez>nzpjLiPSYFA%7P zPn*+@(2C+6k4)D8L5RS?%B$k+)qz%Wk($!@J|01j{o77rP)OZegdW_0`V$L}hLg6% z>(ch^m*Tb$J(i9~ND@>7nR;;{J%nHZlhgG3$$Ytbq%|Qz z7oWb;-N}XH=35QnYR^#29z*&l_q96hjJ=J+p?D550Wd@a;(KQA$W0~Ty}z0tu4L}X z!1OE%I9{Tk7V3hUeQ}0n_+(jB>TkYl!;cQ`M&MItD%&5#-9$DXScfaMPXEBC5#%%a z-79c9r%ptS53#7R#ARKwN+LM3t96mSCu1})tD-im^1~44_?R~wd!UWASTc3*suASTlsRPf?R5ofqHs2*8A$SKM*!s&bZQmaP9w}h%$YNrGpqSM4y zA;+k*xhgX|<9Rnt;7Ga8+k_?fk7Eph~p}YJ|!i zK76r6{-Wq&@9mBcC;OuMdEn>E`0+sh!O+B>(bt&bX-8X_LNKj088J}9ASJHvRG6f3 z&6=nhz#{5$-nNlEh&vu3mASqjWIGo89Vx2m4A-#>x5-?II4#VDC@Nupnrz&Zjtl;! zgwJye|8&5y)fl74H1+neq}{%){G#~XR5EtK2b~1Wnz$f--$X0+2tYaZW#;5TgHPg)Rg#Or}39QE~Zp z{bj-*Z6M8H-=K11zst=Q!HSM|odvS0@L-_L*RKuU|A_U1lM~C4$G4{%eUsho`Ie4= zzcJla>|CmSes%i=ksx_N!~L35AKm0T_zR#IwvTC>6Y<7VbKi{=dGFw? zr>N{L)cEH8E>XG1L^(>2wZT_jPtUMslDEVEbra_H%97vxFMeHS^5+RzZ3X#1j>m$y z*#Gc7;1}|Q9U8KQxKf%zEUlpebbGZ8bd=WS0(4p&3ako_Vh}59X>VtUnzy35nYXPO zk2#%?Ab?-U1a@%@gxS-?k=f$*jw}~S*tueX2V$!7k`HbQc=CGMJKDqURH5{=w}ZOy zdJ53pR^f$(Z<2v@l($7(Z3XDG6_hDm9USaztz9X>EIceAW)K?_rG+!>^s|S9vn?fv zg_8~j(%IaCR~2@7%nyLDm;jxXtE(d~5a{9I!Q#Qj;^1rv1o80j09nC6Fqj!ug4x9j z>T2T240WM~;k#{!we}y?pe`)8ZDN7#;sC9+fgl!E;4ehK4voR?Eu*|aY+`zIzu1EZ zKcT>`9{Xo7unZU+HdyyyAzs*}H|B0;5N828DP?&|DJusT*B=+UQ1Y;FaImn_0e|-E ze?SMLDu$ z|7GV*92FG)bNB7-Z}{n^9Iv>8nVUWAfV+&i0G*qgwK*@R87r96oYj=s!~(*`3<6nj zGsCU}V1;=bnRA)(Sa6uLv6=t3<6v&~M>`zdob7Ho&K!2c-41et(gijYAXr1p&3G*w zoMAW1zv1%Cu?>jD3S^$(Q2O@h5IFd_s0cpC))l>bMc|2sf`PC>Bq zoC0(nHxtaiob3F~%j(xlMgPz56a#Fl_=cfjoOr|1^y0iXufomMRv56lVr7rb2DH}_!u4IY>cc6Y;H(>VTLA?MG6 zKnz3i-A~cQ`I6@P4@9_Luizx;C=NF$xOh-I`RPpshieDdkXK&AgDl}^RP6;MFiE89 zLrZ*6xYm+wXTW=`(e_-dwHkEek1e>VSyW=8t;PGP3+i3c{e80{n`CVnnod zLc+@8g2Fu328K?yCiXy3j-9=Mm4iJGFX&Uo!QR@zUc|&4_?Y~!MuKM{q9?M_Gll2o z21o)ejqHtySV1}R08lUXKwBb!h`FvkPzb1RWdMBh2Hwuz7N~0h@0_@&reT#Kg5kNT z@@2-qy?{OrA0k(YG^gKG0XSL|L?tW^M3rQ%WIfkQr0_~>tZTJqifKmHD5{WOhaoZC z;M#QGWZYaDe8!I`d)=FIFE6+hajw>SOxs0xkCs?Fv(+Y{U2~ycjSCU@tT%1Q@qPW6 z<>}Gd<^{G_;^08ZTz5di_1W&~519*<{w5UtrR#W~w02ZfqxstGkomBim{4*odT&TB z>1rJ!V+H6raw#ufsIQz2FS77C{Ilcs__kJpJX!Cc-hFf`!{+sIn(dNlQK|$Z{ARpE zD*`R}g}+*xQjZgbiB*#FC_d9ohFp3es2K+cvVLq6TE{3Zy-TtquH)2A$b*P9!*v*M8}ekO z%NM_CRczS9%X5!(l ztq>HfBLi3TvNNT8wZEFSGP11};mc~S+i0KW6|Pg6J%{@aUKzjxZ{uopQ$^Hv3?y4i zx!LyI2(|fmLI!bs+XB!Cyir1o*1{k+;(}vXF?cgm&wO0e}Ir)o!sv zUm=K8?Ov@MMxOb2u%4F^DP%TFv$J81{qM3_P3P5oLvQnVJ0wbb*(pe2AiuSBU+WcAyKd^bY zdYsL6ZnamUT4QQnU+As@s!yKXsv>Y*9x8Z#jE=#v2C&RydrG_q)cFo4*iZMxxP;MI zB{b72e{}Ht>M97Ou5S_1rojuw(s%oQno7kAUlw>h;dc@~Nr(r7sE7JWD>l5U5%;+a zC2B?Ht7?0hK!mc9LBH#do{^O&GcC3dSSRz@vX*KM|>_H$TA_0SVjPc9RJm8$Wi z%aXSiqG-IU?!qAO=W)dP98NMVpa+HB$GI?0ukteejB zYd^61lO7P9i7xNr}%s(BtAx>0*tP-O^j{n>Ge6HdXug4wh zai4m8GcYjI!~c=T!2WOB83V_EwV$cZTF$bgcucAs7TKbfecNi;R{+4x2+tUzJA4f^ z(CtE-H#U2lM?&7Ucn}&+@z!Q^hm}_Lvbj`jJCTE%iQt5XIF>k_ciySa5!Q9*n^UgK z=eiR6pqHHkKC8040Ws2Cap|FHvbF@`7$r#x7sE#pMuQJ?DF=;TLX5l*?s<6Q@6aFi zoiP+XuZ)FZ_=D+|vJMbj$Z-cgKyl-wA~I0{xt34~Y`j;fJ3Smf47~GX9YyzfcH_zA z^P^ee;;37}J{FLlStkOMKx}bbo;w_vIYm+sM;?Hp>Yj*kLYgh$j++P58R?Yn{6Ric zfJjCtIx_)03tBU4Q=G-B4%721@izZ~6GWvK<`?J4xUx)%!IQTvD#8kygMjdjZ(tG2oBvI0n1kOFzhMqtt^n^05U0BNs+|vRL)|(Cw9rE@d)=*L2 zY#iNF7mghKCeQlLJHo3dtJV7uFY&-~jalu6v#&pj{O1VRCY@sAQ%d%ow(cPD5pMGu zv`Y?yCPI1$l?_4^j_%ZXO}Ka)cW!lplaK5l*1C^QGA^$QVqCLD>7R9OP4u#t5rm+* z;S$@7t+H*3u`RIVvteTc$8!;BIgfC*w1{z$eeU<$=3iA{T1?SeP6r=0v_{@)Vh|3LNj>Lfpe|D66;>oeyy`Xd-rg zfB80vPp2bYi*6hd5*FDXtcei~{CUAAtS{o;f~F0^i0|YLDAZW;<86g{<$2%Y2~I#n zUEfuI1)m-Gp>$h{f84?stND`l%tLY)Dc&t_*Y%mNiZ7P)E#V4NYA+UN?~W5$p;VD$ ztehSviJ?`81nKlUKw_n=uLW26cz~Y{CMSD2@0;a^cQvD-^ty7z#~4V(m2z8pPR4q5 zY)D)7V#UmqLjq}m`HB3?q2Ye}z-0bn?-^j4daA_MR16ceKtyQ$TP1J)p>afa!Cct6 zwK~tKbbOTApamK(#SebwyBD45)}NaFJcz$d6~?>UAnp4z#$#LUEP!ogGhP-jN-5_@ z4a8tMT*S4sBk6=ndiv;f(i58t-2JYq4i*Merr75P%T~&rZDR&o_HP=R3qQ zz2-wonAhZMHbH%ig7NyV^2oHPThXP%%bIa?W5pi~XR7Kcpr_6S>bt;1Erb^%JzO** zb;M{F)DLPW$smmPMel27aJYVi+eIDB`DB`$fHMnAec$f`i|Rk=Zx(7r@fU%zEAmRk z8YeS(j?l3@DA-vW^=a>w2t|U6;^)wsKHo+{F0ZCd-sEM$n}6GQpLW!zotKH8rs>)a?YcumYt=!w^ zcRzwBv5ATl^H!Rh`jR>929EBZN#G2fkMdR&2`*1xEz{osPD9KQCiCn#0%v$f$aBmL zQEURx_*WoDicWrL^=mCIcqG&19E?trAkG1LLn2DHG&=Qt8N`^#bxGhUJ1e$kY)VGN zuaP!&y=_|5!tJ3#!c{Lr@9pPiIcVOM#a0ICihW4kNwqi{Zb)wQzH!gWvRpFMHY6+Q z!CUCI1q6QDR9GaxZxlZwdewLF5E8k`^zr6q>FTJfPl^qG+q8tKD#8%L1qsd3t!POl zZ9ALQ6hTc%Z~Q&Yq%0MJ9~opc3Z^fzJ92f$ry>&HPI2x?dmecyF<(g-U8$^bykoRx z{%!M!lxBahG;?}yG+kUmjKYvWf07ms&CZMjv#7XqllIq1_7IWep{4}yJ9m%wrN$#L z=T>A_LL%N-bbv9yc|ciY^1FHutWV*BIJCn_6G@2QocP=?i_{B~ z1LLSGv68R(S`@N0h8z~|k9X-lwEJe5-jei{Hz}C`5gC1h#>{#V1}FL_JT(jO%*ut! z@MSLsn(E{ou6oe+nOfpxKD;6}WHO$-XdbRixC_dgkMbr<`;*ZmA)|v(H=Nd+9^g3fnitu5>|G_ots4!WEoxaaJ;;n#>KS2 z%Dvl7GuPf$=UYo>TZvWW;T^KI(Mi2Qz*FGZue}7t>wR!V2BC?nBQJ1Rvsg`!_AzbV z{Y_HK_}#7GPeP2JZlQb{tGS4b!ste%$3 zEie`i79w_LMooBtyp=uZtVTo+ zs$~nbv?pSETz;Tzpq-V2tv=8Wbi|XjwbEAr+G_wnXH_DABGB0$)K0_-RGH!F*ar_f z;{gOgX;6DRqNnxynDq-?vHi8i|38z%$oNG3-^h6ack;i{!}vJEM~;DJ_Wzrne_+qk zmiIe7e~|;?El6BMPx7)O0=zXbup`odf0U*?Ji{Xw<>8-*mxtFR0`c47QCh!EjN$L| z0#(tq*EP2?`qkkdl9dA5>l%Pch?su%{F|hHfnyM7TLexAhe2Z!Yu>ERh4H4fC`|E9~|N&CIa|B9Z+@&BMlK-UiV zsJZ|#NqJdOacU47ZB2l-PwFfLw9~gWv9`CeC1U(J$tV4ItPaw56I(lbL1SH8A`TXS zr0yTz42%o_6%zw{V>=BZR(g7P`p3Wj_B@XNEB{}=9^3qt_gL#^>W?>Qr3qVt{3s@t zMxcQ#`7P~C{!A-4=-EH6??);b{$l@=*#3383N99UR^~qy{^x{#bwkATv}yqVp|_{f z-!5Ax3bW+{8z1gbn*Nb+yZ%p{v*4Xn3#xuJ&#j(Wanf0iLLM~AT{~@`8CPM zJWyRW_NV8MT#y3(V%{%iKC|<@v1OKzeW1A;tf=d4=d1Cp` zw!cPxq6ah*Ge{VZRQ&#a?Ee?FkF@=y{qc(p^!!osG^d|)d=&0u>901AqyB93*J%H| zG#Tih7yu&oH(7)D25K(9Ia-~s%0`j4m@lna8$y4GUAM{<59ABT7>du$315C>s36McS5BXbZKhX*Lw11*$^ zI6wvbjz&)i<8c#$2T18U|DH0jvjZW6-*Qy{7=ih5@JF};0`3$5U4R}yA7B6g0*nDB z05gC&z!G2!umjiw94rlhws!hfwm^U*z=iT@vX8MKkXrvMs{3u>{fzVc9_9g2{5u*E z{1q2sU}0f-^XAV8P?DmVEV>HLJm0yYsI0ez5Q5>TqYxB9-e6cBACw#}Dm5%7bubZe zPXS-k;Sh?J)Fd`qcRv{Q+{Zlge0A-iP?BqChxh04^iR1)3rEH5)+Uj-mVKEFglqQ)CV{@ ztiIs4yT@`wh<5S{)oyJ?~NgqM23Y$92}6_$j&JmjFCaOw*JViMoD;0 z93s~LR;D-nCd~iC*q7bJzOlkv(yh4e&)hEdj>^^UCWY>5rt!r3Qu_%x(rpiuKIs%8 zg>&C-Kd^N7L{{bPjItRPX6NEiMSsqSR)8Dhrb?8^B+k83B&iDcoQ|b1tcbHNZjjcd zh$@P9!k?B4$pY(<;rnI*yaB7kG8LV(X=u6sjc^IazS0X-JWcI6paRQ3C}-V*j#6P~NUdy2-Ka`D;{ z*_6Re`WhOIl|t-S6`r|o5We#{Z92(Bl|7F+H0ili?PzW?6|Z(~HXXUg8w)>oCZU>2 zr=y#QVX>VoWeNBe6~#VO=wsYL>)=O_3}c3hKL(>{rjQU4XC-^kTTnDrJbe5`E{ADc z$&?MZHn9QT0y?G1>-_4p_S~{P`pgigG&7;0sR-fR$)zH&nNUPbib_*FOkIfxAsWM2 z>5QysfJR?~DcA{1``jC~LGvOQ%d?>@Y<8$p8e5a8q1d#bC3P(C%dO>xkkLs{!lrGw zQ%^Oe*|6n1{Eo{1IBuZJyOD!+DNJ$8*^QbRld4KdzLK@$ za=*@No|hrsI{cD^f%xUCl&En4{5;ay$=_>#NngZm6a)yP8|9 zQQ=;k_`6Dyj@WvhPezBaxD2E0$}f%;Zb!{F6F5syNN>dJW85oXT&digVi*RtQ(^Rg7IsZoyD{hErqc%e2j@AJm513 zj%q3>oiAH?ZjuvL6JMp4Vaj;W(nCnI+YZbywLv*U=)mHN*jVp5-;koT?w^(O+$7mK z`|98}uO2C9_h4XV31i|jB3#6LFQ7P{WwmDDrgOyo8m}ERa?r7;DPn8Su8XwkZT$uo z`?QTNB*=F)gs-zzwmux?&^bYSdR;vxCW5fh(?cM?@LOGaWsMM>2bGO}cx9=2-DSwB zUwY5T3gedgt)N<^wz6kxu4J;DYpSdq!$iJ`nUjyey=*3z z4-jRL@_lbiTzq8fycw-_`TS((N*kdXo-RV83vOGy2dkR3kXRCx6~{5G{zdaVG)X3UM8TtYz%u50(PzqZvecu59np6R ze2j>7QuE_RM=S=COzO0}IwTaG_``hn2)5ZgCTEZl}C zWZB2f8~7r?r6#f2MV1qRP=9%Im&=^Q$yG1v2Nv^6$As*$4xtgH&>T}l$rY{VdmhBT z)@NL<;Lp(WY;xJ7dG7aB_`p-%>){}Kbq1s#WNL}rT9ouKISr+Q*W5uI&E;Hm?<7wV zN%iQK3@+9}UG;${Fqyx?r#x<+t)ch~tGuV14Pk%pEk8CfKF0ZF9x?G~bjxOIMhQ_O zZJ?E1}UUBzW_2AU{V>XY4kL5ZMGe%2H%P zV0l>4k5<-zTkAz43f?%%<&28s|cg-{wl!??$6)^5lTogMbf;EtT&kNT89>9 zpe`0Vsz_(cyiEh08fB0)d*h@YxehV;Znc4sor|D`kXKs4Cre8-Pz0l1!PHjYG5VCy zs+D3U7Ga3L#RH*^xsoz2izpLEh$9Az1%IesVR1iZ?`z`wwu39au~EgB;F-oGH|zG( z=dmrvtr@fvj)|9Vos-|8yPk)XX($LL2?sKKC@(I5qxAJUbeX*dG8>vM=!OvWGVpjQ zL~iKATX&ofzGwm_WR!{@))hoaTXAiVzq)_xv)T4{13%^$p(BTX6U0;(<9s5xppWrc zi2Q<|Hct2zT)x?R{k7>uM+bRY_9G(s#y>LzI}4$nZUYo1Ov_-llKEsq(mbDcGr zo9Hle!6)8mEP|t*vJ=a%;D(*8f8t>)mOPibMJnibk^9E-S|u6Ym&0p|@J7#)0A4z1 ze8(RfCWT3#c+m{IM3DKD^2aG3y!^#ao3rmXxk5e!FhvBD7SSQNBxi>rO5LMMhv&qw z%f9M&kZ;ypPpMn4IijA!m8PNd@QNWvfR!WOkoR3#EpC9!qgH8Xjp#FO%)zhmd!hOT z+Ac%ut6p9RpAW$@OkYIY@?!$rgrcGp_gMDDm!}rF;W-!kpTkG5Af8i^;Edwhr4r+5^9cDOCg^a>sV=ZLT}O7x~+*Oe1im=n9Eu*~H#U)oy>0nLTSBvVy@gU4d&OHg*2M@eb==HHJDFBrm7c+mI!y z!N9=!BQNQZ6`&lnwEP`8A=nTwh5+ArkO5r!{r>e!%r}yz?y-GXf*EDc2(w#A>jIEp zWH(?SAoU{`=r7Y-40u*h@dhIApC*K^*@)jq-S>rC^Xuefw2{WFc~ZP~4gY{TSIHif z-{fZ20U)^byQ`rjH6^Xm%@5|3u`=33h4Db2=^D<>hf%gt8QR9KMj2%Y^j-OmT;G{d zMH%ZBLz$&qQoJ>E!H8Y`X@&N%j3EKPe%g_D>FRcFGm9h>wj`IfC~Ok9Sv;1IT}0kFa#KZ?tX&2Fn>B8%z<`x01J@+!P3D(59E31!}b)ad1hkF3U`BnluIAzQZ~gKv7W-x&dWs; zBzMDG4g57q{i>)GLf6Hfd2cXVdFfwe2>IZG`#d2*RYo)9sigo7h0b=uQhv%)pgu z(sl-1Nl%uS`wv|2i2~HxDbvG2sHZ1?+g{vI*-={Sdub_!<@z@kxVH<$0c-(EZLE4+ zVM5=;Nzl0hl7!&Pf~TYk$yrhGKP{pq1oXF=wJEPSd=PF!TW&KK;NzD5CfV1qwA`ts zj91_$aU8j$TX(3o+&Klei(tS?{&`e@RJOWP%XyaEZg|E$e}kN)8Cwci{+iLp9WfvrlPAeFllKB z|AMRE5WD7;b=;7q^#miK>2X;wF}S8)6VK*iTSiJ6N8k@~6S@@|A%w%{n=oy{!_1qk zJle9nDHr|zT&(8qEH3SzRYXg)?yOJEz>o!VF7MX`fo~={*+)>&O;({6w!Z03yC7aC zazm>c>WO5|^^VyO*<>Mm zgiv)oeNxu=-6GP46&JNE3Lq(Scg9#ag6&sd5_qV)kHq^1#u*n&(yK2{FBR?#sYaz{ z<~xm<&xTo^1zc|5RMQ)kq2~gm(w(6pgzl{SEnDRhFDpX}D9*CJ9KL*!6@|FY_*wa=c%)!Te@*4bb=rg@ z+o{xfHYr%W9E$|mWuCB^F1)nN#)u4Qy32060U8e*;Spz3F56y+Lu}tZjAbRWf%>?E zEt!N|{n}nf$<_|T*Y5YuD_ld{2ZPt?A;f6ixOE2iNZn+z!c9Dld0Qlv(j1IuC<_^wzBg24;jk zp7aA_f6tF$HUNz`xNpNW7*%;K@r|tEu4Qz3aiSeJl&M(sXnAKFW>3i`T32d}jGLqvE)Xv&BdQRcy2*Q1%PD(c~FYghRtd}J}nY#oi zp|BA1i7M^YIH${c2;L-k!+VM94tao}X`)!_7vMg*Uph3vw`qWA(<}&jo=s2cds$iM zrtQNnW;3zjzTe(EK6T3~*2_q3su?eRe(>3q(j+dG{>6=c?mWFF#ZZ%s^bdgunx2Ip z?Vq{PIT@$Ed=MQVArF?Mc+JiVCDxJ;u9TrlUDA;c&!YUcbZ=ldEUkI#Ri|%+rcO#% zprD}~u2R1@*tYQTT>Xm;-5>tvuA)T>!};K^ggbZGvr>~u;5vQzca4B0f`AD9oqI9# zdinON+FLhRZDAp1D!$=B+_HHgUPk1`IGQ*jR_Gkmdlq#eQAu#BvEt7CLHB0IerGGl z?z^11#ioo56L4Xe<(6>iHkr#vX%c}W?s^yVD2d@zXkl}DS)tT}`h6(9eL9k@EMrb$ zt5P>Hns?@B5j>n-qU_Mh91D7DMO1dQ?RR$_N#>^v`@DKXO&$kGSixjEOLNjY^EE^C zivEpFT>^}+LlFlU7(=TE3H?c@+GKBE3mzFF@;5bnxFdpfwRWs?WZU=R|MC5!EEBPN zADE2(Zi-7lO5A?XLLvco#7gYz5BO=J=;WIu(u?nVeGkTgiZKX3hBXqqM;(-O2A5J> z10v3Fn1LZv5zV#H>~&-nd|Ik)*k|h;6{)ao>be{Xk(Vm_f{ovORy>BaiS%AYdnqps z+V96cklKH8+TZ)GaER>S){T9t=(-)wg5Y?z#}(7Md0o8$t5Dq^d(rROXVka&rq+(% z*>MN;jT7QvGw!#y%@#V(fETLF-j?&iR9nJQ>hIQ&%KVZ)d$;Z-zxs|z ztMAoB^CRCL2qWS4Y64E$XL@47@Q10R`p_}XU|aPD9wB`x%39_!S$zyH-|5ED8Q&}d zJaEGO<$wu7MNsYiv*Y7Z9b#8=R+t*S=3FLLoP<*bJQcqzL<1r##j*K$X`_zIucI#2 zoNgHqdiBlv40Z8m3`HUhsE9+wl~`OjtizZDLC~D}s@a85HZ;a(@yb#abRDXza*jR_ zyR_A;4~~)8c1~P9ik00O1}GZPm=aP_5p>!78KX-h`DNX%7?R8!Fa79xT{@w!gI`ka z4x)*5nd{0)5AY3_H8s+o3}Gl+frT8=WL1k4VXWGy>xFYhV(qHoXgt7uK|60^jhSBg z=xAM##Q2t$?nrOW7=!hJmV7IauWgK4l=yWCqOb^Rn-|!e^n%+z9IGCq&;QM_>YuMu zJRPd&ACFX^NGr%k%<*UFmK7AQX8$XC`xuA)>re%%_qRjUe>hWtV$Ps=?e7s<&`p8g z&Px0M0e~Pt2p|j)2S@^>0MY;%fGhwM6bC2*)BsP;-{0f0OpkMw|LeT-l>TGx|NVJ~ zfsOv}eqJ+K#ZBBd{=mVDEEGjYRsrVvF_C79;YvkXkVrF0;0z95|mncx$BDg*s2%k*JST^EYF5D{e|6lFBf_&_=@71mI!)E5#a zxKPMV&|4cC>20bWC3;tR0%)-Z&&0$vIL_CdiC^1R@N1~r)2wXbFMj&e#U^@tNk*)u zkViWvT!;$DXU@7lW(?X_{a8)2sEQkw2k0FYzASsVX!a7l^J>NYs1_f3=_zm9<7Tpj zTYq6-xEG`otJF6btGXd&$WrmqCGeBsf*~tCewI5-@G^&Y})VqdDSiQOt%H%d86!Cn$; zQ;+pLfYBmU3gfNJ^U=Wq2K?Xn<4nOero&Hte|PTRJgJlHV}Zi{eB`;5g79ij`pJxU zBp8jxv)x+9^_|HSi%Z|{1*u;V=dg=fqtEZAj0Dcj18HmF1o7QTc?Y}i?{`-{n3sxf zFZAs~o=Z{tRX06FPVB?tq3rd2Y;Rv@Y*@1 z_8}fE9<_Asb6toYH*^R!JHq;yU!+N^4u8yby^-z-5-rjuCU>s;^BR;_x1zn7#PLl> z$G*X)F{@-)lDT^uTg|nOeWOOu_9bU*56jj~=Hlj9cg`QN;#{*V&tV$p(`0EUZQ5t^ z-v&w?Bb4{e!VVlVp-ITy2&z21e#ksP`VpL)ZDAAsdR9GQjwnA)^c5gnd*pIC-x`Zm zOiSqG_|kHC_eQmgZ}0iL;#%Y*JMwgYkF3*DS*olgXv<=kE{Qfd*R`(F@wO{Ly;Zrw z(KSczCIJTUoP)AcL>TGi6nSm(a-$hjw6?wG*I_Q+(-s%6KfX!93eS$|MGm0N+o-*y zJ1NyiMlcIC7wJ0I3`@qm?+KH+)=Y5( zltSYZd&%c_Chpf4Yxs!HcQ5Lc_&4v6?A2x>N&yfYBSjsF(aQ2hB~|*?u!~)yAFs*o z8N=SjRpLptGYA76Z1fqM0R;q0y58u`@~^a3`q$SD_3S2UbK&Xy?kr;uxVRkm`<5`` zP}9;ahsT6-Yq4Ugc$%LBWpYab(f9m1xzQSSs|I!1t)ZLcTt(qs5&=ri#NGI^22_{)PxU2)L73NlVR>_=xRMrHL!K%~E630R|5cKrO3c4s{ zsO_5fcjqgpo?DA4jpS+Zt5|-@D36_HhV4=GlsmRqFov2Y{JyGVIhX8nixiZ8o9?i3 z$y1oIMli`SG0q}ZCuX&?)q&p$V3kHkl#?Ok|KUDxTZ|xq=fdmQ(-pC^{IyuCj>~Rb z@zA?PfjQUipyht4(OfF0k%i}*yMm}i$=xd~5mXwJI3=WEBKP15ABk=N&G6D|0JLfWDQ5h3?aRuAgq!pI6&J z-c~~sfDy>mYV2Zd47B{?s@J2l)e2x`2?WKLtsno%!yIU6|MTnVavb0f*Xv)`<$ii$ zffgn|NBb3rwl}r~g5uFmR{s!@2Dk!kt^NjAo^H_p23LN&Zv5ZF6&5zezqw~sO;i;o z>lPSFFRH65KMV_5q+1jz@2D1~zZ6Zh(R&#w9_LSwE+BwLYHWJt_8OuD~|(^Z}!FlOP4K3r%aWJ zn^<2kBDx+<-)GhQ0RY@6i@h3+ot%Ewen%HKWjc6hgrWnD-&a}?KRA2PMUw>QrtOzk zg6c>!aSgGsL7Hs2a6qGRzAvro?y6_tEOh*Vr9inv6D9onQhO8>U7C2t4YpjEbjz-m5M>Dsm8VuR;{vk$xE zH*tbjtY}uKqMwA@W_`KJVh@S9KRLky^eC65E>S?f+&0^m5bIaUDD?qRZI*hNW&WyC zyQJr+2dFons@gbPqMTFM#R|!hQSo81nqP0Ap1{S&N`Dh-Ln}c+ZYuzJg~^u1a^cAJ zu*z_K1g22a+B~9T9b9HQOe}WScWvwA90ltA&zsL*tO+p2aLdr94Gi<2W^I*7vq^fL zhabFsuI1=iYtT`M3&-@`J!?`oPtd28SF6bLtaFl4>&9jyJkGW=DmdrGASVYGDd&8m z@E|99Zc!n+4*b*wU1CJlG#SE*p`Q4|{58lQnC+++p~1Dy zQm==*#izket7%%b`_cIuC3<-K=L{xd@FXAwt?PIyLp^%?jyfQT*1d&ns$)K4H4B(B zqGQ<+LE*m&!rOZh%dG=s$5u@V=8s`;Y&XZzedTe6OPU(-ac}G}&(sb-b#Sa>7d=&0 zqCq=)IY#vDk~qS;5eP*a8OKU{U_0B~9N`>!^W1hS1`lXpP+mkIwnfTmXR?6Rm5Hs8 z^QlYN2_MT-4uj9<&bm>_c0Lx-cy!M z82ZfJ$RX)LI#M=Yfy!p6vVuG6aQe&VDB5e_y7$RT7S&N{5F(w z?TesWj%7yoniX<%mXR^x6aJewjvxTF<(sM zy^PFPe9TVB2vm&2aOz+RlN<$WsL>Xa?^7K12Yt%SNe62_*;f{`E`3E6E>!)Reb}0X z+MT#)hljLNl+9NSKg z4eQB^TXa#eYXG8{kd^5V=VPe`5d>Fb*d=&VNljvEn{2aGlDJ5V$exJ;lS**1@R^O< zTM@oi7k23?CH3l$#jj7663!!nh>weV67yzF0wo)m6zb4@`t9YA4=Ibsk(4KV7^-zy z`^rMy9B{L?dzmHE)Nck^u`u#5$i55fDMvl4n~-0aiZ%^G#LC`1#k`G^- zu*rf-*VlY{-dU==B3F~V4LYRNCE{&6skpIks8($XioJz>b$Fe2lc^_r95_=6hx*cV z?(4bHpjD)Z=lZqNHrQtZ$SPQgApdmOIalsKt$vDiu8j zv1<1{KV5x#+3BP#g%F zSd?#1B=}LEE5?3#;X3odoka2LOfHTq!T?{xyCnIPjKPi+f(D70gpvs#a2=X5`)0Mn zmtVIGz01@>xFn_mEi6|oNEF?qZIDqQJ~4{FY{VnAooqEYLV1?z3zIL^F)H#+Jk@u* zho!er3))0Z&)XUEc$3aMtG0bxPqq(2DZ3@u-F;FEPAP*-6L6%>wN;rVn>$YPtodxu#X z7wz+mqHK2a3Z>y-o$@cAaRaXrZ9A8lFUj03b}HKagGDa0j~aGerJaJACn$xK zZYN^5d34BwrtV=98zAy`u2_?Hbv>(RFrbpFSsH`As4ZWN(a-6oh`n@sO#x6)g-Lv(UUIvSk&GHK6MS+N!h-jE6$2^)y<*dxLo?mD$TVv=_(p6m6Hf7TAJVVSJizFCtOP_@S3%8$% zDw{z@qGS--n%+l)xQ~#1{xxa@y#bL26=y2~MPL|Ubp>Lm#C!$0Lle%UaC1C)m|ZU$ zybb3y5T>!~i*jb6U~+G{YnapOCuMSomz4W?oj~uM zqO+vlXD=+-AU}?9Wena_(ZKuwS_@TkjdM}UCB`NaprVHELk0W1|9ps*l9sFe%)sZU zgYa5rln25nAMotD7RosT6Pm63{&W2Viw5bp&$AQjJsbPmXu|KH8flsfDLU^O)6=t= zO7BYxoZR_75WOPedROtuG5DUqLo)v>RcrsLiidh zxxR0;EzNYS$5O46aIdwP(Bt7ReKYG^P>MSQ7Jl6@;IOhHLI3Jh=& z!bx+wCq4(rQF-{%FwDO8!L~x5aW6t;D=n*ul{CB#< zy*4Owh83p}jDn$QFQkx=v5!K?g(zb37+z}}E@Z3*hjc6wCal^c;9L3m%^7u3meYdg zz2i~e(gieg>P^H|wZB*40&(|jn2ElL1GyY0^yxXoa`ms`EcE$4t`BAH7h>FE$3E90rgfRYxL!p|$fGG83`a^CRignG4&-9#K!^o)Ak*!y6wATnhFS2J_w=7JzuPSSEa`Ce* zGbqgUzti-VH{Vzros&eW%IP`6LMTgPu2}o~)GptM$U+nthd&XHP>8F0DB5z->Cf)-j6Gs(OZ@DCfjLVDt>%p=xh&6b#UEK%MjYa*7 zPaaX+6e~HVN{&PDYh*E6wT#VA^)bVkT>TTy8Fe?0t#MP*&MPva3+d z;Vf~r%bOLj3R5^RvRhkYcj6qq-m{39->D04g+%;>n7eCWVCXGfloItsJQQ60pe(#; zq^7LRtv}dJ`S=vp@=`dquzTTIQOWu{ZhswJ*|_Q3+lQX z=DS9w?ig~^tfO`o&QsS@n$z|N*26MDLF`X-1I3{M=U7ST&w8bEt%1( z*nY!k&(FE%^ERwb{UfhQ=T(NjR0VzK_R?j}TpP72YSq-%TLy{DVZHdf#0wt7Mv~|5 zIu9GFMl`u|x;oA<-CytL8AK@QCnp;mF0g97s?@SgWq|@^c}sKr%-D{>SJB!+PtPi+ z`=Yrw+rldDRiEs@1RCf}AuP!9^s%e(YV2B(6Q5 z&{6vIw%Oq~@m5)%m|-Rlu9Sx#Ek7REoq{!sQV~(MoVpw(6H?ix*$>XS?yLORSo+^X zA>J>18%VE6GJ^*4i1TpeZznTsGAs1g>zt`f2`$V72MpmbwNr@_Z5p!a!z`Sp`cnyY z3GHpV2h`r>l&`nNw`j0hXG?vr8&}We<6ZS#Gi%j#y$si@=z!k@x2G4F@6pbfqa+I$ zRLJkCc?s|Rb^04prqb>#3%5C|=dJS_Ah_-;*{|3Zi}p@h@-9Zr&$5$Mv!PZc z-C%8uqFTf@#Sgii{Tas&eNtG~ovBz=zSZ}xC(XI4Z|jx+xaXBSwiDqU9=`_R%)qx$vt51c~uNU@^0g_1I5gHUONumxupEOS$RbL;PySak5A`r z%h!Nk>t2Os;@gkhKY7DKpy-#v{f!%yRT3KT(s)zhyM0~;XP&!SB?l-ToYHvQug6Wj zS!EhEDpq+gEULopwmmT&VP8wr8GdV&KI8ITa$4-k!~F;Rbr;qwY3FwL51u-Rcs%1} z*KW|XNC7Z<{h z4N|hqb*EFbFgtDSwW^=kZAuP6@QpfLr%zdRqc8Q~`G-ZBa7V~Ug8NTT%oSe_nN6Gg zgkhAA^X=h+FXWuRd!0QT?7ucT!zP5U4OCQf8R*>#KA!qLS)BG8}AMw!!9spc%esN|q!ED@SJO45}eL6101-*Sz;wZ2?I zMv(=Jf&st>DGLq~NGLKIYSe@R?&V@E3OTAG4Wyww9GsC-p)e?rFGb=oWDJak@yn20 zG3aCu7m5RsFouKzF2!svWewmueRc@m(NF{GoI z`{BR>j18L#bSMr0zr)?g0LR$rI0&Qw#-Smy3yi1W$rPCAMa51~0_y~qqP2(S`HA=y|^5GXnod?@8h zgE;ijdR`GE{d^O|msb`gh$Z0BP%<=|!)1jANl|oH!KgO-bMAup^v^e=cG$mteJ8V{ zBCuaTlCfWRBV85wFJ1qhqrbm`K!+_26)yjRnbd3hO;^g7O=bA~J!J$AF3AfTRHD43 z4H*>qR)BF38OGzuU>86T3cP?C*eyTM7^_~x@71>voj%5mlZiQ8Krg`)Rpo{C`2tNZ zL_876MUKe`unBmqD8G<`F&Pd|0-TcZGKc_?C&}<6(j*xqr+7@Th4JJ`G9np2(G~{q z55P;4Uth-p5lMJJbQvdu2{2)@Kini444KFY9OG;uf+-20QO3(m38aZJAOeXzF)t7S zWM-l*-V_F>%EtQx1DrHIoC$eSTmpeONe}cSO^%C)CguvllZk-dH9juRRNnbLUWO+T zCfO1|xlPm~nc^nR&D6wnq6~(iN$U#(e-q=vB$AxBH-0Px6B6h!8ZRRex#zyQ z^JeDDw^_ZqtGlb~Z~41cgs6^{JtVRSAWIk}{*tDUi-GtkbKo5j+3*Aor^OsKPV~h;%x8YEC#eTeSZCqdV*skVkELN zvV`N|0mzuznmbz%v4e7y0H9W!O&y5AF1u~yZ;gh^Vdz9Ahp^dkN8F1`PiNsIB0z}B)+rxw zw@Zu{>X7P?F461W+*d>+}bTh%GX2UmMLsz&>L#J~WH3H%(S|d)-(r_i(kS;hS=U zCQCr50Vs{YKN$cUd8jIv?aRaB`gz+-n(pQN(w4%F?ntiRx&bna-=g zZ0xo8tA!>jqOQ2>%#O&_vA7ScsW38fGd7&LugwpdU+rSKa!ql*ev&$v-aldN#?hOY zRl?GA`G+EF7;7gn{E8tsr=cASTPvH=^zOQcn)su5kW4F4#4Q)1n$ub2iBe|S$yhHv>$Q9+ zuNGsg8hm}Of{GTKRQ#BJUw|C?G*9ZL3>T(mAz4jXZJ%_*Hc#_;n!Cgp zb<0CwNwNUjrqFt$TvO}q7Al?uHO<{=E3DK@aMvX`Dodg5Vk>oKA>vw&xRktuQu!?L zojgzZMVd=pH0X0{lmJ3nY2@W6l||t}^w+Jgy3v5Z^eed%ZGRkKZ*BZH9%rj>F+frH zSdb54GKE&MY zH!8TScoZDHSz5AF6W6!5ajWLPMqrgU@QxNsI2{0o5s8-*v_Ga~+ix9d9a1pbEZSJ5 z)utn1JEZ&YRw=aYW0rbhz?W1S9x3brUBmNP=3LewBvP-Sv8)xn6tro`)1JlbvI<*5 zKqHsy9A9Spdh|?!qt=`aLPWDueMQlL-pRv_or;Yuj)^|0+hJZJx}Axr_CeHUhFr_! z`KD-t?sY&J^v9{mtx2RmXI$>eQ`;U^8CCb|818(Gg1@U3=~#WFK@pL9O=W9MOi%16SN zrJ7ACB+tydYV1BoE}{q zUV1s(o}M=?Z@rn_3i^QiZuz|5^Y)R;6CF^)*dhqHl2qvd#^ucz)*x~?rFji~%{@Lk zUTwhM;456+R!fo}p{kSv@AW=x2A>mR2h%`qq*ZXnHk)?+IDgb!;Bw$lCt&ra%1GJl zTNhn(WaU(_RQTbxQC5()>XGego@&guCbqCp;}O`{X-7SiyCMPJz`!sn+z^#C$C4ex z6_2(D@5ghbSKBc5h&zl5DpWdFSPbF*+SCYOV6@_Xjg15X<3Udy+4f5eXzIXLJUo@G z)9I7QCYq8U{(XYD!Miv4&=;<-r5N&1fTp(T%AJR?z2r?9Jh3EcINv!YcjykWy(2R? zO^4{j3&z;XN0u6eG+yfrFS_9t8^(DrfiVGLaqIRwm@k6 zD&6EwY9V0j9_uY6ap+A10&*PO4u)9sBcgFWuq+fvO;{%31K1-ZyluQV&%AiMv+$J> zH!mV=l)#eDTF!(T{cvF?qf#<_7zbg^gk;1UmFHY7G+c#56q9#d zlGz}?aeRfs&GI7ec@=!cWuYHS!WOFAZqj~P&?mHN>Hx$zKy!|ndB4E}Eig_a-C(xE z&E8Z63k3x^9_fKVQG;+lAY+U7>N{uZO|s-?VhtmVcX}_-3U;PPOFiue+zqEYbICan z=4W2I25I|p}4DT7L|bqZ2&n(X3Gtqa1c+#3F%e{4P}SBEgT5|(pYz4B{1jJcrB zR7RqNd{g)VmFiIxrxB9L{Lv`{sTXv?skinDfsW8bFTPAYuJ@KDpMJbDx8h*K@Qa1@ zj}W^_g7GDnP7&+`#>#ug4OiLL}SX?2g=*`^C4~@7T zSq|C)XoDeNv*?OmeSaxJsL)Ezy+GV^F~u0JlKD}yw1Tmp3gV$gO8sL5aI0ed$B)wu zdy{n&4YCeY%m6!uA4siL1&Yw03;EaB9O5{^m)T=WMV^|bUUF2XWanJ}P=U^*MWu}7 z3k(s(GHahy=4Mvn`d)vpFMtx5HDZzDWpRW5S}Xrc0hnE>lWp2LW5*&8viIa0v-8-e zw)d1yNFQ`Lp=A`2?WQI8xp}Zlkze?fxnT#t#GdVWF-0>BRj&(OTR$fk*6D>oX!o&5BV^EV zJLSKeGCz-xpT`UvEBhbE3^VJ$95c+%y!n62lFKy~Y!@U@K*!9*f`Z?)A;Mb(uWCEO=?%wEyN5DV;NpkTH@h3MyZdrpVz1cwZGi5SGMr-P5Zc*h$_c}1(6yw zYQSKhktI+_97~Q1XAzj_6lz-Ly*;jLo3HYkCQK;N961{FO*+;ry(-@~;G&e!(6c)! zQouIRXHZaBy0LDg!B*Aq1J@Msl-e{WZmy=&BrbgJri07x>kToL0 zvP;wwg6Hk8#GDwyJ>p*OdE_S;m5(v`7$>I`8kq4gv9N2MEaQ48KbDw<75IP0U+UFe z`EVI1Sm9+2#dswBDhU50zO^AtcSVH*lExJ4S!&OvM!F{LP$oh~=ZqFkcU0F@&;oyM zpO4eBtVsYsUGXIoSX@KNG4ja`Y-`DZo(hfKWp~Yys&-mo4m`LdGuM^D%f~r1Jq4U( zI)g68$+kVA`Ze}3y4F|I5Fx^XB(B*avi{pq+|Xj`onYpknA|PxViNBVEFS2X&JaVUaMbSNnl6L_7U^b@?52#c*f3oM35m}qsrNIo zqpnnNQs5?osl`fO^|M&TB2fhUy_)ePtM95vcH0gF&h{;WXc3&1g^j!1(VilFd+63u zV04AOlwn^q2?mzf%pw^@-q!j?1RZe1&tj!gIClH0+T_8?lu)*DSOj}!&uS>vf2lgS zZDmj~*Fxg8>QAcu?suY&vjGa1J)4ipNCBSU zu1ZIwZu>skhnDn&@_-kbYFHh0-2%BAK5ugS(u#ADDppT|rX9-MmNBBY;+usjzMocD zTz!2b?BAl7!e-F!b89OiHEBrH8A{%No{}VRCPBd-#_#6f#_1H--!I9?HD`pXpHkO@ zSa(^y1d%camd)YvVv1Tf*JojOi*>m5qoXjyJY6Xe4W*e?ZP5bPJl=FVUU#3|&4_B8 zk~_V%Yj-s=Ri;vonoC00ZI+9t<~W+FP}-~)kSZji%spXw^c47(nPMUKm7LZCC5G+y zX{g#N!g;N)3l>=E7=lpRxykP)v{KC^aTXX8=j1KhCKbn;^Qp=D5qnQ5lvre(Sj0g@ zWlAHEJ=ulc>+a|lC*t9z3!3@k+>^a77tT&-K{l^$$foI;fKv1llU%`d{hm#v`I|-< z7MYF8CLG=e%pfLfc$6Njp;@e(LhtCG4bMAo+Y z=5+U`EU9LS_X8U8DNP1Cd-&dtt_x0%cL}48D7EP&{ui4<4c)Bv&F49DB`Yf9S)3aE zR2zFm#k9qpB1il0hHV|d5Wj9gU&0pbsf8AV6!HMDQg!l?JqahV@t2amC~TGQNli$z zFp&`S0FDrf(SZ8~_+N?X{gfV0IU{rEfSZ23M0>cTs({h1N$jxVCXW5Qo%nC)!pN~m z29)vQZbSBZQjhnv;8}+J9M@5t?D%e89{uf~+aFrExS{05^_4CsXX7u(u2^uBJ5N7F zWze|kshBJA65K;+mk)5brPbX1kgfM4mZHxhcefbSYqL1Qo#@eBnSVoD%ipk;@a_j2 zEfNK>brXq4<;t)}R%Br3-NARwpjlU{JxTcugQ;!B$-50b%`-!+c{risi6LEz5Jx9B z_K!@T)-|{>v{R_|e$zPs%4l@%c z#~(cB7n-BuVQ&ghFf=y>$eNk}4TbF7iL@C(l!uLrjfj(#Sr-nVWakX>3=%Pdq#R9c zorzeU2@xpU)XC1p(b&`p&7k!wYNBC?q(8&IO>+=uh`AI^5 z)#opDK(+Amk4BUmuIwo85q-l9T!N% z(Am)1&is!Ce@9l<)Y;GkR6@k^Tg$&7^@nc;WEmwUHaMo=$gvU=3mntW%Ai~(kmKfA z6MzyI+;1)#B@Vcsy8YG8PZ)l;uo5#P9P{&x1J(GyY4TUqer@vqRJCVSepgM%(8=_9 z76T--l$8~PX+ais1e!YjoY^9#PR5QvduKaGBIe)5`*W&1i-V><(9y|R*uv0}h>Hy% zWB7ZTiJ1wY4m5GLaMC7XXJmw9eE$2t{rx5JX9`sF&-Bmwf4%)offk>rEy$4%v^58H zXe(&z1pM<|*~Q5DdC5O(%k&o_Kau?Vu$4V*jO?s`TLZrh?2l%MSbi=fz`tqjXX&pi z=#P4UXOsT<@^{@tfM#ZeRe{}|!l?ff(U zUo8BW^lzzumik*;|4l2uNrGAd$^6ygbLyXd&(eR(|9uwyE%)zI{{t+Zx7fe0TSZY> zK~-5=6`+l&6a7B|@vNcJf3OUgIR4nN;F#I|X0AUM#h)erV!*%E0F`rqwtjYYj-Ssz z((IrEgM;JQ!_UI`JRFemKoVT6tiMTdaKb%H{8pEZjs4I1zqS6{$}jzZ`e6Hg!9L5f zf?D|_hxun8j6}~*P8JrT=W>uN-1C$1r{r(_gWmrKK>R{t{#+A6qB6>&;=co-WM^Y& z`}ZaBJnH`h2-ZK3j(-4x1vHrF-?JH>!FW#p1O@Kd6u32-~h6Q z?!Uf)zIK9`$1gb=zxTlU-1##t0^Jp;0EPe~fHA-XUTK!6p%8ej{s12_Vl z0L}mxTN6`9Cu2KDQ-CYL4d6ljbI{L051`rocS8Bg>iaFA;n#QukmkR#9^pR%AecBg zK@{lEP=^dvFBQ~1^elnxK`N>~YXMP~Lp8;hh*Q(5K+L%<;%1_<)&$*C81P&eG*~Qf zxV7&^FhPE>SSP9q4SZUs{;yR;bQVekn`yKMn#;>oMe46Eo97 z!Q)*E3iDf<;zQH(KSd5@Nbb!YD7jJexitlw=9@Q)iZqwYOT~V)>G!;wNAJq5LIOyd`x2VP7>ldL5htYB4C zr$U7;cB8BWj!a%SP^34`JWgnHZ!^VSX`NWV@{Z%3-Q?h&&&73-N&wk-99VC#CNaD` zW{3v_Ja)RL|NHMjA##{kxIZK`7%oN6a@SjVqDoSX3G0oFN#Za|5N^a?qA;_ZzP;-hSX$n$P9@pq({r&fG{PY!rn_?DL@E&8?CxF4(rre3j6xZl6KPI zTC^dpkxz&}_vFM;$xfQeSJ&wecx5W*k!pG4(}^W+R!u{BjxIQagKr;eulYYEw8$db z!54c{RvmE=-I%c~}no+oY=y~1^|jMD4Plzg*N(7FYu9NG*$vi)cz z&eG6Eu8FGl;Hx|5>k%lVT(pJAg4wKfeEr1DvKDjbm#bE=l_FMGn9@RPxWih?IuMYX zdoLBYCt~R>{He6%txn%n;U{*;nGy^78{z)T3Dg40v*_dT{u?|B2G*^>L}GoN1Wg4W zYb1Z%PS)@j;6{?QB@EGM$+X?;213y(%NPOgp~{=vPQOgs$|{E*E*k1WRGK1STEYzs zTql;8Xm526P-SYykGUp7uvsU4LOQ~IWwm9tddVntxt}( zh`ZMYGYU=Wv+)@^L;PfN#>kW8W7V=pO#T$fxr=Ds9A15$n7&ZfY6NX|*n0t5hjE-n z3H_7=SEX!>*Rf?BU`pa9Iy23 zPIu_sYeu`doh*F`t@3sBFv5094E;xL&&bc-9>sZOKj1m^zQ#1Y7fTjxy$-P8fWv?V z6dZ*u#TYwA&-p0M=&AP-v)itlT+sIDy*}8LJ9dH$ja5trW8u*=5PxrjxZXXvPKtHX zLWJ*8HPAgdIvQ^b@VY_%$m4$DHd*doE=WZgS*IqgzR|?$DuN2k>4;BAE0X#Wg)OpPr-oAn4%gBTL z3H)d;%MPG-@H?^!ClFB$Uuk_io1?;LT*pXcNpJCC4^u?4W5M zd#cWZ=4Qway@oN)2e?S~Mo+^{_9okjvdI1Y`S`$m7b(YV{!_{ixNGzXize^CIv2$FQTGmz2elDWdbH}tMd}Obb&~PQ5GnPa=aA! zX%nJdmV1@$FZA!hGVCOkDkq#)jo213f;a@>HAxXJwj_%SER1AkVzk4)Yv3$5YTp@U zX%%+w=Eo~aBMXrWUXb}a`E|TY%7az)`+hL+G#)952_Jh!WR{P5_15Pr4!>?O>W96K zrpKMvMNTE16}mQdD|%M^QMr#0a-~t?&u+f|8sYQv7XF`*oB!rg|2LAu&h-D7bU=n?EJhW{N?{({v{adKPNlPOib**k{vZGg?M$G zN1-$PK-2QL*KwlfqIlXGdljzbYH!r&jHb0JNZgCd`|7|Ao1lcq)WNxQoYqhRz*_4e zMMSOIyhX~UzPLi_s;dv~&$>3ZY)nZXq>pmFucZ`(cTIk%j^|H_-|-o}Y8{$toym=_Wq#60-skg*dbRFQ>)kkauY~u&c~OlxEcsAm$xm>xAAqMd%egB}$C{;{byTKZXrsKQAIY5nS z@lDDeSB-jKQtlL;hpnrnoS=%CtD|B2p^wLV9Sl@}wssXSt<%?t(B+_~6?8OF$j!d< zvsZ8t;SIEL(ysaWh2|z^rh|O>MHVz6;UC!*V5h`rVx@AIbJ!J;r_3zT(Iv|ZzbRN1 zyG-4wpnb{fDozmrNC`|UsC$%p`)(L--<>s_XbP6CBH#;Wfzt{eqn##ruIc3H%x<-O zaZ9t~a&yCR!>rlG7~Ft2zbQ)8CeedCb1Rk}D7#%60;|G_9_uI4-{P`orb2R_O`AWQ z4>6)ZzaV{xvby^&tS|ww0B=L?n%IPfAxvM!ij7ju&iEC-NWlY~dW?%8SsFZw?Stj3 zPZDA%a&%GiiZyGz)YKyVxn6X~u@PzO>rS;z5=;nRl<0bER&m$DLc7MSFSJ>A#?MMM zIxOOQ+@Lm+1{m28Ctu}3i^2LeM|-C*36WYe9{?P4T7r-=q2N?Tv2@QEZ%L`>XaV%K zdka{s>t>r(Rzq-5p@FDW!5ICIfg)e8@DLrlFfwX8%1X;?1ai8UCoHGgljc*_*@L+- zDY|-ESGR=Z=dk525{8{`^NO4#Znk8`Z}ppdC<6OoXoD?LCM|30W~56$hBdpoW~d-Q z=J?%puNh zb$ASIspPSUpy2jnZO?+k^$F_o539 zjVwA&aZ!W4mpjmVEF^M7_;r3b)HYttxW!H~oAYbYp&k;G{4gB`W`il?CXDjA@9Amj zeiX+yi|R=N;31!iI9!LhZ|1W%7k$L{ONPl#IV}7#cYLmtU#cl<+A7847|J=xh33jO zsk_1G1qpjGWV-T`IO`7x^FtA#Hmz4Rkl}61vcT9wRm*c}_>1j!_A|hOVh^m+8f$<9^M)4E^$i6{+p-(b<`N zZFbo4y65Qz4BYnC9e)t}T{It4gm6_t?uS z_Vq-T{EHWMgKYk%z&!%)_MmA-w*b@#7XGEfFn^&|KMlzs;lRrFh>jCe^HCzF{K;`B z?ck_2DZqO$Hsm=s!PM##YK)RG-+5$fCJIZ zkk94(Kxk4Zf?i`s7+L`>Fj^nK+*Y^#1rOm8N_6HzRU|Tg0wn4+{d@j9`gKrP{jNE! z5pslCb!*mbQ!!muOBl+R?d4RAU8Kj0Z>Dq|hC#QiLk69@aGTdGsUF)!=8ssV@Hl(W zb9R_wf`+rr=M4vjx^=;8-kMClaGvdLyeFjh2)?N1-r}5BVHOAx?M9OtPhLS&E+dfy zVYTgxHE-FFIl?6Fm@}~*xz3hPZhUq|m~NPDE=p!E*-+@5&(#t%-<2Z0XrT4Qw!uaZ z7qWE{yuh|o4tb%7qL)e0ek29=mW|bVxu%C@=4j>Nn$*l26P3v$eff)cg=EI1;WXwx(o#&3Jz41Z8Y_I*&(f{tJvfOPlHX>he~y ztHAXhtUY(}CqD~urL#36bT2KR7*^sMk9BNm9D;m!Ol>aPj)sF)w#6W^--5ZUR~_8$eR&Sk ziN};+VM&zC^y8=HsD5C$jdp?QSEmL30O}KCQ_Iu^QCm`2$+kQVsw0a}+<2DK#OIrp z*%IZdAJ{DyQh)<$M^S2MW6s&wRm!>m{DvPlic@dFtUc&Q|AE&%dt(0+Uia_575ql( zSlL1DCoYg95tLwOWBDh~72C5T=}*rU8#^l;;4jY=7yG~ST!9Myr=Ba$Up!YDAm7z* zo~xgpv!DJebI|{n0e!9d>Bq7LSerUI{bYK!E;dFWFBZ`J*{@{}um^q5vNQSV;QEi* z-_MVzzp%ewJpTVV`(t6`_%E(5bq^I~bBwph?jE9_5P+6SY@G$F)^$qh#cCzfCB`n+ zia4T>gYD!D+*6els~oxwz{kr_Wx;$8K-0LqbI5IxSe|KXC*n=630f$GHdzB3v3s8eq^fdPy0` ziEyXf4my1vih{E@Vibmd-6P_c-1lvc<<@v@*Dm`2NR{RpLy zqozv?gFAmkv#zK4p^Aq=8U>T@opzSCUa~&QHTbPkA}!JfjGYfEt-2cNs+t51sv0Db z(sJ+eNRsb&b6TE`!Qs2N6Y}AtMYqrsRi{&oBwgif^?U_$vN>(P+~-eAuXIj!di(pOpA-ufX)v%@dau&*(^vcT`^$MdNdm+3nYMhZB-HR4^N~qqC(7l4V_p|bM7)HqU@~bXpJbIAMQK?W4<*jfkU@4m0D%w`Ew^w2T zX#0C4*|t+t1FV*?F(HU9??Vs-IwZXNW*leBU8t>f5+#k%z=aUwPdeB1u8D{k+|-V@ z;ws0TXnXF#vz(Lf*qE>J9ITe$Xw{d>Sk!P}8dDMYiU|7l8O}`SCp!=n@?}OT0*EKT zISOKoek)oGw*(7!40}ZyVCecz8}hF4>2|c-b-+}$hNx;4lVwb*!i+LxrW86tD}v>8gm{~gdb`C<#WLB72g zKzt*ra?#}WIe;mK=@^6SDMLn759j(Nwy?W6fUKZJ=M(iga0L_ebKF z1!i1A3RW|2B<2U8)ytFmo?3&I03i#p%+S|?%coXAiL7ipoJ=&;ItDVFF89L(`zi65 zuuco>g*-y=2f~5-PoFy%Vcf~8QY9T7V39a>i)a-EL~`Vrd-lkKd0OEuaHkC!f(g27 zf7r*M!)P-=GLRs1y&CEI{IHo{3C-zOu&lYEHoLFmw|jKr(qMtFO2F_ruP+nP)gS!k zpfxo32~Mor8Vetp5z?N*!iJSiV_&NjKT!aRwGIcENjupJ?U9w49QWzgkv*Mq=lv9Z zk=sl?@HV=nafHpLxywa^$v0pBS0!D zv&Xyj9pM59FP}vtw?dn8(};p^+17C!Rx%wToboLpcZfi;jC2ft-32h74x4(eA+uxthFX0Br+s1t$q z5%F~Q?|2Qm4NqS|K#xznN`*iL!lF8a|*QhJ4(wmwIAPM`}-g4%NhL ziT4El9^cl|25c$54hU4Roq8Py>uEVTR}{jsezRG-uy$WW?heOQiNw6%H)k<7>Z(~r zA8m5ssPU=93OyldU9EpS1klg)4WCCMvxmKL|IX=gb^|FC4vxWNHN||5)qD01Ce(73 z{eFQ%tZ#P8g{@{OU8-CPf#w~GooK@}(Ash>y&ix0Ef$hG0*!Pdil?B{cst1n+$@#U z0zFMU<_oY+#&(`^r54KR@f0mP<6FP-57JOiSS`>encut3A|+XMsE)|66i0QC?2Sy zjYozRr;Rhk%Hl>B9xndF>S8}eP3Z@8-9*mELVQAC0lq(*e*s3KW}rJnDfqiGBvcCI zwJk~nHRia*K@y<-F_W=2?QYJGa|I7n3Q~Y|?8P)MT2rkABlv^FYKRH+8Lg^T_51jR znuRk4qvN>7FJv4y0+w$PuC3>@O6>v_PjbpXe~*T4%~&NGS3ROtD>5Z1$aR?s34U&MZUppu*)*swUwvh~0gOa3P9p9qmg~r-1${ zLVRRX<$+}#yej?dMUhp2EI;Px-tyKwf?DABX&^Qbdy9G%(I5g~%4y8G5x6hkDQZ9A zTbN`J7GVg#1Z^Gv%DPS7DBU{5aT_>Rx=(Yi%6*faYye*&yIjZ9*0-!UKz&W)DM+~M za&_AZ{pQa4qhOIimhW{+76vD@I^*5m2^aG^`wa@Vycj)6%BBpbDYf?&>gSI(F_VUM zEgfLFEfd;fw5h9U9MM%Ot;&*Mc0#5`Sa9WbO`n-9=a{M#eF6t z0bi(|%#V7z=ggrqcp(Wd629w}IQcT%n+5YD>Y-nNm?5SXCD}O1 zBaNNx{9BpN&i&;Jkp||{#QWjiWxpQZ+6{?>V_J7F<2H6>g5GLi3KFFz(SGf2;U1N&_idnh}B zrMKutBq6%LCk3{&5hFXN<-I?rNR?QL8ozSge55yI9W`s3(0J%oimdeM;n-)z4nIQ7RaT=b{;s*V*_ zj+%;fddg~zqgvPO<}HZF)kL5L7`?A*>BxWx_t*Fe_^5@@hVJ{LrG;^v&1#96}VP$6#2>nFXXKi0YBSK(~W**C=2mH+UMoA z9{z?)tWc)+u4i=HiOTmEODXr|cIJ3E1O&S+1ExPD-8QG4ZoIDZF>O3)zmJ`aHRY*O zKMK`9VW7lk_+QH4Msj#Y=^1`RsxlQQRHkOLY^$hN5v8cAU)`M=!-;E(p(4 z%&BGGF9Qc;RJ~XU9VSN-wGbgHGDY*`8q9n1+GQO(Th^LSnQ&<^eg3(EnqGFeDZ_Bqq_6PmMxZba z++I`;A2MNS%9`b2CkvDg=&k3D1wkq z%|gA>xUTQCHmxNL$lU$T=PNT7-<`PH zbidx(y1b6s`C0jV4NXfOIo{GYQLaSs-MA&7x=)7&*V0#IL4dym1ts1rdioo&Bx+m~5LX9mV#%zz{3^9iZEtCi5RIZqH#5|H;MepCgNYUfURn z=$RSWLD2yqPdwLO;Resa0>6hFJO>W^b!h_${c>poRsA=YHc+4hD8k^^m;z8}3mo9j zm;#PpV+sTTLI7ca2tX7d1`r2G0%QQP06Bm>Kmh;><^ZSwQ~{dLcQ-p58^fQG2j-xt zgFjsI_P<=qTz(BUV0pHV(qA{QpYOk0>;K>e#>&LX!+uce(IyC)Doyn&|9Sh?S5Rn0^qz}eu5eu|-s4v&iX@Rh7NR2-U| zobxz33L(;=p7*|i|Ng1`u`P`Sp2bReXnQugzQ<;%a5l4w6sVrPux#Mg6l%WvXkQ5d zotK+|$vkA;8+gOJ(O+h`&3KpGG{n;z;b4fsSTRJr?PJDL8>TsAZTx|8A*EmldPvR; zyEaX8 zlPSEQYYXrhRyH*m^t^{N(LJDeZ93YjofyFvNzVzHl0liMw6cYxHdm$-;h8b!7(|;AB*7N6Z*mD6Qz-yZjYqS#t6BTSKtaW z-5!lmmhyTV^9tw3JtFTX`rSGX)H;JD>xsCAD5y#4C`Cx z4`d`=iSGzj@xd7gl}l<7h)(fzPR`j~1__|1ofNH}*+(2xb#@q7^U0(pJjb-* z;^HL3Esb`GQ+#1lC1i0~Rbd277rOVzBu?vzL31(jet|yGrd-Th1Sj<=I2GmNr^0(0 zrC?mE!BOd9?${LHN`ddG+bYJKhdI%ON|^a`$+1oBp@1oQvrqMOwMr}jov-~d7fWnP zW*U+>PvvFXOfn3R;XBxKTo~v~c(27M@Fb%oqx+)BTf(%(hYW@iKY49Jh8Q;(;LYkE zDh}M`w>c_n+=*F3xuk2LrzWPz)JSMKC~f&pB0new6eDKHV~z`W!f%f^A;IsSBOtY} zRyPYl5Gy>uUXQ3|l9TdCtN9(ENupgSb9~D?5oz0I2+`b)i`HC{XAEoigsfO?J>^38 z452uRh?CqudS6Y^z#RB;UGen7`3xf z`c8XTav{SsRv-RiscUESy%VirZIv1GBDyfz(Au0Qd_Ym8dXSV@C3O$S`MxSQAy4YN z`;EBP{Oq-MqqIoXoe+Sy^>Iu+Ud5b@T8t?5An8MwPc+35#jL#U5}-D=Ix5h$leRq! zsx)$|*d_Pm1gj3Apun#G3)~Uz)a%Y%4Tq_bgxN8ym6$-vZ>X)>noG2SJTJi=`5MEG z7UAXBztGSiAQVI*1j4zfs>62;_}lNBd`RtdyYQd&Ki|BppHH@NzW-KOS76`Y(~N1V zVr6GE8w#cEMZbm4MR_rC+c;ll7VsubyM-Z0+nX=$>+wmfk54m$y^NoK z3N{!QPr_xNKSXBahHqMkV!@k>1y+Np$VY_)t%4ggVVqmdNo=L=ta*5OG$V5K(BP&R zj?l*+dr=#P9}A-3d~~94*-t4yf5}>;F3-?5MgDaEa)L1E1iszK&=zGtb!)p=lA)i5 zM-io1o=%R;eXpX8)-B`O2brh^cPW=BmXniv*)GlQX~P6ar)z_8fGaIcD*;PAqq3bP z^*P-ke3cT^n}huF!361o1I;&?`Ran{#p#Lk*hMNEiE&!1hw8vOzG}T&K=l3u)R&a?gpIC3+fL~z=*`9$XyH~4IA3tD1+DAg2 zf+s@|1N@m>mOl8uL|>j!UjlTuqDKhIZJLDm_RXweqql4`?&Y`CaJwYKch?Ho z$6w{_=tO&xVo}rPWWP|e&C@1Ji#F3ng{%o#7Xr|CBLYGi@GjL#*mq99_`I{OH`{bg zcVO-2v426G0n74H;>dBlVRmRJAOPHkz(Hz|x-wqywdW_p7;c4esN*RA!l3h|^1`ds zR?9lUR8>s{DJcixh_y16v%_Yt5#4%h#g;MBV&c=saq2a)7cKfHEk2h4r)QK(ZEnW< zFZRf7LMqN%B`3Sp=NgL=E?x%Y#cMZLUS8bSt<|-bk>ssnripV4!Qqm=*GNJ^$G}Eg zFVGRMYLOMwL8I~3P=4t9usjNPfejE`((s(`24ZX1dceLX3e|6D@7+!!s6hV!^H$fy zj6>xF!GqB0sOUsccG#Zjtp{u_U!LMrXavf*Qm{K`B}3FnL%67xo6D_dT5ZX&g{)+W z;@t};WEd&2tT3$}g|3Gri%)34tI|o1xld;>bNdg#?AWwR>O-cpy;Y2hMTmmJ6TmPQ54<%S!#M|60wDRc}4{uK6rV26fX5geJo#bQ6B@T-6q z_r&`Y2FXNTHg*9Bo$}te8W6a_Jb2N=>n`YX=&8_Hi^wuFb(q)FK1<)+0`DOq^nPIL z(iV``yXxf8ECz@##k$&Q#p(Nk^-q~tFj_Qyu99_8{a{D`nBX9t^p#QyRf)v09)%zi z9LG7N#f!Xjxcc%A(U5{4Q3mnGGTekRX=vE2a;#s%abT5D+tZr6PP@s25Df%_tPw*~Cd=JZ20U z0lp1l0@OkXcuNl5AMZ_e3OM3n>>i1>*XAH_gVf%#l#=bo4dLv+(p9dUNh{S#ldr>S zmgGl#e}J^a0ySdqE336efyPLTpO%}v0-~k!6=N}0bZU&5u-LX#+NegXO*U>-cvQfXpDE)6 z<)o(V=Hr>xj-jy@)J z*-{_JLvKd(E{{A`YyFZfhnp8pb?*r369qBL z)Pm>Lpx6j?dX6!5jXTNzS8LZDPxb%($qJd7W!%iN?!7LTYi6&E?7i=`U9LStR)n%5 zJ1esg62iyI7BV6uLb9oh@O!I1eH)+e_~Z9}_~Y%|b6)55IFyAb zh@UNgjXO{=Xl1Vx8BW$GP5NaKSFTQ;oyRSdJxl#Au5rGoL9-X%4f*G-UN`xC{i!J4 z^Ck)GWk#)XUtxcyS;Tf#Pg{|w@Iz14(9KpHA*N(R-l$u!&a4@CO#_amsLHKIaYgPm zPX6ALGxQgwwEv82e=3yv(RB1rMfCrsPvb{i3zX1*?G=Cv|Hww3rV_u$wZgw7BjG~8 zM?aF0K-cZRi)(>S$^R7B!hs<7N3HzNajoKyxb|OBtu9#aYh-&`QE!EIL_7Z!<9^Fg ze(N;=Qk7pj4ZarK+xocJBAvh2-G3`fLpvi+vy`WezK%$g`?ojDX?wumsY};yQ8LoW z?wcMrJ8$scsZ4iU3=$}4^Fse)NgLP~?2E*pe~GNWc252jS^v~n_Pw7bqNs~%611gJ|mPIM2Jm^pDHCU zCEHF|NNUemT$A+rz5S#YuTxV!nb*$rXV1aIb-#`2jiW7zJ)BDQPmco~9#scM$O)^m z>hp~D;4W9B|TlB{CQ|>AZ zoWYwO)g&!kq3`es_x{Y*XA*y}mk&PI=I1RIbhfvl`1C6r_lxoF))AZD=Glzuj*M0^ z-K05Y73G4m3tr(uxS1JiTI+U%6nW6@$+ugx%jcbZ9yo?ho}dFmKyYWJ>HCxoysx;O z{0?Go_nH{gSGlo--kq*f_!Jep9v$`R)~$~*JEC`Hv*_+n?X`qde;94rDgPAk<}JHL zPqKq&t++^`v&@!^TO1Wx`igs$Xo|qL$u{i2vb^t|1x>S_xdpQ1rnu(FN^|~F zC~ZaPS@xRqDz_Nh)GQGd(c`M6Y!Ym`6eWb{w>XyIiturTQuZlAnif{E$o)2VOZ>aC zy)5yBv~Q7?Fld?!`$*_TXvBDEiHtDC^)~V3NDrUa&+Hgi+gI%iQ`Inq&?S@pT15#1 zWodf^GUwi)P+^36lfe8t`fz%6Q=-5k%YwU-~& zt$BphQLlsNsBBP-n?CqaWMi~@FXt2kC1Xb7x)fSzNBWi6rE?Y6a}bL(RnLcjsIldJ z|Df_GFn{5N;h<20A-OQ@3x;QV9(MWbw**r;h6~txdRjyUXUrL!2O#hpJH`dwEJ~Bk zjV>8nr6mz9noIClB)yvDtT@Gc^?KrgjGd_>ls8Z4rqlGiWmn62k3Ws&b3e}UghHG($AUb~I=*{k zUV{nNVS0At&}dSkt^+}}ajn@UqZ6gUC?9hfjW!mN7^%BLFz)*Xypqk`%;OpZp>B5$ zx8)+^7A1WyK9e5HIte=S!sLLek7A+FrGpPF{fK3Iv%F6s_u@e%-W67#+UBKQb(t~e zokA{QXkUMbP{+ji!1Eif8c}x`UTV{ZoCAU5yW5vZ68q#fn%xbODlepXH|rXVmUClM zH|OO$J(N)-DdA=x7<3q9WSo6amWV=1wN$d)9zb5KmcEA`nkuxw!kY=6&}(ui6*c;+ zl}-geb>=|-X~!yI2;l-%GtZKvW@-j!A2#0AQre5s#W#CM&!|6!yKV%p`Q;{`5r~nW zyA!e4sF!yi8k34bj>A8bLC5w)ec#tw~uyR4OLd=x5r@?ka!|tIWxLu07sBBVyT)-r z_s_c=0vQ`Lp#@=%)1HI1B_2eJ&WmZzqZ{+*2n|+?>mH|t3hd?1ziwCO^SVJ6h%Lz` zxmo{shr`k%M-Mw@C2T=P&R~wX+bKy|sKj=;$G_LElcFKqY`Wutosyo zs5dRy3ji!skOWIRE(Wr|1*=bewMn-aQ!&T3!`VOAk+;q2Z8`Rt;v%nXm88j*`>yo- zW;WK`{t;%UhV~`P<&wNFeMGswL8wek{<0n2-AEk%sO@)n26bCQvUkpEa$_6`%O;p_ z4%iCMPi3IXtJ^mg>mlSHnv(+cr&|wtgwuS8PTG_%$(V_z$4(Cp7A;)#jiK2cB5!6N zNqNmu?LG8SBV9>(OexP{M8NROu#%I5k`gRChoD2w>7I63cHG_eO_HT9)FmGUWdE3x z8z^Tw89Wi*)$Xpvw+S5$ul5|JwQ_7Ve)u@P-rXl@rAMIm!E5z&J3d~$E>-`M@zP4H zXDxJ()dk9y zrV+GnyFTQ3qC6TuOgIegB#Uwkk?heIo_)T;!>SWjY{{;1rcMp@f~QBo8q4=4dKTXF ziFGEFNPa$UN!un!)>L0wc`$Z7bL(0llOgI-3^lumKT9p>Jf!3UG$JG6}n}5!%Krc7*&V8cf;Z&tc+j$wR8?jVoXb)btOu67AGpZrVJNmNnsq_eeov z@~9NAE3s9Ml*-ysX2)^3XOcHZEb|h25UHfX6Xo&kTU`b-)~AaLIF6fxb_|PU13IRW zB1Tr!=nsoMieCAnH@NH;xx)eVZrr2KBQe*ymzxw2ng3cirA^)$2Q0SNjk7v2rjpTn**>lKc0 z?}qIu2`ea!VC7nemVAR^O3Df!zsedmzLJk`ku5#ZyXQFE(Oe_c*&zh>s>n{2O|AMi z?Z#)IkFrLk?Nv4RYPNSZC>ja~g`tw&%>A3Ucn^i<*XD zEc_Sl`76*n-~7<7u$l1)(vupHg^{H!Qa-nQP3~Pb7QUvr>?;=M7b`@y`&hnP$>bZ? zjMQXg${NdMtp@4vRxqmckRjDIkAT9o_@n*9%TK(`oTa?Abz|8`+pPZbBMUcSTz$k? z*X>n>OJ|Qc5Eqdu+xI48l2)lmWG}Lw7;;y#w}59`X^9ZvvL}A(HYZD;R+o&sz+J{O z4yR?RjK2jcnN3znKva49G&YJZ(GZ}5@``l`5G;|$>)<*K3cI?8s=foeIa+~wfM z4^={)qPSK`bXDw1Xk;XhIiv;)yeM9%_~` zC1O8&)Buu(7|5~5w%@?3n|Hb3kMq3peb?mSr%wE(O`LRJb&nVU<^*Dg{k2;jqAl{@~XFC8hmc&g3j7}vMIV} zShS|(<~;#3L(avvgF6i8>idLiAIHA2fjw$PrVp+`>7NIgt{k!F1va^SDB+71E0)%{ zuaj)dT8z`sVQ6&JzE(IIiu+h!fFF@J!zdgUf7wYhVw)}lMnn;BMw@Ca;y*EyJM!pVv>0PNNA>lKDs9y(Gq#IP zM9J4OG39I)2)7;|emd^tYc+FW?2g=BkF?d_XRg;wU^;{D?qZkqHt5pqVDHW@BrotK zE7DT$kY|N@^w#(5?%w8-how8bs2t!f8*>*}NO%F?FRw~Tl|v}P{_1r=35tg!^l|cY z)BR&8sVr(}Q^Ik3JID7(7u&l$MKRY>N3puG-!bleTsw`x`*LV5fvG8bSour;`qj#+}osHc0X9BU5X&XKl^z1#VQ`@ zV`E11G6r|A^J=&vv++b-U>%yf$ATA*uBu|_a$v97*a)s7EoP*AF&j;?P7?11&)zl? z)KXu$QL8N}AoBR`Ola5IofS*yMr(EYpz2(gUl8~#TIqS>WUj5AS?-)p<>q-G6<rb(8QmLJ422nWYpacTY1sJt>(eB=wP)X2Uco z>wSYJ3)+T7^X;B-eDI{9-wMz6!i7Mc`v#^lJF=>(0ebrL3e&+w5yQB45yVykAM6G~ zAHB56^Q|&oe77vkquZ?oh6Vcxd^z__W8l1;6SLTGpD&zrhXG11MB_!=L;S=j>oDbk zdBR%+H{4wPD7Fu#U zP4}*)BF=6+uc=Do#axMK+B~H7k|MHQu3?oY|D2yfvXUo@jgh&bSY!dtdc=|chSdBm zia>QE57A}pG15=yD^ls2_OUCwv*wv3ZMql|*Bx z5_W_$q6oUHf{t@oB~d2@xi5Ue&^_h>b=7En^B{HMduefG)q+v+#d|gS!xk=~pHyy% zKM~qa$l4!Z_g(iH&44~7s}ddP-U92<3uX;N5)W9n8w%BBI}{@JHYxLmI+cfs$riRW z8Kn&#yt2s6Bj_e-#Y-U6AJq{>Ig}YMs(A2dK$mIHN-Ijh8)FztC^mK<>g!hQn&t}dRk zx9{Az%&S{>wjRr|)gdmnUV`q#y!Xu-hcm;1E~ZxM`g#hkrkwAS-JmME8Dv#|X&F{S zco7|U!H5yjf@ri|EjoL+jbF_kg;K_t=(;(Wn5d|rO!(Ky`<0$muAW!ogt?-!kh?{k+iacG!WYt5#%i64bEGTk{| zpW85F-lKCx6Pq?sLC^9H(yFxuwq}YozMFyP2@7t<~}c6M`2be1l*@IFo%J z<sj{IEANQgArs2s@6S6? z*u1o)Yj&~=smjsPdev#qfcqD__M;AM+-)f-spo9WUgLbmC|;dBQ7%=!P3oO^hTbaM zp6XcL3NcA-NUEycnW*SSYb^?=I~J=?FNU5-yvW@2Qq0p=oYpgNb4S0Ojyofobp1iz z$e{SGv|!q^c8cOjljY0!V|Ly)T(~#hpKURbUYU#b{z4d5ysS1s{ zKu(!T!wRkQRD(%6bTOSP1jTVUzK{86W_s9^*SPQPBSr*=mG`lgk}i0y;}?5mH!f0T zgJ0#9Q)kmDujOj5>b;H7EY-fx*8-{vF=e`)H+wr*557*OJh?G2&`345Kt_6VTFHrwR>O$mdm+KU((i@Q4#az%p1BotT;s=g;Xwe zsj8P*b&auatJ*pKPQ%Q1=wMWB6BTLd{EldA`1K z+NSY9+JY&u&9M5(0O4khbekp7!xoZ*yJPQa$sOL5Bbi^vpXhgc9WqsnqBu8FKCj<2 zxf2T8xN$If^wdJ&gF@hXTDoX33A8!xcyn`(Ob9PV;yAD7WE(QGcKrS@ojMmPGs`0G zTX}L26a1L*a42?FY}Hl;xwmQf0u_Ka;V7I%IM0?}$jQd6g0^#Tv~^N(xJC(D*j3M( z19PqUG|7-y*S|$8`@MPNc|_gVQ8$5b!86Vo==j7C+tnL2Ur*gRMpz#sUsjX2K~n;= z4Ia%c)iy}EL%GJxyKKSaGNpL}-LFWdO_0p=9`3&o*c;xeFHjrGmao9PZAg6xzdDS4 zfB0zHi}+CHVwF5)ug=uRF|B8s8z_H{dV)Z_8~RLwCQi>sUwil^20{tX1@x{eLzCJg7=FyU0!Me(uG`dEo zlO0;>UI)g_W$36`$Edc)DzLMp%kJ| zY?g06&lhNU+W_iR3`yDs-@SL!O<;#utr5@Or$W2S&9CX|WnF6Dhe5_*_@Fa^>Xoki z_e>GZIkyvYmFBi{<+$y@loA=y{)&B(i(?0FH-q#Ddcy>Zo)}q1^=WEsT*u!vlqt&f zh0KbS(AtkTJ`R~D5gfbXZ+}g9l$YSTjpU(CrU(oD=X23lq>cMim5`5HQ`ln8m&cTb zXXU)JfeTpjGh$Kryo4SeJs=lsFR){blz2DB=n1!?O2@-_Wzwkt-o1LE*+Ag7KE9dE z`j@u?{o_gulerq&;~}p~T91k1{(73=^4h8;aYwZw#DFHEPQ;4Ou_FFr@QXZp&soif zGWE#_E6yr7oh!G75uY0Q?6K?`Z@lA>dEfa~nL-1N4XSOSt@l^XAB7Y(^@K=DpkP-v zb=00;@@=~2s?jPF#x{l3`25DuA)a@$U(NdQMS?R`v9deo-?kC5JTj!N-I$53ojJ2B zL>n;XDE!2|j|ls9@F!7~R3ELg?odfn*RU+f+s|THNsZ4jyYk)i^$2MB*vlmO_~vml zdLTKG!AeGexz<^pA{*8ozd9aVYGfwnxXMhEz9I=HlE7j0k-6eD;UVqzl%zBBVqvUD zR@Ue0&tdE>77s${0yT-&IV3A-To2bX9h*p()d^ZZw?$eF592C%+uGo-u@qUK;hLRO zuC(dMz300NvytFQMMQ&+&mVgd<^7rA`3h0_bLHaS;FbTv{Lxpv_5<(-DkShDQy?bk z4K(08Al*ThNEZTlqRzA*?wiC5Xf% zEr44}ki6a&F1)C(S0}lF0L&zD78%WJ@+_we-Xh*kE=~Z3Cdk{#(b-MJTb%Q&hzRh0 zN(OU+zOuMGh;!pYgl!zt( zt@>?1;5TtjTX%OC5ir=x%Ztwo#)rn(fT0Kk0u12?^Yilp9K3Em&h8f8yv}Z{fWEI2 zvD5z{=IqAzbxwRhDJ0lV9}MM#fd5wXcY+MK&I)v@*uwJk+9?*6@1p=WQvLHVzz4uM zFkpGWn+O02Ywcl$#E5e$Xj}s+*rMIszX4`~5PX7yd=O6X_jUajb$~7ZSskze-={4G z@QA1aaF-|_S)d0`f*%5y0Lsq`L1;r^A~1vqRM1ci{2LRnPk@xn*RH+)BJ~r~Pf}=% zHn4FLHW)Mt1@b)Y@dNAy<>Tk)6Zod=tJrrgG4QD+e_HDQxOfW}Rn`Bzd?%+&w8 zkwsg1I04{YO0wdd9v*hqB5*4RKinE($!mc^!g!%jlrS%Vcn0C+Mv`CoV67g>4-d4=>}{C6qty$l?V!r0q{BjpLcNqu*1IIiUtN8f>S~a z_|V!Beo(KXjb_!99I`>?K5yAMv|gAaDrm_dSOQpF)cNDhq`O3;(VI3KM|+ zVL!Mq&=3BrEI&k;|92V$F7W64grR@Tj~{T2pY*z8EC5tN41o6y0&Cg%A_0E}0kG$2 z0KWXR@*f0Naz>#+r{_=;DCUp_8HvfuKx7cW;eyFQWrgLWh2>b}aIdyrW{{u_^8?*ob literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_stat.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_stat.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a9951f7be656a982be152708cccde81c053d381 GIT binary patch literal 32753 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_time.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_entry_time.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e65156039ed9fc211fe477d75f63839bd936dfbb GIT binary patch literal 22970 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cf55fad1fffdef9826f6a0f4aa121d7b32dfd2d2 GIT binary patch literal 32422 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 K`1t(Wm(f4fo0i4^ literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_data.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_data.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b4f510cefb692bf75c6d0f188b402b168e436b53 GIT binary patch literal 25866 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 CwK7%! literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_extract.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_extract.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8dd2740eefbc798fec406b708229fe42cf9493da GIT binary patch literal 28166 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 JxUMSm{{R!a%N76t literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_filter.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_filter.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89baee52422ec9340b09e1fe3487009cd97d1937 GIT binary patch literal 25802 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 TwdsMU43SviM@uveG(rCdB#f|% literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_format.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_format.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e210ec7406f2aef502ffe48c3b8bce8e1f9774e4 GIT binary patch literal 26771 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 Be;5D& literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_free.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_free.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cef2d8493292e356b20a5cdb10979bfb061cf830 GIT binary patch literal 22324 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 C6p_LJ literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_header.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_header.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..10ccaa12c4e3092c3cf04ba2edd2b142a978a515 GIT binary patch literal 22191 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_open.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_open.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..869c3545a0b9faf860584bae40307a2f21a25e36 GIT binary patch literal 33480 zcmcG!1yr5MvM7vukl?}H*|;XSdvN!SySuvw2=4A~fgnMG6D+v91qiO;0h!EX=A3ii z`S1GQ+Uwix-PK*yRn=8RCMP69$4JitN7j1~odZWkCT`_qZJ_61YHh_uXrt#~0x-5G zq?4l~q%&0D7ZH|!Oa-ki9~(^dO)X3vT%~|cK#Mnz6A;qb{?SiHR*qjuLHMz!0KcN3 z7$Kd#kg&42pzs?TLnCK9QwQKFF8ek3tvWnhz2N9#k)~tF6j71-&6LF%6i#NQ_ zaWz>55$Rji8hPW4<1GN8AhaQS&aH_AbHi}OlC?)w;uUCqrqAWV(L$2)dt;ToyV$`&(0=!QZF=mW@q3R0i~FsWL!cFc7c;KR1D0H(Zfe)|1msR^ zp^lVx_Mk}y;*Uf5Y>BlKKwDpaPHwYRjf zx^!G?xK1^;=G8K_?$_A<{?rTVWy5uJ-t?(r^LzvX&bx)!jZ(~LM#Pjk8{qPD)Z}l; zQe)MZ%12K;hF&k1uE!_hv&82j_`8$WZtR<{pRDybgsJyjzdyd*mE~r$&q+^5 z)9q7#Ww*rKZOdTk(V^*TOEU^w&kw)X!YtirW?VB_avmbmMbx9)rhYwtn4YZeAIwRS zvSq772@X4XNgz-*G=J)QBF45`Ig1mDZM(A=b=$JCC z=@ZZnfflQORo0_YkZ~lwZR}oq{doswiw^CCcs>ZSq+3b!+g_1uiNbQj?vZYr@WX>Q30=&1}w>7(Xyp9Tp#=kw@+`Z78Vs zx$1_xQP871EszR`;Zi!hnE2j|5)2zwrV}ObLu$&I*l6&Vc5Dsa@&;l)Jcuas{zIBw`dbGzms?AelWsy8SEm zHc+BLQpjd956{)&F}YQPxj(kD5J(SvnXd< zEmx2YzKnI`v6|%HI#TjbcM#5v(_Z`8znH17PD0`g4q8`OZxaYg`O)W{98g~r-*OtoCy7k)l zl`mkAh|xJE*q;A}6L@dlgrhPmEjyvPLG>OcaXV&9`C+g_PLR z-DT1|s2X26ZdnEwE>0&|Yz;|33HvG7FOlCRyw0FXkkNYJe1i6nXqYf-ffMZfoqN$M z3(B3LxN6qct(@)G76SCH+f$7&rsHcR(dig(#iNV(D5>ym#C2I=m5SAJ9cFENAoXV# zc9`Jc1i0kTvg`25Fxc_x_@}7l{d(88NC>Q7m&i2 z-GB};pe{{HsDw{DxYjZ(+}}$)<8!W7NXmh1+!)BxJC&jDZMm@V%TY zdJ!)Ty(bW~W&6sDWkSj-3fL83+0{$`)f1OG2dif9^8p(i(4Mk#*eNyxKX4fv;%dsG3q1|Gk_@vR`&>fB>6qyHDVkdG`*T6%w%1b(saUps8D(0)7^uLDt9g3OT^?n}qIO$du$gE^gwh;m% zjgwYVAk5BRj^hp#my4dHY^RNbzlQDzF|Kz-TwK;~#-#R>JW-#y4AF{hL{K0fs=2l$ zOjxfszbdqh@8@~JiVJ1;p2(eh@$LBKWj)VsspJyICZ_a`?#(!R({zwe+e;`rv%Vu# zF%UDHOY=|*b{tQ{LpIBsU2o{o#n16Q-H_~-tS=Q3^{i%ZtVL8zX?!9;rqhBCchI}1 zKf57TXCELicJ?9LoFzwF`coT=Onmxse99iBHJt;rGWtBTXi}Y2clT6CA0f4V4GE%b_iA0aQP6)F zxZFq`?oqKexYMm|VL-Bf3IDP%mYiz#05BCn&P14682u5KGI3j|N2@ZzmI4n=SDbJzHpKl#Jbh2{+~bPt}m`)AH4ypnuXhFCq67Z00EqFQYpUY^PAOj7GN=OGZ9SVT^P0 zw&!VzzB9kKK2cOg=f6xEG^=i9PflN8Oa&It@*F~m5A0)J(ks166eQPJ*lw3n5R=Fh zDAj*Q%NPkfkkK-fEWDZj21;zBG1aIv^{Kst`~jH3Cm=PrGSJNoiUY0#irnmGOAD=F zpu?A`W4|*a-mtd=?D-;S{1P%!%iN$}P#F#ADGCQUzxQBn<{^SJfEwi#fs*jH$T<-0 zDkZ*k77JlkdEn>_VtOn&_<>{O^?2QtsmRG~+3<;W{Z%Mq!D#OQLtb{JDK>V88*O&Z zeu3On@D`D|npAFIUO96KWlOTsi-lrOYHo#Gb1NplUKHFFpG}H%I^48iV|`GC5e3XU zJupQO5ve)Av4sI~ydrZKEy^gN!%Ll_+3>Fz7JGQ0mm%E0EUM2&t zzKe84^W&OW=kiX0nd#K%cDGPQ)fF^w7V|$44nmLl#^6Uic;p!Uw#l{hNAXF<0y~?nE$9^lH7IO$^`$9quFm-OBnUS@ zhOWlK8VP8p#hwSlPJk4pWRihjDIOMx%R3}X_{2#*=^$YP@oX-?j&CP%jZ$elG>azK zbsA0WmB^+=8Qb=*QzeUX*a5Lsk{r9krWW?~zEKM=%I&(5Ej%Y1LC6?Z2dar+=wFr3 z8Iy@Y`<#+bSK#lpm6dhf#`O=NTG+6uagOfIYkareQPpO~ zr9^m@IL8X|KJ;?aq^Z|RifBC+gpn%A{~{I!!7;yiWNdWSlJHdj$YZx+TzZg00=F}D zkw8(~tIx3|$jGcl3>;GcEdwQG0>i$4elWy3QE8wmuN*~|nH3ErO5W}8dr<;0S<=Ob_tzFU=5+qFKkXTTg+F-J+d z;o}KaZfkNqKRFNj*wpsn`m+evuwIxg)Q-(lZ92Lm!u4q@N8K z>pK=S^NAR}xgW78(#f8AwP4-KC1jQI?6t^ImoN^FSk9fBB#^jL%+6kb$zXNU*QV0c zwrQY3>z@ifEWXEM!|EQjg!(jlO*9ojK--OMf5Ljge-AA6ziEQtlewFwz2iKBckNWy$+ohOvJ$plomw^LVSC#LKJ`cW1Z z5l^nM4^)-{XfalJz9W%~r~9#;MK-)kk{rA3jTFZHxt}Q5sZY>Gw#`=pe8p@hWFk?D zH?Gjs^&AQ`$e8;*#l$Ct^u;tnRvS8P&@yv=g;m9Gm;)u!@RyY2w6{ZaW@au^359j+--R_4Ce;19KC48Nn=KL{J?!pnNXag6qp4D4GF( zYkQu0gt3&qn9X7V-WOte09FR_wY=UnbHsoX5h;przi4phRhCjV9w`=-c4iN z(|PHMI}SeJe+-ew8;KsYe$Y|g485Vg}@ynj%Z0zAB`Mcn)&zh1pxH>oD<8=a!;viF+OrU0Pj0;M!1X&V676}vfqE&# z0421jbYI(v_jO`Ehc>{^QdnHZ)5J+$5PFPl*0s&0HTb(F_->9>()ID&FGUM8hIi;N zIR|i$+}mIJoG*gfxK~E^@N{<=r&Zd#2HQ3Ck&EV0Ws-j&WQ@t`ti#(?eQZ99e*g4M3XJ=GwhF;p0+4TBR%cY-vxD(^ zQ{3IDa$sgp_F|-2*f**x7r(;touGcGC1F9;2e&Nb7JJ!c`Q{pd_#tCUZ!TG$*N1-_ z3pm9FLj;q+abbOd^nMRrEOn95H;oGzsS?@sF72pByhn5_AiHp(t+j$y90aYE)*oh9u(%mi89nb4JpBmh#PmrZLm>SO}LwjB58* zewkz~1V_1nF9{2uF`{THlBgS~0ABu=L5+t~e@>YFOoFmKP7vsEq$F>6ko{aja|d!4 zK3L*`yOp`T_m*c|t>^PZ-II_bZ?L+1s>6*8Z&W~hazkbVjoyw^)81XL@ApJospfeX zp4qx5Qwd4$G&K?X!8*ZKOZtii(PV3#+Sz|MzB(mq5mLJ2hc8s={-!pzPq+HarSDl`Ob+Y?7`NAuWCgX zzp^8d^WN(Rs8+rt-8uM8(_kDm-O0;)qSN#tGx#tPz6Nr@8Pit0-j~bK8TfJvDOgrz zoyGke`J%Z#xP0>~>UhKAfzt1-^dgG70y(3Lg*5d7(CM9HLPoRlB2;l1JhF}xa}*J&Du+kmK*{B2VBo1CeZiGx@z0v$S7@a4&fkr>HB%7+?x znpD4D$}N0hgMp!-4ir6%F%boH$7AI5@#8{zCubZ75cUCee|O)t?rh=?J%!iK)|UbY z*m>Qd4Dh*D3bI4w)gnYu5av_7T0AnX3qWK-iBm4J^#`zpf_^B=P4F^`Su5b;$JDoT z$VO6v1aUF-ADZMTQXMKW8oI+HV`=iuQ=<$bSbkV9&X4tgjIPh*zMV`sfUzW_;p`w@ z#i@=hqx=dI;bz>iG9{pJREVlo=&Ej&AIG%8IgcsqE`O{_5-UMMvjFtaFrFs0a$NJnh?;(-gf7IN2SYcKKRYYm0BXP&k< zR^E%A1NQlNqQ#FKGVCrx9HggTVPz>P)w*Q|j3pZ>i4yM)HAPq4nD@A(kXei}T5S$) z+vvVpyz%U{2Z@iodQlU~XCXLFtx7Y* z-cG=MjBRxUmY26c7D_!x;X*GU*HuBJQ5PNOVs|d}F1Tk!glpc;!?Cb-HbfZ9Dz%xt z_5+zpbZ0+FXyjc=3V|Zo1VTW?)Ipvq==RDhl)lnzY6P;&WjJy)zeu6NOGn2%WifRR zLZVtyLwrbnlO6{EcLx99IRs0Exm#hfrjeYjmc@%k=z3UPd5HKQ1Q4V~h#y0J@=)V4 zumEf89$dn4rPtD)3Dt2pHZ+`*kvvFq{g%eCt$VlSHMo*%wVNxIermL}#MjCNyg?@e z%Mnd7dI1^O&axe!ENxeg><#iqHPl++jx{|#aJ|l5tn6i)$SO)T@S*ZbsOtFW&0x4& z1B!1lKvN@iIKdxREsb*aohcehdIQ#`ggC$xSYNAK8hGOp%9)k-=*x@@5EnI1K z5s#t!^<5Dea-8CGi84j^ys@aVuHWO(dl z2efh^WPV~;kJUhXYezc+p#38+le4onPyjk;03ID!gaAdLi^JnM5$ng!jL*IxxJSni zK=85rINqM{$zde_RQ1cm^~3_7Kzy9(|1mgBPdk5J`!8^wEo{HT!}Oa+>;E-8Pu9JE z!1F95euwAjz<(akTY!)XydZqV@wTfZOl zpA-EtkD#7|o`tpXuL=LatTfO;&+xH@koo77zhUY(`6bT|_fvGqGqS=lKI0T1&&UkN z_&m#FmJyDT@o9Gec}}=zi{)SQJfqLPgM9g_$fF_`44}79xfRKQKqPQH*>UJ6^y~;ZSpiadf8-gNm;frKh7Kn78iZ^N3~&rj|9^h}bMCjEa8LQadjGxj zN6X{&6SjKvxSCoSKQ3v-Z)I=#XIa5f-{I-fKf%lR7fyb=gn#Z^O-)i!QIbZ{)Dmb< zCvR=3XZ6p$Khy8eTl>$gGc*0Rbyk*NTYsd`Cm?_SF*7q0K7CJhPpwb+=U#BEk6Zoy z`&s%mmWiE%@ag-b{CJ@3kCep5#{T?0=O0OsmGy~gpGv>hV0*0P;NX0&d#s21+2d*4 zQ|_ttsrS>z$?|l$o^rp|e1_n0C6>pQC&+$JpXUDs?JwA#%1?Rr$M27}KX>)ipZO7v zr}kgtp4R%6f13NxbsyLK*B>LpGc7!U{c{sfRQ1o_(=?CYZ!|&3{PVv42U2)${hcBI zNjp!J@n_+mge7EZWCVN^5sxxKEZ81lc#42~4BTU8 zh6C{18$3Os9%~=pLwYu1z$dx)v-q^cQ`^%}IKWTw#&2b8@%ZwB11LBEEtLs59~=0c zjGuMLC(4BbNb9-$UNW_}f7JMXt5N-91(v79pA^!^R~jWi51Iz#L!! zumo5EtN}IvJAggF0pMt52(+^|u(ksNoB+-MH>&4NKSc#T>Sg~_<$t5GpAmn*2mC!k z{=2p*_$xw?k%NdMTJYecHfOHnJTl2Pta_bjS|Ag9g|a`G~>i**p*b) z1$cQOeYG(@q*+9u@!C2u$oem(Ixtn!qNP3Lz|rX{=Hn?#g?m3)P3Q@4mT})2ZTHT2 zi3j9ybKe?lZ$zgq-!C2=-QIun!u8wdx8Zn`poG&L&dFDSx??-3!Nl;KVNc?(Vyws|>%bxSq^AQl3f%4fQQd6-~v1#HJo=dzp$l z!qT&r(u%N$Wo!ukApkW!6i{MjBLw%>5yn1eIf1L!gp!ZkbGJW|H zxd9;E6)!F6uzKWJ)@VGlei4bar>mxS_?toea`V#H%45WOl9Y-HL(bo}V+s;fZo_p6 zIB_|VX>$mAYCpWE(x6=MT>t~nrOme4l@^^jJd>z8b#2kUj>@Y;OYr9db1Q z8q-cuBc=lJJU|Ii!r} zN=N!VDpDyp(tXAj98@bbL99a`2eOvsVjFpbl53fimU|U{m%Ll~)Tn0RY`(F?Tz(1| z+xz=j(b8qxwfZgyg@o5}ARlj5T^_)=FqAuJv-z{jW2w+LbL6}}i0HAH)RChsD%rHj zdJSS4MPBf7XnYU%V6LsTY+U{k?Jk=fC^a`Ld1aH2>N@Yx-}Yk_dyHEHo{J_qY9MNEd0M-Y`>k`%-j$VqJY6A^ zzWuT`rsq~ppZNYX2I7^Td>jK|$7bsLVWtJ$Kp5NHDjwXrIz5NFjUd2yrp~wNhKrC9 zJjNZ>H;zKt5G+AK#FwLn$vsKD6z=hULxJI59GtW4n!5iFFI+i(oZ_^?$9^0(i&E zkLeA;`ccRZuVfYi(^X|*pxJUVF1KlKdt{!u!P0xul8Q>DYWE_uaslV7l^=p!W06zgd$Otna|%t7q3aYo zl1NqtR2#MAdgy{QU0$gt7RPQH%ax4Anf3-R<;mXCqNh7HZx@^=0s!ZerOipZJR*3W zO|Rnu-kiR450Xj!4wHViYY6Tn{ds7hJCW3rwW6?nrvfnK$_RR@tKDJGl9=5>G8^D$ z8HyI5)xkE4jEseW(Knjt-&v(}gv1LhXpMS*+hK(^@02P>$&;=x)jiyfj~swOv|6is z+Ar@GM`eC zdOf%x;FZZ0^iZYdW5KmsZ9Yya>aCD>}eexV+LL9Y>NlpENg1~tUta-P-*-(Y1em@Yv| z9}z=d#jCq~Eq%^B(8(ILaC-naKy{+*N0yLghYYvTkw1u#!BK&!M%=1)8o)+#PyaZ6 z-;cS?bx~{;mcql+jjv1P-=J2hU|NF2bS?chQa=GMN(Rw5c8ZgE>M$F{@P(7)4u3Ef zUUg7s|87jLB6kOe-UyX*P>douc(Lbf5@}Zve?zzr?ES|RtpbI)_*&j?_rN2ITqb*@$MsG zZ-u;&-f%Rb1V>y$T%*?dM{@R=B_we$OMH5z_^06-8R1P}&@0K@>|04abpKn5TSkORmA6ab0< zC4e$O1)%na=3`)OVQmF4u(q_+0~kK)K|k#jkLu8qmBQ5NQ8BUr7(ePpCayLnK&wX; z$?P{J$=V9|s3_Sy*}|Vq7|*$9`vt(}@$qVH2(bOrtnsflj%N+a9%yO$69#)5Jp@BcQuUpNx_x>%V6?c{zGg1@6|9iW@e_})i4)V zMTP05i%?&Cneuw{2y%T?Zq<3NdG+4?5Cvi3Eq=(iTds&iMBw6tv*IvBq(pq3ufI@+ zppF=5)FUd*OMEl2cCWOXcf8C_z0_DnbUX44ZfSEaxBf&BQ(GIneR;6$>J=>9Bu%VJ zI~DJ9wXri4=vCYgt)ThP{>7y_X*MotdR9YjfMAW$+Bt|f5JX`{H%w#rVD|QPQvJlr zXeq-sYiDGSdNuRRja8P;vHR&ZU?wdkArXZDCy~{7Ha4GNBy=G4bgduvXlLkZCZ6+X zh1V`8PJSXbSE0tKmqHY1Jd&*H9Hrx6;WYj!;^A(#-RSlqHIpzT5=Vh8KgdevRAxE0 znw8ny{UR!D!M~F-^P^ykP_VP;QRw%`$kXskSr{<{DL4s4ZL7>$H|d_1qg{+0O!_d@ z8pW0aa6gy08NrXjS1(IL8$(;WH9MnSf{!V-P(XzUAGJ53kFpS`MBU`X@iS7iq@6I< z`Y0$e7DO1R8lhy}Z2DBy=`;Kud>&FBVh5xNs65@G-Sqm9)v2oDLxgs)7^}iVLVnbM`e!rQOr= z++0T%K12DadNOxu{oS@`2CtNC>JMWX5Q-#&jXR*o48nHAk@41-*Pj-@NN*?D?Ymek zxh+{~ca=eoGC0ygap?7-Y`vf`r|tX1sT-5nyD03og=$3~iWn{Foa3B#z4|HxIf%39 zSkpZGtDIgPY|x72;iwFLvb8jGJ~%9rVF;XmT^(}5+jYpQG;pdJ1k=d_p7&HxGC}rH z=bJER_g;h9ddNo$TkUNm$JOFjIb^#gR24Sj3HMB zX@>{yYi=nK>%^(}*BPmikU8RM%dB2cs&7GHyCwP`XRV8GSDd6}jh$Ogu{c1XgzrP? z`lU^$qG^IHSvSvF>$Yoy)ZH(~)J83Lh3kByxx}!7+P3fDf)p3^=T7?r%L-btR0?T5Us^6Xkoy7__2 zzi0D;8WkNkb;IxzPVNEYL-i#mrIHw;c_|z}c?_obrv4emz-o@OUQn65 z5+v>Gl_E;>=|mqp-LWymNuoR%6KYb~F&rCmxRo5~_zUnreQ}h}+p+%Y1%N7(qX~u( zzoX7Hnq}6h4Ej~Q2r~bn@o3Hy2V{yY`pi`2ER*x*9uAz=LIqv8N{8z_iCh- zA&ork%oSdk z*EP6=U|IcdX_SxP#b;^mkw=5`lKAL@H1!HtYxfAc?oilpjem4=jwV^~1W;V4`plTn zr(EpTWCAkGUo%qjxp+N%yrUDYgBhSM;wv4`!_G?1q)Hy~M0M*1O%{f<6L!+}V}T|0 ztvk^a)i)n;JjQ-Ok@?|t_-jJ|-d!<5H{cMo*Ds87i2I&M>2A zE#1Uu)3Q*S2hp;wG&}6G{Y)S=yo5`A6)L}fUu!`2!?h_5T@|Lx$BJQF6eh-Z9HLZ_ zhe;}#`C(HmnIY4^QL29`jI{JPVOz#xR@Y=|%;w_3U{Hhdo2cEa8*3X99->(*zkGJ9 zU>6!k;*GinRdvN@`0pF_@)WfnN7m1jn)aror1Ef%nPpHs7PUl5;J@}zXMx$Z4kali z0EZyX)Z15ve|!sWgT>U8+8HPxfDr!}(mfedZrhrxcIQ#oEs`=Id3Gg~L4=|Eb@D?| zv6&gIo!grxr|(n6Ls4%Q!Gttr%U@3WlP|q%D9DB{hn3vFQqW8FNJ<_bX%56z_zYpY zz5HFG%*7Ov^D#W_?Cy1#MMpRayB2Ck zoAIQ*F$W_|OL|#*bmwWVMK8k479o4QMETr2ON8I{TZSMJqT4w56gKGdHQ05@-NX3A zWp+JFQ&jm&rA@ma6fhT~v;D2#01{UBanHT2{GYm8b6OJ6JMXK1aFa!(6t z&jJ$fnN=$x3Ye1S^OdL*zsm{AiW*W{P;*fN-HMf; zNeSF=WccqjTL-dO(AEg@`O5*+V_1At46_GsY`8uST7GzIX2z-u9qw8^^x|Vg(w<@h zjW0}yQgTgQKBa#Pm{DjD2nZW~QGHTW>M=2jeo0{;wIdWZ*;a)7*h{n#PfTUB_vQoq zoJf*vBI(#Sz!+=WiF>)*qJGQP9m#;V92@ytua&hyM z_SHDbjqBu9$B3UL^NJUDGK3vX9MqTtR;MRKAxDb(0iIh19v!Med5Rr+3`j8xH;H(8 z>=yb4hWdv!u0Ux8VhaUjee0@u2@OZA8bN*LuW;1xa~Jm!OIyS*%O#>>X;8yl^*N?x z^7|s#6pG7pM2?Z$Zb(uTa>h%2W1&ytg<(@*xf+=PItGilz8{vWS39eDZ6|Li#Z!ns z`XtKlWXQhXL&!oHy*KLN|KvjUo+b7eeIu$<{Fv@)?uO#j=_nF@coX`=Io=Vzl~oM9 z`PDb^`uPr{SJhq46>vOq^Bmdpo}k2y<)FSL1?AHDyUC)Zh2PvB&qI9w_kaC;lS6$v&*otP(%H`)Bs zHge0Fg*n=fY`u4pM$E*>>O*v}eot)wR9jWRFc~Cz3hd&Lvq7GrE%*8AkI1NuCE z+G!tSKL)pd-{jwO9A>U(C#8u3yZJ$)^KJJ;LfiOg{0>OmLI05qniaSr*?Lco z?DWNi4)C(MIcN9=dwBYqef};XKO(KM=R$pU2$#1 zSM2SDFFp8rn_u{5e?082)w6^Lb;G`rXxxIJVG_btQ?s>&KJn}DvdQ9VpfjXg#rCma zn7i8_TX$IQ=%2Iq@xnJ=vIvGwRrBsb^!Vx+uHA#-(LXk)VIEhgcuF%-enOoFEGgY@ zCV6#v1yP76hM7k|8S%9uTZPOkl81y9XM@RF1=_Gyp%j4$zDcy}%ZlQjYfABMaG{&3 ztf*cajo(_qmQ}V|_Wap`;QO%if$a#*@Ovru#2^BN$P{Wz5*L_}c%(@ktD`nB9!OEL zR#UoQC|(QgkYah^&c&rP^0;DHH?76Xi`%yBkb(C*XKHt_oJ}B=tQ`S72F#_`7(?yL zlS4)?vFHn}@!o@z25BldVY9cs{+fiiBaG9EdCMZ=oj@q|WvKuCKv=j7=PWh$MY%=z zfyv?4${7T*AoODN)#j4_=iIKlrG^rxQTU2O?wV={TZs?8H&V<+5F=3)1vQ8I!6Ha* zeC@5}#ksRfkTSj)j_G;nA_L#m(quNlznbzrjJ`!~alY5vXd9{oR*hI3@e(m~Qlv=^ zYYAFL=4?o`k&M`Z;O5*btX~|3-E3g~uy;?gO>i`ZIQ+~`vpfRJQYt<7#S}~C9^cXF z{n4kPH@DZvVEJs_;>>X1C$6US@94*NtHme4fr0P*z6;S7?+Ngd(aXiA&zaNKnH*m# zO^#(xm3S@mvUOXbWHCsrm&aTef6w9=_!`ZXJcd8DLrL4Agp<0xB7|c%sKE6WjdoMu zOHgfLhpcW^7DX%BO<&k&;U;Q2ffFmeYhL)$7;CxJ&W5#AU^fbU;TO5RkNDK1=*~@P zxJbtM_9=A0dz-nQzQAlwXoJAJ`(4|T>lt5N9PQh+qF(>8Xb~f~rEcl)1(`zz>fs7; zLM21KaPWm5RnaoH(hA(;JqqHwq;U(yzDD$kjAg#YYO=Jtva-qexr42#xw(XdvN^Pc z^t5*l#@yHrq)WTsuMH?&*(U5k*Q2e~5qCMcTg1rGUHg5DgcL>GofNyfF>>&2m*k1$YFRqua!OYVFu$dSoWeBjvs1DY&xYVm zS|BayFO5s8HU(~m)}Y?jjJ&u|VPS!7o;SDl34VM4##Em_AmT1aFt+0Z`B4wK1aQ-o z$RL$HaFT0k(GHo+gz7_tr{k!bMm+D}iUsx;_WQZ|N{apBGkCbQrOXm(HfS{E-6GsZ zW`$*@rb#R&5L9(3>>Z(B$cHxsLwizkK!2lpi!&LdubsS*1!kt6Ehm00z$jH6hZ02E z`)R_22w|;(<&)`XdGSdzRBxsj?AOA2G+(eRIW#f2(R~x@L^W~rT_i~bG%tPan($M$ zbhT}>m|@6OzwfvbIEtDFbg9VG{6V&B_*g%B3EgQ&fe89Ut~!=qzP3klYr|P62#3c` zbUKq;f-Di1@qBa9ZmEIR%w0_n-Fe8Txp9Us4hE$7$x_yRFIBR^GhEzn9_y{-HNywH zG*#u_^=?%30D8&jPU(ouurg;2$=qNWZqA)nj5LT5#1fF4epaH*r{yX|EG)XPgFW1u zpt8&oswoZ0sH&+}Nh_&Fpc(q+ zMpCt7QQ=ICNaXmE{U!KdmXk+_IfWjSef4^Fj~!THJR>wctaH-23&c&6msTYh(}7_K z{c_H?LOo2#GvFqz)21eQ>d7Y z#@`U?eWdL>=Nh`Xb5zacLxV2>DUGK<+ zV_W#-(eF!Sh|aKs0Bl{hM<=(f5D4U!Lz5=Ph&5;BgJ*fI6k1T$DywD_k5rtrx~Pl) z#`{Z9{fFyzK2G5F{+Q4m-)xL+;cWNsX%cu;n?}3hjHDci-b3h{bo{0XL>f{ zTgY4LdUbT2@-h9hT>&LiHBp7>589wZ4tMqrDreOXKo%JR18Z(I3jEqt*pEY>t2QE% z?w1HY4}LZN}<7R2+=uutU!0OfeIHH{>aE0Z@3)hK!TLFb00ht;}h*=iPK3Dg>+ zOkzI0friTHbZHylo5aqwvI;e&Bf64-;)GM1W)JSkZ|2mO5324lJ$@Y64U0byb9cjd zPQzg0;LCyacCNgnQ)|x~A!fcVb97V&l%{GQw^`5X-D(U|H3!_O<1R??H>zD`3=Y7fm)US~w|=^R+=)H4&B6`GUnVM^fd0nkf_(K0a}1yuZ;Gdsn;FKXzC&F#UBsO{pUWbQtCGnhJ2Jmw?^Bj} z8BY=L@{?T@(xi6oaq;(I-9@{_FjLuw?R*itBc_WR@#{=!)m2LrCvghL4`~PsK&tt7h#QwY?BSuWbQY~ zg=(F-ed(s*62@>;$fnDQs}R!tdR4U^n+I_WmZrdaA|6h?uR08l&T7ZKy%yx?Z6j0+ zpAX(sU7ETU#RQmVUtY@Iw1FVG$f_)R(-3mp$|3MFYNt`2RJ^sneHj1h1wXo+cBxVA z^st6L2w_4qw@(i=k|rD-e$?2(y?!v>9|L$QVviL*6 z4Hl18xHK`Ya(8T6lkb6s&TEU;b^h;H~z^pxhm2q|{{Ht^8ITG~03FG-sQKirBtw-n9qi>7lDfEbg`Il>pk(rT^ zf#o;<)>CZFU%@;akHtUzTmR9$#r{8gw^*J6g#L=xd5YF~iq(0F&-vvuas)X2%_H<2 z`udwk=(qU1|K20S$il?@yGJPAT}r_jt@j90{SYlVcR%mbxzk|xrMZ>ughkj|_!S>$ zPp=0EB(>!y42gM3oyJNHFH2YF*XmZq0>v;zKBz%p_9H46FNGP@lA5s%^x0UqoVT@V z-dpxxT%O!+Z`_^S{*d9>c1H{o5+mKOQ2#XdYn^g$CmI50Xiqc(*fOsYH zef||9Nd!Ni6lqB4$;j3nGBl31|3+z*A^FR|92x~D_buST9JBXor|>>}I18M(wpaDe zB5-gS6=*8-un-d4BO#ul8IOgisBfzGPKp+=ME?%>o>I644k)^j)9(FXy{A+CKoL#Y z=MY%aB;-h{kp@5^5_=UJWk}fa?oA&TDfVoL1;0EpS|}_tUrr3}25d9tJ=vOW_i3Ny zyT!LSxi`5`+1v>zASua$xi+711Z^T48@)fC%Fl}filERhBorbWK8t|UPHybO6yFE- z2m^(CkITAdxkD|qwC@<=-&Q!fjaQElj*2uYDsq^EOvzi1?|=}pt(MN5rd73NOkE`l zgRdYu<{Ej=uuR!)@8+A}^Ws?u1-Q8~cO3vg2U~Q1dlk z8U+7AeCFXRxJ@rb3X8Q9qY32gou<4IGXS^|U-RVq)kIdfbjj2hhn3?ku!q$)ggc7@ zc7ncYS;KKb)0(B;00xW<7R1g(JW5={sS_1@|1W9u$UJ`3!SiPM1H;OCBTJUaka?XJ z)nFu)(1;X)i(3`O{)jaTGRcqyxfoOodeppQQ{L29JI!)Bt=2UB$b5Y2rTgh19RH`a zua1jy>-MJ`l#rJ0oEczX=eTe8$lYB?yle9Iq!M(c<#OL z{eA9y=8xyuvvxjv&wke0-}PP0`^fubR&gYsmAjVuVJ(U6b5<_9mb!7Pyj0gwo`tmd zL@6r4^qZC)s>2TRM=pejrP4Sc@eLL5ym@iZ80E43nMHayWsCT0>yF#XgC+6=+kCdE zw+`6fvwZqs3#v4DnPiM%a};D`U1sW5CS)`jhmGq66{ZH3u;0LDhk)=IXE9^}^P2CK zNQkX%{0`Fqi82$z{j$Usc}6deIb1K&of`NTSqjF$EGKsR<*scW^1IcOsb1%JbbVzHF$z{M1pxU*nI^>~T zfjd-4z=$SJLIW%g5l4#c{d!ei-;zlQ+t^uH7yxlJ58sq%Ot_Kj^TA9l?(*h;*06Q% zcC1rQaBjJ%p7SR}(S~h!qhO+C#}n_qa^;%8*pK{SQ!I>#0g$eH`<`;zwee!ZuX$&6d^FLHg&L$4%-V3e?TGpI?m(3s@6J z2M-zUkEyxJp2FHChW>!x24`;`=?R^W{U`uYU7FV zajETeY}oCDbYC^=#gfdv+F(B%DH#kHvqG?ddx!2LZMa*$WmgDL123KF4ieTOv%TNj zuIF_-o3%B7u`TBQzLPMoxVT|g>u2PJgaK!G17yc;9G>vF>oa=J)ykhY(pDi|5TM_@ zTrgn=vZ=A4!!fpWbyrAhc>g6#>oS$?CG#aLX|}%W_!FiuG%b*-p`bh&_?$&w^xy-HeVlEv$w=n)h{@yi(T}$318s1} z;M3m_B3$4irZlVnzRCSSxBn-b+{}Z#ybHCF;9cS)wtN#gRm5ZC}mu-&wzk+c9 z{*OSb_t1`eV22tM%<%_+^&Yxm`2(o&JBan)o8;fXtWYq;FT3UsH2P1w=1=Zl|M{*7 z;sN}!Yiij*aTNH?!1`|M5#3Q3?35JKlKlkDE9Ih6w8^0GM3vwtw&-x87I8#yIB=9P z9jU>LCN8CY%28sE+tqC{Y9AE{7ANKxm6SEJC5eT3I!slRdOC>8yVYN=u-=wq`Rp~E z)wSI0V7|hU&-CJ-FXm!Qwn441Nf#N3K;`2wtLIjleBC{m+}_+e)G6X$d})R@Ap5ug z4VlbsQ4CpRE7eMiCyQh#^QBd+DL(DuL8ATi+%_2*@lu6xTRRuy`+6JH*%c1+GFIJf z+NiW;zOXoK21Zy7 z8H4qZLkFc9(AvVaLtxTk`J&dBBtaC-pjWLKYAgBk*q0~``2s>EPcExBx;E<4H(Z=N ztvv`cRCu$Wby1$4%AbNcGq>o-iij7f;Tz-|Nptp8SJ$^>b(7&+AG{hJp=fHo9`2$b z7#^7$9xW~&urw7RXR7CIZn@x3aBIWYkaKVqF(B&?mDSEukuc7c1ATj=X6%vE>QH3H zSmryxS*vtiEAPi?St$62Vp4v`#?O8U!Gi8^Ie zMmw^e@=0ej)Z9g&OcFqQL{>j@L+s=lXoE+X$_eVu0p8yyxvTcx5_-K#SG$^n;W zUp{3|!Zq6nG5I3I`{FVVA1T@;8Vn|wSOZKWr-}osrB69<9?!bY)nI}j)me-`(t2&1 zIXpdQP61ix;+SEDxW5O$N#@iyQC_1{^p!{`z-4m4kL+_&gcb`Iur6+#>~P^z%vZS& zVukl=?p8WuHo$OHEYA*$sfnggqmhap4y8(v`0-Iq7Vw0J)b>15laTTth0qG^MW*gX zUw^1u6iy73v3cc)QhY+GV`<}BjfgbOvVBu&+jylcV^XB9H5vy$u_nVtOXHtiuQWhF z&x|ub=@^0-NmVb)#9PU}_B_u?i^Yqzhc6pgQW7we($KQ1D%0|$tT4N^z`7^U#pF}r z8G(1$%8o6|(yaXKsu98x;b>O+!@Gb4 z_tKH~S1&cS#$#KJGDV)I3#4^8Tj*p;ins*#M)y93upTybe%*)TZ~4|vgq|_YK&5tD ztoTCT9(761BQ5DoeSpDEI-7HzqWAW#+fk~`o0RZ#WsnCHVax~s3G58<#oRnt;u`As7*eTpk4Jyc3)rq!V8dvcGqmr zEg8yp*-Tk%e<|7s03H}vXr5$(b0?We5Iw>+^G!2X15ZJUd)=@g`$v)09+ z$Ewhp&glS`D9~0YGyH1v)2_DcicYO@LBO-%V)$L^B^VP;g{_^pT%DHQaEo~S*Pfj6 z8RZ->wHr`PW1?$gh%;y$#V77j6fTxM7)gxMP<)!Aoy;L=iV6UloaE{!{c3L)h(tNE z-)`z&uS$vejGMxY3y%$p!{DlVtv^=jjoD2GIpOoBeQT8leWOPD*Ve-x1RBp(9micO zzj(O1V20y6M+uiMx=nn9_1e}-y}U!M86o^(30&Qa)Yu#GF =z*x<5^*`7){E2)X4v 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̔vnD)7-ar|BM7#wrwGyM#u7HMR935dFtC}N^kv7? zgCd_(H^j`WpEq&{4uZbmYl4hFfa5bHHLGVu6{AZ=g+lZ#R`y`_WG0&(|9wT%2&yO^ z(EirVLmPc~!01T4?rYFzWWnh|SKMLuvo!ed+OuJE`9Z-90cWDw7wysQyg&x}B=cK9%||3yORvUP zE*R?W_j#W_q3E-HK@8@{Z)6hbzzXY^lZ*f;r^BYtO%hhVnhI-7)L${fj14(^$gUo@ z5*p-1xA1badX`Gm04c{Q>Aj0?Q~V6tkJewCVnAE>`>V$fBCqqfp4`$UcnZCE$+eAt zw&mB5*xo5Stq>b&;50;u2;NTJKxwPy%$yKF3iTZYy+k-9%@k1+4T1^@oJ-lBZg|+p z-C?q@))$7&f0f^w#6&Z~Q{wo}n*y^0)z?gC(=&k27VHmPv)X1@R?;EzM%Tzg0N1XD z!E|8@D?4LS-DPizqPSm(Xsu5mr}PII`XFApQQH*qt1}-GIcsd$XvS#(bW*P;*tq4- zZIA=XZFrYgr}RyodM~X0{$?8_l`RA1pVv;(tv0D_u$4%N+v3g}0cz`E#7Dk6GD?D(lu<2ojWAhaVt^DNVQvI`OgZ zG3H0BK*crv09f>QSl0{)igIl=K64oL%YBTiG0=6&mElz&R#c%rNrtu_G#VBpiw>iFJC=V%_bXv56u1s z6zz+#`X}uD3*!C_d(6!2|A9T`f5tVL|Esv>-`=F-=HK4rsoKf2HmnaJugTCV z-;G;K&g+rsy~V&(>(JN4%F(g+{dT7KZw5WtD??F2*#hA?c7lf|+TY*jH0}38%g&rXyFntnupqK&boSXhclX!3t|#3dgEELJKq_Sh9mtVA|YuGWr41Zt9X+O^6Pnp`wlMK(^3 zVc!(XpdFReHm4tZAMi-u7x1#tEZXNXEuB<_N`GVQBR=eeI>~pn(qENKy)1Atjq(AC zG|z0V!$ChdYGex?cE6zZG^4cJT~>R}<)V5d>Y_y`Z@MYi3n2{0A?bGQRS3m$sM46v{mB)@ z!Ra?Fg5&Z6iY<$~VIYrqzUY*<46&;{H)IZ+o z=->V>&4e!|Dixv7j=j1duf-ZpyH$$M`j8@n^vv>&{EB*y`HwYSBJgc+s%K;~D9uao zgjd24a*nLqs5I>vzdVs+HO`a>LflQ4J(Vg;{E@K_fV_Gbi6P#Y2=?ok5Kn~?@QH62 z!21S(qSB(Ou7wyQ4JAAhu)+8jh+_^$f$YCHcJ06R!SG`CQyF0WPT2x~1nCY4R2^7X zdOi*wIDP7v+de++e-*P2nFxu-4nF3~w^p#{eq;kZAEYJ(Pu#m`#&uaQCrM;K#Jd4c zYpyI~qJRO#$C(DIOm?SmRl^#ULA#JcaL1HKVI#C!1|h_PTOyO`LLx4bUu9cXT0ghp z3V&9PqkRMNKoofkB49t#_L>lSy*H~0r2>G9r`R}AA~f;`bc z`p|x!Qsqd~1deH`P&lRZ)-Ky!Tv_Sr(mulY#;=?Z=9fo=7SfaVi-fDv;c_obz2g;i zxJm*~rK>C`s{)j`x^_BoXSbUO|z?R?OzxmGcPjQ@j&Y&t&YrHDZ~tI)p2uGE&EPl zKlhmpLn<(g_Lq#;v+0xujdJ;r*2H`bf+$Pk@eZ>whU#&v-pCfrJ;UlkN*t6)eFT%2 zNY}0O2u=}j&3Gonf(Q-Ka^A&zXP)W9FW}w-r+qTRv#?#}VU`X(A^sXE-hD(X1OnFy zUZuq-2wb57spbe-3y&8*#D_P3+-Ynu^OVU9LQC-w0=2ZZs+KIw_VJA&3bRr>naTX5 zPZ|h4Jm|BN4OFU~9OxegCX?iT&JLJu07uO<-*8Yuk6v7&V%AM?aY76^SOA~t*nR7XfPL7dH7b_UJ$+P-~^K|TR z)VvdF7={`Z;^4f1#WXXT3?G)3Ew+s=ws9x_EMkLjA-*bt3M(4a@`&wcZIMZw6wG5I zHf(EbvswlUIdjd7ACS&UbEC9OkIScjM&< z(<~!v8_Qfp0CEZt9BOB6pheq%2!S<=A%kv?^*dpF0@@7V3 z4?3b|*b9(kIkvaV(7>s*KJnX3Ma|U`EzY$_Tg}PGfa9~n#U}!`Rm++D1P=WHY6y^0 z=$2L~bA=hF+ESXXVSOdDVqRx(elvmrd$za9!&vzZ?AD^=gWQaE`IHs4uZi>~#WZpkw`vh8KL8O*zBY^Y=#!iyIg%y!`&t=;%e#I46933_Y zy{7qBNhS`v<}Zow_}(Jf!K;NC-@cOG(3^JL0;MP)&Kf&u=V~;`^rv!jO0#a3Ee|yD z!)>5AUk2b98)u?@8kYBtUJ1nM!iy=vF%vg`n)+6IUwQ&z@a<%Evj8`kXvlmX@2x-d zVdiYq?Gv|KJXN33oN?Rv1-sMK^9&t9^K)G!+g=0G{TiWvsHL0A<6j(O;hZ@{e)LCS zqJ+>&80IDGDxIW8fwEs1kR^l<&+3G@Y&f5u>Y;~vQW>&#o#VxUSPwK*3^g{|>Vdiu zpx@|KA$Cy!-3!DbRz-6d!0*48r%9_fwJ*hO0GYMsR7E`J#5>U9(B72uDn_F`CR>z- zq-V!_@E!{#uE@UVnd7i2w0xy9vZ4nVTj22^=}noz3aK zBXXc1qWxaqHDdjM zXFpTg+m-Xlq5H{_JvAD6>Gm-Gw29H~GIVXv{+mxfU&;p%^+d`(6bh{|^+<6SrGY(8 zt&_UkIVbr@(v<73-LzYZ_+puS>&ARARXFf6HWnGhbTK?d-m_HPCFRmWxU88rRYM0>AuqVFlg2d+of3qC?w1rlRgcGZGWg=yO^|fDpJrFNceL>vyRrG z2wLt)C}U3xI&a*k&cE%a1rN{B1jAkx*~TaQR-yDccM$lS{#% z0{NZ;HfLg#wTZ&Haq5KO>+a`t9}`W$5aQTF2)CI^Dns5O6m)ywkX+uDXCuu$(w%o+ z6T~5DL|zQgyj0BO=?CGB$i-1+b=70Gtcwf&NAtv(q)COJ*_>7E|+EXGRxd23(HTAaF5gKwq8G^;T7QgyT>lE9CwI z$Q9Jf3DTyk4hU`HlhIXqpN^pT_;uLb<#qyN?7JWf8Qj(=fDn@ZSL9FPT4wB)OMM2 zMSy*5>p%EvrZ(_9+H=3W=uP`*{14b~7MxuPS-_O?}usx(ki_e=50 zfQ3|_b48WNjBIF~6LHweyF;afr+Zp~qbP16c|B(r9^Q4FeS zKC>g*=|p&T1E`{H!yKCm=Q`hqR_K1_cs2;#}2xt4JImT^<-C1|u(hKI}z-m$`h#+tJ;zLssk zQ+R~-F*fnaoq41IZaZ-4NK_Dw+A`YaIt&1Dz^E=W^CQ4Fp?=)@0pc!lgH^Nc9iuIt z8)T!`9u7zgn$2j--fE!0Eucb1tl06lf zx~Zd|mm1b~qE6Aixe|k;wS=ECOyxa|DV~Q@JT3Eq2+!OIt%vuQJYT)YBwOj5)j%PG!^td~43xw6q`=A5=W4-pH*iOifw9fBj`#nE zx3_?by4xCuMY^R+1ZfZ$xgeu5ZA2ywCOC_r7<1 z|98!r`NiqI_c>?h8Apo!(S7dq>xLuNxKg`WEzGuKRTymr-PD^Nu~XfkgNn9Eks-6> zqm%l89fUs9BgiwTx1U1&E+oCL)YA-}Pvd|T3PHq}ZrNLcWX%We`<&M|$n}tutN*-1 z{ql8Yq5Erx`pdOO(Zw1FkkvH;0;GTjCc6Aq&V=gs+6HEJWfs)Y<#Jlm4gs52&X9$K7GLcPjc@cOGJ4AKv}w55xTk?>qK? z(4U7BKK>Cr4EOBAKlJCPO6dQ6e;Dsk|9ANOLg5eiFy5=4{%_#J_zM<)k!@L~GDqi3dHu=oo;5A5*o{rRgqptS<_Khy)drH7;cu9%f)hkNK9K%N!uq3?gKcMpruuPXnyh40({_l5td z!G~G>zb$hQh+k#?8rDBo{tp29<7ob=%mdl}s{B7J^A7|64H17V{;#3`fWRMZ^Xu9H z@3$#{w6Lg*io^>L{n(lSZ6CHSL7<(!t%F1l@(tqUrJ=f3NKWq3=3hrl~zh8f^ z?XR?-ZT(+=Tw}$!BS2^6Oc_ zLC^l4=eVEw^nXo?hspGJv?#b(=vkTn4)~wd5Hdfke1LyZ+e7M)+8$VnpXC7eDF5~F z_r3|57#adWOb&>v0WCue01#q7*1|3pd;>&x#W`d6ex{|}^e59&XEej(wH#PPG-kLw@v{8sOOkp8p1e|PzSr>A?~fXPqZH7aANAj-{TJVV zgSEfa_Fv%cH%93f>I78Ps9#{z;dCP=E&UeIWN;`}^m<8qoJQdLd-~&UOB) zJ@B_(>c8Cs8QB3g4p#S@ppmgXh|6UI04)r3?Tq2*ndkt9CICZo5Esn&J&%E&xjE3# z{@24pncsKK-{|(&s{0q0^+2!Ex)#7cF=PB7y@Waqh!3NoXJZB7k&TdrfkE^BL`={@ zo{Wre06shYd))-+ElAOzYb^@A?=XnCKuPya+^5|ag#(Cz*nbm!K1(BWkV*p%pkNQQ zP$FapmEvsIX@MS1%6AN?w(@o*?=`#!BVwBR7b!7468D{-PDc4m zR>g<#?q@hz4-I-J_|!W(o|eO=Dxl@&vXH5c*jyiRZB;66ed3(5j8V_Y{rtw_edg-> zY5yUcm;*7MF&o`#nyE$D1K26g(lTXX;eI^QBAY_C)2{;|Wes>Ov0-9~beOBG$#*<{K(lD$>=3 z+h)xde~pL!D&`{hf`WV?^)S0v;qgH7YeA{(yh)0IcwDK7Y>gtDN&Cl?K>n|C>5q{+ zD03Zzu_8!&#d-zELdY!m)pf)7S=xeWF>%7+uoVnxj)o|bGXz@`!p>OUk?X$ zsJl;z_V6vcD;|EHV(4R+nBO*}*>E{uc(dqL>59-&r>iERBD1^WYikR5CPi+goL8u9 zXfjPZzazR>&2a2&zqK!GRUxW-ARnC76FK6|QN2F7>Z({c-H^{!*vK1#T_^rZA*OV` z#E^9_fl^gI}&%UQ0b! z@uNhKh+dSo=vxLH$vy4%iL^tL@W6#yBfo(bdrKj$m@=wYq{_LbYuy2Xi|t3LUE+D1 z3Lh{`yCppmPLD9+S;ALb#Zhgjq-e@#OJrZ!_#D&vue4Q&yKc2ucmO}iadvRxG46exKX_^y>}v8{rtj;fJ3?qT7axmH+5dT)U7*DO(c4@ z?2rT#4^KL?;LcZlF^D>wpzV>73xC-DHcSmMQpv_u_a@dc`1AqI;`2!(8Tg|*oq{@& zcq|A@fg5`TWYdarmHUUF}ANqyoQX~^vOY$0xl@pGSniCJn zy6qc!11cAZv>o(pVDu_KaxJl!sjOUo+$_{gI@M?tw>=FANwU(3<<#TiM{aPm&vbWb zW(HirT=hm>alAx$eL()&MU079i?Ix)%4<#*OipTae_&Zk&3(A##MXVp0Q*SqNpA<+ z+`2RM3!XZJi{8L<`ek?D_XZ(v(raq)U-0PfN#?nh-qp!B%Er>k@P|rDQ@Z4ZrDP=z zezvf$zGgO!3gi#bS)A{C<9A};#((mf^Hhb#Re?DeYIi^O3yU?X*!jxGI!}nem(#Of zLR1bX!N|1V*0)?do>QqPC#J55Ev*NxV^E-v*KN7SYM>mIOPnnOJh<;#ow#i+C|elw zxzuHDTu-w_w~JP+2FYw)iLJqs>$+|o^=U&soxL?0Zyj*X7gg6yg=zTgxuVV9FA+ng zo=`HO`=lJT!{r-RJED^a=j4Hy)faJl9c1X)K-SUc>Fq%aqEGY#~ zgiZLP(fZ}+211OnLGGf(YZ_L6CgvKgNu2jQJ)YVjAJ>h~Y!HAxa7@A|G=G9)oguW9 z*O!!2o}JHR`Ne?W+~Cn$3koK!J%#+7i~v;*y)6*QH^c|lKTqL#mRuM>DM;b=Tvncz z3ax{aF=JWGx$}6&nJMFu@5VbG@S3SFt?_n8@U}JiD>mf}+Q%Zb=T<2)IB&#u+7`oJ zW{DJyyfu7&1Z9vcYMqGU%4AE1szUEe@Pc;CNQT+NrA$}EF{rl88f!Kr8TVB{GnIOZ z>R@ktQ&J#tZwK+afD`SkJsx+5rl1yl;p1{z0jBAI+gE#pAse5z4v-q2dd8RS!Eo{B z`H9TT=^tKoKNGI{+>ZCHvtuF&hx*CR;g#{%P$DQsF6ZKn=18I(f>jSUt3K9nXI$1| zDUytmu}{c25{f7Eo?d>dHpnJ~mX?u`<#|5Gr=BD2CY}Cx9HFn`z9n6U;s`*#-F#=2 z0~6$asiVKMJ02V80sSH}7p*8`uS;EwK$_5lO~b(0(aIx1V99Q;_6$)%6`xCTKZvl_ zzk0W>dCet={Nk|yDfsi

    The library automatically detects archives compressed with -[[gzip(1)|http://www.freebsd.org/cgi/man.cgi?query=gzip&sektion=1]], +[[compress(1)|http://www.freebsd.org/cgi/man.cgi?query=compress&sektion=1]], [[bzip2(1)|http://www.freebsd.org/cgi/man.cgi?query=bzip2&sektion=1]], -[[xz(1)|http://www.freebsd.org/cgi/man.cgi?query=xz&sektion=1]], +[[grzip(1)|http://www.freebsd.org/cgi/man.cgi?query=grzip&sektion=1]], +[[gzip(1)|http://www.freebsd.org/cgi/man.cgi?query=gzip&sektion=1]], +[[lrzip(1)|http://www.freebsd.org/cgi/man.cgi?query=lrzip&sektion=1]], +[[lz4(1)|http://www.freebsd.org/cgi/man.cgi?query=lz4&sektion=1]], [[lzip(1)|http://www.freebsd.org/cgi/man.cgi?query=lzip&sektion=1]], +[[lzop(1)|http://www.freebsd.org/cgi/man.cgi?query=lzop&sektion=1]], +[[xz(1)|http://www.freebsd.org/cgi/man.cgi?query=xz&sektion=1]], or -[[compress(1)|http://www.freebsd.org/cgi/man.cgi?query=compress&sektion=1]] -and decompresses them transparently. +[[zstd(1)|http://www.freebsd.org/cgi/man.cgi?query=zstd&sektion=1]] +and decompresses them transparently. Decompression of some formats +requires external decompressor utilities. It can similarly detect and decode archives processed with [[uuencode(1)|http://www.freebsd.org/cgi/man.cgi?query=uuencode&sektion=1]] or which have an @@ -79,19 +89,19 @@ archives,
  1. cpio archives,
  2. -Zip archive, +7-Zip archives, +
  3. +ar archives,
  4. two different variants of shar archives,
  5. ISO9660 CD images,
  6. -7-Zip archives, -
  7. -ar archives, -
  8. mtree file tree descriptions,
  9. -XAR archives. +XAR archives, +
  10. +Zip archive.
  11. Pax interchange format is an extension of the tar archive format that eliminates essentially all of the limitations of historic tar formats diff --git a/src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveChanges3.wiki b/src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveChanges3.wiki similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveChanges3.wiki rename to src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveChanges3.wiki diff --git a/src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveFormats5.wiki b/src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveFormats5.wiki similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveFormats5.wiki rename to src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveFormats5.wiki diff --git a/src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveInternals3.wiki b/src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveInternals3.wiki similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/wiki/ManPageLibarchiveInternals3.wiki rename to src/dependencies/libarchive-3.6.2/doc/wiki/ManPageLibarchiveInternals3.wiki diff --git a/src/dependencies/libarchive-3.5.2/doc/wiki/ManPageMtree5.wiki b/src/dependencies/libarchive-3.6.2/doc/wiki/ManPageMtree5.wiki similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/wiki/ManPageMtree5.wiki rename to src/dependencies/libarchive-3.6.2/doc/wiki/ManPageMtree5.wiki diff --git a/src/dependencies/libarchive-3.5.2/doc/wiki/ManPageTar5.wiki b/src/dependencies/libarchive-3.6.2/doc/wiki/ManPageTar5.wiki similarity index 100% rename from src/dependencies/libarchive-3.5.2/doc/wiki/ManPageTar5.wiki rename to src/dependencies/libarchive-3.6.2/doc/wiki/ManPageTar5.wiki diff --git a/src/dependencies/libarchive-3.5.2/examples/minitar/README b/src/dependencies/libarchive-3.6.2/examples/minitar/README similarity index 100% rename from src/dependencies/libarchive-3.5.2/examples/minitar/README rename to src/dependencies/libarchive-3.6.2/examples/minitar/README diff --git a/src/dependencies/libarchive-3.5.2/examples/minitar/minitar.c b/src/dependencies/libarchive-3.6.2/examples/minitar/minitar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/examples/minitar/minitar.c rename to src/dependencies/libarchive-3.6.2/examples/minitar/minitar.c diff --git a/src/dependencies/libarchive-3.5.2/examples/tarfilter.c b/src/dependencies/libarchive-3.6.2/examples/tarfilter.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/examples/tarfilter.c rename to src/dependencies/libarchive-3.6.2/examples/tarfilter.c diff --git a/src/dependencies/libarchive-3.5.2/examples/untar.c b/src/dependencies/libarchive-3.6.2/examples/untar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/examples/untar.c rename to src/dependencies/libarchive-3.6.2/examples/untar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/libarchive/CMakeLists.txt similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/libarchive/CMakeLists.txt index 87901c5..ff7ade0 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/CMakeLists.txt +++ b/src/dependencies/libarchive-3.6.2/libarchive/CMakeLists.txt @@ -5,6 +5,10 @@ # ############################################ +if (ANDROID) + include_directories(${PROJECT_SOURCE_DIR}/contrib/android/include) +endif() + # Public headers SET(include_HEADERS archive.h @@ -78,6 +82,7 @@ SET(libarchive_SOURCES archive_read_set_format.c archive_read_set_options.c archive_read_support_filter_all.c + archive_read_support_filter_by_code.c archive_read_support_filter_bzip2.c archive_read_support_filter_compress.c archive_read_support_filter_gzip.c @@ -238,10 +243,10 @@ ELSEIF(ARCHIVE_ACL_SUNOS) ENDIF() # Libarchive is a shared library -#ADD_LIBRARY(archive SHARED ${libarchive_SOURCES} ${include_HEADERS}) -#TARGET_INCLUDE_DIRECTORIES(archive PUBLIC .) -#TARGET_LINK_LIBRARIES(archive ${ADDITIONAL_LIBS}) -#SET_TARGET_PROPERTIES(archive PROPERTIES SOVERSION ${SOVERSION}) +ADD_LIBRARY(archive SHARED ${libarchive_SOURCES} ${include_HEADERS}) +TARGET_INCLUDE_DIRECTORIES(archive PUBLIC .) +TARGET_LINK_LIBRARIES(archive ${ADDITIONAL_LIBS}) +SET_TARGET_PROPERTIES(archive PROPERTIES SOVERSION ${SOVERSION}) # archive_static is a static library ADD_LIBRARY(archive_static STATIC ${libarchive_SOURCES} ${include_HEADERS}) @@ -255,7 +260,7 @@ ENDIF(NOT WIN32 OR CYGWIN) IF(ENABLE_INSTALL) # How to install the libraries - INSTALL(TARGETS archive_static + INSTALL(TARGETS archive archive_static RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive.h b/src/dependencies/libarchive-3.6.2/libarchive/archive.h similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive.h index ca83cbd..217ac19 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive.h @@ -36,7 +36,7 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */ -#define ARCHIVE_VERSION_NUMBER 3005002 +#define ARCHIVE_VERSION_NUMBER 3006002 #include #include /* for wchar_t */ @@ -97,7 +97,7 @@ typedef ssize_t la_ssize_t; #endif /* Large file support for Android */ -#ifdef __ANDROID__ +#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" #endif @@ -120,6 +120,8 @@ typedef ssize_t la_ssize_t; # define __LA_DECL __declspec(dllimport) # endif # endif +#elif defined __LIBARCHIVE_ENABLE_VISIBILITY +# define __LA_DECL __attribute__((visibility("default"))) #else /* Static libraries or non-Windows needs no special declaration. */ # define __LA_DECL @@ -155,7 +157,7 @@ __LA_DECL int archive_version_number(void); /* * Textual name/version of the library, useful for version displays. */ -#define ARCHIVE_VERSION_ONLY_STRING "3.5.2" +#define ARCHIVE_VERSION_ONLY_STRING "3.6.2" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); @@ -1024,6 +1026,8 @@ __LA_DECL int archive_read_disk_set_atime_restored(struct archive *); #define ARCHIVE_READDISK_NO_ACL (0x0020) /* Default: File flags are read from disk. */ #define ARCHIVE_READDISK_NO_FFLAGS (0x0040) +/* Default: Sparse file information is read from disk. */ +#define ARCHIVE_READDISK_NO_SPARSE (0x0080) __LA_DECL int archive_read_disk_set_behavior(struct archive *, int flags); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_acl.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_acl.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_acl.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_acl.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_acl_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_acl_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_acl_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_acl_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2.h similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_blake2.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_blake2.h index dd6fe6f..8f6b5e9 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2.h @@ -21,8 +21,10 @@ #if defined(_MSC_VER) #define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop)) -#else +#elif defined(__GNUC__) #define BLAKE2_PACKED(x) x __attribute__((packed)) +#else +#define BLAKE2_PACKED(x) _Pragma("pack 1") x _Pragma("pack 0") #endif #if defined(__cplusplus) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2_impl.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2_impl.h similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_blake2_impl.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_blake2_impl.h index 0f05def..eb8619c 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2_impl.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2_impl.h @@ -154,7 +154,7 @@ static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) /* prevents compiler optimizing out memset() */ static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) { - static void *(*const volatile memset_v)(void *, int, size_t) = &memset; + static void *(__LA_LIBC_CC *const volatile memset_v)(void *, int, size_t) = &memset; memset_v(v, 0, n); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2s_ref.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2s_ref.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_blake2s_ref.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_blake2s_ref.c index d92ffd0..93d3281 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2s_ref.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2s_ref.c @@ -13,6 +13,8 @@ https://blake2.net. */ +#include "archive_platform.h" + #include #include #include diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2sp_ref.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_blake2sp_ref.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c index aef1010..b913a4d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_blake2sp_ref.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c @@ -13,6 +13,8 @@ https://blake2.net. */ +#include "archive_platform.h" + #include #include #include diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_check_magic.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_check_magic.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_check_magic.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_check_magic.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_cmdline.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_cmdline.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_cmdline.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_cmdline.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_cmdline_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_cmdline_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_cmdline_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_cmdline_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_crc32.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_crc32.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_crc32.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_crc32.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_cryptor.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_cryptor.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_cryptor.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_cryptor.c index d4bca90..112baf1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_cryptor.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_cryptor.c @@ -401,14 +401,6 @@ aes_ctr_init(archive_crypto_ctx *ctx, const uint8_t *key, size_t key_len) memcpy(ctx->key, key, key_len); memset(ctx->nonce, 0, sizeof(ctx->nonce)); ctx->encr_pos = AES_BLOCK_SIZE; -#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) - if (!EVP_CIPHER_CTX_reset(ctx->ctx)) { - EVP_CIPHER_CTX_free(ctx->ctx); - ctx->ctx = NULL; - } -#else - EVP_CIPHER_CTX_init(ctx->ctx); -#endif return 0; } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_cryptor_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_cryptor_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_cryptor_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_cryptor_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_digest.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_digest.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_digest.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_digest.c index 410df01..3361b19 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_digest.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_digest.c @@ -49,16 +49,16 @@ * Initialize a Message digest. */ static int -win_crypto_init(Digest_CTX *ctx, ALG_ID algId) +win_crypto_init(Digest_CTX *ctx, DWORD prov, ALG_ID algId) { ctx->valid = 0; if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + prov, CRYPT_VERIFYCONTEXT)) { if (GetLastError() != (DWORD)NTE_BAD_KEYSET) return (ARCHIVE_FAILED); if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_NEWKEYSET)) + prov, CRYPT_NEWKEYSET)) return (ARCHIVE_FAILED); } @@ -243,7 +243,8 @@ __archive_md5init(archive_md5_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_md5()); + if (!EVP_DigestInit(*ctx, EVP_md5())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -275,7 +276,7 @@ __archive_md5final(archive_md5_ctx *ctx, void *md) static int __archive_md5init(archive_md5_ctx *ctx) { - return (win_crypto_init(ctx, CALG_MD5)); + return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5)); } static int @@ -434,7 +435,8 @@ __archive_ripemd160init(archive_rmd160_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_ripemd160()); + if (!EVP_DigestInit(*ctx, EVP_ripemd160())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -624,7 +626,8 @@ __archive_sha1init(archive_sha1_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_sha1()); + if (!EVP_DigestInit(*ctx, EVP_sha1())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -656,7 +659,7 @@ __archive_sha1final(archive_sha1_ctx *ctx, void *md) static int __archive_sha1init(archive_sha1_ctx *ctx) { - return (win_crypto_init(ctx, CALG_SHA1)); + return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1)); } static int @@ -887,7 +890,8 @@ __archive_sha256init(archive_sha256_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_sha256()); + if (!EVP_DigestInit(*ctx, EVP_sha256())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -915,7 +919,7 @@ __archive_sha256final(archive_sha256_ctx *ctx, void *md) static int __archive_sha256init(archive_sha256_ctx *ctx) { - return (win_crypto_init(ctx, CALG_SHA_256)); + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256)); } static int @@ -1122,7 +1126,8 @@ __archive_sha384init(archive_sha384_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_sha384()); + if (!EVP_DigestInit(*ctx, EVP_sha384())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -1150,7 +1155,7 @@ __archive_sha384final(archive_sha384_ctx *ctx, void *md) static int __archive_sha384init(archive_sha384_ctx *ctx) { - return (win_crypto_init(ctx, CALG_SHA_384)); + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384)); } static int @@ -1381,7 +1386,8 @@ __archive_sha512init(archive_sha512_ctx *ctx) { if ((*ctx = EVP_MD_CTX_new()) == NULL) return (ARCHIVE_FAILED); - EVP_DigestInit(*ctx, EVP_sha512()); + if (!EVP_DigestInit(*ctx, EVP_sha512())) + return (ARCHIVE_FAILED); return (ARCHIVE_OK); } @@ -1409,7 +1415,7 @@ __archive_sha512final(archive_sha512_ctx *ctx, void *md) static int __archive_sha512init(archive_sha512_ctx *ctx) { - return (win_crypto_init(ctx, CALG_SHA_512)); + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512)); } static int diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_digest_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_digest_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_digest_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_digest_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_darwin.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_darwin.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_darwin.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_darwin.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_freebsd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_freebsd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_freebsd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_freebsd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_linux.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_linux.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_linux.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_linux.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_sunos.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_sunos.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_disk_acl_sunos.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_disk_acl_sunos.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_endian.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_endian.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_endian.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_endian.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry.c index ca7a4bd..ae6dc33 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry.c @@ -568,6 +568,13 @@ archive_entry_nlink(struct archive_entry *entry) return (entry->ae_stat.aest_nlink); } +/* Instead, our caller could have chosen a specific encoding + * (archive_mstring_get_mbs, archive_mstring_get_utf8, + * archive_mstring_get_wcs). So we should try multiple + * encodings. Try mbs first because of history, even though + * utf8 might be better for pathname portability. + * Also omit wcs because of type mismatch (char * versus wchar *) + */ const char * archive_entry_pathname(struct archive_entry *entry) { @@ -575,6 +582,13 @@ archive_entry_pathname(struct archive_entry *entry) if (archive_mstring_get_mbs( entry->archive, &entry->ae_pathname, &p) == 0) return (p); +#if HAVE_EILSEQ /*{*/ + if (errno == EILSEQ) { + if (archive_mstring_get_utf8( + entry->archive, &entry->ae_pathname, &p) == 0) + return (p); + } +#endif /*}*/ if (errno == ENOMEM) __archive_errx(1, "No memory"); return (NULL); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry.h similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry.h index bfba54f..e579e9f 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry.h @@ -30,7 +30,7 @@ #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3005002 +#define ARCHIVE_VERSION_NUMBER 3006002 /* * Note: archive_entry.h is for use outside of libarchive; the @@ -99,7 +99,7 @@ typedef ssize_t la_ssize_t; #endif /* Large file support for Android */ -#ifdef __ANDROID__ +#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" #endif @@ -122,6 +122,8 @@ typedef ssize_t la_ssize_t; # define __LA_DECL __declspec(dllimport) # endif # endif +#elif defined __LIBARCHIVE_ENABLE_VISIBILITY +# define __LA_DECL __attribute__((visibility("default"))) #else /* Static libraries on all platforms and shared libraries on non-Windows. */ # define __LA_DECL diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_acl.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_acl.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_acl.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_acl.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_copy_bhfi.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_copy_bhfi.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_copy_bhfi.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_copy_bhfi.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_copy_stat.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_copy_stat.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_copy_stat.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_copy_stat.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_link_resolver.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_link_resolver.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_link_resolver.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_link_resolver.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_linkify.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_linkify.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_linkify.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_linkify.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_locale.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_locale.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_locale.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_locale.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_misc.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_misc.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_misc.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_misc.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_paths.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_paths.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_paths.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_paths.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_perms.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_perms.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_perms.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_perms.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_sparse.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_sparse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_sparse.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_sparse.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_stat.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_stat.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_stat.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_stat.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_stat.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_stat.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_stat.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_stat.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_strmode.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_strmode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_strmode.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_strmode.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_time.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_time.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_time.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_time.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_entry_xattr.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_entry_xattr.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_entry_xattr.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_entry_xattr.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_getdate.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_getdate.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_getdate.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_getdate.c index 3ec5bba..39e224c 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_getdate.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_getdate.c @@ -714,7 +714,7 @@ Convert(time_t Month, time_t Day, time_t Year, ? 29 : 28; /* Checking for 2038 bogusly assumes that time_t is 32 bits. But I'm too lazy to try to check for time_t overflow in another way. */ - if (Year < EPOCH || Year > 2038 + if (Year < EPOCH || Year >= 2038 || Month < 1 || Month > 12 /* Lint fluff: "conversion from long may lose accuracy" */ || Day < 1 || Day > DaysInMonth[(int)--Month] diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_getdate.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_getdate.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_getdate.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_getdate.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_hmac.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_hmac.c similarity index 91% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_hmac.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_hmac.c index 2a9d04c..012fe15 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_hmac.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_hmac.c @@ -230,10 +230,23 @@ __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx) static int __hmac_sha1_init(archive_hmac_sha1_ctx *ctx, const uint8_t *key, size_t key_len) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + OSSL_PARAM params[2]; + + EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", NULL); + *ctx = EVP_MAC_CTX_new(mac); + if (*ctx == NULL) + return -1; + EVP_MAC_free(mac); + params[0] = OSSL_PARAM_construct_utf8_string("digest", "SHA1", 0); + params[1] = OSSL_PARAM_construct_end(); + EVP_MAC_init(*ctx, key, key_len, params); +#else *ctx = HMAC_CTX_new(); if (*ctx == NULL) return -1; HMAC_Init_ex(*ctx, key, key_len, EVP_sha1(), NULL); +#endif return 0; } @@ -241,22 +254,38 @@ static void __hmac_sha1_update(archive_hmac_sha1_ctx *ctx, const uint8_t *data, size_t data_len) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_MAC_update(*ctx, data, data_len); +#else HMAC_Update(*ctx, data, data_len); +#endif } static void __hmac_sha1_final(archive_hmac_sha1_ctx *ctx, uint8_t *out, size_t *out_len) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + size_t len = *out_len; +#else unsigned int len = (unsigned int)*out_len; +#endif +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_MAC_final(*ctx, out, &len, *out_len); +#else HMAC_Final(*ctx, out, &len); +#endif *out_len = len; } static void __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_MAC_CTX_free(*ctx); +#else HMAC_CTX_free(*ctx); +#endif *ctx = NULL; } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_hmac_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_hmac_private.h similarity index 95% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_hmac_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_hmac_private.h index 13a67d4..50044a0 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_hmac_private.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_hmac_private.h @@ -74,9 +74,16 @@ typedef mbedtls_md_context_t archive_hmac_sha1_ctx; typedef struct hmac_sha1_ctx archive_hmac_sha1_ctx; #elif defined(HAVE_LIBCRYPTO) +#include +#include +#if OPENSSL_VERSION_NUMBER >= 0x30000000L +typedef EVP_MAC_CTX *archive_hmac_sha1_ctx; + +#else #include "archive_openssl_hmac_private.h" typedef HMAC_CTX* archive_hmac_sha1_ctx; +#endif #else diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_match.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_match.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_match.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_match.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_openssl_evp_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_openssl_evp_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_openssl_evp_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_openssl_evp_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_openssl_hmac_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_openssl_hmac_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_openssl_hmac_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_openssl_hmac_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_options.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_options.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_options.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_options.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_options_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_options_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_options_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_options_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_pack_dev.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_pack_dev.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_pack_dev.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_pack_dev.c index f8286d8..d95444d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_pack_dev.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_pack_dev.c @@ -77,7 +77,7 @@ static pack_t pack_12_20; static pack_t pack_14_18; static pack_t pack_8_24; static pack_t pack_bsdos; -static int compare_format(const void *, const void *); +static int __LA_LIBC_CC compare_format(const void *, const void *); static const char iMajorError[] = "invalid major number"; static const char iMinorError[] = "invalid minor number"; @@ -310,6 +310,7 @@ static const struct format { }; static int +__LA_LIBC_CC compare_format(const void *key, const void *element) { const char *name; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_pack_dev.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_pack_dev.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_pack_dev.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_pack_dev.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_pathmatch.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_pathmatch.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_pathmatch.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_pathmatch.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_pathmatch.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_pathmatch.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_pathmatch.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_pathmatch.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_platform.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_platform.h similarity index 85% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_platform.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_platform.h index b8bcb52..1038932 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_platform.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_platform.h @@ -69,8 +69,16 @@ * either Windows or Posix APIs. */ #if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) #include "archive_windows.h" +/* The C library on Windows specifies a calling convention for callback + * functions and exports; when we interact with them (capture pointers, + * call and pass function pointers) we need to match their calling + * convention. + * This only matters when libarchive is built with /Gr, /Gz or /Gv + * (which change the default calling convention.) */ +#define __LA_LIBC_CC __cdecl #else #define la_stat(path,stref) stat(path,stref) +#define __LA_LIBC_CC #endif /* @@ -155,6 +163,28 @@ #define INTMAX_MIN ((intmax_t)(~INTMAX_MAX)) #endif +/* Some platforms lack the standard PRIxN/PRIdN definitions. */ +#if !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) +#ifndef PRIx32 +#if SIZEOF_INT == 4 +#define PRIx32 "x" +#elif SIZEOF_LONG == 4 +#define PRIx32 "lx" +#else +#error No suitable 32-bit unsigned integer type found for this platform +#endif +#endif // PRIx32 +#ifndef PRId32 +#if SIZEOF_INT == 4 +#define PRId32 "d" +#elif SIZEOF_LONG == 4 +#define PRId32 "ld" +#else +#error No suitable 32-bit signed integer type found for this platform +#endif +#endif // PRId32 +#endif // !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) + /* * If we can't restore metadata using a file descriptor, then * for compatibility's sake, close files before trying to restore metadata. @@ -165,8 +195,9 @@ /* * glibc 2.24 deprecates readdir_r + * bionic c deprecates readdir_r too */ -#if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)) +#if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)) && (!defined(__ANDROID__)) #define USE_READDIR_R 1 #else #undef USE_READDIR_R diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_platform_acl.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_platform_acl.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_platform_acl.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_platform_acl.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_platform_xattr.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_platform_xattr.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_platform_xattr.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_platform_xattr.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd7.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd7.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd7.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd7.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd7_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd7_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd7_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd7_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd8.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd8.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd8.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd8.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd8_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd8_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd8_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd8_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_ppmd_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_ppmd_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_private.h similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_private.h index 55a8da1..b2a2cda 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_private.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_private.h @@ -107,14 +107,11 @@ struct archive { * Some public API functions depend on the "real" type of the * archive object. */ - struct archive_vtable *vtable; + const struct archive_vtable *vtable; int archive_format; const char *archive_format_name; - int compression_code; /* Currently active compression. */ - const char *compression_name; - /* Number of file entries processed. */ int file_count; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_random.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_random.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_random.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_random.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_random_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_random_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_random_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_random_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_rb.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_rb.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_rb.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_rb.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_rb.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_rb.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_rb.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_rb.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read.c index c59f051..45a38ae 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read.c @@ -58,7 +58,6 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read.c 201157 2009-12-29 05:30:2 static int choose_filters(struct archive_read *); static int choose_format(struct archive_read *); static int close_filters(struct archive_read *); -static struct archive_vtable *archive_read_vtable(void); static int64_t _archive_filter_bytes(struct archive *, int); static int _archive_filter_code(struct archive *, int); static const char *_archive_filter_name(struct archive *, int); @@ -73,26 +72,18 @@ static int _archive_read_next_header2(struct archive *, struct archive_entry *); static int64_t advance_file_pointer(struct archive_read_filter *, int64_t); -static struct archive_vtable * -archive_read_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_filter_bytes = _archive_filter_bytes; - av.archive_filter_code = _archive_filter_code; - av.archive_filter_name = _archive_filter_name; - av.archive_filter_count = _archive_filter_count; - av.archive_read_data_block = _archive_read_data_block; - av.archive_read_next_header = _archive_read_next_header; - av.archive_read_next_header2 = _archive_read_next_header2; - av.archive_free = _archive_read_free; - av.archive_close = _archive_read_close; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_read_vtable = { + .archive_filter_bytes = _archive_filter_bytes, + .archive_filter_code = _archive_filter_code, + .archive_filter_name = _archive_filter_name, + .archive_filter_count = _archive_filter_count, + .archive_read_data_block = _archive_read_data_block, + .archive_read_next_header = _archive_read_next_header, + .archive_read_next_header2 = _archive_read_next_header2, + .archive_free = _archive_read_free, + .archive_close = _archive_read_close, +}; /* * Allocate, initialize and return a struct archive object. @@ -109,7 +100,7 @@ archive_read_new(void) a->archive.state = ARCHIVE_STATE_NEW; a->entry = archive_entry_new2(&a->archive); - a->archive.vtable = archive_read_vtable(); + a->archive.vtable = &archive_read_vtable; a->passphrases.last = &a->passphrases.first; @@ -245,24 +236,29 @@ client_seek_proxy(struct archive_read_filter *self, int64_t offset, int whence) } static int -client_close_proxy(struct archive_read_filter *self) +read_client_close_proxy(struct archive_read *a) { int r = ARCHIVE_OK, r2; unsigned int i; - if (self->archive->client.closer == NULL) + if (a->client.closer == NULL) return (r); - for (i = 0; i < self->archive->client.nodes; i++) + for (i = 0; i < a->client.nodes; i++) { - r2 = (self->archive->client.closer) - ((struct archive *)self->archive, - self->archive->client.dataset[i].data); + r2 = (a->client.closer) + ((struct archive *)a, a->client.dataset[i].data); if (r > r2) r = r2; } return (r); } +static int +client_close_proxy(struct archive_read_filter *self) +{ + return read_client_close_proxy(self->archive); +} + static int client_open_proxy(struct archive_read_filter *self) { @@ -298,9 +294,7 @@ client_switch_proxy(struct archive_read_filter *self, unsigned int iindex) r1 = (self->archive->client.closer) ((struct archive *)self->archive, self->data); self->data = data2; - if (self->archive->client.opener != NULL) - r2 = (self->archive->client.opener) - ((struct archive *)self->archive, self->data); + r2 = client_open_proxy(self); } return (r1 < r2) ? r1 : r2; } @@ -457,13 +451,18 @@ archive_read_prepend_callback_data(struct archive *_a, void *client_data) return archive_read_add_callback_data(_a, client_data, 0); } +static const struct archive_read_filter_vtable +none_reader_vtable = { + .read = client_read_proxy, + .close = client_close_proxy, +}; + int archive_read_open1(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; struct archive_read_filter *filter, *tmp; int slot, e = ARCHIVE_OK; - unsigned int i; archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, "archive_read_open"); @@ -481,11 +480,7 @@ archive_read_open1(struct archive *_a) e = (a->client.opener)(&a->archive, a->client.dataset[0].data); if (e != 0) { /* If the open failed, call the closer to clean up. */ - if (a->client.closer) { - for (i = 0; i < a->client.nodes; i++) - (a->client.closer)(&a->archive, - a->client.dataset[i].data); - } + read_client_close_proxy(a); return (e); } } @@ -497,14 +492,11 @@ archive_read_open1(struct archive *_a) filter->upstream = NULL; filter->archive = a; filter->data = a->client.dataset[0].data; - filter->open = client_open_proxy; - filter->read = client_read_proxy; - filter->skip = client_skip_proxy; - filter->seek = client_seek_proxy; - filter->close = client_close_proxy; - filter->sswitch = client_switch_proxy; + filter->vtable = &none_reader_vtable; filter->name = "none"; filter->code = ARCHIVE_FILTER_NONE; + filter->can_skip = 1; + filter->can_seek = 1; a->client.dataset[0].begin_position = 0; if (!a->filter || !a->bypass_filter_bidding) @@ -570,12 +562,12 @@ choose_filters(struct archive_read *a) bidder = a->bidders; for (i = 0; i < number_bidders; i++, bidder++) { - if (bidder->bid != NULL) { - bid = (bidder->bid)(bidder, a->filter); - if (bid > best_bid) { - best_bid = bid; - best_bidder = bidder; - } + if (bidder->vtable == NULL) + continue; + bid = (bidder->vtable->bid)(bidder, a->filter); + if (bid > best_bid) { + best_bid = bid; + best_bidder = bidder; } } @@ -587,8 +579,6 @@ choose_filters(struct archive_read *a) __archive_read_free_filters(a); return (ARCHIVE_FATAL); } - a->archive.compression_name = a->filter->name; - a->archive.compression_code = a->filter->code; return (ARCHIVE_OK); } @@ -600,7 +590,7 @@ choose_filters(struct archive_read *a) filter->archive = a; filter->upstream = a->filter; a->filter = filter; - r = (best_bidder->init)(a->filter); + r = (best_bidder->vtable->init)(a->filter); if (r != ARCHIVE_OK) { __archive_read_free_filters(a); return (ARCHIVE_FATAL); @@ -614,10 +604,9 @@ choose_filters(struct archive_read *a) int __archive_read_header(struct archive_read *a, struct archive_entry *entry) { - if (a->filter->read_header) - return a->filter->read_header(a->filter, entry); - else + if (!a->filter->vtable->read_header) return (ARCHIVE_OK); + return a->filter->vtable->read_header(a->filter, entry); } /* @@ -1006,8 +995,8 @@ close_filters(struct archive_read *a) /* Close each filter in the pipeline. */ while (f != NULL) { struct archive_read_filter *t = f->upstream; - if (!f->closed && f->close != NULL) { - int r1 = (f->close)(f); + if (!f->closed && f->vtable != NULL) { + int r1 = (f->vtable->close)(f); f->closed = 1; if (r1 < r) r = r1; @@ -1112,11 +1101,10 @@ _archive_read_free(struct archive *_a) /* Release the bidder objects. */ n = sizeof(a->bidders)/sizeof(a->bidders[0]); for (i = 0; i < n; i++) { - if (a->bidders[i].free != NULL) { - int r1 = (a->bidders[i].free)(&a->bidders[i]); - if (r1 < r) - r = r1; - } + if (a->bidders[i].vtable == NULL || + a->bidders[i].vtable->free == NULL) + continue; + (a->bidders[i].vtable->free)(&a->bidders[i]); } /* Release passphrase list. */ @@ -1241,19 +1229,35 @@ __archive_read_register_format(struct archive_read *a, * initialization functions. */ int -__archive_read_get_bidder(struct archive_read *a, - struct archive_read_filter_bidder **bidder) +__archive_read_register_bidder(struct archive_read *a, + void *bidder_data, + const char *name, + const struct archive_read_filter_bidder_vtable *vtable) { + struct archive_read_filter_bidder *bidder; int i, number_slots; + archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_NEW, "__archive_read_register_bidder"); + number_slots = sizeof(a->bidders) / sizeof(a->bidders[0]); for (i = 0; i < number_slots; i++) { - if (a->bidders[i].bid == NULL) { - memset(a->bidders + i, 0, sizeof(a->bidders[0])); - *bidder = (a->bidders + i); - return (ARCHIVE_OK); + if (a->bidders[i].vtable != NULL) + continue; + memset(a->bidders + i, 0, sizeof(a->bidders[0])); + bidder = (a->bidders + i); + bidder->data = bidder_data; + bidder->name = name; + bidder->vtable = vtable; + if (bidder->vtable->bid == NULL || bidder->vtable->init == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "Internal error: " + "no bid/init for filter bidder"); + return (ARCHIVE_FATAL); } + + return (ARCHIVE_OK); } archive_set_error(&a->archive, ENOMEM, @@ -1382,7 +1386,7 @@ __archive_read_filter_ahead(struct archive_read_filter *filter, *avail = 0; return (NULL); } - bytes_read = (filter->read)(filter, + bytes_read = (filter->vtable->read)(filter, &filter->client_buff); if (bytes_read < 0) { /* Read error. */ filter->client_total = filter->client_avail = 0; @@ -1561,8 +1565,8 @@ advance_file_pointer(struct archive_read_filter *filter, int64_t request) return (total_bytes_skipped); /* If there's an optimized skip function, use it. */ - if (filter->skip != NULL) { - bytes_skipped = (filter->skip)(filter, request); + if (filter->can_skip != 0) { + bytes_skipped = client_skip_proxy(filter, request); if (bytes_skipped < 0) { /* error */ filter->fatal = 1; return (bytes_skipped); @@ -1576,7 +1580,7 @@ advance_file_pointer(struct archive_read_filter *filter, int64_t request) /* Use ordinary reads as necessary to complete the request. */ for (;;) { - bytes_read = (filter->read)(filter, &filter->client_buff); + bytes_read = (filter->vtable->read)(filter, &filter->client_buff); if (bytes_read < 0) { filter->client_buff = NULL; filter->fatal = 1; @@ -1631,7 +1635,7 @@ __archive_read_filter_seek(struct archive_read_filter *filter, int64_t offset, if (filter->closed || filter->fatal) return (ARCHIVE_FATAL); - if (filter->seek == NULL) + if (filter->can_seek == 0) return (ARCHIVE_FAILED); client = &(filter->archive->client); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_add_passphrase.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_add_passphrase.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_add_passphrase.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_add_passphrase.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_add_passphrase.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_add_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_add_passphrase.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_add_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_append_filter.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_append_filter.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_append_filter.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_append_filter.c index da7c55b..25dc4b2 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_append_filter.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_append_filter.c @@ -135,7 +135,7 @@ archive_read_append_filter(struct archive *_a, int code) filter->archive = a; filter->upstream = a->filter; a->filter = filter; - r2 = (bidder->init)(a->filter); + r2 = (bidder->vtable->init)(a->filter); if (r2 != ARCHIVE_OK) { __archive_read_free_filters(a); return (ARCHIVE_FATAL); @@ -192,7 +192,7 @@ archive_read_append_filter_program_signature(struct archive *_a, filter->archive = a; filter->upstream = a->filter; a->filter = filter; - r = (bidder->init)(a->filter); + r = (bidder->vtable->init)(a->filter); if (r != ARCHIVE_OK) { __archive_read_free_filters(a); return (ARCHIVE_FATAL); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_data.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_data.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_data.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_data.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_data_into_fd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_data_into_fd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_data_into_fd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_data_into_fd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk.3 similarity index 75% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk.3 index 82d6a5c..8b568d7 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk.3 +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk.3 @@ -29,6 +29,8 @@ .Os .Sh NAME .Nm archive_read_disk_new , +.Nm archive_read_disk_open , +.Nm archive_read_disk_open_w , .Nm archive_read_disk_set_behavior , .Nm archive_read_disk_set_symlink_logical , .Nm archive_read_disk_set_symlink_physical , @@ -38,7 +40,14 @@ .Nm archive_read_disk_uname , .Nm archive_read_disk_set_uname_lookup , .Nm archive_read_disk_set_gname_lookup , -.Nm archive_read_disk_set_standard_lookup +.Nm archive_read_disk_set_standard_lookup , +.Nm archive_read_disk_descend , +.Nm archive_read_disk_can_descend , +.Nm archive_read_disk_current_filesystem , +.Nm archive_read_disk_current_filesystem_is_synthetic , +.Nm archive_read_disk_current_filesystem_is_remote , +.Nm archive_read_disk_set_matching , +.Nm archive_read_disk_set_metadata_filter_callback , .Nd functions for reading objects from disk .Sh LIBRARY Streaming Archive Library (libarchive, -larchive) @@ -47,6 +56,10 @@ Streaming Archive Library (libarchive, -larchive) .Ft struct archive * .Fn archive_read_disk_new "void" .Ft int +.Fn archive_read_disk_open "struct archive *" "const char *" +.Ft int +.Fn archive_read_disk_open_w "struct archive *" "const wchar_t *" +.Ft int .Fn archive_read_disk_set_behavior "struct archive *" "int" .Ft int .Fn archive_read_disk_set_symlink_logical "struct archive *" @@ -81,6 +94,29 @@ Streaming Archive Library (libarchive, -larchive) .Fa "int fd" .Fa "const struct stat *" .Fc +.Ft int +.Fn archive_read_disk_descend "struct archive *" +.Ft int +.Fn archive_read_disk_can_descend "struct archive *" +.Ft int +.Fn archive_read_disk_current_filesystem "struct archive *" +.Ft int +.Fn archive_read_disk_current_filesystem_is_synthetic "struct archive *" +.Ft int +.Fn archive_read_disk_current_filesystem_is_remote "struct archive *" +.Ft int +.Fo archive_read_disk_set_matching +.Fa "struct archive *" +.Fa "struct archive *" +.Fa "void (*excluded_func)(struct archive *, void *, struct archive entry *)" +.Fa "void *" +.Fc +.Ft int +.Fo archive_read_disk_set_metadata_filter_callback +.Fa "struct archive *" +.Fa "int (*metadata_filter_func)(struct archive *, void*, struct archive_entry *)" +.Fa "void *" +.Fc .Sh DESCRIPTION These functions provide an API for reading information about objects on disk. @@ -92,6 +128,14 @@ objects. Allocates and initializes a .Tn struct archive object suitable for reading object information from disk. +.It Fn archive_read_disk_open +Opens the file or directory from the given path and prepares the +.Tn struct archive +to read it from disk. +.It Fn archive_read_disk_open_w +Opens the file or directory from the given path as a wide character string and prepares the +.Tn struct archive +to read it from disk. .It Fn archive_read_disk_set_behavior Configures various behavior options when reading entries from disk. The flags field consists of a bitwise OR of one or more of the @@ -137,6 +181,9 @@ for more information on extended file attributes. .It Cm ARCHIVE_READDISK_RESTORE_ATIME Restore access time of traversed files. By default, access time of traversed files is not restored. +.It Cm ARCHIVE_READDISK_NO_SPARSE +Do not read sparse file information. +By default, sparse file information is read from disk. .El .It Xo .Fn archive_read_disk_set_symlink_logical , @@ -221,6 +268,37 @@ using the currently-registered lookup functions above. This affects the file ownership fields and ACL values in the .Tn struct archive_entry object. +.It Fn archive_read_disk_descend +If the current entry can be descended, this function will mark the directory as the next entry for +.Xr archive_read_header 3 +to visit. +.It Fn archive_read_disk_can_descend +Returns 1 if the current entry is an unvisited directory and 0 otherwise. +.It Fn archive_read_disk_current_filesystem +Returns the index of the most recent filesystem entry that has been visited through archive_read_disk +.It Fn archive_read_disk_current_filesystem_is_synthetic +Returns 1 if the current filesystem is a virtual filesystem. Returns 0 if the current filesystem is not a virtual filesystem. Returns -1 if it is unknown. +.It Fn archive_read_disk_current_filesystem_is_remote +Returns 1 if the current filesystem is a remote filesystem. Returns 0 if the current filesystem is not a remote filesystem. Returns -1 if it is unknown. +.It Fn archive_read_disk_set_matching +Allows the caller to set +.Tn struct archive +*_ma to compare each entry during +.Xr archive_read_header 3 +calls. If matched based on calls to +.Tn archive_match_path_excluded , +.Tn archive_match_time_excluded , +or +.Tn archive_match_owner_excluded , +then the callback function specified by the _excluded_func parameter will execute. This function will recieve data provided to the fourth parameter, void *_client_data. +.It Fn archive_read_disk_set_metadata_filter_callback +Allows the caller to set a callback function during calls to +.Xr archive_read_header 3 +to filter out metadata for each entry. The callback function recieves the +.Tn struct archive +object, void* custom filter data, and the +.Tn struct archive_entry . +If the callback function returns an error, ARCHIVE_RETRY will be returned and the entry will not be further processed. .El More information about the .Va struct archive diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_entry_from_file.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_entry_from_file.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c index 9c9cf38..ab0270b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_entry_from_file.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c @@ -303,9 +303,11 @@ archive_read_disk_entry_from_file(struct archive *_a, if (r1 < r) r = r1; } - r1 = setup_sparse(a, entry, &fd); - if (r1 < r) - r = r1; + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + r1 = setup_sparse(a, entry, &fd); + if (r1 < r) + r = r1; + } /* If we opened the file earlier in this function, close it. */ if (initial_fd != fd) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_posix.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_posix.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_posix.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_posix.c index 3ee6269..5a94ec5 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_posix.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_posix.c @@ -34,9 +34,6 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_PARAM_H #include #endif -#ifdef HAVE_SYS_MOUNT_H -#include -#endif #ifdef HAVE_SYS_STAT_H #include #endif @@ -54,6 +51,8 @@ __FBSDID("$FreeBSD$"); #endif #ifdef HAVE_LINUX_FS_H #include +#elif HAVE_SYS_MOUNT_H +#include #endif /* * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h. @@ -109,6 +108,11 @@ __FBSDID("$FreeBSD$"); #define O_CLOEXEC 0 #endif +#if defined(__hpux) && !defined(HAVE_DIRFD) +#define dirfd(x) ((x)->__dd_fd) +#define HAVE_DIRFD +#endif + /*- * This is a new directory-walking system that addresses a number * of problems I've had with fts(3). In particular, it has no @@ -369,22 +373,14 @@ static int open_on_current_dir(struct tree *, const char *, int); static int tree_dup(int); -static struct archive_vtable * -archive_read_disk_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_free = _archive_read_free; - av.archive_close = _archive_read_close; - av.archive_read_data_block = _archive_read_data_block; - av.archive_read_next_header = _archive_read_next_header; - av.archive_read_next_header2 = _archive_read_next_header2; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_read_disk_vtable = { + .archive_free = _archive_read_free, + .archive_close = _archive_read_close, + .archive_read_data_block = _archive_read_data_block, + .archive_read_next_header = _archive_read_next_header, + .archive_read_next_header2 = _archive_read_next_header2, +}; const char * archive_read_disk_gname(struct archive *_a, la_int64_t gid) @@ -461,7 +457,7 @@ archive_read_disk_new(void) return (NULL); a->archive.magic = ARCHIVE_READ_DISK_MAGIC; a->archive.state = ARCHIVE_STATE_NEW; - a->archive.vtable = archive_read_disk_vtable(); + a->archive.vtable = &archive_read_disk_vtable; a->entry = archive_entry_new2(&a->archive); a->lookup_uname = trivial_lookup_uname; a->lookup_gname = trivial_lookup_gname; @@ -1290,7 +1286,7 @@ archive_read_disk_descend(struct archive *_a) ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, "archive_read_disk_descend"); - if (t->visit_type != TREE_REGULAR || !t->descend) + if (!archive_read_disk_can_descend(_a)) return (ARCHIVE_OK); /* @@ -2106,6 +2102,8 @@ tree_push(struct tree *t, const char *path, int filesystem_id, struct tree_entry *te; te = calloc(1, sizeof(*te)); + if (te == NULL) + __archive_errx(1, "Out of memory"); te->next = t->stack; te->parent = t->current; if (te->parent) @@ -2436,7 +2434,7 @@ tree_dir_next_posix(struct tree *t) #else /* HAVE_FDOPENDIR */ if (tree_enter_working_dir(t) == 0) { t->d = opendir("."); -#if HAVE_DIRFD || defined(dirfd) +#ifdef HAVE_DIRFD __archive_ensure_cloexec_flag(dirfd(t->d)); #endif } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_set_standard_lookup.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_set_standard_lookup.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_set_standard_lookup.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_set_standard_lookup.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_windows.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_windows.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_windows.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_windows.c index 877bc44..f9d1395 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_disk_windows.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_disk_windows.c @@ -418,8 +418,9 @@ la_linkname_from_pathw(const wchar_t *path, wchar_t **outbuf, int *linktype) FILE_FLAG_OPEN_REPARSE_POINT; int ret; - h = CreateFileW(path, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, flag, - NULL); + h = CreateFileW(path, 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, flag, NULL); if (h == INVALID_HANDLE_VALUE) { la_dosmaperr(GetLastError()); return (-1); @@ -449,22 +450,14 @@ entry_symlink_from_pathw(struct archive_entry *entry, const wchar_t *path) return; } -static struct archive_vtable * -archive_read_disk_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_free = _archive_read_free; - av.archive_close = _archive_read_close; - av.archive_read_data_block = _archive_read_data_block; - av.archive_read_next_header = _archive_read_next_header; - av.archive_read_next_header2 = _archive_read_next_header2; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_read_disk_vtable = { + .archive_free = _archive_read_free, + .archive_close = _archive_read_close, + .archive_read_data_block = _archive_read_data_block, + .archive_read_next_header = _archive_read_next_header, + .archive_read_next_header2 = _archive_read_next_header2, +}; const char * archive_read_disk_gname(struct archive *_a, la_int64_t gid) @@ -541,7 +534,7 @@ archive_read_disk_new(void) return (NULL); a->archive.magic = ARCHIVE_READ_DISK_MAGIC; a->archive.state = ARCHIVE_STATE_NEW; - a->archive.vtable = archive_read_disk_vtable(); + a->archive.vtable = &archive_read_disk_vtable; a->entry = archive_entry_new2(&a->archive); a->lookup_uname = trivial_lookup_uname; a->lookup_gname = trivial_lookup_gname; @@ -1081,7 +1074,9 @@ next_entry(struct archive_read_disk *a, struct tree *t, else flags |= FILE_FLAG_SEQUENTIAL_SCAN; t->entry_fh = CreateFileW(tree_current_access_path(t), - GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, flags, NULL); + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, flags, NULL); if (t->entry_fh == INVALID_HANDLE_VALUE) { la_dosmaperr(GetLastError()); archive_set_error(&a->archive, errno, @@ -1090,9 +1085,11 @@ next_entry(struct archive_read_disk *a, struct tree *t, } /* Find sparse data from the disk. */ - if (archive_entry_hardlink(entry) == NULL && - (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0) - r = setup_sparse_from_disk(a, entry, t->entry_fh); + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + if (archive_entry_hardlink(entry) == NULL && + (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0) + r = setup_sparse_from_disk(a, entry, t->entry_fh); + } } return (r); } @@ -1300,7 +1297,7 @@ archive_read_disk_descend(struct archive *_a) ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, "archive_read_disk_descend"); - if (t->visit_type != TREE_REGULAR || !t->descend) + if (!archive_read_disk_can_descend(_a)) return (ARCHIVE_OK); if (tree_current_is_physical_dir(t)) { @@ -2052,7 +2049,8 @@ tree_current_file_information(struct tree *t, BY_HANDLE_FILE_INFORMATION *st, if (sim_lstat && tree_current_is_physical_link(t)) flag |= FILE_FLAG_OPEN_REPARSE_POINT; - h = CreateFileW(tree_current_access_path(t), 0, FILE_SHARE_READ, NULL, + h = CreateFileW(tree_current_access_path(t), 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, flag, NULL); if (h == INVALID_HANDLE_VALUE) { la_dosmaperr(GetLastError()); @@ -2281,7 +2279,8 @@ archive_read_disk_entry_from_file(struct archive *_a, } else desiredAccess = GENERIC_READ; - h = CreateFileW(path, desiredAccess, FILE_SHARE_READ, NULL, + h = CreateFileW(path, desiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, flag, NULL); if (h == INVALID_HANDLE_VALUE) { la_dosmaperr(GetLastError()); @@ -2343,7 +2342,8 @@ archive_read_disk_entry_from_file(struct archive *_a, if (fd >= 0) { h = (HANDLE)_get_osfhandle(fd); } else { - h = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, + h = CreateFileW(path, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (h == INVALID_HANDLE_VALUE) { la_dosmaperr(GetLastError()); @@ -2371,9 +2371,11 @@ archive_read_disk_entry_from_file(struct archive *_a, return (ARCHIVE_OK); } - r = setup_sparse_from_disk(a, entry, h); - if (fd < 0) - CloseHandle(h); + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + r = setup_sparse_from_disk(a, entry, h); + if (fd < 0) + CloseHandle(h); + } return (r); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract2.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_extract2.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_extract2.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_filter.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_filter.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_filter.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_filter.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_format.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_format.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_format.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_format.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_free.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_free.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_free.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_free.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_header.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_header.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_header.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_header.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_new.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_new.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_new.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_new.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_open.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_open.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_open.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_open.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_fd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_fd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_fd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_fd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_file.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_file.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_file.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_file.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_memory.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_memory.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_open_memory.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_open_memory.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_private.h similarity index 92% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_private.h index c842e6f..383405d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_private.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_private.h @@ -42,6 +42,16 @@ struct archive_read; struct archive_read_filter_bidder; struct archive_read_filter; +struct archive_read_filter_bidder_vtable { + /* Taste the upstream filter to see if we handle this. */ + int (*bid)(struct archive_read_filter_bidder *, + struct archive_read_filter *); + /* Initialize a newly-created filter. */ + int (*init)(struct archive_read_filter *); + /* Release the bidder's configuration data. */ + void (*free)(struct archive_read_filter_bidder *); +}; + /* * How bidding works for filters: * * The bid manager initializes the client-provided reader as the @@ -62,16 +72,16 @@ struct archive_read_filter_bidder { void *data; /* Name of the filter */ const char *name; - /* Taste the upstream filter to see if we handle this. */ - int (*bid)(struct archive_read_filter_bidder *, - struct archive_read_filter *); - /* Initialize a newly-created filter. */ - int (*init)(struct archive_read_filter *); - /* Set an option for the filter bidder. */ - int (*options)(struct archive_read_filter_bidder *, - const char *key, const char *value); - /* Release the bidder's configuration data. */ - int (*free)(struct archive_read_filter_bidder *); + const struct archive_read_filter_bidder_vtable *vtable; +}; + +struct archive_read_filter_vtable { + /* Return next block. */ + ssize_t (*read)(struct archive_read_filter *, const void **); + /* Close (just this filter) and free(self). */ + int (*close)(struct archive_read_filter *self); + /* Read any header metadata if available. */ + int (*read_header)(struct archive_read_filter *self, struct archive_entry *entry); }; /* @@ -86,25 +96,14 @@ struct archive_read_filter { struct archive_read_filter_bidder *bidder; /* My bidder. */ struct archive_read_filter *upstream; /* Who I read from. */ struct archive_read *archive; /* Associated archive. */ - /* Open a block for reading */ - int (*open)(struct archive_read_filter *self); - /* Return next block. */ - ssize_t (*read)(struct archive_read_filter *, const void **); - /* Skip forward this many bytes. */ - int64_t (*skip)(struct archive_read_filter *self, int64_t request); - /* Seek to an absolute location. */ - int64_t (*seek)(struct archive_read_filter *self, int64_t offset, int whence); - /* Close (just this filter) and free(self). */ - int (*close)(struct archive_read_filter *self); - /* Function that handles switching from reading one block to the next/prev */ - int (*sswitch)(struct archive_read_filter *self, unsigned int iindex); - /* Read any header metadata if available. */ - int (*read_header)(struct archive_read_filter *self, struct archive_entry *entry); + const struct archive_read_filter_vtable *vtable; /* My private data. */ void *data; const char *name; int code; + int can_skip; + int can_seek; /* Used by reblocking logic. */ char *buffer; @@ -242,8 +241,10 @@ int __archive_read_register_format(struct archive_read *a, int (*format_capabilities)(struct archive_read *), int (*has_encrypted_entries)(struct archive_read *)); -int __archive_read_get_bidder(struct archive_read *a, - struct archive_read_filter_bidder **bidder); +int __archive_read_register_bidder(struct archive_read *a, + void *bidder_data, + const char *name, + const struct archive_read_filter_bidder_vtable *vtable); const void *__archive_read_ahead(struct archive_read *, size_t, ssize_t *); const void *__archive_read_filter_ahead(struct archive_read_filter *, diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_format.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_format.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_format.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_format.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_options.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_options.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_options.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_options.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_options.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_options.c similarity index 85% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_options.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_options.c index 2e2eea6..2bd9b81 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_set_options.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_set_options.c @@ -112,37 +112,15 @@ static int archive_set_filter_option(struct archive *_a, const char *m, const char *o, const char *v) { - struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter *filter; - struct archive_read_filter_bidder *bidder; - int r, rv = ARCHIVE_WARN, matched_modules = 0; + (void)_a; /* UNUSED */ + (void)o; /* UNUSED */ + (void)v; /* UNUSED */ - for (filter = a->filter; filter != NULL; filter = filter->upstream) { - bidder = filter->bidder; - if (bidder == NULL) - continue; - if (bidder->options == NULL) - /* This bidder does not support option */ - continue; - if (m != NULL) { - if (strcmp(filter->name, m) != 0) - continue; - ++matched_modules; - } - - r = bidder->options(bidder, o, v); - - if (r == ARCHIVE_FATAL) - return (ARCHIVE_FATAL); - - if (r == ARCHIVE_OK) - rv = ARCHIVE_OK; - } /* If the filter name didn't match, return a special code for * _archive_set_option[s]. */ - if (m != NULL && matched_modules == 0) + if (m != NULL) return ARCHIVE_WARN - 1; - return (rv); + return ARCHIVE_WARN; } static int diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_all.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_all.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_all.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_all.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_by_code.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_by_code.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_by_code.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_by_code.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_bzip2.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_bzip2.c similarity index 93% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_bzip2.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_bzip2.c index 3885a7c..793d605 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_bzip2.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_bzip2.c @@ -70,7 +70,6 @@ static int bzip2_filter_close(struct archive_read_filter *); */ static int bzip2_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int bzip2_reader_init(struct archive_read_filter *); -static int bzip2_reader_free(struct archive_read_filter_bidder *); #if ARCHIVE_VERSION_NUMBER < 4000000 /* Deprecated; remove in libarchive 4.0 */ @@ -81,24 +80,21 @@ archive_read_support_compression_bzip2(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +bzip2_bidder_vtable = { + .bid = bzip2_reader_bid, + .init = bzip2_reader_init, +}; + int archive_read_support_filter_bzip2(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *reader; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_bzip2"); - - if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "bzip2", + &bzip2_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - reader->data = NULL; - reader->name = "bzip2"; - reader->bid = bzip2_reader_bid; - reader->init = bzip2_reader_init; - reader->options = NULL; - reader->free = bzip2_reader_free; #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR) return (ARCHIVE_OK); #else @@ -108,12 +104,6 @@ archive_read_support_filter_bzip2(struct archive *_a) #endif } -static int -bzip2_reader_free(struct archive_read_filter_bidder *self){ - (void)self; /* UNUSED */ - return (ARCHIVE_OK); -} - /* * Test whether we can handle this data. * @@ -183,6 +173,12 @@ bzip2_reader_init(struct archive_read_filter *self) #else +static const struct archive_read_filter_vtable +bzip2_reader_vtable = { + .read = bzip2_filter_read, + .close = bzip2_filter_close, +}; + /* * Setup the callbacks. */ @@ -209,9 +205,7 @@ bzip2_reader_init(struct archive_read_filter *self) self->data = state; state->out_block_size = out_block_size; state->out_block = out_block; - self->read = bzip2_filter_read; - self->skip = NULL; /* not supported */ - self->close = bzip2_filter_close; + self->vtable = &bzip2_reader_vtable; return (ARCHIVE_OK); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_compress.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_compress.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_compress.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_compress.c index e05132d..05b80a5 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_compress.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_compress.c @@ -133,7 +133,6 @@ struct private_data { static int compress_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int compress_bidder_init(struct archive_read_filter *); -static int compress_bidder_free(struct archive_read_filter_bidder *); static ssize_t compress_filter_read(struct archive_read_filter *, const void **); static int compress_filter_close(struct archive_read_filter *); @@ -150,25 +149,19 @@ archive_read_support_compression_compress(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +compress_bidder_vtable = { + .bid = compress_bidder_bid, + .init = compress_bidder_init, +}; + int archive_read_support_filter_compress(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_compress"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) - return (ARCHIVE_FATAL); - - bidder->data = NULL; - bidder->name = "compress (.Z)"; - bidder->bid = compress_bidder_bid; - bidder->init = compress_bidder_init; - bidder->options = NULL; - bidder->free = compress_bidder_free; - return (ARCHIVE_OK); + return __archive_read_register_bidder(a, NULL, "compress (.Z)", + &compress_bidder_vtable); } /* @@ -205,6 +198,12 @@ compress_bidder_bid(struct archive_read_filter_bidder *self, return (bits_checked); } +static const struct archive_read_filter_vtable +compress_reader_vtable = { + .read = compress_filter_read, + .close = compress_filter_close, +}; + /* * Setup the callbacks. */ @@ -233,9 +232,7 @@ compress_bidder_init(struct archive_read_filter *self) self->data = state; state->out_block_size = out_block_size; state->out_block = out_block; - self->read = compress_filter_read; - self->skip = NULL; /* not supported */ - self->close = compress_filter_close; + self->vtable = &compress_reader_vtable; /* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */ @@ -305,16 +302,6 @@ compress_filter_read(struct archive_read_filter *self, const void **pblock) return (p - start); } -/* - * Clean up the reader. - */ -static int -compress_bidder_free(struct archive_read_filter_bidder *self) -{ - self->data = NULL; - return (ARCHIVE_OK); -} - /* * Close and release the filter. */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_grzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c similarity index 86% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_grzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c index 84c86ae..d4d1737 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_grzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c @@ -54,30 +54,21 @@ static int grzip_bidder_bid(struct archive_read_filter_bidder *, static int grzip_bidder_init(struct archive_read_filter *); -static int -grzip_reader_free(struct archive_read_filter_bidder *self) -{ - (void)self; /* UNUSED */ - return (ARCHIVE_OK); -} +static const struct archive_read_filter_bidder_vtable +grzip_bidder_vtable = { + .bid = grzip_bidder_bid, + .init = grzip_bidder_init, +}; int archive_read_support_filter_grzip(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *reader; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_grzip"); - - if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, NULL, + &grzip_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - reader->data = NULL; - reader->bid = grzip_bidder_bid; - reader->init = grzip_bidder_init; - reader->options = NULL; - reader->free = grzip_reader_free; /* This filter always uses an external program. */ archive_set_error(_a, ARCHIVE_ERRNO_MISC, "Using external grzip program for grzip decompression"); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_gzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_gzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c index 9fa9e2b..4135a63 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_gzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c @@ -94,24 +94,21 @@ archive_read_support_compression_gzip(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +gzip_bidder_vtable = { + .bid = gzip_bidder_bid, + .init = gzip_bidder_init, +}; + int archive_read_support_filter_gzip(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_gzip"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "gzip", + &gzip_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - bidder->data = NULL; - bidder->name = "gzip"; - bidder->bid = gzip_bidder_bid; - bidder->init = gzip_bidder_init; - bidder->options = NULL; - bidder->free = NULL; /* No data, so no cleanup necessary. */ /* Signal the extent of gzip support with the return value here. */ #if HAVE_ZLIB_H return (ARCHIVE_OK); @@ -291,6 +288,15 @@ gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry) return (ARCHIVE_OK); } +static const struct archive_read_filter_vtable +gzip_reader_vtable = { + .read = gzip_filter_read, + .close = gzip_filter_close, +#ifdef HAVE_ZLIB_H + .read_header = gzip_read_header, +#endif +}; + /* * Initialize the filter object. */ @@ -317,12 +323,7 @@ gzip_bidder_init(struct archive_read_filter *self) self->data = state; state->out_block_size = out_block_size; state->out_block = out_block; - self->read = gzip_filter_read; - self->skip = NULL; /* not supported */ - self->close = gzip_filter_close; -#ifdef HAVE_ZLIB_H - self->read_header = gzip_read_header; -#endif + self->vtable = &gzip_reader_vtable; state->in_stream = 0; /* We're not actually within a stream yet. */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lrzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c similarity index 86% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lrzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c index c82a8e2..a238989 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lrzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c @@ -53,31 +53,21 @@ static int lrzip_bidder_bid(struct archive_read_filter_bidder *, static int lrzip_bidder_init(struct archive_read_filter *); -static int -lrzip_reader_free(struct archive_read_filter_bidder *self) -{ - (void)self; /* UNUSED */ - return (ARCHIVE_OK); -} +static const struct archive_read_filter_bidder_vtable +lrzip_bidder_vtable = { + .bid = lrzip_bidder_bid, + .init = lrzip_bidder_init, +}; int archive_read_support_filter_lrzip(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *reader; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_lrzip"); - - if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "lrzip", + &lrzip_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - reader->data = NULL; - reader->name = "lrzip"; - reader->bid = lrzip_bidder_bid; - reader->init = lrzip_bidder_init; - reader->options = NULL; - reader->free = lrzip_reader_free; /* This filter always uses an external program. */ archive_set_error(_a, ARCHIVE_ERRNO_MISC, "Using external lrzip program for lrzip decompression"); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lz4.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lz4.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c index 43ee6c2..1e99542 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lz4.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c @@ -99,7 +99,6 @@ static int lz4_filter_close(struct archive_read_filter *); */ static int lz4_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int lz4_reader_init(struct archive_read_filter *); -static int lz4_reader_free(struct archive_read_filter_bidder *); #if defined(HAVE_LIBLZ4) static ssize_t lz4_filter_read_default_stream(struct archive_read_filter *, const void **); @@ -107,24 +106,21 @@ static ssize_t lz4_filter_read_legacy_stream(struct archive_read_filter *, const void **); #endif +static const struct archive_read_filter_bidder_vtable +lz4_bidder_vtable = { + .bid = lz4_reader_bid, + .init = lz4_reader_init, +}; + int archive_read_support_filter_lz4(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *reader; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_lz4"); - - if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "lz4", + &lz4_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - reader->data = NULL; - reader->name = "lz4"; - reader->bid = lz4_reader_bid; - reader->init = lz4_reader_init; - reader->options = NULL; - reader->free = lz4_reader_free; #if defined(HAVE_LIBLZ4) return (ARCHIVE_OK); #else @@ -134,12 +130,6 @@ archive_read_support_filter_lz4(struct archive *_a) #endif } -static int -lz4_reader_free(struct archive_read_filter_bidder *self){ - (void)self; /* UNUSED */ - return (ARCHIVE_OK); -} - /* * Test whether we can handle this data. * @@ -218,6 +208,12 @@ lz4_reader_init(struct archive_read_filter *self) #else +static const struct archive_read_filter_vtable +lz4_reader_vtable = { + .read = lz4_filter_read, + .close = lz4_filter_close, +}; + /* * Setup the callbacks. */ @@ -238,9 +234,7 @@ lz4_reader_init(struct archive_read_filter *self) self->data = state; state->stage = SELECT_STREAM; - self->read = lz4_filter_read; - self->skip = NULL; /* not supported */ - self->close = lz4_filter_close; + self->vtable = &lz4_reader_vtable; return (ARCHIVE_OK); } @@ -456,7 +450,9 @@ lz4_filter_read_descriptor(struct archive_read_filter *self) chsum = (chsum >> 8) & 0xff; chsum_verifier = read_buf[descriptor_bytes-1] & 0xff; if (chsum != chsum_verifier) +#ifndef DONT_FAIL_ON_CRC_ERROR goto malformed_error; +#endif __archive_read_filter_consume(self->upstream, descriptor_bytes); @@ -527,7 +523,9 @@ lz4_filter_read_data_block(struct archive_read_filter *self, const void **p) unsigned int chsum_block = archive_le32dec(read_buf + 4 + compressed_size); if (chsum != chsum_block) +#ifndef DONT_FAIL_ON_CRC_ERROR goto malformed_error; +#endif } @@ -658,10 +656,12 @@ lz4_filter_read_default_stream(struct archive_read_filter *self, const void **p) state->xxh32_state); state->xxh32_state = NULL; if (checksum != checksum_stream) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, "lz4 stream checksum error"); return (ARCHIVE_FATAL); +#endif } } else if (ret > 0) __archive_xxhash.XXH32_update(state->xxh32_state, diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lzop.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lzop.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c index a1c392f..4ebdd3b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_lzop.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c @@ -101,23 +101,21 @@ static int lzop_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int lzop_bidder_init(struct archive_read_filter *); +static const struct archive_read_filter_bidder_vtable +lzop_bidder_vtable = { + .bid = lzop_bidder_bid, + .init = lzop_bidder_init, +}; + int archive_read_support_filter_lzop(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *reader; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_lzop"); - - if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, NULL, + &lzop_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - reader->data = NULL; - reader->bid = lzop_bidder_bid; - reader->init = lzop_bidder_init; - reader->options = NULL; - reader->free = NULL; /* Signal the extent of lzop support with the return value here. */ #if defined(HAVE_LZO_LZOCONF_H) && defined(HAVE_LZO_LZO1X_H) return (ARCHIVE_OK); @@ -171,6 +169,13 @@ lzop_bidder_init(struct archive_read_filter *self) return (r); } #else + +static const struct archive_read_filter_vtable +lzop_reader_vtable = { + .read = lzop_filter_read, + .close = lzop_filter_close +}; + /* * Initialize the filter object. */ @@ -190,9 +195,7 @@ lzop_bidder_init(struct archive_read_filter *self) } self->data = state; - self->read = lzop_filter_read; - self->skip = NULL; /* not supported */ - self->close = lzop_filter_close; + self->vtable = &lzop_reader_vtable; return (ARCHIVE_OK); } @@ -280,7 +283,9 @@ consume_header(struct archive_read_filter *self) else checksum = adler32(adler32(0, NULL, 0), p, len); if (archive_be32dec(p + len) != checksum) +#ifndef DONT_FAIL_ON_CRC_ERROR goto corrupted; +#endif __archive_read_filter_consume(self->upstream, len + 4); if (flags & EXTRA_FIELD) { /* Skip extra field */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_none.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_none.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_none.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_none.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_program.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_program.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_program.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_program.c index bf5b6f2..885b2c2 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_program.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_program.c @@ -98,7 +98,7 @@ struct program_bidder { static int program_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *upstream); static int program_bidder_init(struct archive_read_filter *); -static int program_bidder_free(struct archive_read_filter_bidder *); +static void program_bidder_free(struct archive_read_filter_bidder *); /* * The actual filter needs to track input and output data. @@ -123,42 +123,20 @@ static ssize_t program_filter_read(struct archive_read_filter *, static int program_filter_close(struct archive_read_filter *); static void free_state(struct program_bidder *); -static int -set_bidder_signature(struct archive_read_filter_bidder *bidder, - struct program_bidder *state, const void *signature, size_t signature_len) -{ - - if (signature != NULL && signature_len > 0) { - state->signature_len = signature_len; - state->signature = malloc(signature_len); - memcpy(state->signature, signature, signature_len); - } - - /* - * Fill in the bidder object. - */ - bidder->data = state; - bidder->bid = program_bidder_bid; - bidder->init = program_bidder_init; - bidder->options = NULL; - bidder->free = program_bidder_free; - return (ARCHIVE_OK); -} +static const struct archive_read_filter_bidder_vtable +program_bidder_vtable = { + .bid = program_bidder_bid, + .init = program_bidder_init, + .free = program_bidder_free, +}; int archive_read_support_filter_program_signature(struct archive *_a, const char *cmd, const void *signature, size_t signature_len) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; struct program_bidder *state; - /* - * Get a bidder object from the read core. - */ - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) - return (ARCHIVE_FATAL); - /* * Allocate our private state. */ @@ -169,20 +147,31 @@ archive_read_support_filter_program_signature(struct archive *_a, if (state->cmd == NULL) goto memerr; - return set_bidder_signature(bidder, state, signature, signature_len); + if (signature != NULL && signature_len > 0) { + state->signature_len = signature_len; + state->signature = malloc(signature_len); + memcpy(state->signature, signature, signature_len); + } + + if (__archive_read_register_bidder(a, state, NULL, + &program_bidder_vtable) != ARCHIVE_OK) { + free_state(state); + return (ARCHIVE_FATAL); + } + return (ARCHIVE_OK); + memerr: free_state(state); archive_set_error(_a, ENOMEM, "Can't allocate memory"); return (ARCHIVE_FATAL); } -static int +static void program_bidder_free(struct archive_read_filter_bidder *self) { struct program_bidder *state = (struct program_bidder *)self->data; free_state(state); - return (ARCHIVE_OK); } static void @@ -393,6 +382,12 @@ child_read(struct archive_read_filter *self, char *buf, size_t buf_len) } } +static const struct archive_read_filter_vtable +program_reader_vtable = { + .read = program_filter_read, + .close = program_filter_close, +}; + int __archive_read_program(struct archive_read_filter *self, const char *cmd) { @@ -439,9 +434,7 @@ __archive_read_program(struct archive_read_filter *self, const char *cmd) } self->data = state; - self->read = program_filter_read; - self->skip = NULL; - self->close = program_filter_close; + self->vtable = &program_reader_vtable; /* XXX Check that we can read at least one byte? */ return (ARCHIVE_OK); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_rpm.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_rpm.c similarity index 92% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_rpm.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_rpm.c index ddd6839..67a979c 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_rpm.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_rpm.c @@ -72,25 +72,19 @@ archive_read_support_compression_rpm(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +rpm_bidder_vtable = { + .bid = rpm_bidder_bid, + .init = rpm_bidder_init, +}; + int archive_read_support_filter_rpm(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_rpm"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) - return (ARCHIVE_FATAL); - - bidder->data = NULL; - bidder->name = "rpm"; - bidder->bid = rpm_bidder_bid; - bidder->init = rpm_bidder_init; - bidder->options = NULL; - bidder->free = NULL; - return (ARCHIVE_OK); + return __archive_read_register_bidder(a, NULL, "rpm", + &rpm_bidder_vtable); } static int @@ -133,6 +127,12 @@ rpm_bidder_bid(struct archive_read_filter_bidder *self, return (bits_checked); } +static const struct archive_read_filter_vtable +rpm_reader_vtable = { + .read = rpm_filter_read, + .close = rpm_filter_close, +}; + static int rpm_bidder_init(struct archive_read_filter *self) { @@ -140,9 +140,6 @@ rpm_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_RPM; self->name = "rpm"; - self->read = rpm_filter_read; - self->skip = NULL; /* not supported */ - self->close = rpm_filter_close; rpm = (struct rpm *)calloc(sizeof(*rpm), 1); if (rpm == NULL) { @@ -153,6 +150,7 @@ rpm_bidder_init(struct archive_read_filter *self) self->data = rpm; rpm->state = ST_LEAD; + self->vtable = &rpm_reader_vtable; return (ARCHIVE_OK); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_uu.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_uu.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_uu.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_uu.c index 689c18c..209b2a1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_uu.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_uu.c @@ -76,25 +76,19 @@ archive_read_support_compression_uu(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +uudecode_bidder_vtable = { + .bid = uudecode_bidder_bid, + .init = uudecode_bidder_init, +}; + int archive_read_support_filter_uu(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_uu"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) - return (ARCHIVE_FATAL); - - bidder->data = NULL; - bidder->name = "uu"; - bidder->bid = uudecode_bidder_bid; - bidder->init = uudecode_bidder_init; - bidder->options = NULL; - bidder->free = NULL; - return (ARCHIVE_OK); + return __archive_read_register_bidder(a, NULL, "uu", + &uudecode_bidder_vtable); } static const unsigned char ascii[256] = { @@ -357,6 +351,12 @@ uudecode_bidder_bid(struct archive_read_filter_bidder *self, return (0); } +static const struct archive_read_filter_vtable +uudecode_reader_vtable = { + .read = uudecode_filter_read, + .close = uudecode_filter_close, +}; + static int uudecode_bidder_init(struct archive_read_filter *self) { @@ -366,9 +366,6 @@ uudecode_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_UU; self->name = "uu"; - self->read = uudecode_filter_read; - self->skip = NULL; /* not supported */ - self->close = uudecode_filter_close; uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1); out_buff = malloc(OUT_BUFF_SIZE); @@ -388,6 +385,7 @@ uudecode_bidder_init(struct archive_read_filter *self) uudecode->in_allocated = IN_BUFF_SIZE; uudecode->out_buff = out_buff; uudecode->state = ST_FIND_HEAD; + self->vtable = &uudecode_reader_vtable; return (ARCHIVE_OK); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_xz.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_xz.c similarity index 93% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_xz.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_xz.c index 11807cf..e313d39 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_xz.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_xz.c @@ -108,24 +108,21 @@ archive_read_support_compression_xz(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +xz_bidder_vtable = { + .bid = xz_bidder_bid, + .init = xz_bidder_init, +}; + int archive_read_support_filter_xz(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_xz"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "xz", + &xz_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - bidder->data = NULL; - bidder->name = "xz"; - bidder->bid = xz_bidder_bid; - bidder->init = xz_bidder_init; - bidder->options = NULL; - bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA return (ARCHIVE_OK); #else @@ -143,24 +140,21 @@ archive_read_support_compression_lzma(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +lzma_bidder_vtable = { + .bid = lzma_bidder_bid, + .init = lzma_bidder_init, +}; + int archive_read_support_filter_lzma(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_lzma"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "lzma", + &lzma_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - bidder->data = NULL; - bidder->name = "lzma"; - bidder->bid = lzma_bidder_bid; - bidder->init = lzma_bidder_init; - bidder->options = NULL; - bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA return (ARCHIVE_OK); #else @@ -179,24 +173,21 @@ archive_read_support_compression_lzip(struct archive *a) } #endif +static const struct archive_read_filter_bidder_vtable +lzip_bidder_vtable = { + .bid = lzip_bidder_bid, + .init = lzip_bidder_init, +}; + int archive_read_support_filter_lzip(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_lzip"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "lzip", + &lzip_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - bidder->data = NULL; - bidder->name = "lzip"; - bidder->bid = lzip_bidder_bid; - bidder->init = lzip_bidder_init; - bidder->options = NULL; - bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA return (ARCHIVE_OK); #else @@ -293,8 +284,8 @@ lzma_bidder_bid(struct archive_read_filter_bidder *self, /* Second through fifth bytes are dictionary size, stored in * little-endian order. The minimum dictionary size is * 1 << 12(4KiB) which the lzma of LZMA SDK uses with option - * -d12 and the maximum dictionary size is 1 << 27(128MiB) - * which the one uses with option -d27. + * -d12 and the maximum dictionary size is 1 << 29(512MiB) + * which the one uses with option -d29. * NOTE: A comment of LZMA SDK source code says this dictionary * range is from 1 << 12 to 1 << 30. */ dicsize = archive_le32dec(buffer+1); @@ -377,7 +368,7 @@ lzip_has_member(struct archive_read_filter *filter) /* Dictionary size. */ log2dic = buffer[5] & 0x1f; - if (log2dic < 12 || log2dic > 27) + if (log2dic < 12 || log2dic > 29) return (0); bits_checked += 8; @@ -470,6 +461,12 @@ set_error(struct archive_read_filter *self, int ret) } } +static const struct archive_read_filter_vtable +xz_lzma_reader_vtable = { + .read = xz_filter_read, + .close = xz_filter_close, +}; + /* * Setup the callbacks. */ @@ -494,9 +491,7 @@ xz_lzma_bidder_init(struct archive_read_filter *self) self->data = state; state->out_block_size = out_block_size; state->out_block = out_block; - self->read = xz_filter_read; - self->skip = NULL; /* not supported */ - self->close = xz_filter_close; + self->vtable = &xz_lzma_reader_vtable; state->stream.avail_in = 0; @@ -562,7 +557,7 @@ lzip_init(struct archive_read_filter *self) /* Get dictionary size. */ log2dic = h[5] & 0x1f; - if (log2dic < 12 || log2dic > 27) + if (log2dic < 12 || log2dic > 29) return (ARCHIVE_FATAL); dicsize = 1U << log2dic; if (log2dic > 12) @@ -617,9 +612,11 @@ lzip_tail(struct archive_read_filter *self) /* Check the crc32 value of the uncompressed data of the current * member */ if (state->crc32 != archive_le32dec(f)) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, "Lzip: CRC32 error"); return (ARCHIVE_FAILED); +#endif } /* Check the uncompressed size of the current member */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_zstd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c similarity index 93% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_zstd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c index af7eeb7..39f25f1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_filter_zstd.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c @@ -79,24 +79,21 @@ static int zstd_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int zstd_bidder_init(struct archive_read_filter *); +static const struct archive_read_filter_bidder_vtable +zstd_bidder_vtable = { + .bid = zstd_bidder_bid, + .init = zstd_bidder_init, +}; + int archive_read_support_filter_zstd(struct archive *_a) { struct archive_read *a = (struct archive_read *)_a; - struct archive_read_filter_bidder *bidder; - archive_check_magic(_a, ARCHIVE_READ_MAGIC, - ARCHIVE_STATE_NEW, "archive_read_support_filter_zstd"); - - if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK) + if (__archive_read_register_bidder(a, NULL, "zstd", + &zstd_bidder_vtable) != ARCHIVE_OK) return (ARCHIVE_FATAL); - bidder->data = NULL; - bidder->name = "zstd"; - bidder->bid = zstd_bidder_bid; - bidder->init = zstd_bidder_init; - bidder->options = NULL; - bidder->free = NULL; #if HAVE_ZSTD_H && HAVE_LIBZSTD return (ARCHIVE_OK); #else @@ -160,6 +157,12 @@ zstd_bidder_init(struct archive_read_filter *self) #else +static const struct archive_read_filter_vtable +zstd_reader_vtable = { + .read = zstd_filter_read, + .close = zstd_filter_close, +}; + /* * Initialize the filter object */ @@ -192,9 +195,7 @@ zstd_bidder_init(struct archive_read_filter *self) state->out_block_size = out_block_size; state->out_block = out_block; state->dstream = dstream; - self->read = zstd_filter_read; - self->skip = NULL; /* not supported */ - self->close = zstd_filter_close; + self->vtable = &zstd_reader_vtable; state->eof = 0; state->in_frame = 0; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_7zip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_7zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c index 63cbb7d..0ba4bee 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_7zip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c @@ -287,6 +287,7 @@ struct _7zip { const unsigned char *next_in; int64_t avail_in; int64_t total_in; + int64_t stream_in; unsigned char *next_out; int64_t avail_out; int64_t total_out; @@ -775,7 +776,7 @@ archive_read_format_7zip_read_header(struct archive_read *a, } /* Set up a more descriptive format name. */ - sprintf(zip->format_name, "7-Zip"); + snprintf(zip->format_name, sizeof(zip->format_name), "7-Zip"); a->archive.archive_format_name = zip->format_name; return (ret); @@ -986,15 +987,30 @@ ppmd_read(void *p) struct _7zip *zip = (struct _7zip *)(a->format->data); Byte b; - if (zip->ppstream.avail_in == 0) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Truncated RAR file data"); - zip->ppstream.overconsumed = 1; - return (0); + if (zip->ppstream.avail_in <= 0) { + /* + * Ppmd7_DecodeSymbol might require reading multiple bytes + * and we are on boundary; + * last resort to read using __archive_read_ahead. + */ + ssize_t bytes_avail = 0; + const uint8_t* data = __archive_read_ahead(a, + zip->ppstream.stream_in+1, &bytes_avail); + if(bytes_avail < zip->ppstream.stream_in+1) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated 7z file data"); + zip->ppstream.overconsumed = 1; + return (0); + } + zip->ppstream.next_in++; + b = data[zip->ppstream.stream_in]; + } else { + b = *zip->ppstream.next_in++; } - b = *zip->ppstream.next_in++; zip->ppstream.avail_in--; zip->ppstream.total_in++; + zip->ppstream.stream_in++; return (b); } @@ -1485,6 +1501,7 @@ decompress(struct archive_read *a, struct _7zip *zip, } zip->ppstream.next_in = t_next_in; zip->ppstream.avail_in = t_avail_in; + zip->ppstream.stream_in = 0; zip->ppstream.next_out = t_next_out; zip->ppstream.avail_out = t_avail_out; if (zip->ppmd7_stat == 0) { @@ -2840,8 +2857,10 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* CRC check. */ if (crc32(0, (const unsigned char *)p + 12, 20) != archive_le32dec(p + 8)) { +#ifdef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, -1, "Header CRC error"); return (ARCHIVE_FATAL); +#endif } next_header_offset = archive_le64dec(p + 12); @@ -2891,8 +2910,10 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* Check the EncodedHeader CRC.*/ if (r == 0 && zip->header_crc32 != next_header_crc) { archive_set_error(&a->archive, -1, +#ifndef DONT_FAIL_ON_CRC_ERROR "Damaged 7-Zip archive"); r = -1; +#endif } if (r == 0) { if (zip->si.ci.folders[0].digest_defined) @@ -2943,9 +2964,11 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* Check the Header CRC.*/ if (check_header_crc && zip->header_crc32 != next_header_crc) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, -1, "Malformed 7-Zip archive"); return (ARCHIVE_FATAL); +#endif } break; default: diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_all.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_all.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_all.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_all.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_ar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_ar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_ar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_ar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_by_code.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_by_code.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_by_code.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_by_code.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_cab.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_cab.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c index 950f3d2..4d5029b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_cab.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c @@ -996,7 +996,7 @@ archive_read_format_cab_read_header(struct archive_read *a, cab->end_of_entry_cleanup = cab->end_of_entry = 1; /* Set up a more descriptive format name. */ - sprintf(cab->format_name, "CAB %d.%d (%s)", + snprintf(cab->format_name, sizeof(cab->format_name), "CAB %d.%d (%s)", hd->major, hd->minor, cab->entry_cffolder->compname); a->archive.archive_format_name = cab->format_name; @@ -1134,7 +1134,7 @@ cab_checksum_update(struct archive_read *a, size_t bytes) } if (sumbytes) { int odd = sumbytes & 3; - if (sumbytes - odd > 0) + if ((int)(sumbytes - odd) > 0) cfdata->sum_calculated = cab_checksum_cfdata_4( p, sumbytes - odd, cfdata->sum_calculated); if (odd) @@ -1171,12 +1171,14 @@ cab_checksum_finish(struct archive_read *a) cfdata->sum_calculated = cab_checksum_cfdata( cfdata->memimage + CFDATA_cbData, l, cfdata->sum_calculated); if (cfdata->sum_calculated != cfdata->sum) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Checksum error CFDATA[%d] %" PRIx32 ":%" PRIx32 " in %d bytes", cab->entry_cffolder->cfdata_index -1, cfdata->sum, cfdata->sum_calculated, cfdata->compressed_size); return (ARCHIVE_FAILED); +#endif } return (ARCHIVE_OK); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_cpio.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_cpio.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_cpio.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_cpio.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_iso9660.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_iso9660.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_iso9660.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_iso9660.c index db14d41..33bf330 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_iso9660.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_iso9660.c @@ -1007,7 +1007,8 @@ read_children(struct archive_read *a, struct file_info *parent) p = b; b += iso9660->logical_block_size; step -= iso9660->logical_block_size; - for (; *p != 0 && p < b && p + *p <= b; p += *p) { + for (; *p != 0 && p + DR_name_offset < b && p + *p <= b; + p += *p) { struct file_info *child; /* N.B.: these special directory identifiers @@ -1756,7 +1757,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, size_t name_len; const unsigned char *rr_start, *rr_end; const unsigned char *p; - size_t dr_len; + size_t dr_len = 0; uint64_t fsize, offset; int32_t location; int flags; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_lha.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_lha.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c index bff0f01..bcfd42e 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_lha.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c @@ -739,7 +739,7 @@ archive_read_format_lha_read_header(struct archive_read *a, if (lha->directory || lha->compsize == 0) lha->end_of_entry = 1; - sprintf(lha->format_name, "lha -%c%c%c-", + snprintf(lha->format_name, sizeof(lha->format_name), "lha -%c%c%c-", lha->method[0], lha->method[1], lha->method[2]); a->archive.archive_format_name = lha->format_name; @@ -1039,9 +1039,11 @@ lha_read_file_header_2(struct archive_read *a, struct lha *lha) } if (header_crc != lha->header_crc) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "LHa header CRC error"); return (ARCHIVE_FATAL); +#endif } return (err); } @@ -1107,9 +1109,11 @@ lha_read_file_header_3(struct archive_read *a, struct lha *lha) return (err); if (header_crc != lha->header_crc) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "LHa header CRC error"); return (ARCHIVE_FATAL); +#endif } return (err); invalid: diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_mtree.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_mtree.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c index c87a154..2bc3ba0 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_mtree.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c @@ -692,7 +692,7 @@ detect_form(struct archive_read *a, int *is_form_d) { const char *p; ssize_t avail, ravail; - ssize_t detected_bytes = 0, len, nl; + ssize_t len, nl; int entry_cnt = 0, multiline = 0; int form_D = 0;/* The archive is generated by `NetBSD mtree -D' * (In this source we call it `form D') . */ @@ -728,8 +728,6 @@ detect_form(struct archive_read *a, int *is_form_d) * character of previous line was '\' character. */ if (bid_keyword_list(p, len, 0, 0) <= 0) break; - if (multiline == 1) - detected_bytes += len; if (p[len-nl-1] != '\\') { if (multiline == 1 && ++entry_cnt >= MAX_BID_ENTRY) @@ -745,7 +743,6 @@ detect_form(struct archive_read *a, int *is_form_d) keywords = bid_entry(p, len, nl, &last_is_path); if (keywords >= 0) { - detected_bytes += len; if (form_D == 0) { if (last_is_path) form_D = 1; @@ -997,9 +994,11 @@ process_add_entry(struct archive_read *a, struct mtree *mtree, struct mtree_entry *alt; alt = (struct mtree_entry *)__archive_rb_tree_find_node( &mtree->rbtree, entry->name); - while (alt->next_dup) - alt = alt->next_dup; - alt->next_dup = entry; + if (alt != NULL) { + while (alt->next_dup) + alt = alt->next_dup; + alt->next_dup = entry; + } } } @@ -1074,7 +1073,7 @@ read_mtree(struct archive_read *a, struct mtree *mtree) continue; /* Non-printable characters are not allowed */ for (s = p;s < p + len - 1; s++) { - if (!isprint((unsigned char)*s)) { + if (!isprint((unsigned char)*s) && *s != '\t') { r = ARCHIVE_FATAL; break; } @@ -1253,9 +1252,17 @@ parse_file(struct archive_read *a, struct archive_entry *entry, archive_entry_filetype(entry) == AE_IFDIR) { mtree->fd = open(path, O_RDONLY | O_BINARY | O_CLOEXEC); __archive_ensure_cloexec_flag(mtree->fd); - if (mtree->fd == -1 && - (errno != ENOENT || - archive_strlen(&mtree->contents_name) > 0)) { + if (mtree->fd == -1 && ( +#if defined(_WIN32) && !defined(__CYGWIN__) + /* + * On Windows, attempting to open a file with an + * invalid name result in EINVAL (Error 22) + */ + (errno != ENOENT && errno != EINVAL) +#else + errno != ENOENT +#endif + || archive_strlen(&mtree->contents_name) > 0)) { archive_set_error(&a->archive, errno, "Can't open %s", path); r = ARCHIVE_WARN; @@ -1629,11 +1636,11 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, || strcmp(key, "contents") == 0) { parse_escapes(val, NULL); archive_strcpy(&mtree->contents_name, val); - break; + return (ARCHIVE_OK); } if (strcmp(key, "cksum") == 0) - break; - __LA_FALLTHROUGH; + return (ARCHIVE_OK); + break; case 'd': if (strcmp(key, "device") == 0) { /* stat(2) st_rdev field, e.g. the major/minor IDs @@ -1647,65 +1654,64 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, archive_entry_set_rdev(entry, dev); return r; } - __LA_FALLTHROUGH; + break; case 'f': if (strcmp(key, "flags") == 0) { *parsed_kws |= MTREE_HAS_FFLAGS; archive_entry_copy_fflags_text(entry, val); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'g': if (strcmp(key, "gid") == 0) { *parsed_kws |= MTREE_HAS_GID; archive_entry_set_gid(entry, mtree_atol(&val, 10)); - break; + return (ARCHIVE_OK); } if (strcmp(key, "gname") == 0) { *parsed_kws |= MTREE_HAS_GNAME; archive_entry_copy_gname(entry, val); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'i': if (strcmp(key, "inode") == 0) { archive_entry_set_ino(entry, mtree_atol(&val, 10)); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'l': if (strcmp(key, "link") == 0) { + parse_escapes(val, NULL); archive_entry_copy_symlink(entry, val); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'm': if (strcmp(key, "md5") == 0 || strcmp(key, "md5digest") == 0) { return parse_digest(a, entry, val, ARCHIVE_ENTRY_DIGEST_MD5); } if (strcmp(key, "mode") == 0) { - if (val[0] >= '0' && val[0] <= '7') { - *parsed_kws |= MTREE_HAS_PERM; - archive_entry_set_perm(entry, - (mode_t)mtree_atol(&val, 8)); - } else { + if (val[0] < '0' || val[0] > '7') { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Symbolic or non-octal mode \"%s\" unsupported", val); - return ARCHIVE_WARN; + return (ARCHIVE_WARN); } - break; + *parsed_kws |= MTREE_HAS_PERM; + archive_entry_set_perm(entry, (mode_t)mtree_atol(&val, 8)); + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'n': if (strcmp(key, "nlink") == 0) { *parsed_kws |= MTREE_HAS_NLINK; archive_entry_set_nlink(entry, (unsigned int)mtree_atol(&val, 10)); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'r': if (strcmp(key, "resdevice") == 0) { /* stat(2) st_dev field, e.g. the device ID where the @@ -1723,7 +1729,7 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, return parse_digest(a, entry, val, ARCHIVE_ENTRY_DIGEST_RMD160); } - __LA_FALLTHROUGH; + break; case 's': if (strcmp(key, "sha1") == 0 || strcmp(key, "sha1digest") == 0) { @@ -1747,9 +1753,9 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, } if (strcmp(key, "size") == 0) { archive_entry_set_size(entry, mtree_atol(&val, 10)); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 't': if (strcmp(key, "tags") == 0) { /* @@ -1757,7 +1763,7 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, * Ignore the tags for now, but the interface * should be extended to allow inclusion/exclusion. */ - break; + return (ARCHIVE_OK); } if (strcmp(key, "time") == 0) { int64_t m; @@ -1783,79 +1789,85 @@ parse_keyword(struct archive_read *a, struct mtree *mtree, else if (m < my_time_t_min) m = my_time_t_min; archive_entry_set_mtime(entry, (time_t)m, ns); - break; + return (ARCHIVE_OK); } if (strcmp(key, "type") == 0) { switch (val[0]) { case 'b': if (strcmp(val, "block") == 0) { - archive_entry_set_filetype(entry, AE_IFBLK); - break; + *parsed_kws |= MTREE_HAS_TYPE; + archive_entry_set_filetype(entry, + AE_IFBLK); + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'c': if (strcmp(val, "char") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; archive_entry_set_filetype(entry, AE_IFCHR); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'd': if (strcmp(val, "dir") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; archive_entry_set_filetype(entry, AE_IFDIR); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'f': if (strcmp(val, "fifo") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; archive_entry_set_filetype(entry, AE_IFIFO); - break; + return (ARCHIVE_OK); } if (strcmp(val, "file") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; archive_entry_set_filetype(entry, AE_IFREG); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; case 'l': if (strcmp(val, "link") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; archive_entry_set_filetype(entry, AE_IFLNK); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; default: - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Unrecognized file type \"%s\"; " - "assuming \"file\"", val); - archive_entry_set_filetype(entry, AE_IFREG); - return (ARCHIVE_WARN); + break; } - *parsed_kws |= MTREE_HAS_TYPE; - break; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Unrecognized file type \"%s\"; " + "assuming \"file\"", val); + archive_entry_set_filetype(entry, AE_IFREG); + return (ARCHIVE_WARN); } - __LA_FALLTHROUGH; + break; case 'u': if (strcmp(key, "uid") == 0) { *parsed_kws |= MTREE_HAS_UID; archive_entry_set_uid(entry, mtree_atol(&val, 10)); - break; + return (ARCHIVE_OK); } if (strcmp(key, "uname") == 0) { *parsed_kws |= MTREE_HAS_UNAME; archive_entry_copy_uname(entry, val); - break; + return (ARCHIVE_OK); } - __LA_FALLTHROUGH; + break; default: - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unrecognized key %s=%s", key, val); - return (ARCHIVE_WARN); + break; } - return (ARCHIVE_OK); + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unrecognized key %s=%s", key, val); + return (ARCHIVE_WARN); } static int diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c similarity index 79% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c index c2666b2..793e8e9 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c @@ -135,6 +135,16 @@ #define MAX_SYMBOL_LENGTH 0xF #define MAX_SYMBOLS 20 +/* Virtual Machine Properties */ +#define VM_MEMORY_SIZE 0x40000 +#define VM_MEMORY_MASK (VM_MEMORY_SIZE - 1) +#define PROGRAM_WORK_SIZE 0x3C000 +#define PROGRAM_GLOBAL_SIZE 0x2000 +#define PROGRAM_SYSTEM_GLOBAL_ADDRESS PROGRAM_WORK_SIZE +#define PROGRAM_SYSTEM_GLOBAL_SIZE 0x40 +#define PROGRAM_USER_GLOBAL_ADDRESS (PROGRAM_SYSTEM_GLOBAL_ADDRESS + PROGRAM_SYSTEM_GLOBAL_SIZE) +#define PROGRAM_USER_GLOBAL_SIZE (PROGRAM_GLOBAL_SIZE - PROGRAM_SYSTEM_GLOBAL_SIZE) + /* * Considering L1,L2 cache miss and a calling of write system-call, * the best size of the output buffer(uncompressed buffer) is 128K. @@ -213,6 +223,69 @@ struct data_block_offsets int64_t end_offset; }; +struct rar_program_code +{ + uint8_t *staticdata; + uint32_t staticdatalen; + uint8_t *globalbackup; + uint32_t globalbackuplen; + uint64_t fingerprint; + uint32_t usagecount; + uint32_t oldfilterlength; + struct rar_program_code *next; +}; + +struct rar_filter +{ + struct rar_program_code *prog; + uint32_t initialregisters[8]; + uint8_t *globaldata; + uint32_t globaldatalen; + size_t blockstartpos; + uint32_t blocklength; + uint32_t filteredblockaddress; + uint32_t filteredblocklength; + struct rar_filter *next; +}; + +struct memory_bit_reader +{ + const uint8_t *bytes; + size_t length; + size_t offset; + uint64_t bits; + int available; + int at_eof; +}; + +struct rar_virtual_machine +{ + uint32_t registers[8]; + uint8_t memory[VM_MEMORY_SIZE + sizeof(uint32_t)]; +}; + +struct rar_filters +{ + struct rar_virtual_machine *vm; + struct rar_program_code *progs; + struct rar_filter *stack; + int64_t filterstart; + uint32_t lastfilternum; + int64_t lastend; + uint8_t *bytes; + size_t bytes_ready; +}; + +struct audio_state +{ + int8_t weight[5]; + int16_t delta[4]; + int8_t lastdelta; + int error[11]; + int count; + uint8_t lastbyte; +}; + struct rar { /* Entries from main RAR header */ @@ -273,15 +346,16 @@ struct rar struct huffman_code lengthcode; unsigned char lengthtable[HUFFMAN_TABLE_SIZE]; struct lzss lzss; - char output_last_match; unsigned int lastlength; unsigned int lastoffset; unsigned int oldoffset[4]; unsigned int lastlowoffset; unsigned int numlowoffsetrepeats; - int64_t filterstart; char start_new_table; + /* Filters */ + struct rar_filters filters; + /* PPMd Variant H members */ char ppmd_valid; char ppmd_eod; @@ -343,23 +417,43 @@ static int read_symlink_stored(struct archive_read *, struct archive_entry *, static int read_data_stored(struct archive_read *, const void **, size_t *, int64_t *); static int read_data_compressed(struct archive_read *, const void **, size_t *, - int64_t *, size_t); + int64_t *, size_t); static int rar_br_preparation(struct archive_read *, struct rar_br *); static int parse_codes(struct archive_read *); static void free_codes(struct archive_read *); static int read_next_symbol(struct archive_read *, struct huffman_code *); static int create_code(struct archive_read *, struct huffman_code *, - unsigned char *, int, char); + unsigned char *, int, char); static int add_value(struct archive_read *, struct huffman_code *, int, int, int); static int new_node(struct huffman_code *); static int make_table(struct archive_read *, struct huffman_code *); static int make_table_recurse(struct archive_read *, struct huffman_code *, int, struct huffman_table_entry *, int, int); -static int64_t expand(struct archive_read *, int64_t); -static int copy_from_lzss_window(struct archive_read *, const void **, - int64_t, int); +static int expand(struct archive_read *, int64_t *); +static int copy_from_lzss_window_to_unp(struct archive_read *, const void **, + int64_t, int); static const void *rar_read_ahead(struct archive_read *, size_t, ssize_t *); +static int parse_filter(struct archive_read *, const uint8_t *, uint16_t, + uint8_t); +static int run_filters(struct archive_read *); +static void clear_filters(struct rar_filters *); +static struct rar_filter *create_filter(struct rar_program_code *, + const uint8_t *, uint32_t, + uint32_t[8], size_t, uint32_t); +static void delete_filter(struct rar_filter *filter); +static struct rar_program_code *compile_program(const uint8_t *, size_t); +static void delete_program_code(struct rar_program_code *prog); +static uint32_t membr_next_rarvm_number(struct memory_bit_reader *br); +static inline uint32_t membr_bits(struct memory_bit_reader *br, int bits); +static int membr_fill(struct memory_bit_reader *br, int bits); +static int read_filter(struct archive_read *, int64_t *); +static int rar_decode_byte(struct archive_read*, uint8_t *); +static int execute_filter(struct archive_read*, struct rar_filter *, + struct rar_virtual_machine *, size_t); +static int copy_from_lzss_window(struct archive_read *, void *, int64_t, int); +static inline void vm_write_32(struct rar_virtual_machine*, size_t, uint32_t); +static inline uint32_t vm_read_32(struct rar_virtual_machine*, size_t); /* * Bit stream reader. @@ -913,9 +1007,11 @@ archive_read_format_rar_read_header(struct archive_read *a, crc32_val = crc32(0, (const unsigned char *)p + 2, (unsigned)skip - 2); if ((crc32_val & 0xffff) != archive_le16dec(p)) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Header CRC error"); return (ARCHIVE_FATAL); +#endif } __archive_read_consume(a, skip); break; @@ -971,9 +1067,11 @@ archive_read_format_rar_read_header(struct archive_read *a, skip -= to_read; } if ((crc32_val & 0xffff) != crc32_expected) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Header CRC error"); return (ARCHIVE_FATAL); +#endif } if (head_type == ENDARC_HEAD) return (ARCHIVE_EOF); @@ -1244,6 +1342,7 @@ archive_read_format_rar_cleanup(struct archive_read *a) rar = (struct rar *)(a->format->data); free_codes(a); + clear_filters(&rar->filters); free(rar->filename); free(rar->filename_save); free(rar->dbo); @@ -1337,9 +1436,11 @@ read_header(struct archive_read *a, struct archive_entry *entry, /* File Header CRC check. */ crc32_val = crc32(crc32_val, h, (unsigned)(header_size - 7)); if ((crc32_val & 0xffff) != archive_le16dec(rar_header.crc)) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Header CRC error"); return (ARCHIVE_FATAL); +#endif } /* If no CRC error, Go on parsing File Header. */ p = h; @@ -1662,6 +1763,7 @@ read_header(struct archive_read *a, struct archive_entry *entry, memset(rar->lengthtable, 0, sizeof(rar->lengthtable)); __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context); rar->ppmd_valid = rar->ppmd_eod = 0; + rar->filters.filterstart = INT64_MAX; /* Don't set any archive entries for non-file header types */ if (head_type == NEWSUB_HEAD) @@ -1856,9 +1958,11 @@ read_data_stored(struct archive_read *a, const void **buff, size_t *size, *size = 0; *offset = rar->offset; if (rar->file_crc != rar->crc_calculated) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "File CRC error"); return (ARCHIVE_FATAL); +#endif } rar->entry_eof = 1; return (ARCHIVE_EOF); @@ -1886,13 +1990,13 @@ read_data_stored(struct archive_read *a, const void **buff, size_t *size, static int read_data_compressed(struct archive_read *a, const void **buff, size_t *size, - int64_t *offset, size_t looper) + int64_t *offset, size_t looper) { if (looper++ > MAX_COMPRESS_DEPTH) return (ARCHIVE_FATAL); struct rar *rar; - int64_t start, end, actualend; + int64_t start, end; size_t bs; int ret = (ARCHIVE_OK), sym, code, lzss_offset, length, i; @@ -1901,6 +2005,33 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, do { if (!rar->valid) return (ARCHIVE_FATAL); + + if (rar->filters.bytes_ready > 0) + { + /* Flush unp_buffer first */ + if (rar->unp_offset > 0) + { + *buff = rar->unp_buffer; + *size = rar->unp_offset; + rar->unp_offset = 0; + *offset = rar->offset_outgoing; + rar->offset_outgoing += *size; + } + else + { + *buff = rar->filters.bytes; + *size = rar->filters.bytes_ready; + + rar->offset += *size; + *offset = rar->offset_outgoing; + rar->offset_outgoing += *size; + + rar->filters.bytes_ready -= *size; + rar->filters.bytes += *size; + } + goto ending_block; + } + if (rar->ppmd_eod || (rar->dictionary_size && rar->offset >= rar->unp_size)) { @@ -1922,9 +2053,11 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, *size = 0; *offset = rar->offset; if (rar->file_crc != rar->crc_calculated) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "File CRC error"); return (ARCHIVE_FATAL); +#endif } rar->entry_eof = 1; return (ARCHIVE_EOF); @@ -1936,7 +2069,7 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, bs = rar->unp_buffer_size - rar->unp_offset; else bs = (size_t)rar->bytes_uncopied; - ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs); + ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs); if (ret != ARCHIVE_OK) return (ret); rar->offset += bs; @@ -1954,6 +2087,13 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, continue; } + if (rar->filters.lastend == rar->filters.filterstart) + { + if (!run_filters(a)) + return (ARCHIVE_FATAL); + continue; + } + if (!rar->br.next_in && (ret = rar_br_preparation(a, &(rar->br))) < ARCHIVE_WARN) return (ret); @@ -2045,13 +2185,17 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, { start = rar->offset; end = start + rar->dictionary_size; - rar->filterstart = INT64_MAX; + if (rar->filters.filterstart < end) { + end = rar->filters.filterstart; + } - if ((actualend = expand(a, end)) < 0) - return ((int)actualend); + ret = expand(a, &end); + if (ret != ARCHIVE_OK) + return (ret); - rar->bytes_uncopied = actualend - start; - if (rar->bytes_uncopied == 0) { + rar->bytes_uncopied = end - start; + rar->filters.lastend = end; + if (rar->filters.lastend != rar->filters.filterstart && rar->bytes_uncopied == 0) { /* Broken RAR files cause this case. * NOTE: If this case were possible on a normal RAR file * we would find out where it was actually bad and @@ -2065,7 +2209,7 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, bs = rar->unp_buffer_size - rar->unp_offset; else bs = (size_t)rar->bytes_uncopied; - ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs); + ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs); if (ret != ARCHIVE_OK) return (ret); rar->offset += bs; @@ -2080,6 +2224,7 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, *size = rar->unp_buffer_size; *offset = rar->offset_outgoing; rar->offset_outgoing += *size; +ending_block: /* Calculate File CRC. */ rar->crc_calculated = crc32(rar->crc_calculated, *buff, (unsigned)*size); return ret; @@ -2691,8 +2836,8 @@ make_table_recurse(struct archive_read *a, struct huffman_code *code, int node, return ret; } -static int64_t -expand(struct archive_read *a, int64_t end) +static int +expand(struct archive_read *a, int64_t *end) { static const unsigned char lengthbases[] = { 0, 1, 2, 3, 4, 5, 6, @@ -2739,25 +2884,22 @@ expand(struct archive_read *a, int64_t end) struct rar *rar = (struct rar *)(a->format->data); struct rar_br *br = &(rar->br); - if (rar->filterstart < end) - end = rar->filterstart; + if (rar->filters.filterstart < *end) + *end = rar->filters.filterstart; while (1) { - if (rar->output_last_match && - lzss_position(&rar->lzss) + rar->lastlength <= end) - { - lzss_emit_match(rar, rar->lastoffset, rar->lastlength); - rar->output_last_match = 0; + if(lzss_position(&rar->lzss) >= *end) { + return (ARCHIVE_OK); } - if(rar->is_ppmd_block || rar->output_last_match || - lzss_position(&rar->lzss) >= end) - return lzss_position(&rar->lzss); + if(rar->is_ppmd_block) { + *end = lzss_position(&rar->lzss); + return (ARCHIVE_OK); + } if ((symbol = read_next_symbol(a, &rar->maincode)) < 0) return (ARCHIVE_FATAL); - rar->output_last_match = 0; if (symbol < 256) { @@ -2778,7 +2920,8 @@ expand(struct archive_read *a, int64_t end) goto truncated_data; rar->start_new_table = rar_br_bits(br, 1); rar_br_consume(br, 1); - return lzss_position(&rar->lzss); + *end = lzss_position(&rar->lzss); + return (ARCHIVE_OK); } else { @@ -2789,9 +2932,9 @@ expand(struct archive_read *a, int64_t end) } else if(symbol==257) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Parsing filters is unsupported."); - return (ARCHIVE_FAILED); + if (!read_filter(a, end)) + return (ARCHIVE_FATAL); + continue; } else if(symbol==258) { @@ -2864,7 +3007,7 @@ expand(struct archive_read *a, int64_t end) goto truncated_data; offs += rar_br_bits(br, offsetbits[offssymbol] - 4) << 4; rar_br_consume(br, offsetbits[offssymbol] - 4); - } + } if(rar->numlowoffsetrepeats > 0) { @@ -2908,7 +3051,8 @@ expand(struct archive_read *a, int64_t end) rar->lastoffset = offs; rar->lastlength = len; - rar->output_last_match = 1; + + lzss_emit_match(rar, rar->lastoffset, rar->lastlength); } truncated_data: archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, @@ -2922,8 +3066,31 @@ bad_data: } static int -copy_from_lzss_window(struct archive_read *a, const void **buffer, - int64_t startpos, int length) +copy_from_lzss_window(struct archive_read *a, void *buffer, + int64_t startpos, int length) +{ + int windowoffs, firstpart; + struct rar *rar = (struct rar *)(a->format->data); + + windowoffs = lzss_offset_for_position(&rar->lzss, startpos); + firstpart = lzss_size(&rar->lzss) - windowoffs; + if (firstpart < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Bad RAR file data"); + return (ARCHIVE_FATAL); + } + if (firstpart < length) { + memcpy(buffer, &rar->lzss.window[windowoffs], firstpart); + memcpy(buffer, &rar->lzss.window[0], length - firstpart); + } else { + memcpy(buffer, &rar->lzss.window[windowoffs], length); + } + return (ARCHIVE_OK); +} + +static int +copy_from_lzss_window_to_unp(struct archive_read *a, const void **buffer, + int64_t startpos, int length) { int windowoffs, firstpart; struct rar *rar = (struct rar *)(a->format->data); @@ -3003,3 +3170,628 @@ rar_read_ahead(struct archive_read *a, size_t min, ssize_t *avail) } return h; } + +static int +parse_filter(struct archive_read *a, const uint8_t *bytes, uint16_t length, uint8_t flags) +{ + struct rar *rar = (struct rar *)(a->format->data); + struct rar_filters *filters = &rar->filters; + + struct memory_bit_reader br = { 0 }; + struct rar_program_code *prog; + struct rar_filter *filter, **nextfilter; + + uint32_t numprogs, num, blocklength, globaldatalen; + uint8_t *globaldata; + size_t blockstartpos; + uint32_t registers[8] = { 0 }; + uint32_t i; + + br.bytes = bytes; + br.length = length; + + numprogs = 0; + for (prog = filters->progs; prog; prog = prog->next) + numprogs++; + + if ((flags & 0x80)) + { + num = membr_next_rarvm_number(&br); + if (num == 0) + { + delete_filter(filters->stack); + filters->stack = NULL; + delete_program_code(filters->progs); + filters->progs = NULL; + } + else + num--; + if (num > numprogs) { + return 0; + } + filters->lastfilternum = num; + } + else + num = filters->lastfilternum; + + prog = filters->progs; + for (i = 0; i < num; i++) + prog = prog->next; + if (prog) + prog->usagecount++; + + blockstartpos = membr_next_rarvm_number(&br) + (size_t)lzss_position(&rar->lzss); + if ((flags & 0x40)) + blockstartpos += 258; + if ((flags & 0x20)) + blocklength = membr_next_rarvm_number(&br); + else + blocklength = prog ? prog->oldfilterlength : 0; + + registers[3] = PROGRAM_SYSTEM_GLOBAL_ADDRESS; + registers[4] = blocklength; + registers[5] = prog ? prog->usagecount : 0; + registers[7] = VM_MEMORY_SIZE; + + if ((flags & 0x10)) + { + uint8_t mask = (uint8_t)membr_bits(&br, 7); + for (i = 0; i < 7; i++) + if ((mask & (1 << i))) + registers[i] = membr_next_rarvm_number(&br); + } + + if (!prog) + { + uint32_t len = membr_next_rarvm_number(&br); + uint8_t *bytecode; + struct rar_program_code **next; + + if (len == 0 || len > 0x10000) + return 0; + bytecode = malloc(len); + if (!bytecode) + return 0; + for (i = 0; i < len; i++) + bytecode[i] = (uint8_t)membr_bits(&br, 8); + prog = compile_program(bytecode, len); + if (!prog) { + free(bytecode); + return 0; + } + free(bytecode); + next = &filters->progs; + while (*next) + next = &(*next)->next; + *next = prog; + } + prog->oldfilterlength = blocklength; + + globaldata = NULL; + globaldatalen = 0; + if ((flags & 0x08)) + { + globaldatalen = membr_next_rarvm_number(&br); + if (globaldatalen > PROGRAM_USER_GLOBAL_SIZE) + return 0; + globaldata = malloc(globaldatalen + PROGRAM_SYSTEM_GLOBAL_SIZE); + if (!globaldata) + return 0; + for (i = 0; i < globaldatalen; i++) + globaldata[i + PROGRAM_SYSTEM_GLOBAL_SIZE] = (uint8_t)membr_bits(&br, 8); + } + + if (br.at_eof) + { + free(globaldata); + return 0; + } + + filter = create_filter(prog, globaldata, globaldatalen, registers, blockstartpos, blocklength); + free(globaldata); + if (!filter) + return 0; + + for (i = 0; i < 7; i++) + archive_le32enc(&filter->globaldata[i * 4], registers[i]); + archive_le32enc(&filter->globaldata[0x1C], blocklength); + archive_le32enc(&filter->globaldata[0x20], 0); + archive_le32enc(&filter->globaldata[0x2C], prog->usagecount); + + nextfilter = &filters->stack; + while (*nextfilter) + nextfilter = &(*nextfilter)->next; + *nextfilter = filter; + + if (!filters->stack->next) + filters->filterstart = blockstartpos; + + return 1; +} + +static struct rar_filter * +create_filter(struct rar_program_code *prog, const uint8_t *globaldata, uint32_t globaldatalen, uint32_t registers[8], size_t startpos, uint32_t length) +{ + struct rar_filter *filter; + + filter = calloc(1, sizeof(*filter)); + if (!filter) + return NULL; + filter->prog = prog; + filter->globaldatalen = globaldatalen > PROGRAM_SYSTEM_GLOBAL_SIZE ? globaldatalen : PROGRAM_SYSTEM_GLOBAL_SIZE; + filter->globaldata = calloc(1, filter->globaldatalen); + if (!filter->globaldata) + return NULL; + if (globaldata) + memcpy(filter->globaldata, globaldata, globaldatalen); + if (registers) + memcpy(filter->initialregisters, registers, sizeof(filter->initialregisters)); + filter->blockstartpos = startpos; + filter->blocklength = length; + + return filter; +} + +static int +run_filters(struct archive_read *a) +{ + struct rar *rar = (struct rar *)(a->format->data); + struct rar_filters *filters = &rar->filters; + struct rar_filter *filter = filters->stack; + struct rar_filter *f; + size_t start, end; + int64_t tend; + uint32_t lastfilteraddress; + uint32_t lastfilterlength; + int ret; + + if (filters == NULL || filter == NULL) + return (0); + + start = filters->filterstart; + end = start + filter->blocklength; + + filters->filterstart = INT64_MAX; + tend = (int64_t)end; + ret = expand(a, &tend); + if (ret != ARCHIVE_OK) + return 0; + + /* Check if filter stack was modified in expand() */ + ret = ARCHIVE_FATAL; + f = filters->stack; + while (f) + { + if (f == filter) + { + ret = ARCHIVE_OK; + break; + } + f = f->next; + } + if (ret != ARCHIVE_OK) + return 0; + + if (tend < 0) + return 0; + end = (size_t)tend; + if (end != start + filter->blocklength) + return 0; + + if (!filters->vm) + { + filters->vm = calloc(1, sizeof(*filters->vm)); + if (!filters->vm) + return 0; + } + + ret = copy_from_lzss_window(a, filters->vm->memory, start, filter->blocklength); + if (ret != ARCHIVE_OK) + return 0; + if (!execute_filter(a, filter, filters->vm, rar->offset)) + return 0; + + lastfilteraddress = filter->filteredblockaddress; + lastfilterlength = filter->filteredblocklength; + filters->stack = filter->next; + filter->next = NULL; + delete_filter(filter); + + while ((filter = filters->stack) != NULL && (int64_t)filter->blockstartpos == filters->filterstart && filter->blocklength == lastfilterlength) + { + memmove(&filters->vm->memory[0], &filters->vm->memory[lastfilteraddress], lastfilterlength); + if (!execute_filter(a, filter, filters->vm, rar->offset)) + return 0; + + lastfilteraddress = filter->filteredblockaddress; + lastfilterlength = filter->filteredblocklength; + filters->stack = filter->next; + filter->next = NULL; + delete_filter(filter); + } + + if (filters->stack) + { + if (filters->stack->blockstartpos < end) + return 0; + filters->filterstart = filters->stack->blockstartpos; + } + + filters->lastend = end; + filters->bytes = &filters->vm->memory[lastfilteraddress]; + filters->bytes_ready = lastfilterlength; + + return 1; +} + +static struct rar_program_code * +compile_program(const uint8_t *bytes, size_t length) +{ + struct memory_bit_reader br = { 0 }; + struct rar_program_code *prog; + // uint32_t instrcount = 0; + uint8_t xor; + size_t i; + + xor = 0; + for (i = 1; i < length; i++) + xor ^= bytes[i]; + if (!length || xor != bytes[0]) + return NULL; + + br.bytes = bytes; + br.length = length; + br.offset = 1; + + prog = calloc(1, sizeof(*prog)); + if (!prog) + return NULL; + prog->fingerprint = crc32(0, bytes, length) | ((uint64_t)length << 32); + + if (membr_bits(&br, 1)) + { + prog->staticdatalen = membr_next_rarvm_number(&br) + 1; + prog->staticdata = malloc(prog->staticdatalen); + if (!prog->staticdata) + { + delete_program_code(prog); + return NULL; + } + for (i = 0; i < prog->staticdatalen; i++) + prog->staticdata[i] = (uint8_t)membr_bits(&br, 8); + } + + return prog; +} + +static void +delete_filter(struct rar_filter *filter) +{ + while (filter) + { + struct rar_filter *next = filter->next; + free(filter->globaldata); + free(filter); + filter = next; + } +} + +static void +clear_filters(struct rar_filters *filters) +{ + delete_filter(filters->stack); + delete_program_code(filters->progs); + free(filters->vm); +} + +static void +delete_program_code(struct rar_program_code *prog) +{ + while (prog) + { + struct rar_program_code *next = prog->next; + free(prog->staticdata); + free(prog->globalbackup); + free(prog); + prog = next; + } +} + +static uint32_t +membr_next_rarvm_number(struct memory_bit_reader *br) +{ + uint32_t val; + switch (membr_bits(br, 2)) + { + case 0: + return membr_bits(br, 4); + case 1: + val = membr_bits(br, 8); + if (val >= 16) + return val; + return 0xFFFFFF00 | (val << 4) | membr_bits(br, 4); + case 2: + return membr_bits(br, 16); + default: + return membr_bits(br, 32); + } +} + +static inline uint32_t +membr_bits(struct memory_bit_reader *br, int bits) +{ + if (bits > br->available && (br->at_eof || !membr_fill(br, bits))) + return 0; + return (uint32_t)((br->bits >> (br->available -= bits)) & (((uint64_t)1 << bits) - 1)); +} + +static int +membr_fill(struct memory_bit_reader *br, int bits) +{ + while (br->available < bits && br->offset < br->length) + { + br->bits = (br->bits << 8) | br->bytes[br->offset++]; + br->available += 8; + } + if (bits > br->available) + { + br->at_eof = 1; + return 0; + } + return 1; +} + +static int +read_filter(struct archive_read *a, int64_t *end) +{ + struct rar *rar = (struct rar *)(a->format->data); + uint8_t flags, val, *code; + uint16_t length, i; + + if (!rar_decode_byte(a, &flags)) + return 0; + length = (flags & 0x07) + 1; + if (length == 7) + { + if (!rar_decode_byte(a, &val)) + return 0; + length = val + 7; + } + else if (length == 8) + { + if (!rar_decode_byte(a, &val)) + return 0; + length = val << 8; + if (!rar_decode_byte(a, &val)) + return 0; + length |= val; + } + + code = malloc(length); + if (!code) + return 0; + for (i = 0; i < length; i++) + { + if (!rar_decode_byte(a, &code[i])) + { + free(code); + return 0; + } + } + if (!parse_filter(a, code, length, flags)) + { + free(code); + return 0; + } + free(code); + + if (rar->filters.filterstart < *end) + *end = rar->filters.filterstart; + + return 1; +} + +static int +execute_filter_delta(struct rar_filter *filter, struct rar_virtual_machine *vm) +{ + uint32_t length = filter->initialregisters[4]; + uint32_t numchannels = filter->initialregisters[0]; + uint8_t *src, *dst; + uint32_t i, idx; + + if (length > PROGRAM_WORK_SIZE / 2) + return 0; + + src = &vm->memory[0]; + dst = &vm->memory[length]; + for (i = 0; i < numchannels; i++) + { + uint8_t lastbyte = 0; + for (idx = i; idx < length; idx += numchannels) + lastbyte = dst[idx] = lastbyte - *src++; + } + + filter->filteredblockaddress = length; + filter->filteredblocklength = length; + + return 1; +} + +static int +execute_filter_e8(struct rar_filter *filter, struct rar_virtual_machine *vm, size_t pos, int e9also) +{ + uint32_t length = filter->initialregisters[4]; + uint32_t filesize = 0x1000000; + uint32_t i; + + if (length > PROGRAM_WORK_SIZE || length < 4) + return 0; + + for (i = 0; i <= length - 5; i++) + { + if (vm->memory[i] == 0xE8 || (e9also && vm->memory[i] == 0xE9)) + { + uint32_t currpos = (uint32_t)pos + i + 1; + int32_t address = (int32_t)vm_read_32(vm, i + 1); + if (address < 0 && currpos >= (uint32_t)-address) + vm_write_32(vm, i + 1, address + filesize); + else if (address >= 0 && (uint32_t)address < filesize) + vm_write_32(vm, i + 1, address - currpos); + i += 4; + } + } + + filter->filteredblockaddress = 0; + filter->filteredblocklength = length; + + return 1; +} + +static int +execute_filter_rgb(struct rar_filter *filter, struct rar_virtual_machine *vm) +{ + uint32_t stride = filter->initialregisters[0]; + uint32_t byteoffset = filter->initialregisters[1]; + uint32_t blocklength = filter->initialregisters[4]; + uint8_t *src, *dst; + uint32_t i, j; + + if (blocklength > PROGRAM_WORK_SIZE / 2 || stride > blocklength) + return 0; + + src = &vm->memory[0]; + dst = &vm->memory[blocklength]; + for (i = 0; i < 3; i++) { + uint8_t byte = 0; + uint8_t *prev = dst + i - stride; + for (j = i; j < blocklength; j += 3) + { + if (prev >= dst) + { + uint32_t delta1 = abs(prev[3] - prev[0]); + uint32_t delta2 = abs(byte - prev[0]); + uint32_t delta3 = abs(prev[3] - prev[0] + byte - prev[0]); + if (delta1 > delta2 || delta1 > delta3) + byte = delta2 <= delta3 ? prev[3] : prev[0]; + } + byte -= *src++; + dst[j] = byte; + prev += 3; + } + } + for (i = byteoffset; i < blocklength - 2; i += 3) + { + dst[i] += dst[i + 1]; + dst[i + 2] += dst[i + 1]; + } + + filter->filteredblockaddress = blocklength; + filter->filteredblocklength = blocklength; + + return 1; +} + +static int +execute_filter_audio(struct rar_filter *filter, struct rar_virtual_machine *vm) +{ + uint32_t length = filter->initialregisters[4]; + uint32_t numchannels = filter->initialregisters[0]; + uint8_t *src, *dst; + uint32_t i, j; + + if (length > PROGRAM_WORK_SIZE / 2) + return 0; + + src = &vm->memory[0]; + dst = &vm->memory[length]; + for (i = 0; i < numchannels; i++) + { + struct audio_state state; + memset(&state, 0, sizeof(state)); + for (j = i; j < length; j += numchannels) + { + int8_t delta = (int8_t)*src++; + uint8_t predbyte, byte; + int prederror; + state.delta[2] = state.delta[1]; + state.delta[1] = state.lastdelta - state.delta[0]; + state.delta[0] = state.lastdelta; + predbyte = ((8 * state.lastbyte + state.weight[0] * state.delta[0] + state.weight[1] * state.delta[1] + state.weight[2] * state.delta[2]) >> 3) & 0xFF; + byte = (predbyte - delta) & 0xFF; + prederror = delta << 3; + state.error[0] += abs(prederror); + state.error[1] += abs(prederror - state.delta[0]); state.error[2] += abs(prederror + state.delta[0]); + state.error[3] += abs(prederror - state.delta[1]); state.error[4] += abs(prederror + state.delta[1]); + state.error[5] += abs(prederror - state.delta[2]); state.error[6] += abs(prederror + state.delta[2]); + state.lastdelta = (int8_t)(byte - state.lastbyte); + dst[j] = state.lastbyte = byte; + if (!(state.count++ & 0x1F)) + { + uint8_t k, idx = 0; + for (k = 1; k < 7; k++) + { + if (state.error[k] < state.error[idx]) + idx = k; + } + memset(state.error, 0, sizeof(state.error)); + switch (idx) + { + case 1: if (state.weight[0] >= -16) state.weight[0]--; break; + case 2: if (state.weight[0] < 16) state.weight[0]++; break; + case 3: if (state.weight[1] >= -16) state.weight[1]--; break; + case 4: if (state.weight[1] < 16) state.weight[1]++; break; + case 5: if (state.weight[2] >= -16) state.weight[2]--; break; + case 6: if (state.weight[2] < 16) state.weight[2]++; break; + } + } + } + } + + filter->filteredblockaddress = length; + filter->filteredblocklength = length; + + return 1; +} + + +static int +execute_filter(struct archive_read *a, struct rar_filter *filter, struct rar_virtual_machine *vm, size_t pos) +{ + if (filter->prog->fingerprint == 0x1D0E06077D) + return execute_filter_delta(filter, vm); + if (filter->prog->fingerprint == 0x35AD576887) + return execute_filter_e8(filter, vm, pos, 0); + if (filter->prog->fingerprint == 0x393CD7E57E) + return execute_filter_e8(filter, vm, pos, 1); + if (filter->prog->fingerprint == 0x951C2C5DC8) + return execute_filter_rgb(filter, vm); + if (filter->prog->fingerprint == 0xD8BC85E701) + return execute_filter_audio(filter, vm); + + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "No support for RAR VM program filter"); + return 0; +} + +static int +rar_decode_byte(struct archive_read *a, uint8_t *byte) +{ + struct rar *rar = (struct rar *)(a->format->data); + struct rar_br *br = &(rar->br); + if (!rar_br_read_ahead(a, br, 8)) + return 0; + *byte = (uint8_t)rar_br_bits(br, 8); + rar_br_consume(br, 8); + return 1; +} + +static inline void +vm_write_32(struct rar_virtual_machine* vm, size_t offset, uint32_t u32) +{ + archive_le32enc(vm->memory + offset, u32); +} + +static inline uint32_t +vm_read_32(struct rar_virtual_machine* vm, size_t offset) +{ + return archive_le32dec(vm->memory + offset); +} diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar5.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar5.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c index 5d62d16..38979cb 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_rar5.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c @@ -632,7 +632,7 @@ static int run_arm_filter(struct rar5* rar, struct filter_info* flt) { /* 0xEB = ARM's BL (branch + link) instruction. */ offset = read_filter_data(rar, (rar->cstate.solid_offset + flt->block_start + i) & - rar->cstate.window_mask) & 0x00ffffff; + (uint32_t)rar->cstate.window_mask) & 0x00ffffff; offset -= (uint32_t) ((i + flt->block_start) / 4); offset = (offset & 0x00ffffff) | 0xeb000000; @@ -1012,7 +1012,16 @@ static int read_var_sized(struct archive_read* a, size_t* pvalue, return ret; } -static int read_bits_32(struct rar5* rar, const uint8_t* p, uint32_t* value) { +static int read_bits_32(struct archive_read* a, struct rar5* rar, + const uint8_t* p, uint32_t* value) +{ + if(rar->bits.in_addr >= rar->cstate.cur_block_size) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "Premature end of stream during extraction of data (#1)"); + return ARCHIVE_FATAL; + } + uint32_t bits = ((uint32_t) p[rar->bits.in_addr]) << 24; bits |= p[rar->bits.in_addr + 1] << 16; bits |= p[rar->bits.in_addr + 2] << 8; @@ -1023,7 +1032,16 @@ static int read_bits_32(struct rar5* rar, const uint8_t* p, uint32_t* value) { return ARCHIVE_OK; } -static int read_bits_16(struct rar5* rar, const uint8_t* p, uint16_t* value) { +static int read_bits_16(struct archive_read* a, struct rar5* rar, + const uint8_t* p, uint16_t* value) +{ + if(rar->bits.in_addr >= rar->cstate.cur_block_size) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "Premature end of stream during extraction of data (#2)"); + return ARCHIVE_FATAL; + } + int bits = (int) ((uint32_t) p[rar->bits.in_addr]) << 16; bits |= (int) p[rar->bits.in_addr + 1] << 8; bits |= (int) p[rar->bits.in_addr + 2]; @@ -1039,8 +1057,8 @@ static void skip_bits(struct rar5* rar, int bits) { } /* n = up to 16 */ -static int read_consume_bits(struct rar5* rar, const uint8_t* p, int n, - int* value) +static int read_consume_bits(struct archive_read* a, struct rar5* rar, + const uint8_t* p, int n, int* value) { uint16_t v; int ret, num; @@ -1051,7 +1069,7 @@ static int read_consume_bits(struct rar5* rar, const uint8_t* p, int n, return ARCHIVE_FATAL; } - ret = read_bits_16(rar, p, &v); + ret = read_bits_16(a, rar, p, &v); if(ret != ARCHIVE_OK) return ret; @@ -1099,6 +1117,44 @@ static int bid_standard(struct archive_read* a) { return -1; } +static int bid_sfx(struct archive_read *a) +{ + const char *p; + + if ((p = __archive_read_ahead(a, 7, NULL)) == NULL) + return -1; + + if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) { + /* This is a PE file */ + char signature[sizeof(rar5_signature_xor)]; + ssize_t offset = 0x10000; + ssize_t window = 4096; + ssize_t bytes_avail; + + rar5_signature(signature); + + while (offset + window <= (1024 * 512)) { + const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail); + if (buff == NULL) { + /* Remaining bytes are less than window. */ + window >>= 1; + if (window < 0x40) + return 0; + continue; + } + p = buff + offset; + while (p + 8 < buff + bytes_avail) { + if (memcmp(p, signature, sizeof(signature)) == 0) + return 30; + p += 0x10; + } + offset = p - buff; + } + } + + return 0; +} + static int rar5_bid(struct archive_read* a, int best_bid) { int my_bid; @@ -1109,6 +1165,10 @@ static int rar5_bid(struct archive_read* a, int best_bid) { if(my_bid > -1) { return my_bid; } + my_bid = bid_sfx(a); + if (my_bid > -1) { + return my_bid; + } return -1; } @@ -1712,14 +1772,29 @@ static int process_head_file(struct archive_read* a, struct rar5* rar, } } - /* If we're currently switching volumes, ignore the new definition of - * window_size. */ - if(rar->cstate.switch_multivolume == 0) { - /* Values up to 64M should fit into ssize_t on every - * architecture. */ - rar->cstate.window_size = (ssize_t) window_size; + if(rar->cstate.window_size < (ssize_t) window_size && + rar->cstate.window_buf) + { + /* If window_buf has been allocated before, reallocate it, so + * that its size will match new window_size. */ + + uint8_t* new_window_buf = + realloc(rar->cstate.window_buf, window_size); + + if(!new_window_buf) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "Not enough memory when trying to realloc the window " + "buffer."); + return ARCHIVE_FATAL; + } + + rar->cstate.window_buf = new_window_buf; } + /* Values up to 64M should fit into ssize_t on every + * architecture. */ + rar->cstate.window_size = (ssize_t) window_size; + if(rar->file.solid > 0 && rar->file.solid_window_size == 0) { /* Solid files have to have the same window_size across whole archive. Remember the window_size parameter @@ -2273,6 +2348,62 @@ static int skip_base_block(struct archive_read* a) { return ret; } +static int try_skip_sfx(struct archive_read *a) +{ + const char *p; + + if ((p = __archive_read_ahead(a, 7, NULL)) == NULL) + return ARCHIVE_EOF; + + if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) + { + char signature[sizeof(rar5_signature_xor)]; + const void *h; + const char *q; + size_t skip, total = 0; + ssize_t bytes, window = 4096; + + rar5_signature(signature); + + while (total + window <= (1024 * 512)) { + h = __archive_read_ahead(a, window, &bytes); + if (h == NULL) { + /* Remaining bytes are less than window. */ + window >>= 1; + if (window < 0x40) + goto fatal; + continue; + } + if (bytes < 0x40) + goto fatal; + p = h; + q = p + bytes; + + /* + * Scan ahead until we find something that looks + * like the RAR header. + */ + while (p + 8 < q) { + if (memcmp(p, signature, sizeof(signature)) == 0) { + skip = p - (const char *)h; + __archive_read_consume(a, skip); + return (ARCHIVE_OK); + } + p += 0x10; + } + skip = p - (const char *)h; + __archive_read_consume(a, skip); + total += skip; + } + } + + return ARCHIVE_OK; +fatal: + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Couldn't find out RAR header"); + return (ARCHIVE_FATAL); +} + static int rar5_read_header(struct archive_read *a, struct archive_entry *entry) { @@ -2281,6 +2412,8 @@ static int rar5_read_header(struct archive_read *a, if(rar->header_initialized == 0) { init_header(a); + if ((ret = try_skip_sfx(a)) < ARCHIVE_WARN) + return ret; rar->header_initialized = 1; } @@ -2425,13 +2558,13 @@ static int create_decode_tables(uint8_t* bit_length, static int decode_number(struct archive_read* a, struct decode_table* table, const uint8_t* p, uint16_t* num) { - int i, bits, dist; + int i, bits, dist, ret; uint16_t bitfield; uint32_t pos; struct rar5* rar = get_context(a); - if(ARCHIVE_OK != read_bits_16(rar, p, &bitfield)) { - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_bits_16(a, rar, p, &bitfield))) { + return ret; } bitfield &= 0xfffe; @@ -2537,14 +2670,6 @@ static int parse_tables(struct archive_read* a, struct rar5* rar, for(i = 0; i < HUFF_TABLE_SIZE;) { uint16_t num; - if((rar->bits.in_addr + 6) >= rar->cstate.cur_block_size) { - /* Truncated data, can't continue. */ - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Truncated data in huffman tables (#2)"); - return ARCHIVE_FATAL; - } - ret = decode_number(a, &rar->cstate.bd, p, &num); if(ret != ARCHIVE_OK) { archive_set_error(&a->archive, @@ -2561,8 +2686,8 @@ static int parse_tables(struct archive_read* a, struct rar5* rar, /* 16..17: repeat previous code */ uint16_t n; - if(ARCHIVE_OK != read_bits_16(rar, p, &n)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_bits_16(a, rar, p, &n))) + return ret; if(num == 16) { n >>= 13; @@ -2590,8 +2715,8 @@ static int parse_tables(struct archive_read* a, struct rar5* rar, /* other codes: fill with zeroes `n` times */ uint16_t n; - if(ARCHIVE_OK != read_bits_16(rar, p, &n)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_bits_16(a, rar, p, &n))) + return ret; if(num == 18) { n >>= 13; @@ -2696,33 +2821,35 @@ static int parse_block_header(struct archive_read* a, const uint8_t* p, ^ (uint8_t) (*block_size >> 16); if(calculated_cksum != hdr->block_cksum) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Block checksum error: got 0x%x, expected 0x%x", hdr->block_cksum, calculated_cksum); return ARCHIVE_FATAL; +#endif } return ARCHIVE_OK; } /* Convenience function used during filter processing. */ -static int parse_filter_data(struct rar5* rar, const uint8_t* p, - uint32_t* filter_data) +static int parse_filter_data(struct archive_read* a, struct rar5* rar, + const uint8_t* p, uint32_t* filter_data) { - int i, bytes; + int i, bytes, ret; uint32_t data = 0; - if(ARCHIVE_OK != read_consume_bits(rar, p, 2, &bytes)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_consume_bits(a, rar, p, 2, &bytes))) + return ret; bytes++; for(i = 0; i < bytes; i++) { uint16_t byte; - if(ARCHIVE_OK != read_bits_16(rar, p, &byte)) { - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_bits_16(a, rar, p, &byte))) { + return ret; } /* Cast to uint32_t will ensure the shift operation will not @@ -2765,16 +2892,17 @@ static int parse_filter(struct archive_read* ar, const uint8_t* p) { uint16_t filter_type; struct filter_info* filt = NULL; struct rar5* rar = get_context(ar); + int ret; /* Read the parameters from the input stream. */ - if(ARCHIVE_OK != parse_filter_data(rar, p, &block_start)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = parse_filter_data(ar, rar, p, &block_start))) + return ret; - if(ARCHIVE_OK != parse_filter_data(rar, p, &block_length)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = parse_filter_data(ar, rar, p, &block_length))) + return ret; - if(ARCHIVE_OK != read_bits_16(rar, p, &filter_type)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_bits_16(ar, rar, p, &filter_type))) + return ret; filter_type >>= 13; skip_bits(rar, 3); @@ -2814,8 +2942,8 @@ static int parse_filter(struct archive_read* ar, const uint8_t* p) { if(filter_type == FILTER_DELTA) { int channels; - if(ARCHIVE_OK != read_consume_bits(rar, p, 5, &channels)) - return ARCHIVE_EOF; + if(ARCHIVE_OK != (ret = read_consume_bits(ar, rar, p, 5, &channels))) + return ret; filt->channels = channels + 1; } @@ -2823,10 +2951,11 @@ static int parse_filter(struct archive_read* ar, const uint8_t* p) { return ARCHIVE_OK; } -static int decode_code_length(struct rar5* rar, const uint8_t* p, - uint16_t code) +static int decode_code_length(struct archive_read* a, struct rar5* rar, + const uint8_t* p, uint16_t code) { int lbits, length = 2; + if(code < 8) { lbits = 0; length += code; @@ -2838,7 +2967,7 @@ static int decode_code_length(struct rar5* rar, const uint8_t* p, if(lbits > 0) { int add; - if(ARCHIVE_OK != read_consume_bits(rar, p, lbits, &add)) + if(ARCHIVE_OK != read_consume_bits(a, rar, p, lbits, &add)) return -1; length += add; @@ -2933,7 +3062,7 @@ static int do_uncompress_block(struct archive_read* a, const uint8_t* p) { continue; } else if(num >= 262) { uint16_t dist_slot; - int len = decode_code_length(rar, p, num - 262), + int len = decode_code_length(a, rar, p, num - 262), dbits, dist = 1; @@ -2975,12 +3104,12 @@ static int do_uncompress_block(struct archive_read* a, const uint8_t* p) { uint16_t low_dist; if(dbits > 4) { - if(ARCHIVE_OK != read_bits_32( - rar, p, &add)) { + if(ARCHIVE_OK != (ret = read_bits_32( + a, rar, p, &add))) { /* Return EOF if we * can't read more * data. */ - return ARCHIVE_EOF; + return ret; } skip_bits(rar, dbits - 4); @@ -3015,11 +3144,11 @@ static int do_uncompress_block(struct archive_read* a, const uint8_t* p) { /* dbits is one of [0,1,2,3] */ int add; - if(ARCHIVE_OK != read_consume_bits(rar, - p, dbits, &add)) { + if(ARCHIVE_OK != (ret = read_consume_bits(a, rar, + p, dbits, &add))) { /* Return EOF if we can't read * more data. */ - return ARCHIVE_EOF; + return ret; } dist += add; @@ -3076,7 +3205,11 @@ static int do_uncompress_block(struct archive_read* a, const uint8_t* p) { return ARCHIVE_FATAL; } - len = decode_code_length(rar, p, len_slot); + len = decode_code_length(a, rar, p, len_slot); + if (len == -1) { + return ARCHIVE_FATAL; + } + rar->cstate.last_len = len; if(ARCHIVE_OK != copy_string(a, len, dist)) @@ -3600,6 +3733,16 @@ static int do_uncompress_file(struct archive_read* a) { rar->cstate.initialized = 1; } + /* Don't allow extraction if window_size is invalid. */ + if(rar->cstate.window_size == 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid window size declaration in this file"); + + /* This should never happen in valid files. */ + return ARCHIVE_FATAL; + } + if(rar->cstate.all_filters_applied == 1) { /* We use while(1) here, but standard case allows for just 1 * iteration. The loop will iterate if process_block() didn't @@ -3770,6 +3913,13 @@ static int do_unpack(struct archive_read* a, struct rar5* rar, case GOOD: /* fallthrough */ case BEST: + /* No data is returned here. But because a sparse-file aware + * caller (like archive_read_data_into_fd) may treat zero-size + * as a sparse file block, we need to update the offset + * accordingly. At this point the decoder doesn't have any + * pending uncompressed data blocks, so the current position in + * the output file should be last_write_ptr. */ + if (offset) *offset = rar->cstate.last_write_ptr; return uncompress_file(a); default: archive_set_error(&a->archive, diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_raw.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_raw.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_raw.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_raw.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_tar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_tar.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_tar.c index 7e8feba..93c3fd5 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_tar.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_tar.c @@ -407,14 +407,13 @@ archive_read_format_tar_bid(struct archive_read *a, int best_bid) /* * Check format of mode/uid/gid/mtime/size/rdevmajor/rdevminor fields. */ - if (bid > 0 && ( - validate_number_field(header->mode, sizeof(header->mode)) == 0 + if (validate_number_field(header->mode, sizeof(header->mode)) == 0 || validate_number_field(header->uid, sizeof(header->uid)) == 0 || validate_number_field(header->gid, sizeof(header->gid)) == 0 || validate_number_field(header->mtime, sizeof(header->mtime)) == 0 || validate_number_field(header->size, sizeof(header->size)) == 0 || validate_number_field(header->rdevmajor, sizeof(header->rdevmajor)) == 0 - || validate_number_field(header->rdevminor, sizeof(header->rdevminor)) == 0)) { + || validate_number_field(header->rdevminor, sizeof(header->rdevminor)) == 0) { bid = 0; } @@ -573,11 +572,15 @@ archive_read_format_tar_read_header(struct archive_read *a, l = wcslen(wp); if (l > 0 && wp[l - 1] == L'/') { archive_entry_set_filetype(entry, AE_IFDIR); + tar->entry_bytes_remaining = 0; + tar->entry_padding = 0; } } else if ((p = archive_entry_pathname(entry)) != NULL) { l = strlen(p); if (l > 0 && p[l - 1] == '/') { archive_entry_set_filetype(entry, AE_IFDIR); + tar->entry_bytes_remaining = 0; + tar->entry_padding = 0; } } } @@ -1396,6 +1399,7 @@ read_mac_metadata_blob(struct archive_read *a, struct tar *tar, struct archive_entry *entry, const void *h, size_t *unconsumed) { int64_t size; + size_t msize; const void *data; const char *p, *name; const wchar_t *wp, *wname; @@ -1434,6 +1438,11 @@ read_mac_metadata_blob(struct archive_read *a, struct tar *tar, /* Read the body as a Mac OS metadata blob. */ size = archive_entry_size(entry); + msize = (size_t)size; + if (size < 0 || (uintmax_t)msize != (uintmax_t)size) { + *unconsumed = 0; + return (ARCHIVE_FATAL); + } /* * TODO: Look beyond the body here to peek at the next header. @@ -1447,13 +1456,13 @@ read_mac_metadata_blob(struct archive_read *a, struct tar *tar, * Q: Is the above idea really possible? Even * when there are GNU or pax extension entries? */ - data = __archive_read_ahead(a, (size_t)size, NULL); + data = __archive_read_ahead(a, msize, NULL); if (data == NULL) { *unconsumed = 0; return (ARCHIVE_FATAL); } - archive_entry_copy_mac_metadata(entry, data, (size_t)size); - *unconsumed = (size_t)((size + 511) & ~ 511); + archive_entry_copy_mac_metadata(entry, data, msize); + *unconsumed = (msize + 511) & ~ 511; tar_flush_unconsumed(a, unconsumed); return (tar_read_header(a, tar, entry, unconsumed)); } @@ -2098,6 +2107,21 @@ pax_attribute(struct archive_read *a, struct tar *tar, /* "size" is the size of the data in the entry. */ tar->entry_bytes_remaining = tar_atol10(value, strlen(value)); + if (tar->entry_bytes_remaining < 0) { + tar->entry_bytes_remaining = 0; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Tar size attribute is negative"); + return (ARCHIVE_FATAL); + } + if (tar->entry_bytes_remaining == INT64_MAX) { + /* Note: tar_atol returns INT64_MAX on overflow */ + tar->entry_bytes_remaining = 0; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Tar size attribute overflow"); + return (ARCHIVE_FATAL); + } /* * The "size" pax header keyword always overrides the * "size" field in the tar header. diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_warc.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_warc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_warc.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_warc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_xar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_xar.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_xar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_xar.c index 503ff58..ec5b06e 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_xar.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_xar.c @@ -624,7 +624,9 @@ read_toc(struct archive_read *a) __archive_read_consume(a, xar->toc_chksum_size); xar->offset += xar->toc_chksum_size; if (r != ARCHIVE_OK) +#ifndef DONT_FAIL_ON_CRC_ERROR return (ARCHIVE_FATAL); +#endif } /* @@ -827,10 +829,12 @@ xar_read_header(struct archive_read *a, struct archive_entry *entry) xattr->a_sum.val, xattr->a_sum.len, xattr->e_sum.val, xattr->e_sum.len); if (r != ARCHIVE_OK) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, "Xattr checksum error"); r = ARCHIVE_WARN; break; +#endif } if (xattr->name.s == NULL) { archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_zip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c index 21d41cc..9d6c900 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_read_support_format_zip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c @@ -58,6 +58,9 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_zip.c 201102 #ifdef HAVE_LZMA_H #include #endif +#ifdef HAVE_ZSTD_H +#include +#endif #include "archive.h" #include "archive_digest_private.h" @@ -191,6 +194,11 @@ struct zip { char bzstream_valid; #endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD + ZSTD_DStream *zstdstream; + char zstdstream_valid; +#endif + IByteIn zipx_ppmd_stream; ssize_t zipx_ppmd_read_compressed; CPpmd8 ppmd8; @@ -435,6 +443,7 @@ static const struct { {17, "reserved"}, /* Reserved by PKWARE */ {18, "ibm-terse-new"}, /* File is compressed using IBM TERSE (new) */ {19, "ibm-lz777"},/* IBM LZ77 z Architecture (PFS) */ + {93, "zstd"}, /* Zstandard (zstd) Compression */ {95, "xz"}, /* XZ compressed data */ {96, "jpeg"}, /* JPEG compressed data */ {97, "wav-pack"}, /* WavPack compressed data */ @@ -1144,7 +1153,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, (intmax_t)zip_entry->compressed_size); ret = ARCHIVE_WARN; } - if (zip_entry->uncompressed_size == 0) { + if (zip_entry->uncompressed_size == 0 || + zip_entry->uncompressed_size == 0xffffffff) { zip_entry->uncompressed_size = zip_entry_central_dir.uncompressed_size; } else if (zip_entry->uncompressed_size @@ -1186,7 +1196,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, { // symlink target string appeared to be compressed int status = ARCHIVE_FATAL; - const void *uncompressed_buffer; + const void *uncompressed_buffer = NULL; switch (zip->entry->compression) { @@ -1657,7 +1667,7 @@ zipx_lzma_alone_init(struct archive_read *a, struct zip *zip) */ /* Read magic1,magic2,lzma_params from the ZIPX stream. */ - if((p = __archive_read_ahead(a, 9, NULL)) == NULL) { + if(zip->entry_bytes_remaining < 9 || (p = __archive_read_ahead(a, 9, NULL)) == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated lzma data"); return (ARCHIVE_FATAL); @@ -2238,6 +2248,140 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff, #endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD +static int +zipx_zstd_init(struct archive_read *a, struct zip *zip) +{ + size_t r; + + /* Deallocate already existing Zstd decompression context if it + * exists. */ + if(zip->zstdstream_valid) { + ZSTD_freeDStream(zip->zstdstream); + zip->zstdstream_valid = 0; + } + + /* Allocate a new Zstd decompression context. */ + zip->zstdstream = ZSTD_createDStream(); + + r = ZSTD_initDStream(zip->zstdstream); + if (ZSTD_isError(r)) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Error initializing zstd decompressor: %s", + ZSTD_getErrorName(r)); + + return ARCHIVE_FAILED; + } + + /* Mark the zstdstream field to be released in cleanup phase. */ + zip->zstdstream_valid = 1; + + /* (Re)allocate the buffer that will contain decompressed bytes. */ + free(zip->uncompressed_buffer); + + zip->uncompressed_buffer_size = ZSTD_DStreamOutSize(); + zip->uncompressed_buffer = + (uint8_t*) malloc(zip->uncompressed_buffer_size); + if (zip->uncompressed_buffer == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory for Zstd decompression"); + + return ARCHIVE_FATAL; + } + + /* Initialization done. */ + zip->decompress_init = 1; + return ARCHIVE_OK; +} + +static int +zip_read_data_zipx_zstd(struct archive_read *a, const void **buff, + size_t *size, int64_t *offset) +{ + struct zip *zip = (struct zip *)(a->format->data); + ssize_t bytes_avail = 0, in_bytes, to_consume; + const void *compressed_buff; + int r; + size_t ret; + uint64_t total_out; + ZSTD_outBuffer out; + ZSTD_inBuffer in; + + (void) offset; /* UNUSED */ + + /* Initialize decompression context if we're here for the first time. */ + if(!zip->decompress_init) { + r = zipx_zstd_init(a, zip); + if(r != ARCHIVE_OK) + return r; + } + + /* Fetch more compressed bytes */ + compressed_buff = __archive_read_ahead(a, 1, &bytes_avail); + if(bytes_avail < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated zstd file body"); + return (ARCHIVE_FATAL); + } + + in_bytes = zipmin(zip->entry_bytes_remaining, bytes_avail); + if(in_bytes < 1) { + /* zstd doesn't complain when caller feeds avail_in == 0. + * It will actually return success in this case, which is + * undesirable. This is why we need to make this check + * manually. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated zstd file body"); + return (ARCHIVE_FATAL); + } + + /* Setup buffer boundaries */ + in.src = compressed_buff; + in.size = in_bytes; + in.pos = 0; + out = (ZSTD_outBuffer) { zip->uncompressed_buffer, zip->uncompressed_buffer_size, 0 }; + + /* Perform the decompression. */ + ret = ZSTD_decompressStream(zip->zstdstream, &out, &in); + if (ZSTD_isError(ret)) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Error during zstd decompression: %s", + ZSTD_getErrorName(ret)); + return (ARCHIVE_FATAL); + } + + /* Check end of the stream. */ + if (ret == 0) { + if ((in.pos == in.size) && (out.pos < out.size)) { + zip->end_of_entry = 1; + ZSTD_freeDStream(zip->zstdstream); + zip->zstdstream_valid = 0; + } + } + + /* Update the pointers so decompressor can continue decoding. */ + to_consume = in.pos; + __archive_read_consume(a, to_consume); + + total_out = out.pos; + + zip->entry_bytes_remaining -= to_consume; + zip->entry_compressed_bytes_read += to_consume; + zip->entry_uncompressed_bytes_read += total_out; + + /* Give libarchive its due. */ + *size = total_out; + *buff = zip->uncompressed_buffer; + + /* Seek for optional marker, like in other entries. */ + r = consume_optional_marker(a, zip); + if(r != ARCHIVE_OK) + return r; + + return ARCHIVE_OK; +} +#endif + #ifdef HAVE_ZLIB_H static int zip_deflate_init(struct archive_read *a, struct zip *zip) @@ -2857,6 +3001,11 @@ archive_read_format_zip_read_data(struct archive_read *a, case 95: /* ZIPx XZ compression. */ r = zip_read_data_zipx_xz(a, buff, size, offset); break; +#endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD + case 93: /* ZIPx Zstd compression. */ + r = zip_read_data_zipx_zstd(a, buff, size, offset); + break; #endif /* PPMd support is built-in, so we don't need any #if guards. */ case 98: /* ZIPx PPMd compression. */ @@ -2948,6 +3097,12 @@ archive_read_format_zip_cleanup(struct archive_read *a) } #endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD + if (zip->zstdstream_valid) { + ZSTD_freeDStream(zip->zstdstream); + } +#endif + free(zip->uncompressed_buffer); if (zip->ppmd8_valid) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_string.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_string.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_string.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_string.c index 7460ded..69458e1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_string.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_string.c @@ -745,7 +745,7 @@ archive_string_append_from_wcs_in_codepage(struct archive_string *as, dp = &defchar_used; count = WideCharToMultiByte(to_cp, 0, ws, wslen, as->s + as->length, - (int)as->buffer_length - as->length - 1, NULL, dp); + (int)as->buffer_length - (int)as->length - 1, NULL, dp); if (count == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { /* Expand the MBS buffer and retry. */ @@ -3988,10 +3988,10 @@ int archive_mstring_get_mbs_l(struct archive *a, struct archive_mstring *aes, const char **p, size_t *length, struct archive_string_conv *sc) { - int r, ret = 0; - - (void)r; /* UNUSED */ + int ret = 0; #if defined(_WIN32) && !defined(__CYGWIN__) + int r; + /* * Internationalization programming on Windows must use Wide * characters because Windows platform cannot make locale UTF-8. diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_string.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_string.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_string.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_string.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_string_composition.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_string_composition.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_string_composition.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_string_composition.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_string_sprintf.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_string_sprintf.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_string_sprintf.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_string_sprintf.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_util.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_util.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_util.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_util.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_util.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_util.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_util.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_util.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_version_details.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_version_details.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_version_details.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_version_details.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_virtual.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_virtual.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_virtual.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_virtual.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_windows.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_windows.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_windows.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_windows.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_windows.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_windows.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_windows.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_windows.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write.c index 38c14cb..27626b5 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write.c @@ -60,8 +60,6 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write.c 201099 2009-12-28 03:03: #include "archive_private.h" #include "archive_write_private.h" -static struct archive_vtable *archive_write_vtable(void); - static int _archive_filter_code(struct archive *, int); static const char *_archive_filter_name(struct archive *, int); static int64_t _archive_filter_bytes(struct archive *, int); @@ -79,26 +77,18 @@ struct archive_none { char *next; }; -static struct archive_vtable * -archive_write_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_close = _archive_write_close; - av.archive_filter_bytes = _archive_filter_bytes; - av.archive_filter_code = _archive_filter_code; - av.archive_filter_name = _archive_filter_name; - av.archive_filter_count = _archive_write_filter_count; - av.archive_free = _archive_write_free; - av.archive_write_header = _archive_write_header; - av.archive_write_finish_entry = _archive_write_finish_entry; - av.archive_write_data = _archive_write_data; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_write_vtable = { + .archive_close = _archive_write_close, + .archive_filter_bytes = _archive_filter_bytes, + .archive_filter_code = _archive_filter_code, + .archive_filter_name = _archive_filter_name, + .archive_filter_count = _archive_write_filter_count, + .archive_free = _archive_write_free, + .archive_write_header = _archive_write_header, + .archive_write_finish_entry = _archive_write_finish_entry, + .archive_write_data = _archive_write_data, +}; /* * Allocate, initialize and return an archive object. @@ -114,7 +104,7 @@ archive_write_new(void) return (NULL); a->archive.magic = ARCHIVE_WRITE_MAGIC; a->archive.state = ARCHIVE_STATE_NEW; - a->archive.vtable = archive_write_vtable(); + a->archive.vtable = &archive_write_vtable; /* * The value 10240 here matches the traditional tar default, * but is otherwise arbitrary. @@ -211,6 +201,10 @@ __archive_write_allocate_filter(struct archive *_a) struct archive_write_filter *f; f = calloc(1, sizeof(*f)); + + if (f == NULL) + return (NULL); + f->archive = _a; f->state = ARCHIVE_WRITE_FILTER_STATE_NEW; if (a->filter_first == NULL) @@ -558,6 +552,10 @@ archive_write_open2(struct archive *_a, void *client_data, a->client_data = client_data; client_filter = __archive_write_allocate_filter(_a); + + if (client_filter == NULL) + return (ARCHIVE_FATAL); + client_filter->open = archive_write_client_open; client_filter->write = archive_write_client_write; client_filter->close = archive_write_client_close; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_b64encode.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_b64encode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_b64encode.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_b64encode.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_by_name.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_by_name.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_by_name.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_by_name.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_bzip2.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_bzip2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_bzip2.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_bzip2.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_compress.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_compress.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_compress.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_compress.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_grzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_grzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_grzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_grzip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_gzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_gzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_gzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_gzip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lrzip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lrzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lrzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lrzip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lz4.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lz4.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lzop.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lzop.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_lzop.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_lzop.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_none.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_none.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_none.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_none.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_program.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_program.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_program.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_program.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_uuencode.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_uuencode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_uuencode.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_uuencode.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_xz.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_xz.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c index 9dd2c30..04bee90 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_xz.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c @@ -251,13 +251,13 @@ archive_compressor_xz_init_stream(struct archive_write_filter *f, int ds, log2dic, wedges; /* Calculate a coded dictionary size */ - if (dict_size < (1 << 12) || dict_size > (1 << 27)) { + if (dict_size < (1 << 12) || dict_size > (1 << 29)) { archive_set_error(f->archive, ARCHIVE_ERRNO_MISC, "Unacceptable dictionary size for lzip: %d", dict_size); return (ARCHIVE_FATAL); } - for (log2dic = 27; log2dic >= 12; log2dic--) { + for (log2dic = 29; log2dic >= 12; log2dic--) { if (dict_size & (1 << log2dic)) break; } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_zstd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c similarity index 91% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_zstd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c index c74a35c..e85b766 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_add_filter_zstd.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c @@ -50,7 +50,8 @@ __FBSDID("$FreeBSD$"); struct private_data { int compression_level; -#if HAVE_ZSTD_H && HAVE_LIBZSTD + int threads; +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR ZSTD_CStream *cstream; int64_t total_in; ZSTD_outBuffer out; @@ -76,7 +77,7 @@ static int archive_compressor_zstd_write(struct archive_write_filter *, const void *, size_t); static int archive_compressor_zstd_close(struct archive_write_filter *); static int archive_compressor_zstd_free(struct archive_write_filter *); -#if HAVE_ZSTD_H && HAVE_LIBZSTD +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR static int drive_compressor(struct archive_write_filter *, struct private_data *, int, const void *, size_t); #endif @@ -107,7 +108,8 @@ archive_write_add_filter_zstd(struct archive *_a) f->code = ARCHIVE_FILTER_ZSTD; f->name = "zstd"; data->compression_level = CLEVEL_DEFAULT; -#if HAVE_ZSTD_H && HAVE_LIBZSTD + data->threads = 0; +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR data->cstream = ZSTD_createCStream(); if (data->cstream == NULL) { free(data); @@ -134,7 +136,7 @@ static int archive_compressor_zstd_free(struct archive_write_filter *f) { struct private_data *data = (struct private_data *)f->data; -#if HAVE_ZSTD_H && HAVE_LIBZSTD +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR ZSTD_freeCStream(data->cstream); free(data->out.dst); #else @@ -187,7 +189,7 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, if (string_is_numeric(value) != ARCHIVE_OK) { return (ARCHIVE_WARN); } -#if HAVE_ZSTD_H && HAVE_LIBZSTD +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR maximum = ZSTD_maxCLevel(); #if ZSTD_VERSION_NUMBER >= MINVER_MINCLEVEL if (ZSTD_versionNumber() >= MINVER_MINCLEVEL) { @@ -204,6 +206,20 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, } data->compression_level = level; return (ARCHIVE_OK); + } else if (strcmp(key, "threads") == 0) { + int threads = atoi(value); + if (string_is_numeric(value) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } + + int minimum = 0; + + if (threads < minimum) { + return (ARCHIVE_WARN); + } + + data->threads = threads; + return (ARCHIVE_OK); } /* Note: The "warn" return is just to inform the options @@ -212,7 +228,7 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, return (ARCHIVE_WARN); } -#if HAVE_ZSTD_H && HAVE_LIBZSTD +#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR /* * Setup callback. */ @@ -252,6 +268,8 @@ archive_compressor_zstd_open(struct archive_write_filter *f) return (ARCHIVE_FATAL); } + ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_nbWorkers, data->threads); + return (ARCHIVE_OK); } @@ -335,7 +353,7 @@ drive_compressor(struct archive_write_filter *f, } } -#else /* HAVE_ZSTD_H && HAVE_LIBZSTD */ +#else /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */ static int archive_compressor_zstd_open(struct archive_write_filter *f) @@ -366,6 +384,14 @@ archive_compressor_zstd_open(struct archive_write_filter *f) archive_strcat(&as, " --ultra"); } + if (data->threads != 0) { + struct archive_string as2; + archive_string_init(&as2); + archive_string_sprintf(&as2, " --threads=%d", data->threads); + archive_string_concat(&as, &as2); + archive_string_free(&as2); + } + f->write = archive_compressor_zstd_write; r = __archive_write_program_open(f, data->pdata, as.s); archive_string_free(&as); @@ -389,4 +415,4 @@ archive_compressor_zstd_close(struct archive_write_filter *f) return __archive_write_program_close(f, data->pdata); } -#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD */ +#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_blocksize.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_blocksize.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_blocksize.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_blocksize.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_data.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_data.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_data.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_data.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk.3 index 2fa016e..97f3fcd 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk.3 +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk.3 @@ -163,14 +163,14 @@ caused by archives that (deliberately or otherwise) extract files outside of the current directory. The default is not to perform this check. If -.It Cm ARCHIVE_EXTRACT_SPARSE -Scan data for blocks of NUL bytes and try to recreate them with holes. -This results in sparse files, independent of whether the archive format -supports or uses them. .Cm ARCHIVE_EXTRACT_UNLINK is specified together with this option, the library will remove any intermediate symlinks it finds and return an error only if such symlink could not be removed. +.It Cm ARCHIVE_EXTRACT_SPARSE +Scan data for blocks of NUL bytes and try to recreate them with holes. +This results in sparse files, independent of whether the archive format +supports or uses them. .It Cm ARCHIVE_EXTRACT_TIME The timestamps (mtime, ctime, and atime) should be restored. By default, they are ignored. diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_posix.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_posix.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_posix.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_posix.c index fcd733a..09a5eef 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_posix.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_posix.c @@ -173,6 +173,7 @@ struct fixup_entry { struct fixup_entry *next; struct archive_acl acl; mode_t mode; + __LA_MODE_T filetype; int64_t atime; int64_t birthtime; int64_t mtime; @@ -357,6 +358,7 @@ struct archive_write_disk { static int la_opendirat(int, const char *); static int la_mktemp(struct archive_write_disk *); +static int la_verify_filetype(mode_t, __LA_MODE_T); static void fsobj_error(int *, struct archive_string *, int, const char *, const char *); static int check_symlinks_fsobj(char *, int *, struct archive_string *, @@ -396,8 +398,6 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p); static ssize_t write_data_block(struct archive_write_disk *, const char *, size_t); -static struct archive_vtable *archive_write_disk_vtable(void); - static int _archive_write_disk_close(struct archive *); static int _archive_write_disk_free(struct archive *); static int _archive_write_disk_header(struct archive *, @@ -464,6 +464,39 @@ la_opendirat(int fd, const char *path) { #endif } +static int +la_verify_filetype(mode_t mode, __LA_MODE_T filetype) { + int ret = 0; + + switch (filetype) { + case AE_IFREG: + ret = (S_ISREG(mode)); + break; + case AE_IFDIR: + ret = (S_ISDIR(mode)); + break; + case AE_IFLNK: + ret = (S_ISLNK(mode)); + break; + case AE_IFSOCK: + ret = (S_ISSOCK(mode)); + break; + case AE_IFCHR: + ret = (S_ISCHR(mode)); + break; + case AE_IFBLK: + ret = (S_ISBLK(mode)); + break; + case AE_IFIFO: + ret = (S_ISFIFO(mode)); + break; + default: + break; + } + + return (ret); +} + static int lazy_stat(struct archive_write_disk *a) { @@ -489,25 +522,16 @@ lazy_stat(struct archive_write_disk *a) return (ARCHIVE_WARN); } -static struct archive_vtable * -archive_write_disk_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_close = _archive_write_disk_close; - av.archive_filter_bytes = _archive_write_disk_filter_bytes; - av.archive_free = _archive_write_disk_free; - av.archive_write_header = _archive_write_disk_header; - av.archive_write_finish_entry - = _archive_write_disk_finish_entry; - av.archive_write_data = _archive_write_disk_data; - av.archive_write_data_block = _archive_write_disk_data_block; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_write_disk_vtable = { + .archive_close = _archive_write_disk_close, + .archive_filter_bytes = _archive_write_disk_filter_bytes, + .archive_free = _archive_write_disk_free, + .archive_write_header = _archive_write_disk_header, + .archive_write_finish_entry = _archive_write_disk_finish_entry, + .archive_write_data = _archive_write_disk_data, + .archive_write_data_block = _archive_write_disk_data_block, +}; static int64_t _archive_write_disk_filter_bytes(struct archive *_a, int n) @@ -822,6 +846,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) fe = current_fixup(a, archive_entry_pathname(entry)); if (fe == NULL) return (ARCHIVE_FATAL); + fe->filetype = archive_entry_filetype(entry); fe->fixup |= TODO_MODE_BASE; fe->mode = a->mode; } @@ -832,6 +857,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) fe = current_fixup(a, archive_entry_pathname(entry)); if (fe == NULL) return (ARCHIVE_FATAL); + fe->filetype = archive_entry_filetype(entry); fe->mode = a->mode; fe->fixup |= TODO_TIMES; if (archive_entry_atime_is_set(entry)) { @@ -865,6 +891,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) fe = current_fixup(a, archive_entry_pathname(entry)); if (fe == NULL) return (ARCHIVE_FATAL); + fe->filetype = archive_entry_filetype(entry); fe->fixup |= TODO_ACLS; archive_acl_copy(&fe->acl, archive_entry_acl(entry)); } @@ -877,6 +904,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) fe = current_fixup(a, archive_entry_pathname(entry)); if (fe == NULL) return (ARCHIVE_FATAL); + fe->filetype = archive_entry_filetype(entry); fe->mac_metadata = malloc(metadata_size); if (fe->mac_metadata != NULL) { memcpy(fe->mac_metadata, metadata, @@ -891,6 +919,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) fe = current_fixup(a, archive_entry_pathname(entry)); if (fe == NULL) return (ARCHIVE_FATAL); + fe->filetype = archive_entry_filetype(entry); fe->fixup |= TODO_FFLAGS; /* TODO: Complete this.. defer fflags from below. */ } @@ -1956,7 +1985,7 @@ archive_write_disk_new(void) a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC; /* We're ready to write a header immediately. */ a->archive.state = ARCHIVE_STATE_HEADER; - a->archive.vtable = archive_write_disk_vtable(); + a->archive.vtable = &archive_write_disk_vtable; a->start_time = time(NULL); /* Query and restore the umask. */ umask(a->user_umask = umask(0)); @@ -1967,6 +1996,8 @@ archive_write_disk_new(void) free(a); return (NULL); } + a->path_safe.s[0] = 0; + #ifdef HAVE_ZLIB_H a->decmpfs_compression_level = 5; #endif @@ -2462,7 +2493,8 @@ _archive_write_disk_close(struct archive *_a) struct archive_write_disk *a = (struct archive_write_disk *)_a; struct fixup_entry *next, *p; struct stat st; - int fd, ret; + char *c; + int fd, ret, openflags; archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, @@ -2475,24 +2507,70 @@ _archive_write_disk_close(struct archive *_a) while (p != NULL) { fd = -1; a->pst = NULL; /* Mark stat cache as out-of-date. */ - if (p->fixup & - (TODO_TIMES | TODO_MODE_BASE | TODO_ACLS | TODO_FFLAGS)) { - fd = open(p->name, - O_WRONLY | O_BINARY | O_NOFOLLOW | O_CLOEXEC); - if (fd == -1) { - /* If we cannot lstat, skip entry */ - if (lstat(p->name, &st) != 0) + + /* We must strip trailing slashes from the path to avoid + dereferencing symbolic links to directories */ + c = p->name; + while (*c != '\0') + c++; + while (c != p->name && *(c - 1) == '/') { + c--; + *c = '\0'; + } + + if (p->fixup == 0) + goto skip_fixup_entry; + else { + /* + * We need to verify if the type of the file + * we are going to open matches the file type + * of the fixup entry. + */ + openflags = O_BINARY | O_NOFOLLOW | O_RDONLY + | O_CLOEXEC; +#if defined(O_DIRECTORY) + if (p->filetype == AE_IFDIR) + openflags |= O_DIRECTORY; +#endif + fd = open(p->name, openflags); + +#if defined(O_DIRECTORY) + /* + * If we support O_DIRECTORY and open was + * successful we can skip the file type check + * for directories. For other file types + * we need to verify via fstat() or lstat() + */ + if (fd == -1 || p->filetype != AE_IFDIR) { +#if HAVE_FSTAT + if (fd > 0 && ( + fstat(fd, &st) != 0 || + la_verify_filetype(st.st_mode, + p->filetype) == 0)) { + goto skip_fixup_entry; + } else +#endif + if (lstat(p->name, &st) != 0 || + la_verify_filetype(st.st_mode, + p->filetype) == 0) { goto skip_fixup_entry; - /* - * If we deal with a symbolic link, mark - * it in the fixup mode to ensure no - * modifications are made to its target. - */ - if (S_ISLNK(st.st_mode)) { - p->mode &= ~S_IFMT; - p->mode |= S_IFLNK; } } +#else +#if HAVE_FSTAT + if (fd > 0 && ( + fstat(fd, &st) != 0 || + la_verify_filetype(st.st_mode, + p->filetype) == 0)) { + goto skip_fixup_entry; + } else +#endif + if (lstat(p->name, &st) != 0 || + la_verify_filetype(st.st_mode, + p->filetype) == 0) { + goto skip_fixup_entry; + } +#endif } if (p->fixup & TODO_TIMES) { set_times(a, fd, p->mode, p->name, @@ -2504,14 +2582,13 @@ _archive_write_disk_close(struct archive *_a) if (p->fixup & TODO_MODE_BASE) { #ifdef HAVE_FCHMOD if (fd >= 0) - fchmod(fd, p->mode); + fchmod(fd, p->mode & 07777); else #endif #ifdef HAVE_LCHMOD - lchmod(p->name, p->mode); + lchmod(p->name, p->mode & 07777); #else - if (!S_ISLNK(p->mode)) - chmod(p->name, p->mode); + chmod(p->name, p->mode & 07777); #endif } if (p->fixup & TODO_ACLS) @@ -2664,7 +2741,7 @@ new_fixup(struct archive_write_disk *a, const char *pathname) fe->next = a->fixup_list; a->fixup_list = fe; fe->fixup = 0; - fe->mode = 0; + fe->filetype = 0; fe->name = strdup(pathname); return (fe); } @@ -2718,7 +2795,7 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, char *tail; char *head; int last; - char c; + char c = '\0'; int r; struct stat st; int chdir_fd; @@ -3787,6 +3864,7 @@ set_fflags(struct archive_write_disk *a) le = current_fixup(a, a->name); if (le == NULL) return (ARCHIVE_FATAL); + le->filetype = archive_entry_filetype(a->entry); le->fixup |= TODO_FFLAGS; le->fflags_set = set; /* Store the mode if it's not already there. */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_set_standard_lookup.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_set_standard_lookup.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_set_standard_lookup.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_set_standard_lookup.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_windows.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_windows.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_windows.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_windows.c index 0c60017..88df3ce 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_disk_windows.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_disk_windows.c @@ -213,7 +213,7 @@ static int check_symlinks(struct archive_write_disk *); static int create_filesystem_object(struct archive_write_disk *); static struct fixup_entry *current_fixup(struct archive_write_disk *, const wchar_t *pathname); -static int cleanup_pathname(struct archive_write_disk *); +static int cleanup_pathname(struct archive_write_disk *, wchar_t *); static int create_dir(struct archive_write_disk *, wchar_t *); static int create_parent_dir(struct archive_write_disk *, wchar_t *); static int la_chmod(const wchar_t *, mode_t); @@ -238,8 +238,6 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p); static ssize_t write_data_block(struct archive_write_disk *, const char *, size_t); -static struct archive_vtable *archive_write_disk_vtable(void); - static int _archive_write_disk_close(struct archive *); static int _archive_write_disk_free(struct archive *); static int _archive_write_disk_header(struct archive *, @@ -628,7 +626,7 @@ la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target, static BOOLEAN (WINAPI *f)(LPCWSTR, LPCWSTR, DWORD); static int set; wchar_t *ttarget, *p; - int len; + size_t len; DWORD attrs = 0; DWORD flags = 0; DWORD newflags = 0; @@ -759,25 +757,16 @@ lazy_stat(struct archive_write_disk *a) return (ARCHIVE_WARN); } -static struct archive_vtable * -archive_write_disk_vtable(void) -{ - static struct archive_vtable av; - static int inited = 0; - - if (!inited) { - av.archive_close = _archive_write_disk_close; - av.archive_filter_bytes = _archive_write_disk_filter_bytes; - av.archive_free = _archive_write_disk_free; - av.archive_write_header = _archive_write_disk_header; - av.archive_write_finish_entry - = _archive_write_disk_finish_entry; - av.archive_write_data = _archive_write_disk_data; - av.archive_write_data_block = _archive_write_disk_data_block; - inited = 1; - } - return (&av); -} +static const struct archive_vtable +archive_write_disk_vtable = { + .archive_close = _archive_write_disk_close, + .archive_filter_bytes = _archive_write_disk_filter_bytes, + .archive_free = _archive_write_disk_free, + .archive_write_header = _archive_write_disk_header, + .archive_write_finish_entry = _archive_write_disk_finish_entry, + .archive_write_data = _archive_write_disk_data, + .archive_write_data_block = _archive_write_disk_data_block, +}; static int64_t _archive_write_disk_filter_bytes(struct archive *_a, int n) @@ -854,7 +843,7 @@ _archive_write_disk_header(struct archive *_a, struct archive_entry *entry) * dir restores; the dir restore logic otherwise gets messed * up by nonsense like "dir/.". */ - ret = cleanup_pathname(a); + ret = cleanup_pathname(a, a->name); if (ret != ARCHIVE_OK) return (ret); @@ -1373,7 +1362,7 @@ archive_write_disk_new(void) a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC; /* We're ready to write a header immediately. */ a->archive.state = ARCHIVE_STATE_HEADER; - a->archive.vtable = archive_write_disk_vtable(); + a->archive.vtable = &archive_write_disk_vtable; a->start_time = time(NULL); /* Query and restore the umask. */ umask(a->user_umask = umask(0)); @@ -1381,6 +1370,7 @@ archive_write_disk_new(void) free(a); return (NULL); } + a->path_safe.s[0] = 0; return (&a->archive); } @@ -1671,9 +1661,22 @@ create_filesystem_object(struct archive_write_disk *a) /* Since link(2) and symlink(2) don't handle modes, we're done here. */ linkname = archive_entry_hardlink_w(a->entry); if (linkname != NULL) { - wchar_t *linkfull, *namefull; - - linkfull = __la_win_permissive_name_w(linkname); + wchar_t *linksanitized, *linkfull, *namefull; + size_t l = (wcslen(linkname) + 1) * sizeof(wchar_t); + linksanitized = malloc(l); + if (linksanitized == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory for hardlink target"); + return (-1); + } + memcpy(linksanitized, linkname, l); + r = cleanup_pathname(a, linksanitized); + if (r != ARCHIVE_OK) { + free(linksanitized); + return (r); + } + linkfull = __la_win_permissive_name_w(linksanitized); + free(linksanitized); namefull = __la_win_permissive_name_w(a->name); if (linkfull == NULL || namefull == NULL) { errno = EINVAL; @@ -2152,6 +2155,8 @@ check_symlinks(struct archive_write_disk *a) return (ARCHIVE_FAILED); } } + if (!c) + break; pn[0] = c; pn++; } @@ -2184,12 +2189,12 @@ guidword(wchar_t *p, int n) * set) any '..' in the path. */ static int -cleanup_pathname(struct archive_write_disk *a) +cleanup_pathname(struct archive_write_disk *a, wchar_t *name) { wchar_t *dest, *src, *p, *top; wchar_t separator = L'\0'; - p = a->name; + p = name; if (*p == L'\0') { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Invalid empty pathname"); @@ -2201,7 +2206,7 @@ cleanup_pathname(struct archive_write_disk *a) if (*p == L'/') *p = L'\\'; } - p = a->name; + p = name; /* Skip leading "\\.\" or "\\?\" or "\\?\UNC\" or * "\\?\Volume{GUID}\" @@ -2256,6 +2261,9 @@ cleanup_pathname(struct archive_write_disk *a) return (ARCHIVE_FAILED); } else p += 4; + /* Network drive path like "\\\\file" */ + } else if (p[0] == L'\\' && p[1] == L'\\') { + p += 2; } /* Skip leading drive letter from archives created diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_filter.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_filter.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_filter.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_filter.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_finish_entry.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_finish_entry.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_finish_entry.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_finish_entry.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_format.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_format.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_format.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_format.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_free.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_free.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_free.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_free.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_header.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_header.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_header.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_header.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_new.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_new.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_new.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_new.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open.3 similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_open.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_open.3 index 29bffe4..6bceb96 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open.3 +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open.3 @@ -218,6 +218,7 @@ On failure, the callback should invoke .Fn archive_set_error to register an error code and message and return +.Cm ARCHIVE_FATAL . .Bl -item -offset indent .It .Ft typedef int diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_fd.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_fd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_fd.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_fd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_file.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_file.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_file.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_file.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_memory.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_memory.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_open_memory.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_open_memory.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_7zip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_7zip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_7zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_7zip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_ar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_ar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_ar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_ar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_by_name.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_by_name.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_by_name.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_by_name.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c similarity index 86% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c index 29a7cad..47152cc 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c @@ -1,3 +1,4 @@ +#include "archive_platform.h" #include "archive.h" /* diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_binary.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c similarity index 95% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_binary.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c index c1e2f65..d6ce35a 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_binary.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c @@ -124,7 +124,7 @@ PACKED(struct cpio_binary_header { * ...but it feels a little better to do it like this: */ -static uint16_t swap16(uint16_t in) { +static uint16_t la_swap16(uint16_t in) { union { uint16_t s[2]; uint8_t c[4]; @@ -141,7 +141,7 @@ static uint16_t swap16(uint16_t in) { /* NOTREACHED */ } -static uint32_t swap32(uint32_t in) { +static uint32_t la_swap32(uint32_t in) { union { uint32_t l; uint16_t s[2]; @@ -156,8 +156,8 @@ static uint32_t swap32(uint32_t in) { U.s[1] = t; } else if (U.c[3]) { /* Big-endian */ U.l = in; - U.s[0] = swap16(U.s[0]); - U.s[1] = swap16(U.s[1]); + U.s[0] = la_swap16(U.s[0]); + U.s[1] = la_swap16(U.s[1]); } else { /* PDP-endian */ U.l = in; } @@ -426,8 +426,8 @@ write_header(struct archive_write *a, struct archive_entry *entry) /* Include trailing null */ pathlength = (int)len + 1; - h.h_magic = swap16(070707); - h.h_dev = swap16(archive_entry_dev(entry)); + h.h_magic = la_swap16(070707); + h.h_dev = la_swap16(archive_entry_dev(entry)); ino = synthesize_ino_value(cpio, entry); if (ino < 0) { @@ -441,7 +441,7 @@ write_header(struct archive_write *a, struct archive_entry *entry) ret_final = ARCHIVE_FATAL; goto exit_write_header; } - h.h_ino = swap16(ino); + h.h_ino = la_swap16((uint16_t)ino); h.h_mode = archive_entry_mode(entry); if (((h.h_mode & AE_IFMT) == AE_IFSOCK) || ((h.h_mode & AE_IFMT) == AE_IFIFO)) { @@ -460,20 +460,20 @@ write_header(struct archive_write *a, struct archive_entry *entry) /* we could turn off AE_IFREG here, but it does no harm, */ /* and allows v7 cpio to read the entry without confusion */ } - h.h_mode = swap16(h.h_mode); + h.h_mode = la_swap16(h.h_mode); - h.h_uid = swap16(archive_entry_uid(entry)); - h.h_gid = swap16(archive_entry_gid(entry)); - h.h_nlink = swap16(archive_entry_nlink(entry)); + h.h_uid = la_swap16((uint16_t)archive_entry_uid(entry)); + h.h_gid = la_swap16((uint16_t)archive_entry_gid(entry)); + h.h_nlink = la_swap16((uint16_t)archive_entry_nlink(entry)); if (archive_entry_filetype(entry) == AE_IFBLK || archive_entry_filetype(entry) == AE_IFCHR) - h.h_majmin = swap16(archive_entry_rdev(entry)); + h.h_majmin = la_swap16(archive_entry_rdev(entry)); else h.h_majmin = 0; - h.h_mtime = swap32(archive_entry_mtime(entry)); - h.h_namesize = swap16(pathlength); + h.h_mtime = la_swap32((uint32_t)archive_entry_mtime(entry)); + h.h_namesize = la_swap16(pathlength); /* Non-regular files don't store bodies. */ if (archive_entry_filetype(entry) != AE_IFREG) @@ -502,7 +502,7 @@ write_header(struct archive_write *a, struct archive_entry *entry) ret_final = ARCHIVE_FATAL; goto exit_write_header; } - h.h_filesize = swap32(strlen(p)); /* symlink */ + h.h_filesize = la_swap32((uint32_t)strlen(p)); /* symlink */ } else { if ((a->archive.archive_format == ARCHIVE_FORMAT_CPIO_PWB) && (archive_entry_size(entry) > 256*256*256-1)) { @@ -516,7 +516,7 @@ write_header(struct archive_write *a, struct archive_entry *entry) ret_final = ARCHIVE_FAILED; goto exit_write_header; } - h.h_filesize = swap32(archive_entry_size(entry)); /* file */ + h.h_filesize = la_swap32((uint32_t)archive_entry_size(entry)); /* file */ } ret = __archive_write_output(a, &h, HSIZE); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_newc.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_newc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_newc.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_newc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_odc.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_odc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_cpio_odc.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_odc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_filter_by_ext.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_filter_by_ext.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_filter_by_ext.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_filter_by_ext.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_gnutar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_gnutar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_gnutar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_gnutar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_iso9660.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_iso9660.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c index faabd28..58b7216 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_iso9660.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c @@ -6802,6 +6802,7 @@ isoent_rr_move(struct archive_write *a) * This comparing rule is according to ISO9660 Standard 6.9.1 */ static int +__LA_LIBC_CC _compare_path_table(const void *v1, const void *v2) { const struct isoent *p1, *p2; @@ -6844,6 +6845,7 @@ _compare_path_table(const void *v1, const void *v2) } static int +__LA_LIBC_CC _compare_path_table_joliet(const void *v1, const void *v2) { const struct isoent *p1, *p2; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_mtree.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_mtree.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_mtree.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_mtree.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_pax.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_pax.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_pax.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_pax.c index a2b2710..cf1f477 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_pax.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_pax.c @@ -1028,10 +1028,8 @@ archive_write_pax_header(struct archive_write *a, archive_string_init(&entry_name); archive_strcpy(&entry_name, archive_entry_pathname(entry_main)); - /* If file size is too large, add 'size' to pax extended attrs. */ + /* If file size is too large, we need pax extended attrs. */ if (archive_entry_size(entry_main) >= (((int64_t)1) << 33)) { - add_pax_attr_int(&(pax->pax_header), "size", - archive_entry_size(entry_main)); need_extension = 1; } @@ -1347,6 +1345,12 @@ archive_write_pax_header(struct archive_write *a, mapsize + pax->sparse_map_padding + sparse_total); } + /* If file size is too large, add 'size' to pax extended attrs. */ + if (archive_entry_size(entry_main) >= (((int64_t)1) << 33)) { + add_pax_attr_int(&(pax->pax_header), "size", + archive_entry_size(entry_main)); + } + /* Format 'ustar' header for main entry. * * The trouble with file size: If the reader can't understand @@ -1713,7 +1717,7 @@ build_pax_attribute_name(char *dest, const char *src) * to having clients override it. */ #if HAVE_GETPID && 0 /* Disable this for now; see above comment. */ - sprintf(buff, "PaxHeader.%d", getpid()); + snprintf(buff, sizeof(buff), "PaxHeader.%d", getpid()); #else /* If the platform can't fetch the pid, don't include it. */ strcpy(buff, "PaxHeader"); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_private.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_private.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_private.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_private.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_raw.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_raw.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_raw.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_raw.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_shar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_shar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_shar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_shar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_ustar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_ustar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_ustar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_ustar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_v7tar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_v7tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_v7tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_v7tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_warc.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_warc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_warc.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_warc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_xar.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_xar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_xar.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_xar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_zip.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c index f4352d5..8c14a70 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_format_zip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c @@ -740,12 +740,16 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) /* We may know the size, but never the CRC. */ zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; } else { - /* We don't know the size. In this case, we prefer - * deflate (it has a clear end-of-data marker which - * makes length-at-end more reliable) and will - * enable Zip64 extensions unless we're told not to. + /* We don't know the size. Use the default + * compression unless specified otherwise. + * We enable Zip64 extensions unless we're told not to. */ - zip->entry_compression = COMPRESSION_DEFAULT; + + zip->entry_compression = zip->requested_compression; + if(zip->entry_compression == COMPRESSION_UNSPECIFIED){ + zip->entry_compression = COMPRESSION_DEFAULT; + } + zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; if ((zip->flags & ZIP_FLAG_AVOID_ZIP64) == 0) { zip->entry_uses_zip64 = 1; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_options.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_options.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_options.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_options.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_options.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_options.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_options.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_options.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_passphrase.3 b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_passphrase.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_passphrase.3 rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_passphrase.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_passphrase.c b/src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_write_set_passphrase.c rename to src/dependencies/libarchive-3.6.2/libarchive/archive_write_set_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/archive_xxhash.h b/src/dependencies/libarchive-3.6.2/libarchive/archive_xxhash.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/archive_xxhash.h rename to src/dependencies/libarchive-3.6.2/libarchive/archive_xxhash.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/config_freebsd.h b/src/dependencies/libarchive-3.6.2/libarchive/config_freebsd.h similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/config_freebsd.h rename to src/dependencies/libarchive-3.6.2/libarchive/config_freebsd.h index ac651f0..758621c 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/config_freebsd.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/config_freebsd.h @@ -236,6 +236,14 @@ #define HAVE_ZLIB_H 1 #define TIME_WITH_SYS_TIME 1 +#if __FreeBSD_version >= 800505 +#define HAVE_LIBLZMA 1 +#define HAVE_LZMA_H 1 +#if __FreeBSD_version >= 1002504 +#define HAVE_LZMA_STREAM_ENCODER_MT 1 +#endif +#endif + #if __FreeBSD_version >= 1100056 #define HAVE_FUTIMENS 1 #define HAVE_UTIMENSAT 1 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/cpio.5 b/src/dependencies/libarchive-3.6.2/libarchive/cpio.5 similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/cpio.5 rename to src/dependencies/libarchive-3.6.2/libarchive/cpio.5 index 837a456..c71018b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/cpio.5 +++ b/src/dependencies/libarchive-3.6.2/libarchive/cpio.5 @@ -354,7 +354,7 @@ while working in AT&T's Unix Support Group. It appeared in 1977 as part of PWB/UNIX 1.0, the .Dq Programmer's Work Bench derived from -.At 6th Edition UNIX +.At v6 that was used internally at AT&T. Both the new binary and old character formats were in use by 1980, according to the System III source released diff --git a/src/dependencies/libarchive-3.5.2/libarchive/filter_fork.h b/src/dependencies/libarchive-3.6.2/libarchive/filter_fork.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/filter_fork.h rename to src/dependencies/libarchive-3.6.2/libarchive/filter_fork.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/filter_fork_posix.c b/src/dependencies/libarchive-3.6.2/libarchive/filter_fork_posix.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/filter_fork_posix.c rename to src/dependencies/libarchive-3.6.2/libarchive/filter_fork_posix.c index ac255c4..62085a7 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/filter_fork_posix.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/filter_fork_posix.c @@ -76,7 +76,7 @@ int __archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, pid_t *out_child) { - pid_t child; + pid_t child = -1; int stdin_pipe[2], stdout_pipe[2], tmp; #if HAVE_POSIX_SPAWNP posix_spawn_file_actions_t actions; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/filter_fork_windows.c b/src/dependencies/libarchive-3.6.2/libarchive/filter_fork_windows.c similarity index 87% rename from src/dependencies/libarchive-3.5.2/libarchive/filter_fork_windows.c rename to src/dependencies/libarchive-3.6.2/libarchive/filter_fork_windows.c index 8d11179..0b96397 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/filter_fork_windows.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/filter_fork_windows.c @@ -31,6 +31,43 @@ #include "filter_fork.h" +/* There are some editions of Windows ("nano server," for example) that + * do not host user32.dll. If we want to keep running on those editions, + * we need to delay-load WaitForInputIdle. */ +static void * +la_GetFunctionUser32(const char *name) +{ + static HINSTANCE lib; + static int set; + if (!set) { + set = 1; + lib = LoadLibrary(TEXT("user32.dll")); + } + if (lib == NULL) { + return NULL; + } + return (void *)GetProcAddress(lib, name); +} + +static int +la_WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds) +{ + static DWORD (WINAPI *f)(HANDLE, DWORD); + static int set; + + if (!set) { + set = 1; + f = la_GetFunctionUser32("WaitForInputIdle"); + } + + if (!f) { + /* An inability to wait for input idle is + * not _good_, but it is not catastrophic. */ + return WAIT_FAILED; + } + return (*f)(hProcess, dwMilliseconds); +} + int __archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, HANDLE *out_child) @@ -149,7 +186,7 @@ __archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, if (CreateProcessA(fullpath.s, cmdline.s, NULL, NULL, TRUE, 0, NULL, NULL, &staInfo, &childInfo) == 0) goto fail; - WaitForInputIdle(childInfo.hProcess, INFINITE); + la_WaitForInputIdle(childInfo.hProcess, INFINITE); CloseHandle(childInfo.hProcess); CloseHandle(childInfo.hThread); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/libarchive-formats.5 b/src/dependencies/libarchive-3.6.2/libarchive/libarchive-formats.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/libarchive-formats.5 rename to src/dependencies/libarchive-3.6.2/libarchive/libarchive-formats.5 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/libarchive.3 b/src/dependencies/libarchive-3.6.2/libarchive/libarchive.3 similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/libarchive.3 rename to src/dependencies/libarchive-3.6.2/libarchive/libarchive.3 index 1ef4b7c..6490562 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/libarchive.3 +++ b/src/dependencies/libarchive-3.6.2/libarchive/libarchive.3 @@ -62,30 +62,40 @@ GNU-format tar archives, .It most common cpio archive formats, .It -ISO9660 CD images (including RockRidge and Joliet extensions), -.It -Zip archives, +7-Zip archives, .It ar archives (including GNU/SysV and BSD extensions), .It Microsoft CAB archives, .It +ISO9660 CD images (including RockRidge and Joliet extensions), +.It LHA archives, .It mtree file tree descriptions, .It -RAR archives, +RAR and most RAR5 archives, .It -XAR archives. +WARC archives, +.It +XAR archives, +.It +Zip archives. .El The library automatically detects archives compressed with -.Xr gzip 1 , +.Xr compress 1 , .Xr bzip2 1 , -.Xr xz 1 , +.Xr grzip 1 , +.Xr gzip 1 , +.Xr lrzip 1 , +.Xr lz4 1 , .Xr lzip 1 , +.Xr lzop 1 , +.Xr xz 1 , or -.Xr compress 1 -and decompresses them transparently. +.Xr zstd 1 +and decompresses them transparently. Decompression of some formats +requires external decompressor utilities. It can similarly detect and decode archives processed with .Xr uuencode 1 or which have an @@ -107,19 +117,19 @@ archives, .It cpio archives, .It -Zip archive, +7-Zip archives, +.It +ar archives, .It two different variants of shar archives, .It ISO9660 CD images, .It -7-Zip archives, -.It -ar archives, -.It mtree file tree descriptions, .It -XAR archives. +XAR archives, +.It +Zip archive. .El Pax interchange format is an extension of the tar archive format that eliminates essentially all of the limitations of historic tar formats diff --git a/src/dependencies/libarchive-3.5.2/libarchive/libarchive_changes.3 b/src/dependencies/libarchive-3.6.2/libarchive/libarchive_changes.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/libarchive_changes.3 rename to src/dependencies/libarchive-3.6.2/libarchive/libarchive_changes.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/libarchive_internals.3 b/src/dependencies/libarchive-3.6.2/libarchive/libarchive_internals.3 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/libarchive_internals.3 rename to src/dependencies/libarchive-3.6.2/libarchive/libarchive_internals.3 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/mtree.5 b/src/dependencies/libarchive-3.6.2/libarchive/mtree.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/mtree.5 rename to src/dependencies/libarchive-3.6.2/libarchive/mtree.5 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/tar.5 b/src/dependencies/libarchive-3.6.2/libarchive/tar.5 similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/tar.5 rename to src/dependencies/libarchive-3.6.2/libarchive/tar.5 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/libarchive/test/CMakeLists.txt similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/libarchive/test/CMakeLists.txt index 53cc3e2..bbbff22 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/CMakeLists.txt +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/CMakeLists.txt @@ -63,6 +63,7 @@ IF(ENABLE_TEST) test_compat_solaris_pax_sparse.c test_compat_solaris_tar_acl.c test_compat_star_acl.c + test_compat_tar_directory.c test_compat_tar_hardlink.c test_compat_uudecode.c test_compat_uudecode_large.c @@ -152,6 +153,7 @@ IF(ENABLE_TEST) test_read_format_rar_encryption_header.c test_read_format_rar_encryption_partially.c test_read_format_rar_invalid1.c + test_read_format_rar_filter.c test_read_format_rar5.c test_read_format_raw.c test_read_format_tar.c @@ -160,6 +162,7 @@ IF(ENABLE_TEST) test_read_format_tar_empty_with_gnulabel.c test_read_format_tar_empty_pax.c test_read_format_tar_filename.c + test_read_format_tar_invalid_pax_size.c test_read_format_tbz.c test_read_format_tgz.c test_read_format_tlz.c @@ -276,6 +279,7 @@ IF(ENABLE_TEST) test_write_format_zip_compression_store.c test_write_format_zip_empty.c test_write_format_zip_empty_zip64.c + test_write_format_zip_entry_size_unset.c test_write_format_zip_file.c test_write_format_zip_file_zip64.c test_write_format_zip_large.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/README b/src/dependencies/libarchive-3.6.2/libarchive/test/README similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/README rename to src/dependencies/libarchive-3.6.2/libarchive/test/README diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/list.h b/src/dependencies/libarchive-3.6.2/libarchive/test/list.h similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/list.h rename to src/dependencies/libarchive-3.6.2/libarchive/test/list.h index 0146e92..42a36b4 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/list.h +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/list.h @@ -122,6 +122,7 @@ DEFINE_TEST(test_compat_solaris_pax_sparse) DEFINE_TEST(test_compat_solaris_tar_acl) DEFINE_TEST(test_compat_star_acl_posix1e) DEFINE_TEST(test_compat_star_acl_nfs4) +DEFINE_TEST(test_compat_tar_directory) DEFINE_TEST(test_compat_tar_hardlink) DEFINE_TEST(test_compat_uudecode) DEFINE_TEST(test_compat_uudecode_large) @@ -206,15 +207,15 @@ DEFINE_TEST(test_read_format_ar) DEFINE_TEST(test_read_format_cab) DEFINE_TEST(test_read_format_cab_filename) DEFINE_TEST(test_read_format_cpio_afio) +DEFINE_TEST(test_read_format_cpio_bin) +DEFINE_TEST(test_read_format_cpio_bin_Z) DEFINE_TEST(test_read_format_cpio_bin_be) DEFINE_TEST(test_read_format_cpio_bin_bz2) -DEFINE_TEST(test_read_format_cpio_bin) DEFINE_TEST(test_read_format_cpio_bin_gz) DEFINE_TEST(test_read_format_cpio_bin_le) DEFINE_TEST(test_read_format_cpio_bin_lzip) DEFINE_TEST(test_read_format_cpio_bin_lzma) DEFINE_TEST(test_read_format_cpio_bin_xz) -DEFINE_TEST(test_read_format_cpio_bin_Z) DEFINE_TEST(test_read_format_cpio_filename_eucJP_UTF8) DEFINE_TEST(test_read_format_cpio_filename_UTF8_eucJP) DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) @@ -233,9 +234,9 @@ DEFINE_TEST(test_read_format_cpio_filename_KOI8R_CP1251) DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP1251) DEFINE_TEST(test_read_format_cpio_odc) DEFINE_TEST(test_read_format_cpio_svr4_bzip2_rpm) -DEFINE_TEST(test_read_format_cpio_svr4c_Z) DEFINE_TEST(test_read_format_cpio_svr4_gzip) DEFINE_TEST(test_read_format_cpio_svr4_gzip_rpm) +DEFINE_TEST(test_read_format_cpio_svr4c_Z) DEFINE_TEST(test_read_format_empty) DEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8) DEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R) @@ -250,20 +251,20 @@ DEFINE_TEST(test_read_format_gtar_gz) DEFINE_TEST(test_read_format_gtar_lzma) DEFINE_TEST(test_read_format_gtar_sparse) DEFINE_TEST(test_read_format_gtar_sparse_skip_entry) +DEFINE_TEST(test_read_format_iso_Z) +DEFINE_TEST(test_read_format_iso_multi_extent) +DEFINE_TEST(test_read_format_iso_xorriso) DEFINE_TEST(test_read_format_isojoliet_bz2) DEFINE_TEST(test_read_format_isojoliet_long) DEFINE_TEST(test_read_format_isojoliet_rr) DEFINE_TEST(test_read_format_isojoliet_versioned) -DEFINE_TEST(test_read_format_iso_multi_extent) DEFINE_TEST(test_read_format_isorr_bz2) DEFINE_TEST(test_read_format_isorr_ce) DEFINE_TEST(test_read_format_isorr_new_bz2) DEFINE_TEST(test_read_format_isorr_rr_moved) -DEFINE_TEST(test_read_format_iso_xorriso) -DEFINE_TEST(test_read_format_iso_Z) DEFINE_TEST(test_read_format_isozisofs_bz2) -DEFINE_TEST(test_read_format_lha_bugfix_0) DEFINE_TEST(test_read_format_lha) +DEFINE_TEST(test_read_format_lha_bugfix_0) DEFINE_TEST(test_read_format_lha_filename) DEFINE_TEST(test_read_format_lha_filename_UTF16) DEFINE_TEST(test_read_format_mtree) @@ -274,8 +275,31 @@ DEFINE_TEST(test_read_format_mtree_nomagic_v2_form) DEFINE_TEST(test_read_format_mtree_nomagic_v2_netbsd_form) DEFINE_TEST(test_read_format_mtree_nonexistent_contents_file) DEFINE_TEST(test_read_format_mtree_noprint) +DEFINE_TEST(test_read_format_mtree_tab) DEFINE_TEST(test_read_format_mtree_crash747) DEFINE_TEST(test_read_format_pax_bz2) +DEFINE_TEST(test_read_format_rar_set_format) +DEFINE_TEST(test_read_format_rar_basic) +DEFINE_TEST(test_read_format_rar_subblock) +DEFINE_TEST(test_read_format_rar_noeof) +DEFINE_TEST(test_read_format_rar_unicode_UTF8) +DEFINE_TEST(test_read_format_rar_unicode_CP932) +DEFINE_TEST(test_read_format_rar_compress_normal) +DEFINE_TEST(test_read_format_rar_multi_lzss_blocks) +DEFINE_TEST(test_read_format_rar_compress_best) +DEFINE_TEST(test_read_format_rar_ppmd_lzss_conversion) +DEFINE_TEST(test_read_format_rar_binary) +DEFINE_TEST(test_read_format_rar_windows) +DEFINE_TEST(test_read_format_rar_multivolume) +DEFINE_TEST(test_read_format_rar_multivolume_skip) +DEFINE_TEST(test_read_format_rar_sfx) +DEFINE_TEST(test_read_format_rar_multivolume_stored_file) +DEFINE_TEST(test_read_format_rar_multivolume_stored_file_skip) +DEFINE_TEST(test_read_format_rar_multivolume_seek_data) +DEFINE_TEST(test_read_format_rar_multivolume_seek_multiple_files) +DEFINE_TEST(test_read_format_rar_multivolume_uncompressed_files) +DEFINE_TEST(test_read_format_rar_ppmd_use_after_free) +DEFINE_TEST(test_read_format_rar_ppmd_use_after_free2) DEFINE_TEST(test_read_format_rar5_set_format) DEFINE_TEST(test_read_format_rar5_stored) DEFINE_TEST(test_read_format_rar5_compressed) @@ -315,35 +339,19 @@ DEFINE_TEST(test_read_format_rar5_distance_overflow) DEFINE_TEST(test_read_format_rar5_nonempty_dir_stream) DEFINE_TEST(test_read_format_rar5_fileattr) DEFINE_TEST(test_read_format_rar5_different_window_size) +DEFINE_TEST(test_read_format_rar5_window_buf_and_size_desync) DEFINE_TEST(test_read_format_rar5_arm_filter_on_window_boundary) DEFINE_TEST(test_read_format_rar5_different_solid_window_size) DEFINE_TEST(test_read_format_rar5_different_winsize_on_merge) DEFINE_TEST(test_read_format_rar5_block_size_is_too_small) -DEFINE_TEST(test_read_format_rar_set_format) -DEFINE_TEST(test_read_format_rar_basic) -DEFINE_TEST(test_read_format_rar_subblock) -DEFINE_TEST(test_read_format_rar_noeof) -DEFINE_TEST(test_read_format_rar_unicode_UTF8) -DEFINE_TEST(test_read_format_rar_unicode_CP932) -DEFINE_TEST(test_read_format_rar_compress_normal) -DEFINE_TEST(test_read_format_rar_multi_lzss_blocks) -DEFINE_TEST(test_read_format_rar_compress_best) -DEFINE_TEST(test_read_format_rar_ppmd_lzss_conversion) -DEFINE_TEST(test_read_format_rar_binary) -DEFINE_TEST(test_read_format_rar_windows) -DEFINE_TEST(test_read_format_rar_multivolume) -DEFINE_TEST(test_read_format_rar_multivolume_skip) -DEFINE_TEST(test_read_format_rar_sfx) -DEFINE_TEST(test_read_format_rar_multivolume_stored_file) -DEFINE_TEST(test_read_format_rar_multivolume_stored_file_skip) -DEFINE_TEST(test_read_format_rar_multivolume_seek_data) -DEFINE_TEST(test_read_format_rar_multivolume_seek_multiple_files) -DEFINE_TEST(test_read_format_rar_multivolume_uncompressed_files) -DEFINE_TEST(test_read_format_rar_ppmd_use_after_free) -DEFINE_TEST(test_read_format_rar_ppmd_use_after_free2) +DEFINE_TEST(test_read_format_rar5_sfx) +DEFINE_TEST(test_read_format_rar5_decode_number_out_of_bounds_read) +DEFINE_TEST(test_read_format_rar5_bad_window_size_in_multiarchive_file) +DEFINE_TEST(test_read_format_rar5_read_data_block_uninitialized_offset) DEFINE_TEST(test_read_format_rar_encryption_data) DEFINE_TEST(test_read_format_rar_encryption_header) DEFINE_TEST(test_read_format_rar_encryption_partially) +DEFINE_TEST(test_read_format_rar_filter) DEFINE_TEST(test_read_format_rar_invalid1) DEFINE_TEST(test_read_format_raw) DEFINE_TEST(test_read_format_tar) @@ -352,6 +360,7 @@ DEFINE_TEST(test_read_format_tar_empty_filename) DEFINE_TEST(test_read_format_tar_empty_pax) DEFINE_TEST(test_read_format_tar_empty_with_gnulabel) DEFINE_TEST(test_read_format_tar_filename) +DEFINE_TEST(test_read_format_tar_invalid_pax_size) DEFINE_TEST(test_read_format_tbz) DEFINE_TEST(test_read_format_tgz) DEFINE_TEST(test_read_format_tlz) @@ -360,7 +369,6 @@ DEFINE_TEST(test_read_format_tz) DEFINE_TEST(test_read_format_ustar_filename) DEFINE_TEST(test_read_format_warc) DEFINE_TEST(test_read_format_xar) -DEFINE_TEST(test_read_format_zip_utf8_paths) DEFINE_TEST(test_read_format_zip) DEFINE_TEST(test_read_format_zip_ppmd_one_file) DEFINE_TEST(test_read_format_zip_ppmd_one_file_blockread) @@ -374,6 +382,10 @@ DEFINE_TEST(test_read_format_zip_bzip2_one_file) DEFINE_TEST(test_read_format_zip_bzip2_one_file_blockread) DEFINE_TEST(test_read_format_zip_bzip2_multi) DEFINE_TEST(test_read_format_zip_bzip2_multi_blockread) +DEFINE_TEST(test_read_format_zip_zstd_one_file) +DEFINE_TEST(test_read_format_zip_zstd_one_file_blockread) +DEFINE_TEST(test_read_format_zip_zstd_multi) +DEFINE_TEST(test_read_format_zip_zstd_multi_blockread) DEFINE_TEST(test_read_format_zip_xz_multi) DEFINE_TEST(test_read_format_zip_xz_multi_blockread) DEFINE_TEST(test_read_format_zip_ppmd8_crash_1) @@ -384,6 +396,7 @@ DEFINE_TEST(test_read_format_zip_lzma_stream_end) DEFINE_TEST(test_read_format_zip_lzma_stream_end_blockread) DEFINE_TEST(test_read_format_zip_7z_lzma) DEFINE_TEST(test_read_format_zip_7z_deflate) +DEFINE_TEST(test_read_format_zip_utf8_paths) DEFINE_TEST(test_read_format_zip_comment_stored) DEFINE_TEST(test_read_format_zip_encryption_data) DEFINE_TEST(test_read_format_zip_encryption_header) @@ -463,8 +476,8 @@ DEFINE_TEST(test_ustar_filename_encoding_EUCJP_CP932) DEFINE_TEST(test_ustar_filename_encoding_CP932_UTF8) DEFINE_TEST(test_ustar_filenames) DEFINE_TEST(test_warn_missing_hardlink_target) -DEFINE_TEST(test_write_disk_appledouble) DEFINE_TEST(test_write_disk) +DEFINE_TEST(test_write_disk_appledouble) DEFINE_TEST(test_write_disk_failures) DEFINE_TEST(test_write_disk_fixup) DEFINE_TEST(test_write_disk_hardlink) @@ -473,11 +486,11 @@ DEFINE_TEST(test_write_disk_lookup) DEFINE_TEST(test_write_disk_mac_metadata) DEFINE_TEST(test_write_disk_no_hfs_compression) DEFINE_TEST(test_write_disk_perms) +DEFINE_TEST(test_write_disk_secure) DEFINE_TEST(test_write_disk_secure744) DEFINE_TEST(test_write_disk_secure745) DEFINE_TEST(test_write_disk_secure746a) DEFINE_TEST(test_write_disk_secure746b) -DEFINE_TEST(test_write_disk_secure) DEFINE_TEST(test_write_disk_sparse) DEFINE_TEST(test_write_disk_symlink) DEFINE_TEST(test_write_disk_times) @@ -524,22 +537,22 @@ DEFINE_TEST(test_write_format_cpio_odc) DEFINE_TEST(test_write_format_gnutar) DEFINE_TEST(test_write_format_gnutar_filenames) DEFINE_TEST(test_write_format_gnutar_linknames) -DEFINE_TEST(test_write_format_iso9660_boot) DEFINE_TEST(test_write_format_iso9660) +DEFINE_TEST(test_write_format_iso9660_boot) DEFINE_TEST(test_write_format_iso9660_empty) DEFINE_TEST(test_write_format_iso9660_filename) DEFINE_TEST(test_write_format_iso9660_zisofs) -DEFINE_TEST(test_write_format_mtree_absolute_path) DEFINE_TEST(test_write_format_mtree) DEFINE_TEST(test_write_format_mtree_no_leading_dotslash) +DEFINE_TEST(test_write_format_mtree_absolute_path) DEFINE_TEST(test_write_format_mtree_classic) DEFINE_TEST(test_write_format_mtree_classic_indent) DEFINE_TEST(test_write_format_mtree_fflags) DEFINE_TEST(test_write_format_mtree_no_separator) DEFINE_TEST(test_write_format_mtree_quoted_filename) DEFINE_TEST(test_write_format_pax) -DEFINE_TEST(test_write_format_raw_b64) DEFINE_TEST(test_write_format_raw) +DEFINE_TEST(test_write_format_raw_b64) DEFINE_TEST(test_write_format_shar_empty) DEFINE_TEST(test_write_format_tar) DEFINE_TEST(test_write_format_tar_empty) @@ -558,6 +571,7 @@ DEFINE_TEST(test_write_format_zip_winzip_aes256_encryption) DEFINE_TEST(test_write_format_zip_compression_store) DEFINE_TEST(test_write_format_zip_empty) DEFINE_TEST(test_write_format_zip_empty_zip64) +DEFINE_TEST(test_write_format_zip_size_unset) DEFINE_TEST(test_write_format_zip_file) DEFINE_TEST(test_write_format_zip_file_zip64) DEFINE_TEST(test_write_format_zip_large) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/read_open_memory.c b/src/dependencies/libarchive-3.6.2/libarchive/test/read_open_memory.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/read_open_memory.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/read_open_memory.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test.h b/src/dependencies/libarchive-3.6.2/libarchive/test/test.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test.h rename to src/dependencies/libarchive-3.6.2/libarchive/test/test.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_nfs4.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_nfs4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_nfs4.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_nfs4.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax_nfs4.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax_nfs4.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax_nfs4.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax_nfs4.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax_posix1e.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax_posix1e.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_pax_posix1e.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_pax_posix1e.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_platform_nfs4.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_platform_nfs4.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_platform_nfs4.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_platform_nfs4.c index ae4bb5a..6a5b439 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_platform_nfs4.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_platform_nfs4.c @@ -907,7 +907,7 @@ DEFINE_TEST(test_acl_platform_nfs4) assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); for (i = 0; i < acls_dir_cnt; ++i) { - sprintf(buff, "dir%d", i); + snprintf(buff, sizeof(buff), "dir%d", i); archive_entry_set_pathname(ae, buff); archive_entry_set_filetype(ae, AE_IFDIR); archive_entry_set_perm(ae, 0654); @@ -960,7 +960,7 @@ DEFINE_TEST(test_acl_platform_nfs4) /* Verify single-permission dirs on disk. */ for (i = 0; i < dircnt; ++i) { - sprintf(buff, "dir%d", i); + snprintf(buff, sizeof(buff), "dir%d", i); assertEqualInt(0, stat(buff, &st)); assertEqualInt(st.st_mtime, 123456 + i); #if ARCHIVE_ACL_SUNOS_NFS4 diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_platform_posix1e.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_platform_posix1e.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_platform_posix1e.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_platform_posix1e.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_posix1e.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_posix1e.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_posix1e.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_posix1e.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_text.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_text.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_acl_text.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_acl_text.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_api_feature.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_api_feature.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_api_feature.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_api_feature.c index 60773ad..d7d1a2d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_api_feature.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_api_feature.c @@ -32,7 +32,7 @@ DEFINE_TEST(test_archive_api_feature) /* This is the (hopefully) final versioning API. */ assertEqualInt(ARCHIVE_VERSION_NUMBER, archive_version_number()); - sprintf(buff, "libarchive %d.%d.%d", + snprintf(buff, sizeof(buff), "libarchive %d.%d.%d", archive_version_number() / 1000000, (archive_version_number() / 1000) % 1000, archive_version_number() % 1000); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_clear_error.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_clear_error.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_clear_error.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_clear_error.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_cmdline.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_cmdline.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_cmdline.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_cmdline.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_digest.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_digest.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_digest.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_digest.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_getdate.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_getdate.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_getdate.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_getdate.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_owner.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_owner.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_owner.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_owner.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_path.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_path.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_path.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_path.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_time.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_time.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_time.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_time.c index c6864b3..23754a1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_match_time.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_match_time.c @@ -321,6 +321,11 @@ test_newer_ctime_than_file_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -435,6 +440,11 @@ test_newer_ctime_than_file_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -782,6 +792,11 @@ test_older_ctime_than_file_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -897,6 +912,11 @@ test_older_ctime_than_file_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -1073,6 +1093,11 @@ test_ctime_between_files_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -1132,6 +1157,11 @@ test_ctime_between_files_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_pathmatch.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_pathmatch.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_pathmatch.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_pathmatch.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_add_passphrase.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_add_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_add_passphrase.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_add_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice_open_fd.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice_open_fd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice_open_fd.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice_open_fd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice_open_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice_open_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_close_twice_open_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_close_twice_open_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_multiple_data_objects.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_multiple_data_objects.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_multiple_data_objects.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_multiple_data_objects.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_next_header_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_next_header_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_next_header_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_next_header_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_next_header_raw.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_next_header_raw.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_next_header_raw.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_next_header_raw.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_open2.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_open2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_open2.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_open2.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_filter_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_filter_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_filter_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_filter_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_format_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_format_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_format_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_format_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_options.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_options.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_set_options.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_set_options.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_support.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_support.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_read_support.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_read_support.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_set_error.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_set_error.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_set_error.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_set_error.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string_conversion.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string_conversion.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string_conversion.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string_conversion.c index fb5359b..7faf58b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string_conversion.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string_conversion.c @@ -847,6 +847,7 @@ test_archive_string_set_get(void) assertEqualInt(0, archive_mstring_update_utf8(a, &mstr, "EEEEE---H")); check_string(a, &mstr, sc, "EEEEE---H", L"EEEEE---H"); + archive_mstring_clean(&mstr); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string_conversion.txt.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string_conversion.txt.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_string_conversion.txt.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_string_conversion.txt.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_add_filter_by_name.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_add_filter_by_name.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_add_filter_by_name.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_add_filter_by_name.c index ba8c1d0..49f91ac 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_add_filter_by_name.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_add_filter_by_name.c @@ -142,12 +142,6 @@ canAlways(void) return 1; } -static int -cannot(void) -{ - return 0; -} - DEFINE_TEST(test_archive_write_add_filter_by_name_b64encode) { test_filter_by_name("b64encode", ARCHIVE_FILTER_UU, canAlways); @@ -185,12 +179,12 @@ DEFINE_TEST(test_archive_write_add_filter_by_name_lz4) DEFINE_TEST(test_archive_write_add_filter_by_name_lzip) { - test_filter_by_name("lzip", ARCHIVE_FILTER_LZIP, cannot); + test_filter_by_name("lzip", ARCHIVE_FILTER_LZIP, canLzip); } DEFINE_TEST(test_archive_write_add_filter_by_name_lzma) { - test_filter_by_name("lzma", ARCHIVE_FILTER_LZMA, cannot); + test_filter_by_name("lzma", ARCHIVE_FILTER_LZMA, canLzma); } DEFINE_TEST(test_archive_write_add_filter_by_name_lzop) @@ -205,7 +199,7 @@ DEFINE_TEST(test_archive_write_add_filter_by_name_uuencode) DEFINE_TEST(test_archive_write_add_filter_by_name_xz) { - test_filter_by_name("xz", ARCHIVE_FILTER_XZ, cannot); + test_filter_by_name("xz", ARCHIVE_FILTER_XZ, canXz); } DEFINE_TEST(test_archive_write_add_filter_by_name_zstd) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_filter_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_filter_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_filter_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_filter_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_by_name.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_by_name.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_by_name.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_by_name.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_filter_by_ext.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_filter_by_ext.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_filter_by_ext.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_filter_by_ext.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_format_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_format_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_option.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_option.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_option.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_option.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_options.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_options.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_options.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_options.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_passphrase.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_archive_write_set_passphrase.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_archive_write_set_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_bad_fd.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_bad_fd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_bad_fd.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_bad_fd.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2_1.tbz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2_1.tbz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2_1.tbz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2_1.tbz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2_2.tbz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2_2.tbz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_bzip2_2.tbz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_bzip2_2.tbz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_cpio.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_cpio.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_cpio.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_cpio.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_cpio_1.cpio.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_cpio_1.cpio.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_cpio_1.cpio.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_cpio_1.cpio.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar_1.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar_1.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar_1.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar_1.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar_2.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar_2.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gtar_2.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gtar_2.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip_1.tgz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip_1.tgz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip_1.tgz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip_1.tgz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip_2.tgz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip_2.tgz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_gzip_2.tgz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_gzip_2.tgz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_1.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_1.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_1.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_1.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_2.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_2.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_2.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_2.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_3.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_3.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_3.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_3.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4BD.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4BD.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4BD.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4BD.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4BDBX.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4BDBX.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B4BDBX.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B4BDBX.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B5.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B5.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B5.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B5.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B5BD.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B5BD.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B5BD.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B5BD.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B6.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B6.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B6.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B6.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B6BD.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B6BD.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B6BD.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B6BD.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B7.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B7.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B7.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B7.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip_1.tlz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip_1.tlz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip_1.tlz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip_1.tlz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip_2.tlz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip_2.tlz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzip_2.tlz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzip_2.tlz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_1.tlz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_1.tlz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_1.tlz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_1.tlz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_2.tlz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_2.tlz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_2.tlz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_2.tlz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_3.tlz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_3.tlz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzma_3.tlz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzma_3.tlz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_1.tar.lzo.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_1.tar.lzo.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_1.tar.lzo.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_1.tar.lzo.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_2.tar.lzo.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_2.tar.lzo.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_2.tar.lzo.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_2.tar.lzo.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_3.tar.lzo.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_3.tar.lzo.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_lzop_3.tar.lzo.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_lzop_3.tar.lzo.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac-1.tar.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac-1.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac-1.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac-1.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac-2.tar.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac-2.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac-2.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac-2.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_mac.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_mac.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_perl_archive_tar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_perl_archive_tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_perl_archive_tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_perl_archive_tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_perl_archive_tar.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_perl_archive_tar.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_perl_archive_tar.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_perl_archive_tar.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_plexus_archiver_tar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_plexus_archiver_tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_plexus_archiver_tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_plexus_archiver_tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_plexus_archiver_tar.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_plexus_archiver_tar.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_plexus_archiver_tar.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_plexus_archiver_tar.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_tar_acl.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_tar_acl.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_tar_acl.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_tar_acl.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_tar_acl.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_tar_acl.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_solaris_tar_acl.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_solaris_tar_acl.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl_nfs4.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl_nfs4.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl_nfs4.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl_nfs4.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl_posix1e.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl_posix1e.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_compat_star_acl_posix1e.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_star_acl_posix1e.tar.uu diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory.c new file mode 100644 index 0000000..5750db3 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory.c @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2021 Samanta Navarro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +/* + * Background: Original tar file format did not use its linkflag to + * specify directories. Instead regular files simply have a slash + * appended to their names. No data blocks follow directories in + * archives. This means that a possibly specified file size must not + * be used to determine the amount of data blocks to skip. + */ + +static void +test_compat_tar_directory_1(void) +{ + char name[] = "test_compat_tar_directory_1.tar"; + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); + + /* Read first entry, which is a directory in a regular file header. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("directory1/", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(1, archive_entry_size(ae)); + + /* Read second entry, which is a ustar directory entry. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("directory2/", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(0, archive_entry_size(ae)); + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_compat_tar_directory) +{ + test_compat_tar_directory_1(); +} + + diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory_1.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory_1.tar.uu new file mode 100644 index 0000000..3e1ead9 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_compat_tar_directory_1.tar.uu @@ -0,0 +1,50 @@ +$FreeBSD$ +begin 644 test_compat_tar_directory_1.tar +M9&ER96-T;W)Y,2\````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#`W,#``,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,#`Q +M`#`P,#`P,#`P,#`P`#`P-C4Q-0`@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!D:7)E8W1OYPW_("`@("``_R````````````````````````````!__P`` +M``````!T72`@/EW_(/\@("`@("`@("`@("`@("`@("`@("`@("`@(/\@("`@ +M("`@("#_("`@("`@("`@("`@("`@("`@("`@("`@("#_("`@("`@("`@_R`@ +M("`@("`@("`@("`@("`@("`@("`@("`@_R`@("`@("`@(/\@("`@("`@("`@ +M("`@("`@("`@("`@("`@(/\@("`@("`@("#_("`@("`@("`@("`@("`@("`@ +E("`@("`@("#_("`@("`@("`@_R`@("`@("`@("`@("`@("`@(``` +` +end diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_solid_window_size.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_solid_window_size.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_solid_window_size.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_solid_window_size.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_window_size.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_window_size.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_window_size.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_window_size.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_fileattr.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_fileattr.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_fileattr.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_fileattr.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_hardlink.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_hardlink.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_hardlink.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_hardlink.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_leftshift1.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_leftshift1.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_leftshift1.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_leftshift1.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_leftshift2.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_leftshift2.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_leftshift2.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_leftshift2.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part01.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part01.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part01.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part01.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part02.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part02.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part02.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part02.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part03.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part03.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part03.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part03.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part04.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part04.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part04.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiarchive_solid.part04.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiple_files.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiple_files.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiple_files.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiple_files.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_owner.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_owner.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_owner.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_owner.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_sfx.exe.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_sfx.exe.uu new file mode 100644 index 0000000..fdf83af --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_sfx.exe.uu @@ -0,0 +1,7048 @@ +begin 644 - +M35J0``,````$````__\``+@`````````0``````````````````````````` +M````````````````````$`$```X?N@X`M`G-(;@!3,TA5&AIP"0!F<`=7YK! +M,`&9P!U?G<$U`9G`'5^1K`+`&9P"]Y"L`C`9G`)@&8P"L`F<"Q +M7YS!%P&9P+%?F<$G`9G`M%]FP"@.1`#HD[X``&A@(T,`Z"#:`0!9P\S, +MS,S,S,S,S,QH<"-#`.@*V@$`6&I%`.CAW```:(`C0P#HT-D!`%G#S,S,S,S,S,S,S+F" +MVT4`Z,'<``!HD"-#`.BPV0$`6,5$`.A]2@``:+`C0P#H<-D!`%G#S,S,S,S, +MS,S,S%6+[('L6`0``%-65XM]%(VUJ/O__[L``@``A?]T05-7B\90Z!GP``"+ +MQE#H8R<"`%F-M:K[__^--$:-A:C[__^+SBO(B\/1^2O!4%=6Z._O``!6Z#LG +M`@!9C31&@\8"C86H^___B\XKR(O#T?DKP5!HH@```.A"SP``4%;HP.\``%;H +M#"<"`%F-C:C[__^--$:#Q@*+QBO!T?@KV%-HL#5#`%;HF>\``%;HY28"`#/) +M:EAFB4Q&`HU%J%Y645#H/>0!`(M%"(/$$(I=&(M]$(E%K*'0#D0`B46PC86H +M^___B46TBT4,B478C46HB76HB7W$QT7(``@``,=%W`P(`0!0A-MT"/\5/"!& +M`.L&_Q5$($8`B_"%]G4L_Q5`($8`/0(P``!U'3/`9HD'C46H4(3;=`C_%3P@ +M1@#K!O\51"!&`(OPA?9?7@^5P%N+Y5W"%`!5B^R!["P"``"-1?Q0_Q6(($8` +MA@.1``D`0^VP%#_=1C_=0CH/O"$``(B&N"$` +M`(3`="-H\((``.CMT`$`68E%[,9%_`6%P'0)B\CH-9X``.L'B\/K`XM%"(F& +MO"$``(J`H6$``(..P"$``/^#CL0A``#_@X[((0``_VI`B$8BC88((@``4U#' +MAK!L```"````B9ZT;```B9ZX;```B9[`;```B9[0(0``B9[4(0``B)Z\;``` +M9HF>Q&P``(F>V"$``(F>H&P``(F>I&P``(F>J&P``(F>K&P``.@IX0$`:C2- +MAD@B``!34.@:X0$`:B"-AI!%``!34.@+X0$`BTWT@\0DB9[8;```,\")GN!L +M``")GN1L``")GNAL``")GNQL``")GO!L``")GO1L``!FB8;Z;```B\:(GM9L +M``"(GOAL``"(GN`A``!>6V2)#0````"+Y5W"!`!1,\")#"2)@2@0``")@2P0 +M``")@3`0``")@300``"(@3@0``")@4`0``")@400``")@4@0``")@4P0``") +M@5`0``")@500``"+P5G#5E>+\;BT-4,`:@A9B_[SJVH@,_^-1B!74.A%X`$` +MBT0D&(/$#(E^0(E^1(E&2(O&7U["!`!5B^QDH0````!J_VB!'T,`4&2))0`` +M``!6B_&#/@!T&(!^$`!T"O]V"/\VZ.'9``#_-NBE(@(`68M-]&2)#0````!> +MB^5=PU6+[&2A`````&K_:($?0P!09(DE`````%:+\8,^`'0;@'X0`'0-BT8( +M`\!0_S;HE]D``/\VZ%LB`@!9BTWT9(D-`````%Z+Y5W#5HOQ@+ZX(0```,<& +MN#5#`'0@5XN^O"$``(7_=!2+S^CDG```:/""``!7Z,/.`0!965^-COA5``#H +M,O___XV.J#(``.@G____C8[H(```Z"BT``"-CB@0``#H\4D``(O.7NDW@0`` +M@<$H$```Z?[^___,S,S,S,S,S,S,S,Q6B_'H>_____9$)`@!=`UH`'T``%;H +M6\X!`%E9B\9>P@0`BT0D!%:+\0%&!(M.!#M."`^&G0```(M&#%-5O5`/1`!7 +MABK5P``BT8(BUX$P>@"@\`@`T8( +M.]AW`HO8@'X0`%-T.NA1(0(`B_A9A?]U!XO-Z'Q7``"#/@!T./]V"/\V5^C@ +MWP$`@\0,_W8(_S;H5M@``/\VZ!HA`@!9ZQ;_-N@@(0(`B_A9687_=0>+S>@_ +M5P``B3Y?78E>"%M>P@0`BT0D!%:+\0%&!(M.!#M."`^&I@```(M&#%-5O5`/ +M1`!7ACT5@``BT8(BUX$P>@"@\`@ +M`T8(.]AW`HO8@'X0`(T$&U!T0.B7(`(`B_A9A?]U!XO-Z,)6``"#/@!T/HM& +M"`/`4/\V5^@CWP$`BT8(@\0,`\!0_S;HEM<``/\VZ%H@`@!9ZQ;_-NA@(`(` +MB_A9687_=0>+S>A_5@``B3Y?78E>"%M>P@0`BT0D!#M!"'8+*T$$4.@N____ +MZP.)003"!`!6_W0D"(OQZ#+^3/;4XLW.)\D(@``=#V+A\!L``"+3A"#P!13 +M4/\58#)#`(O/_U80B\_H22$``(7`=!6#O]PA``!U=0R+1"00.5@$#Y?`ZSTR +MP.LYZ)L'``"+3A!24/\58#)#`(O/_U80:#`V0P"+S^AW)0``ABL-;7<($`+B3'T,`Z(3+`0"#["Q3B]E65VH'BP.-N_@A``!7 +MQH.\;````,:#Q&P```"+<`R+SO\58#)#`(O+_]:#^`=T!S+`Z9L#``!J!S/V +M5XFSP&P``.BL`P``AB) +M@[!L``"#^`%U-H7V?C*#^1Q]+8-][!]^)XM%R"O!@'@<4G42@'@=4W4,@'@> +M1G4&@'@?6'0*BT7L1COP?*?K0HL#`\YJ`&H`B8O`;```BW`048O._Q5@,D,` +MB\O_UHN#L&P``(/X`G0%@_@#=12+`VH'5XMP#(O._Q5@,D,`B\O_UH.[P&P` +M``"-3``"%P`^5P(A%\CP!=,6*1?.*B\5L``"$R70* +M@'T(``^$S_W__X"[Q&P```!U!(3`=1F$R74+C4,D4&H;Z.]0``"`?0@`#X2I +M_?__@'WR`(J#)"(``(B#MFP```^$#`$``("[X"$```!T#8"[O&P````/A?8` +M``"+`XMP%(O._Q5@,D,`B\O_UHOPB_J+@Z!L``")1>B+@Z1L``")1>R+@ZAL +M``")1>2+@ZQL``")1>"+@]PA``")1=SK1+`!Z4____^+@]PA``"#^`-U(8"[ +MM6P```!T#H"[:%8```!U!3/`0.L",\"(@[EL``#K"H/X`G09@_@%=#.+R^CJ +M`0``B\OH&AT``(7`=;CK'X"[M6P```!T#H"[&#,```!U!3/`0.L",\"(@[EL +M``"+1>B)@Z!L``"+1>R)@Z1L``"+1>2)@ZAL``"+1>")@ZQL``"+1=R)@]PA +M``"+`VH`5U:+6V2)#0````"+Y5W"!`#,S,S,S,R# +M>03_#Y7`PS/)@WPD"`%R2HM$)`2`.%)U08-\)`@'`%A=32`>`)R=2Z` +M>`,A=2B`>`0:=2*`>`4'=1R*0`:$P'4$:@+K$#P!=01J`^L(=@<\!7,#:@19 +MB\'""`"XI1]#`.@JQP$`@^P84S/;B\&)1?")7=R)7>")7>2)7>B(7>Q34XU- +MW(E=_%&+R.AN'```A,`/A(,```!65XM]X(U-W&H!Z(?X__^+3>"+1=R+=0B( +M7`'_C4L;```_[>H;```BW`0B\[_%6`R0P"+S__67U[#N+BI30``BP>+<`B+SO\58#)#`(O/_]8RP%[K`K`! +M7\($`.D)]O__BT0D!#M!"'8+*T$$4.@G]___ZP.)003"!`!6B_&-1B10:AKH +M8$T``&H#N5`/1`#&AL1L```!Z,9/``!>PX.Y?#,```!T&#/`.(%Q,P``#Y3` +M2(/@\(/`((F!I"(``,-6BW0D"%>+^8N6_!```(/Z`G45,\`XAO$0```/E,!( +M@^#P@\`@B48D@_H!=0YH``@``(U&*%#HW)4``(U&*#/V9CDP=$-3:EQ::E]; +M9CD0=0R#O[!L```#=0-FB1AF@S@Z=0-FB1@/MPB#^2]T#F8[RG4,@[^P;``` +M`W0#9HD0@\`"9CDP=<5;7U["!`!6B_%7B[[`;````[X`(@``@[ZP;````G4( +MBX84(@``ZQ'_MA0B``#H<_C__P.&5"(``#/2`\=?$])>PXJ!<3,``,.XL"`` +M`.@_Q0$`5XN\)+@@``")3"0,BU<8B\(KA"2\(```.T<<#X)1!@``*]")1QR# +M^@(/@D,&``!3BYPDQ"```%56B\_HLZ<``(O(A=(/C"4&``!_"(7)#X0;!@`` +MBT<8BW<<*\8/A`T&``"%T@^/!08``'P(.\@/A_L%``"-+`Z+SXEL)"CH<:<` +M`"MO'(OPB\(SR8E$)"2)3"0@#XS6!0``?PB%[0^"S`4``(-[!`$/A8(```"# +M_@%U?87`=7F+S\9#'@'H,J<``(E$)!RH`70OB\_H(Z<``(O("\IT'HM,)!B+ +MB:!L```#R(M$)!B+@*1L```3PHE+((E#)(M$)!RH`G0KB\_H\*8``(O("\IT +M'HM,)!B+B:!L```#R(M$)!B+@*1L```3PHE+,(E#-(M,)""+1"0D@WL$`G0* +M@WL$`P^%&P4``(7`#X<3!0``<@F#_@D#@.$!B(L' +M(0``QH,((@```,9%``"H`70EB\_H\:4``(OPN/\````[\'("B_!658O/Z#VE +M``"+1"0+S^C(I0``B_"X_P```#OP<@*+\%:-JP@B``"+SU7H +M#J4``,8$+@"`NP8A````=`V+S^B8I0``B8,((P``@+L'(0```'0-B\_H@J4` +M`(F##",``,:#!2$```'IUP,``(O/Z&FE``"+SXF#`!$``.AA7HP``:@!0C8M`$```Z/+K``#K +M$NB$HP``4E"-BT`0``#H'>P``(I,)!.*1"04@.$$B$PD%G0MB\^$P'05Z!FC +M``!J`%"-BT@0``#HM.L``.L2Z$:C``!24(V+2!```.C?ZP``BD0D$XK(@.$( +MB$PD%W0T@'PD%`"+SW05Z-JB``!J`%"-BU`0``#H=>L``.L2Z`>C``!24(V+ +M4!```.B@ZP``BD0D$X!\)!0`#X00`@``J!`/A`@"``"`?"05`'0GB\_HDZ(` +M`+W___\_O@#*FCLCQ3O&#G!`` +M``4```#&@YL0```!BTPD*(E/'(M'&"O!@_@"#X/*^?__7EU;7X'$L"```,(, +M`%6#[%RXR1]#`.C9O0$`N"0@``#HJ[X!`%-6B]F-32174XE=(.C3GP``,\EJ +M!XE-'(E-_%\XB[QL``!T<(N3P&P``#/``]<3P3F#I&P``'QB3%0``BP.-311J"%&+<`R+SO\58#)#`(O+_]:#^`AU/3/)C444 +M45%145"+@[PA``"-LR@0```%)%```%!J!%&+SNBU.0``B75$ZP.(35]7C4TD +MZ$^A``"#?3P`=0R+R^C'%@``Z;()``"-323H<)\```^WP(U-)(F#Y"$``,:# +M]"$```#H0)\``(U-)`^V\.A-GP``#[?`C4TDB8/L(0``P>@.)`&(@_0A``#H +M,9\```^WR(F+\"$``(FSZ"$``#O/#Z"$```4```#K(L>#Z"$```,```#K%L>#Z"$```(```#K +M"L>#Z"$```$```"+@^@A``")@]PA``"#^'5U!&H&ZQ*#^`%U"?:#["$```)U +M[HU!^5"-323H9J```/^S\"$``(O+Z"GP__^+BZ!L```#R(N#I&P``(F+J&P` +M`(N+Z"$``(/0`(F#K&P``(E-4(/Y`0^$'0<```^.[08``(/Y`P^.C````(/Y +M!0^%VP8``(V[D$4``(VSY"$``/.EBH.810``BY.810``)`&(@ZQ%``"+RHO" +MT>G!Z`*`X0'!Z@,D`8#B`8B+K44``(B#KD4``(B3KT4``(3)=`Z-323H+IX` +M`(F#I$4``("[KT4````/A&`'``"-323HWIT```^WP(F#J$4``(F#V&P``.E$ +M!P``,\"#^0)J``^5P(UX_X'GL-S__X''T$4```/[B\^)?4CH&(0``&H%68VS +MY"$``#/2\Z6+=4A"BWU0BD8(BTX((L*(AI@0``"+P='H(L*(AID0``"+P<'H +M`B+"B(:;$```B\'!Z`HBPHB&H!```(/_`G4+]L$0=`:+PC/2ZP0STHO"B(;P +M$```@_\"=`KVP1!T!3/`0.L"B\*(AOH0``"XX````"/(.\@/E,"(AO$0``"! +M^>````!U!XO"BU8(ZQ*+5@BX```!`(O*P>D%@^$'T^")AO00``"-322+PL'J +M"\'H`X#B`20!B);S$```B(;R$```Z`>=``"-322)1A3H_)P``(U-)(E%5.BD +MG```C4TDB$88QX9P$````@```.C& +M`!$```$```!FB88$$0``@_\"=`HY3B1]!3/`0.L"B\&(AO@0``"+1@C!Z`@D +M`8B&^1```'0LC4TDZ*B;``"-322+^.B>FP``@WU4_XO0=0R#^O]U!S/`0#/) +MZQ$SR8O!ZPN#?53_B]&+^0^4P(B&FA```#/``T84B898$```$_DSP`-%5(F^ +M7!```!/1B89@$```@+Z:$````(F69!```'01N/___W^)AF`0``")AF00``"+ +M14R__Q\``(E]5#O'-A=#?__]0C4TDZ'&;```SP(-]4`*(A#W0 +MW___=78SR8U^*&:)#_=&"``"``!T/XU-`.@O/@``C870W___4.CW"P(`BU54 +M0%D[T'8@:``(``!7B\HKR%&-C=#?__\#P5"+P8U-`%)0Z`L^```SP&8Y!W44 +M:@%H``@``%>-A=#?__]0Z-#0``!6B\OHP_+__^E6`0``C48H:``(``!0B450 +MC870W___4.@@Z0``BWX,*WU,@^\@]T8(``0``'0#@^\(A?\/C@8!``"-AB@0 +M``!7B\B)15CH&?+__U?_MB@0``"-323HEYH``&@X-D,`C7XH5^C\"@(`65F% +MP`^%T0```(.^+!```!0/@L0```"+15B+.`^V1PN9B\B+\@^V1PH/I,X(F<'A +M"`/(#[9'"1/RF0^DS@C!X0@#R`^V1P@3\ID/I,X(P>$(`\B+P1/RB\X/I,$) +MP>`)B8/`(0``BP.)B\0A``"+B#XP-V+VH#6"O#P>`#B448B_"-323H%Y@``(O. +M#[;`T^"#Q@B+3>@+R(E-Z(/K`77ABW5,:\%DBTRU!(E%Z(U%T%#HX=\``(M% +M6$:)=4R#_@0/C%W___^+72"+=4@SP%!0_[9<$```_[98$```_[.L;```_[.H +M;```Z!$.``")@ZAL``"-322)DZQL``"*AO(0``"(12#_=2#HD9@```^WP#D& +M#X0:`0``:@&Y4`]$`,:#Q&P```'HF#\``(!]7P`/A?T```!7C4,D4&H#["$```"````/A-\```"-323HCY<```&#J&P``(.3K&P```#I +MQ0```(V[""(``(O/Z$A^``!J!5F-L^0A``#SI8U-).@HEP``C4TD9HF#'"(` +M`.A.EP``BHL0(@``B]"`X0&)DR`B``"(B[5L``"+BQ`B``#!Z0.`X0&(B[1L +M``"+BQ`B``"+P<'H`B0!B(.W;```B\'!Z`8D`8B#NVP``(O!P>@')`&(@[QL +M``"%TG4+,\!F.8,<(@``=`,SP$"(@[AL``"+P='H)`&(@R0B``"+P<'H""0! +MP>D$@.$!B(.Y;```B(NZ;```:@=?:@"-323H7Y<```^WP#F#Y"$```^$G@`` +M`(N#Z"$``(/X>0^$CP```(/X=@^$A@```(/X!753@+NN10```'1*BP.+`8O+Z%UI +M``#VV!K`]M`B15Z(15Z#[P%UZ(3`=2YJ`[E0#T0`QH/$;````>CR/0``@'U? +M`'05C4,D4%!J!.B8.P``QH/%;````>L&BT4\B44@")`$Y +M-XB#]"$``(M%9(F#\"$``(N#Z"$``(F#W"$```^5P(A%:X3`=#B+R^AEZ___ +M:@.Y4`]$`,:#Q&P```'H.3L``(!]:@!T&(U#)%!0:@3HWS@``,:#Q6P```'I +M=04``#/`]H/L(0```8E%6(E%5'0HC4TPZ"R4``"+R(E55#/`B4U8.]!R$@^' +M004``#N+\"$```^#-04``/:#["$```*+\(EU9(E%7'00C4TPZ/.3``"+\(E% +M9(E57/^S\"$``(O+Z#[D__^+BZ!L``!J`%I24O]U7`/(BX.D;```5A/"4%'H +MSP@``(F#J&P``#/`B9.L;```0(N3Z"$``#O0#X0%!```#XZ\!```@_H##XXZ +M`0``@_H$=#V#^@4/A:4$``!268V[D$4``(VSY"$``/.EC4TPZ&R3```D`8B# +MK$4``#/`9HF#KD4``(B#K44``.EQ!```:@59C;M((@``C;/D(0``\Z6-33#H +M-Y,``(7`="A0:$`V0P"-10!J%%#HS0D``(/$$(U%`(O+4(U#)%#H9@D``.D[ +M!```C4TPZ`.3```D`8U-,(B#7"(``.BFD0``#[;`B8-@(@``@_@8=@A0:$@V +M0P#KL&H0C8-D(@``4(U-,.@ND@``@+M<(@```'1?:@B-LW0B``!6C4TPZ!22 +M``!J!(U%9%"-33#H!I(``(U%C%#H6<4``&H(5HU%C%#HD\4``(U%"%"-18Q0 +MZ$_$``!J!(U%"%"-1610Z"G*`0"#Q`SWV!K`_L"(@UPB``#&@[QL```!Z7D# +M```SP(/Z`FH`#Y7`C7C_@>>PW/__@& +MD'@.$' +MB$X@B\B#X3^#P3*)3AR#^3)T!\=&'`\G``"-33#H_9```(U-,(A&&.CRD``` +MBXOL(0``,]+!Z09"B_C'AOP0```"````BD88(LJ(CO@0```ZPG4(B9;\$``` +MZPN$P'4'@Z;\$````(M."(O!P>@#(L*(AI@0``"+P<'I!<'H!"+*(L*(COH0 +M``"#?6`"BTUDB(:9$```=0GVP4!T!(O"ZP(SP(B&\!```(J&E!```"+"P>D* +MB(;Q$```@^$/#[;`N@```@#3XO?8&\#WT"/"B8;T$```#[:&FQ```/?8&\"# +MX`6)AIP0``"X_Q\``#OX<@*+^%>-A8S?__]0C4TPZ'V/``#&A#V,W___`(V% +MC-___V@`"```C7XH5U#H8MX``(M-6(O!"T54=`U648U%,(O+4.CJY___BT5@ +M@_@"=1!6B\OH"^?__XM%8(/X`G08:#`V0P!7Z)G_`0!9687`=0?&@[9L```! +M@'UK``^$S@```%>-0R10:ASH+S0``.F]````C8L((@``Z&EU``!J!8OWC;L( +M(@``6?.EC4TPZ'R/``"+T#/`0(K*(LB(B[5L``"+RL'I`B+(B(NT;```B\K! +MZ00BR(O"B(NW;```,\G!Z`-!(L&(B[IL``"(@[ML```SP(B#N&P``/;"`G05 +MC4TPZ"B/``")@]AL```SR3/`0>L&B8/8;```@+NU;````'0(.8/8;```=`*+ +MR(B+N6P``(M-6(O!"T54=!.-@P@B``!048U%,(O+4.CBYO__BT5(B45@ZP>+ +MR^B_Y?__C4TPZ*;;__^+3?2+16!?7EMDB0T`````C65L7<-7B_F`O\5L```` +M=`0SP%_#BP=6BW`4B\[_%6`R0P"+S__6B8>@;```,\F+A[!L``!(B9>D;``` +M7H/H`70.@^@!=4&+S^B,]___ZP>+S^CJ[/__B\B%R70KBX>L;```.X>D;``` +M?QE\#HN'J&P``#N'H&P``'<)B\_H)>7__S/)A'W"$``/\```"+P5_# +MN/`?0P#HB*H!`+C@Y@``Z%JK`0!6B_&`OL1L````=!R-1B10:AWH5#(``&H# +MN5`/1`#HP30``.E4`@``@+[P10``!0^'/`(``#/`@[ZP;````P^5P$B#X!6# +MP!TYANQ%```/AQT"``"+ABA6```+ABQ6``!U#SB&:58``'4'L`'I#0(``%.- +MGN@@``!7B\OHU(\``%.-C109___H,.```#/;C8T4&?__4_^VQ%8``(E=_.@E +M\P``BWT(.5T,=5,YGC16``!\'G\,@;XP5@```````780C48D4&H>Z)\Q``#I +MCP$``(7_=0G&AA$A```!ZR#_MC!6``"+S^CXX____[8P5@``C8[H(```_S?H +M)I```#B>:U8``'1:BY:\(0``.)HD40``#X1(`0``#[:.<%8``(V&DE8``%"- +MAIM6``#WV5#_MKQ6``"-AH%6```;R5"-AG%6```CR(V")%```%%0_[9L5@`` +MC8[H(```4^A?CP``:@'_MD!6``"-CJ`A``#H+W```(N&*%8``(V.Z"```/]U +M#(F&""$``(N&+%8``%:)A@PA``"(GA`A``#H9X\``(I%$(V.Z"```(B&$2$` +M`(J&:58``(B&-R$``(V&T$4``(E!.(E9/(N&,%8``(N6-%8``(F%7&7__XF5 +M8&7__XB==&7__SB>\$4``'4*4E!1Z*Q7``#K$E/_MNQ%``"-C109___H;NX` +M``^VEII6``"-AIM6``#WVHV.H"$``!O2(]"-AD!6``!24.A!;P``A,!U*XV& +M^$4``%"-1B10:A_H5S```&H#N5`/1`#HDS(``(7_=`N+S^BF````ZP*S`8V- +M%!G__^BNX```7XK#6^L-C48D4&H>Z.\O```RP(M-]%YDB0T`````B^5=P@P` +M58OL@^Q,5XOYBX>\(0``@+@D40```'56!210``!0C4,```7HN'O"$``,:`)U$```%?B^5=PU:+\8,^`'0+_S;HM_H!`(,F`%F# +M9@0`@V8(`%[#58OLBU4,4X72?#>+30A_!(7)+\3/;Z.#[__^+^(7_=#F+;"04@_T%=`F#OMPA```%="=#]L-_=07HX\H` +M`#FNW"$``'0=B\[H=^#__XO.Z*?[__^+^(7_=75O"!`"+Q^OU4U97 +MB_$SV^L\@[[<(0``!70^0_;#?W4%Z)W*``"#OMPA```#=1;_="00C8;X10`` +M4.CF^0$`65F%P'06\($`(O'Z_96 +MB_'HA%L``#F&H&P``'48.9:D;```=1`YAJAL``!U"#F6K&P``'07C48D4&HX +MZ!4N``!J`;E0#T0`Z((P``!>P_]T)`B-023_="0(4&HBZ.H]``!J`;E0#T0` +MZ&$P``#""`"X@.Y#`,-5B^S_=1C_=13_=1#_=0S_=0CHX_____]P!/\PZ,$: +M`@"#Q!R%P'D#@\C_7<.-1"004&H`_W0D%/]T)!3_="04Z+O___^#Q!3#S,S, +MS,R+3"0$Z`,```#"!`!358O9O0`"``!65XMS"(M[!.LF@SW0@40``7P/@?X` +M!```<@`2!]G]2#E&+@OP```"!]XQH!9N+7"1DB4PD +M*+F%KF>[B4PD,(L0BT`$@?*KV8,?BTPD7#49S>!;B40D1#/MBT0D:(E$)#R+ +M1"1@B40D'(M$)%B)1"0LBT0D5(E$)#B+1"10B40D((M$)$R);"00B6PD2(ML +M)$2)1"04BT0D$,=$)"0Z]4^EB5PD0(E,)#0/MH"`-D,`BX2$C`````/!BTPD +M%`/(BT0D*(E,)!0SSHMT)#3!P1`#P3/PB40D*(M$)!#!S@R)="0T#[:`@39# +M`(N$A(P````#QHMT)!0#\(M$)#2)="04,_&+3"0HP) +M1"0TBT0D$(M,)"`/MH""-D,`BX2$C`````-$)!P#R(M$)#")3"0@,\^+?"0< +MP<$0`\$S^(E$)#"+1"00P<\,B7PD'`^V@(,V0P"+A(2,`````\>+?"0@`_B+ +M1"0);"0\BVPD$`^VA8@V0P"+A(2,`````T0D'`/(BT0D +M&(E,)!0SRHM4)!S!P1`#P3/0B40D&`^VA8DV0P"+;"04P+@?0```")1"0\#R@@#RAH$(N! +M^`````\I;"1`#RED)'`/*!B+10QF#^\=H.Y#`(M(&(M0$(MP"(LX9@]NT68/ +M;L)F#V[.9@]BRF8/;O=F#V+P9@]B\68/_O2)="0DBW`49@_^]68/[]Z)?"0L +MBW@,#RC[9@]R\Q!F#W+7$(E,)!R+2`1F#^_[#RCOB50D(&8/_BV0[D,`BU`< +M#RC%9@_O1"1`#RC@9@]NSV8/"QF#^_? +MBT`D#RC#9@]RT!!F#W+S$(E\)`QF#^_#BWPD.&8/;DPD#`\H\`\I1"109@_^ +M]`\HQF8/;MAF#^_%9@]NUP\HX&8/8LIF#W+0#&8/#O@`!``!`=D6+AO@` +M``"#`$"+CO@```"#.4`;P/?8`4$$_[;P````5N@HZ?__BX[P````@X8``0`` +MP/^V``$``(U!0%!1Z%V@`0"#Q`R+AO@```"+E@`!```!$(N.^````#D1&\#W +MV`%!!("^!`$```!T"HN&_````(-(!/^+AOP````S_X,(_[B`````BXX``0`` +M*\%0BX;P`````\%74.BBG@$`@\0,_[;P````5NBAZ/__BTPD$(N&]````(L$ +M!XD$#X/'!(/_('SL7U[""`"#/="!1``"?!P/*`50-T,`#RD%D.Y#``\H!4`W +M0P`/*06@[D,`5HMT)`B+SNB)`P``,]*+CO0```"+@B`W0P")!`J#P@2#^B!\ +MZ8N&]````($P(``(`HN.]````(M$)`PQ00B+CO0```"+1"00#0`@``#!X!`Q +M00Q>P@P`45>+?"04A?\/A+(```!358ML)!A6BW0D&(N.``$``+N`````BX;P +M````*]D#P8E\)!`[^W9F4U50Z!R?`0"+AO@```"#Q`P!G@`!``"#`$"+CO@` +M``"#.4`;P/?8`4$$@SW0@40``O^V\````%9\!^AH[/__ZP7HC.?__XN.\``` +M`&I`C4%`4%'HS)X!`(.&``$``,"#Q`PK^^L75U50Z+:>`0`!O@`!``"#Q`R+ +M7"00,_\#ZX7_#X5<____7EU;7UG"#`"![``!``!35597B[PD%`$``(UL)!`S +M]HO?BX=("P``.\9V&BO&@_A`=@-J0%A0C8=("0```\904^C^_O__55/HH_W_ +M_X/&0(/%(('#"`$``('^``(``'+!:@B!QT`(``"-="046VH@5E?HS?[__X/& +M((/K`77O_[0D&`$``%?H9/W__U]>75N!Q``!``#""`!355:+="00,^U7:``" +M``!5C89("0``4.B)G`$`@\0,B:Y("P``C89`"```:@%54.C[_?__B_V+WE57 +M4^CO_?__1X'#"`$``(/_"'+L7\:&1`D```'&ACP(```!7EU;P@0`@^QX4XN< +M)(0```!5BZPDA````%:^``(``%>+A4@+```K\(N\))0```")1"0:D!75>CM_?__@\=` +M@<4(`0``@^X!=>F+O"24`````UPD("M\)"`A="0FG0 +M"`$``(O(P>$&`]4#RXE4)"2-7"0HB4PD((/X"'-6B7L(B4L$B1.#_@%V$XN- +M3`L``%-HL#]``.@JL```ZP>+R^@1Y?__BT0D&(/##(M,)"!`BU0D)(/!0('" +M"`$``(E$)!C_1"00B4PD((E4)"0Y="00@DL@`` +MBT0D&(/X"`^"8?___XOW@>;_`0``*_X#WXM\)!R%]G035HV'2`D```/%4U#H +M,IP!`(/$#(T$-U]>B85("P``75N#Q'C"#`!6:/````"+\6H`5NBLF@$`@Z8` +M`0```(/$#,:&!`$```!>P[A(($,`Z/.)`0!15HOQB77PZ`!7``"#9?P`C8X< +MHP``Z.JE``"-CGRC``#&1?P!Z-NE``"-CMRC``#&1?P"Z,RE``"-CCRD``#& +M1?P#Z+VE``"-CIRD``#&1?P$Z*ZE``"+SL9%_`7HB0$``(M-](O&7F2)#0`` +M``"+Y5W#Z3"Z__^!P3RD``#II*4``+@$(```Z$**`0!35597:@!J`/^T)"@@ +M``#HT5@``(N,)!@@``"+V.A!I@``O0`(``#IH@```(U$)!!0Z$EB``"+\`^W +M#E'HSEX``("\)!P@````=`N$P'0;,\!FB0;K%(3`=!!5:+`U0P"-1"084.BQ +MI```:@!J`(U$)!B+^U#H:U@``(OP9H,^*G4Z#[=.`E'H@UX``(3`="QJ+EAJ +M7&:)A"04$```6%5FB80D%A```(V$)!@0``!34.B.I```C;PD$!```/^T)"@@ +M``!75NB=4@``A,!U)XN,)!@@``"-1"0055#H1J4``(3`#X5$____7UY=6X'$ +M!"```,(4`+`!Z^]5B^Q6:@;_=1"+\?]U"/]U#(V&?*,``%#HX/[__X3`=`2P +M`>LP@'T4`'0H@[[THP```'0?:@;_=1"-AMRC``#_=0C_=0Q0Z++^___VV!K` +M_L#K`C+`7EW"$`"!P3RD``#IR*0``%:+\>@Q5@``,\"-CARC``!FB8;Z@@`` +M9HF&&I,``&:)AO""``")AO2"``"(AOB"``#HN:0``(V.?*,``.BNI```C8[< +MHP``Z*.D``"-CIRD``#HF*0``(V./*0``.B-I```C8YP80``7ND>X/__45%3 +M55:+="0H5XOYA?9T#(-\)#``=@4SP&:)!HM,)!PSVT-3:@"*@?$0``"-:2B( +M1"08B\__="08B6PD(%7HZO[__X3`=32!QQRC``"+SXE\)!#H/Z0``(O/ZQ3_ +M="0D55?H-%$``(3`=1N+3"000^B5HP``B_B%_W7A,\!?7EU;65G"&`"+;"0@ +MA>UT$_]T)!17Z+*B``#WV!K`_L"(10"%]G0+_W0D,%=6Z,>B``"+P^O)4U56 +M5VBP[D,`B]GH)`$``+JP\D,`O@`!``"+B@#\__^+^FH'70^VP<'I"#,,A;#N +M0P")#XV_``0``(/M`77F@\($@^X!==-?7EV+PUO#58OLBU4,4XM="%:+=1"% +M]G0@]L('=!L/M@H/ML,SR,'K"#,"#_@@/@H<```!7 +MB_[![P,S&H/N"(M2!(O*P>D8B\+!Z!`/ML"+#(VP[D,`,PR%L/)#`(O"P>@( +M#[;`,PR%L/9#`(O#P>@8,PR%L/Y#`(O#P>@0#[;`,PR%L`)$`(O#P>@(#[;` +M,PR%L`9$``^VPHM5#(/""(E5##,,A;#Z0P`/ML,S#(6P"D0`B]F#[P%U@%^% +M]G08#[8*#[;#,\C!ZP@S'(VP[D,`0H/N`77H7HO#6UW"#`"+5"0$,\DY2@1U +M)U9J"(O!7J@!=`G1Z#4@@[CMZP+1Z(/N`77LB02*08'Y``$``'+;7L($`+B" +M($,`Z'.%`0!14U97:!!A0`!HD&!``&H$B_EH+`$``%>)??#H7(8!`&@084`` +M:)!@0`!J!&AX`0``C;>T!```,]M6B5W\Z#J&`0"-CYP*``#&1?P!Z/R```!H +ML`0``%-7B9^8"@``Z*R5`0!HX`4``%-6Z*"5`0!H``0``(V'I`L``(F?L`0` +M`%-0B9^4"@``Z(*5`0"+3?2#Q"2+QV2)#0````!?7EN+Y5W#S,S,S,S,S,S, +MS,S,45:+\8ET)`3HOHP``(O&7EG#58OL9*$`````:O]H@1]#`%!DB24````` +M5E>+^6BP!```5^@*CP``:.`%``"-M[0$``!6Z/F.``!H$&%``&H$:'@!``!6 +MZ-J%`0!H$&%``&H$:"P!``!7Z,B%`0"+3?1?9(D-`````%Z+Y5W#S,SI>HP` +M`(/L)%-55HMT)#0SVVH@78,^`G5#BT8$5U-34U.)1"0@C40D)%!J!(U$)"A0 +M5?]T)%SHI`8``(E>!(O3B_L/MD04%(O*@^$#P>$#T^`S^$([U7+JB7X$7X,^ +M`W4G4U-34XU$)""#Q@105595_W0D6.AF!@``58U$)!105NB[E0$`@\0,7EU; +M@\0DP@@`BX&8"@``@\#\@_@!=Q?_="0$@<&<"@``_W0D#/]T)`SHM8,``,(( +M`('L@`$``%-65XN\))@!``"+V8"_``$````/A+L```"+M"24`0``A?8/A*P` +M``!5O8````")LY@*``!5C40D%(O/4.@%C```58V$)!0!``!0C40D&%#HB[8` +M`(/N!'0^@^X!=53_M"2P`0``C40D%(O+_[0DL`$``/^T)+`!``#_M"2P`0`` +M_[0DL`$``%!7_[0DL`$``.@T`P``ZQO_M"2@`0``C40D%(O+4%?_M"2@`0`` +MZ#````!5C80D%`$``%#H1(T``&@``0``C40D%%#H-8T``+`!7>L",L!?7EN! +MQ(`!``#"(`"![!@"``!358O95E>)7"04,_^-LRH!``#_M"0P`@``C8[6_O__ +MZ+F*``"$P'0Q@[PD.`(```!U!8`^`.L<@#X`=!UJ"/^T)#P"``"-1MA0Z)6= +M`0"#Q`R%P`^$/0(``$>!QBP!``"#_P1RK6@(`0``C80D)`$``%#_M"0\`@`` +MZ+&U``#_M"0T`@``Z$+5`0"+Z`/M@[PD/`(```!9=!YJ"/^T)#P"``"-C"0H +M`0```\U1Z.B3`0"#Q`R#Q0B-1"1@4.BBE0``,]M5C80D)`$``%"-1"1H4.A= +ME@``B\.(7"00P>@(B$0D$8O#P>@0B$0D$HU$)!!J`U"-1"1H4.B7E0``]\/_ +M/P``=2]J&%F-1"0X4(V$),0```"-="1DC;PDQ````/.E4.AVE```BD0D2(O+ +MP>D.B$0,*$.!^P``!`!RAHU$)$Q0C40D9%#H490``(M<)!0STFH078UT)!@# +M\C/)BT043-/H@\$(B`9&@_D@+_3F>-`$``'4R_[0D?`(``(O. +MZ+R'``"$P'0@:A#_M"2(`@``C88"`0``4.BIF@$`@\0,A<`/A*(!``!'@<9X +M`0``@_\$-1"0D4(VS$@$``%;H?9`!`%>-1"104(V#.`$``%#H +M:Y`!`%>-1"1\4(V#6`$``%#H69`!`(/$,%5J`5=6Z,F'```YK"20`@``=!57 +MC40D6%#_M"28`@``Z#&0`0"#Q`R+M"24`@``A?9T*&H(55;HNHX!`(/$#(I$ +M+#2+S8/A!S`$,44[[W+O5XU$)#A0Z'Z(``"#O"2(`@```'0G_[0DB`(``(M, +M)!2-1"08:``!``!0_[0DA`(``('!G`H``.C$?```5XU$)!A0Z$*(``!?7EU; +M@<1D`@``PB``:B!?5XV&$@$``%"-1"0<4.B=CP$`@\0,C40D%%555U#H"H<` +M`%>-AC@!``!0C40D/%#H>X\!`%>-AE@!``!0C40D:%#H:8\!`(/$&.D5____ +M@>R\`0``4XN<),@!``!55E=J0%\[WW8]C80D9`$``%#HCI,``%/_M"34`0`` +MC80D;`$``%#HOY,``(U$)%10C80D:`$``%#H=I(``&H@C40D6%OK!XN$)-`! +M``"+K"3D`0``B40D$(7M=!R+E"3H`0``@#H`=!!J&EF+]8V\))0```#SI>MA +M,]*%VW0:B_"-1"04*_"-3"04`\J*!`XT-D*(`3O3-3"04*\,# +MRU!J-E'H0XT!`(/$#(V$))0```!0Z.62``!7C40D&%"-A"2<````4.@8DP`` +MBY0DZ`$``(7M=!:`.@!U$6H:68VT))0```"+_?.EQ@(!_[0DW`$``(V$))@` +M``#_M"3<`0``4.CMFA=MT'HM4)!"-1"04*]`S]HU, +M)!0#SHH$"C1<1H@!._-R[H/[0',7:D!8*\.-3"044`/+:EQ1Z'",`0"#Q`R- +MA"3\````4.@2D@``:D"-1"084(V$)`0!``!0Z$22``"+A"3P`0``A>UT%H`X +M`'41:AI9C;0D_````(O]\Z7&``%J((U$)'A0C80D!`$``%#H#Y(``/^T).`! +M``"-A"0``0``4.C$D```7UY=6X'$O`$``,(D`%6-;"2H@>R0`0``4U:+=6Q7 +M:D!8._!S`HO&4/]U:(U%N%#H+XT!`(/$#,=$-;@````!,\!04%!0C44<4(U& +M!%"-1;A0_W5D_W5@Z*;]__]J(%M3C44<4(U%_%#H]HP!`(M%?(/$#$C&158` +MB45(,_;&15<`:A!8B45,B450BT5PB44\BT5TB45`BT5XB45$BWPU2(7_=$^- +M15=0C84P____4(U%5E"-A0@`=1L[]0^#W@```(H$'D9"B$$$B50D%,=!"`@` +M```/MD$$P>@&@^@`#X1B`0``@^@!#X0L`0``@^@!#X3S````@^@!#X6(```` +M._4/@X`````/MAP>1D*)5"04A-L/B:$````[]7-JBT0D*(/C?XH,!D9"B$PD +M$XE4)!2#PP*+1"0T._@/@R8!```[?"0D#X,<`0``BT0D(&8/OA0'#[;!#[9, +M)!)F`]"X_P```&8CT$`/K\B+1"0P9@/1BDPD$TMFB11X1X7;?[6+5"04BTPD +M&(M$)#3`800"@T$(_HM<)"@[]0^"#/___SOX<@.->/^+1"0P,\EFB0QX7UY= +M6X/$#,(8`(/#`HM$)#0[^'/&.WPD)'/`BT0D($N+;"0P9@^^!`=FB41]`$>+ +M;"0LA=M_UNN>.]5SF@^V3!X!N``!```/K\@/M@0>@\8"9@/(BT0D,&:)#'A' +M@\("B50D%.EJ____._4/@V;___\/MDPD$K@``0``#[84'@^OR(M$)#!F`]%F +MB11X1XM4)!1&0NO*._4/@SG___\/M@0>BUPD,&:)!'M'1D*)5"04Z2'___^+ +M5"04BTPD&.D8____58OL@^Q,_W4(C4VTZ#NH__^+3?2#^0AS"HM%#(E$C;3_ +M1?2-3;3HFZ,``(OE7<((`%6+[(/L3/]U"(U-M.@*J/__BTWT@_D(L",L!>P@@`5HOQ@'X,`'42_W0D"&H* +MZ";___^+SNC@`0``:@*+SNB/`0``7L($`%;_="0,B_'_="0,:@GH,?___XO. +MZ+H!``!J"8O.Z&D!``!>P@@`_W0D!&H`Z,_____"!`#I&P(``%6+[('L``@` +M`(U%$%!J`/]U#(V%`/C__V@`!```4.C7T/__@\04C84`^/__4&H!Z*7^__^+ +M30CH7@$``(OE7PU6+[(/L3%:+ +M\8U-M&H'Z(NF__^-3;3H_:$``&H(B\[HIP```%Z+Y5W#5HOQZ#>:``#_="0, +M_W0D#&H(Z$/^__^+SNC,````:@:+SNA[````7L((`/]T)`1J`.C*____P@0` +M5O]T)`B+\6H`Z`T```!J#(O.Z!L!``!>P@0`5O]T)`R+\?]T)`QJ#.CT_?__ +MB\[H?0```&H,B\[H+````%[""`!6B_&`?@P`=1+_="0(:@OHF_W__XO.Z%4` +M``!J`HO.Z,T```!>P@0`BU0D!(O"@^@!=!&#Z`%T)H/H`704+?P```!U!8,Y +M`'4"B1'_003"!`"#.0MT]<P` +M"```C00D:``$``!0Z)+^__^$P'1B4U56:@U=:@I9C70D##/;5P^W!F8[Q70% +M9CO!=06#Q@+K[F8Y'G0W55;HTJ75N!Q``(``##58OL45:+=0B! +M_O\```!U#8!Y"`!U!UZ+Y5W"!`!6Z!3___]H0+-#`(U%_(EU_%#H$:@!`,S_ +M="0(_W0D"&HAZ*O\__]J`KE0#T0`Z.?^___""`!6_W0D#(OQ_W0D#.@-```` +M:@6+SNB4____7L((`%;_="0,B_'_="0,:@WH;?S__XO.Z/;^__]J!8O.Z*7^ +M__]>P@@`,\")@1`0``")@100``")@1@0``")@1P0``")@2`0``")@200``"+ +MP<-6BW0D"#/`5XOX9CD*````4U5J+H/&`C/;70^W1OY0Z)1)``"$P'1G +M#[<&9H7`=%]0Z())``"$P'559CDN=1X/MT8"4.AO20``A,!U"C/`9CE&`G4* +MZP(SP+,!ZP0SP(K89CDN=1YF.6X"=1@/MT8$4.A"20``A,!U"#/`9CE&!'4" +ML`&$VW4%A,!U`4B-O83O__^+QVCT-T,`4.B&Z`$`@\00]]@:P/[` +MB47PA,!T-&H$C;V,[___B\=H`#A#`%#H8>@!`(/$#(7`=1AJ7%AFB86$W___ +MC;V2[___C86&W___ZP:-A83?__]74.@3Z`$`C86$W___4.BTQ0$`BWT,@\0, +MB47LBT4(.)B780``=3PX7?`/A2\#``"-A@01``!0Z"I'``"$P`^%&P,``(V& +M!!$``%!7C48H4/]U".AM!P``A,`/A/\"``"+10@/MH!'80``4&H!5^C`+@`` +M5^@^,```A,!T'5?H2#```%#HD#```%>$P'0'Z'XO``#K!>C*+P``.)[Q$``` +M#X6V````.)X$(0``#X6J````4VB`````:@%34V@```!`5_\5)#!#`(/X_W40 +M5[E0#T0`Z,'Z___I@@(``%#_%1@P0P"+A@`1``"#^`,/A8P```"+3=2+5>B+ +M1>P#PLP#P&:)1@Z-A83?__]0BT7H@\`)C01&4.C&Y@$` +M@\00Z:$```!35_\5'#!#`(7`#X5X____5U-J%.A!^?__N5`/1`#IK0```(/X +M`G0)@_@!#X72`0``BTW4BU7HBT7L`\+'`0P``*"--!)FB7$*C01%$````&:) +M000SP(E!!HV%A.___U"-0110Z%7F`0"-1@*+==1FB48,BT7L`\!FB48.C86$ +MW___4(M%Z(/`"XT$1E#H+.8!`(M%\(/$$`^VP(/P`8E&$%-H```@`FH#4U-H +M````P%?_%20P0P"+R(E-\(/Y_W4;OE`/1`!7B\[H;_G__XO.:@GHR_K__^DG +M`0``4XU%T%`/MT8$4U.#P`A05FBD``D`4?\5$#!#`(7`=7;_=?#_%1@P0P!7 +M4VH5Z$SX____%0`P0P"#^`5T!STB!0``=1OHOHT``(3`=1)J&(U-A.A"H/__ +MC4V$Z+2;``"^4`]$`(O.Z*/Z__]J"8O.Z%+Z__^+=1!7.)[Q$```=`O_%2`P +M0P#IG````/\5*#!#`.F1````C8U)1>")1>2)1>B) +M1>R(1?"+?0B+SU!0B47\C47@4.A1Q/__A,`/A,H```"`/;(.1```=29H:#=# +M`.@X!@``A,!T!\8%L0Y$``%HD#=#`.@C!@``Q@6R#D0``8`]L0Y$``!6:@=> +M=`-J#UY3BUW@4U;_=0S_%0`@1@"%P'5V:``(``"-A93O__]0_W4,Z'U!``"$ +MP'034U:-A93O__]0_Q4`($8`A__^-393HSYD``&H! +MB\_H>?C__UM>C4W@Z'>>__^+3?1?9(D-`````(OE7<((`%6+[(/L3%;_=12+ +M=1!65NCO1P``5NC]*P``A,!U+/]U#&H6Z+WU__]J%XU-M.C_G?__C4VTZ'&9 +M``!J";E0#T0`Z!CX__\RP.M-BT4(4P^V@$=A``!0:@'_=0SH,RH``&H`5O]U +M#/\5+#!#`(7`#Y7#A-MU'_]U#&H6Z&;U__^^4`]$`(O.Z!OX__]J"8O.Z,KW +M__^*PUM>B^5=PA``N,H@0P#H4&T!`+C(8```Z")N`0!35HMU##/`5V8Y!G0M +M9CE&`G4GOP((``"-A>SO__]7:&`W0P!0Z/F(``!75HV%[.___U#HPX@``.L3 +MOP((``"-A>SO__]75E#HUH@``(M="(V%?+___V@`"```4%/HC0$``&:#O7R_ +M__\Z=!U6C4,D4&I3Z.ST__]J`[E0#T0`Z"CW___I+`$``(!]$`!T+(V-+)__ +M_^@.'P``:@&-A2R?__\S_U!7B\N)??SH!,+__XV-+)___^GU````5XV%?+__ +M_U"-A>SO__]0Z"R(``"-C7S/___H,?C__S/_C85\S___5U!6Z,$M``"+C83? +M__^(1?/VP0%T"H/A_E%6Z"``"`??,`QD7\`G0S:@56C8U4K___Z-0A``"$P'0AC86T +MW___4(V%K-___U"-A:3?__]0_[58K____Q44,$,`_[6$W___5NB*+```C8U4 +MK___Z#@>``"-C<3?___H+1X``(M-]%]>6V2)#0````"+Y5W"#`"+1"0,@[BP +M;````W45!8`B``!0_W0D%/]T)`SH\/?__^L",L#"$`!5B^RX`"```.@F;`$` +MBT4(5X.XL&P```*+B/A5``"+N/Q5``!U(8M%$-'O2#OX<@*+^%:+=0Q75E'H +MTIP``#/`9HD$?E[K-KC_'P``._AR`HOX5U&-A0#@__]0Z/-\`0"#Q`S&A#T` +MX/__`(V%`.#___]U$/]U#%#HSIP``%^+Y5W"#`!145-55E?_="0@Z,@_``"$ +MP`^%Y@```(M\)"A7Z+8_``"$P`^%U````(MT)"0SVXOKB5PD$&8Y'W1>:BZ# +MQP2+PUEF.4_\=31F.4_^=2X/MP=0Z"5```"$P'4%9CD?=14Y7"00=`X/MT?Z +M4.@,0```A,!T`46+1"00:BY9@\<"0(E$)!!F.5_\=;B%[7X*5NAT````A,!U +M9?]T)"#H(/;__XE$)!2+1"0___P!U'X"]Q.___P!T%H/N`HV%`/#__SOP +M=ZLRP%Z+Y5W"!`"P`>OU5HMT)`Q7BWPD#("_`6(```!U*H"_E&$```!T(8V& +M^$4``&@,.$,`4.A7O`$`65F%P'4*_W0D%%;HQOG__XV&^$4``&@4.$,`4.@V +MO`$`65F%P'42#[:'`6(``%#_="085NA?^___7U["#`#"#`!65XOYBP>+<`B+ +MSO\58#)#`(O/_]:+1"0,B4<$7U["!`!5B^R#[!2-1?Q34&H@,]O_%0PP0P!0 +M_Q4(($8`A#)@"-7A"#9@0`B\OH>$P``(M]"#/`@V7\ +M`(E^"&:)AO8```!FB8;X$```(8;D````:.#F``#H-6S&1?P!A+^8NWX````(7V=!2+SNBYGP``:.#F``!6Z`1G`0!9 +M68U/$%]>Z8%,``"+5"0$BT$$.T($=PUR!HL!.P)S!3/`0.L",\#"!`"+1"0$ +MBQ&+200[2`1W$W($.Q!W#3L0=04[2`1T!#/`ZP,SP$#"!`!35HMT)`R#OK!L +M```#=0R#OIPB```R#Y?`ZPJ#OIPB```=#Y7`@+Z@(@````^4P_[+(MAT&O]T +M)!"#QB2Y4`]$`%;HW_'__U9J).A@[O__#[;#7H/P`5O""`#H]"\``"T!!0`` +M]]@;P"4```P`!0``!`##N$@0``#H(6^"`` +M`&:+@/J"``!FB49W?__BTX(A,!UGSB9)U$``'0+@<$D4```Z`5N```YGN0```!U +M/(M&"&:#N/J"``!)="^A4`]$`(/X"W0E.)[X(```=0U7:D3H%>W__Z%0#T0` +MA>___U]>75N!Q$@0``##N`00``#HVF4!`%>+^8M'"("X +M`6(````/A=0!``"`N*AA````4XN<)!`0```/E,!55@^VP(VW^!```/^SI"(` +M`%!6Z&8U# +M)%!JL\,L"(1"03BT<(#[:`1V$``%!J`5;H6"```(M' +M"/^SI"(``("XJ&$````/E,`/ML!05NA&(@``B^B*1"03A>UT((3`#X2!```` +MBT<(@+BH80```'4,_[.D(@``5NA9)```QH?W$````8"_]Q````!T3%93_W<( +MZ*CZ__^+5PB-@]`R``"+BMAR``#WV1O)(\B-@\@R``!1BXK4<@``]]D;R2/( +MC8/`,@``48N*T'(``/?9&\DCR%%6Z&0B``!>75M?@<0$$```P@@`5HU#)%!J +M%.@?Z___O5`/1`"+S>BC[?__:@F+S>A2[?__Z7C___^X4!```.BY8P$`4U6+ +MZ;,!BT4(#[>0^H(``(/Z170)@_I8#X4B`0``@+@!8@````^%%0$``%97B[PD +M9!```(VU^!```&H!C8_`,@``4?^WY#(``(U,)!__M^`R``!1:``(``!6_[0D +MA!```%#H*A(``(3`#X7/````,MLX7"03#X7#````C4G__V@`"```5HU$)&A0Z-U]``!J`5;H_S@` +M`(M%"`^V@$=A``!0:@%6Z(`>``!J`8V'P#(``%#_M^0R``"-1"0?_[?@,@`` +M4&@`"```5O^T)(00``#_=0CH:A$``(3`=`2S`>L/5HU')+E0#T0`4.AZZO__ +M7UY=BL-;@<10$```P@@`5HOQBT8(@+@D40```'4?!210``!0_W0D$&H!Z&F2 +M``"$P'0,BTX(QH$G40```;`!7L((`%%3BUPD&%56BW0D'%>+^5.+1P@%$B`` +M`%!6Z!I]``"+1P@SR042(```B4PD$&8Y"'0D4.@].@``#[
    C$-@``A,!U +M$57HJ#4``(3`=0=35NBI+P``BT<(:CI9@[A<80``!`^WJ/J"``!U&8/]6'44 +M4>A\-0``A,!T"C/`QD0D$`%FB0:#_45T$XM'"(.X7&$```%T!U/_="0@ZPM3 +M_W0D(.CJ.0``4%;H8WP``(M'"("XHV$```!U!E;H"C<```^W!E#H])4``(!\ +M)!``#[?X=#IJ7UMF.5X"=1P/MT8$4.@?-@``A,!T#HU'OV:#^!EW!6HZ6.L1 +M9CD>=1!F.5X"=0IJ7%AFB09FB48"7UY=6UG"$`"X!"%#`.@]8`$`N$R=``#H +M#V$!`%:+\8V-J&+___]V".APCO__@V7\`(V&]@```%"-C:AB___H3QL``(3` +M#X0Y`0``:@&-C:AB___H:93__X3`=1%J`;E0#T0`Z$WJ___I%P$``("];<__ +M_P`/A0H!``!35S/;,_\XG5W/__]T>V@`"```C87,8O__4(V%\.___U#HC'L` +M`#B=8L___^L3`[VH[___$YVL[___@+UBS___``^4P`^VP%!H``@``(V%\.__ +M_U#H\#8``(V-J-___^@VZ___:@"-A:C?__]0C87P[___4.C!(```A,!UL0&^ +MF````!&>G````(V%J&+__XO.4.B/````BT8(:DE:7P^WB/J"``!;@_E4=`5F +M.\IU!\:``6(```&+1@AF.9#Z@@``=!J`N`%B````C8[V````40^4P`^VP%#H +M%9```(V-J&+__^BYF/__C8VH8O__Z+^S__^-3?-14(V%J&+__XO.4.B$```` +MA,!UWHV-J&+__^B_C___BTWT,\!>9(D-`````(OE7<-35HOQBTPD#.C3$P`` +MB49H,]N+1@B)5FR)GN@```")GNP````XF"11``!U#>B8CP``A,!U!(O#ZP,S +MP$"+SHB&]A```(A>7XB>]Q```,:&\0````&(GO0```#H\H<``%Y;P@0`N"0A +M0P#H05X!`+B@40``Z!-?`0!3BUT(,])7B_F)?>"+1P@/MX#Z@@``B47H.54, +M=2HX5U]T'%!2C4<04%/HL?\``(3`=1-J`;E0#T0`Z%[H__\RP.F3````,])6 +MB[/<(0``@_X"#X23````@_X#=1V`O_<0````#X03#```C8?X$```4%/_=PCH +MGO3__X/^!0^%^@L``("[K$4````/A`$,``"+=>@SP%90C4<04%/H/_\``(3` +M=1%J`;E0#T0`Z.SG___IVPL``(L#,\E1_[.D;```BW`0B\[_LZ!L``#_%6`R +M0P"+R__6L`%>BTWT7UMDB0T`````B^5=P@P`B)?W$```.9/<,@``?Q9\"#F3 +MV#(``',,B9/8,@``B9/<,@``.9/D,@``?Q9\"#F3X#(``',,B9/@,@``B9/D +M,@``BT\(.9%@80``=1N+@32C```YA^P```!R#8"_\0`````/A3X+``"^``@` +M`(A5[5:-A52N__]04FH&C47M4(V#@"(``%#H)]7__X7`#Y7`B$7NA,!T#H!] +M[0!U"#/`B(?Q````B\OH0I?__U:-A<3N__]0C8.H(@``4.@++```,\E!@+MS +M,P```(E-Y'13BT<(BX#$<@``.\%T9(!][0!U7H7`#Y3`_L@@1>XSP%"-A<3N +M__]0Z#4U``"+3PB+B<1R``!).\AU$C/)C87$[O__05%0Z!Z*@QDS``"(1U\SP(A' +M8(N+J&P``"N+V#(``(LS4(N#K&P``!N#W#(``%!1BTX0_Q5@,D,`B\O_5A`S +MTHK"BLJ(3?*(3=PX1>YU%HJ3M&P``(A5\HA5W(32#X3>"0``,]*+1PB+=>AJ +M28J(`6(``%B$R70'9COPL`%U`HK"_W7;__S/`4(V%5,[__U"- +MA_@0``!0Z$L<``"$P'0VC8/`,@``4(V-9-[__^CG\___A,!T,H"]8-[__P!T +M$%>-C63>___HL//__X3`=!DSP(A%\^L2BT<(@+A780````^5P/[(($7SC87$ +M[O__B\]04^C)\___A,!U(FH"N5`/1`#HX>3__XO+Z!J4__^`N[1L````#Y3` +MZ0;]__^`NQLS````=!>-A<3N__^+SU!3Z+WX__^$P`^$W````(MW"(V]Q/[_ +M_VI`@<8D4```6?.E9J4/MHL@,P``C478BWW@,])0C8-+,P``B57\4/^S;#,` +M`/?9C8,Q,P``4!O)C8,A,P``(\B-A<3^__]14/^S'#,``(U/$%+H)D```("[ +M&S,````/A),```"`NT$S````#X2&````:@B-1=A0C8-",P``4.C_=`$`@\0, +MA'__XM/ +M"('!)%```.@K8@``@TW\_XV-Q/[__^BI80``Z03____&A_@@```!Z;<'``!J +M!NATX?__:@NY4`]$`.BPX___,\"(1?.#3?S_C8W$_O__Z'%A``"-C9S>___H +MC0L``(N#@#,``,=%_`$```")1=1J4%J%P`^$C0```(/X!0^$A````(I-\XMU +MZ(3)#X3]````9COR#X3K````BT<(@+@!8@````^%VP```#/`B$7OC8?X$``` +M4.CN%@``A,!T-8!][P!U.3/)C8/`,@``45#_L^0R``"-1>__L^`R``!0:``( +M``"-A_@0``!04?]W".A*"```@'WO``^$A````#/`BLB(3?/K?HO+Z`B4__^$ +MP'10@'WS``^$G@```(M%Z&:#^%`/A)$```!J25EF.\$/A(4```!J15EF.\%T +M?8M'"#/)03F(7&$``'1O_X?D````C87$[O__4%.+S^@B\___ZUB*3?.$R70B +MC863I7OK__X3)#X3$!0``BT<(@+@!8@```'00QH?W$````8"X`6(```!U +M28I%\H3`=44SP&I0B$7O6&8[\'1`C8V\!A,!U!O^'Y``` +M`/^'Z````(VS\#(``#/`C8_(````B8>`````B8>$````B8>(````B8>,```` +MBT<(_[#@@@``_S;H)QX``(M'"(V/H````/^PX((``/\VZ!$>``"+@]@R``"- +M=Q"+B]PR``")1S"-A9S>__]0B4\TB\Y3Z%(]``"*5>\SR8I%\HA7.8A'.HE- +MW(E-Y(32#X6=````.(O$;```#X61````B[/D,@``BY/@,@``._%\?G\(@?I` +M0@\`=G2+B]@R``"+@]PR```/I,@*P>$*.\9\6'\$.\IV4C/`._!\(W\(@?H` +MX?4%2*1?(SR8UW$(M7"("ZH&$````/ +ME(6UWO__@'WO`'44A,!U$&I06&8Y1>AT!S/`0(K(ZP,SP$"#?=0`B$WPB$7L +MB$7Q#X0)`0``B[.`,P``@_X$=&>#_@5T8COP=$*#_@)T/8/^`W0XC8?X$``` +M4(U#)%!J1^B]W?__,\F*P8A%\8I-\,9%[`"$R0^$N0```(3`#X2Q````,\!` +MZ:L```"$R0^$A````(V'^!```%!3C4<04%+HX>G__^M@:``(``"-A52^__^+ +MSU"-@X0S``!04^CF\___BDWPA,ET3F:#O52^__\`=$2-A52^__]H``@``%"- +MA_@0``!0@_X$=0K_=PCH&>?__^L2C4,DB\]0C86`P``B$7QA,`/ +MA%K___^*3?#K`XI%\8.[L&P```(/A4S___^$R0^%3/___^D[____,\"(A_<0 +M``#K?H"[&#,```!U=8"[H"(```!U%/^SY#(``/^SX#(``%;HQ0,``.M8#[:# +M<#,``(N/X````%#_LW0S``#HT9T``(N'X````(N+X#(``(N3Y#(``(F(2$P` +M`#/)B9!,3```B(A@3```#[:#<#,``(N/X````%#_LYPB``#H09H``(O+Z.>- +M__^`NQDS````=3`/MI-*,P``C8-+,P``]]J-C\@````;TB/0C8/P,@``4E#H +M!!L``(3`=`:Q`3/`ZP0SP(K(@+MP,P```'4(B(?T````ZR:`NZ`B````=!TY +M@^0R``!\%7\(.8/@,@``=@N$R70'QH?T`````8!]\@"(1?!U7X!][`!T683) +M=54XBQLS``!T*#B+03,``'0(.(O$;```=!B`O_0`````=0^-A<3N__]0C4,D +M4&H$ZPV-A<3N__]0C4,D4&H#Z);;__]J`[E0#T0`QD7P`>C.W?__BD7P@WW4 +M`(I5\701@[N`,P``!'4(A-)T!+$!ZP(SR8!][P`/A4X!``"+=>AF.W70=`IF +M.W7,#X4[`0``@WW4`'09A,EU%8.[@#,```4/A20!``"$T@^$'`$``(3`=!.+ +M1PB`N*!A````#X0(`0``BD7PA,D/A;X```"+5>0SR3O1BTW<=P2%R70?A,!U +M$#F/B````'4(.9>,````=`N-C9S>___HR@T``(M7"(VST#(``(V[P#(``(N" +MV'(``(N*U'(``/?8&\`CQO?94!O)C8/(,@``(\B+@M!R``#WV%$;P(V-G-[_ +M_R/'4.@F#```C8V!3_W`(Z*KI__^+1>"+2`B+@=AR +M``#WV!O`(\90BX'0<@``C8V"P``BWW@BT<(@+BH80`` +M`'4L_[.D(@``C;?X$```5NCU$@``A,!U%E:-0R10:A'H(-K__[E0#T0`Z*;< +M___&A_<0```!@TW\_XV-G-[__^A^!```@'WN`(I%\XI5\G0&_X?L````@']@ +M`'4DA,`/A6'T__\X@[1L``!U#(O+Z%F+___I3?3__X32#X5%]/__,L#I0/3_ +M_[A!(4,`Z)51`0"X/!```.AG4@$`4_]U&/]U%/]U%.B'*P``C8VX[___Z-,# +M``#_=10SVXV-N.___XE=_.BA#```A,!U'/]U$/]U%/]U#&H2Z"WI____=0QJ +M$^@MV?__ZT-H```0`(U-X.A=?___QD7\`>L,BTT(4/]UX.B:#```Z!UU``#_ +M=>2-C;CO____=>#H10D``(7`==J-3>"S`>AI@?__C8VX[___Z(P#``"+3?2* +MPUMDB0T`````B^5=PA0`N%,A0P#HTU`!`(/L%%;H8NK__U"-3>#H[7[___]U +MY(M-"/]UX(-E_`#HRS<``(OPA?9^1%.+71!7BWT,B\:9.]-_!GP&.\=R`HOW +MA?9^$XM-"%;_=>#H@SD``(O&F2OX&]K_=>2+30C_=>#HB3<``(OPA?9_QE]; +MC4W@Z,N`__^+3?1>9(D-`````(OE7<(,`%-55E>+?"0DA?]T`\8'`(MT)!PR +MVU;H4`X``(ML)!CK5X3;=0Q6_L/HJP```(3`=4$SP#+;A>T/E,!0_W0D-/]T +M)#3_="0T_W0D,%;_="0LZ)]_``"%P'0C@_@!=#^#^`9U#VC_````N5`/1`#H +MZ=C__U;H\PT``(3`=:4SVSA<)#0/E<.#PQ&%[70<4U:+S>@A`P``A,!T#[`! +MZS2%_W0#Q@UT"U-6B\WH[0(` +M`.L&5NA'#0``7UY=6\(D`+AH(4,`Z&I/`0"X+%```.@\4`$`4U:+=0B-AH__^#Q!"-A?#O__]0Z)P,``"$P'0+,\!F +MB87P[___ZP=FBX7P[___@\=[@?\0)P``?)QFA<`/A*````"_``@``(V%R,__ +M_U=64.@=:@``5_]U\(V%R,___U#HVR<``(V%\.___U"-AL",L"+3?1?7EMDB0T`````B^5=P@0`@TD$_S/`QP$L +M.$,`9HE!)(A!"(E!#(A!$(F!)!```&:)02&(02")012+P<=!&``!`0#'01P` +M`0``PU6+[&2A`````&K_:($?0P!09(DE`````(-Y!/_'`2PX0P!T&(!Y$`!U +M$H!Y&`!T!^B2`0``ZP7H1````(M-]&2)#0````"+Y5W#S,S,S,S,5HOQZ*C_ +M___V1"0(`70-:"@0``!6Z.M,`0!968O&7L($`,S,S,S,S,S,S,S,S,S,4U:+ +M\;,!@WX$_W0B@'X0`'48@WX,`'42_W8$_Q48,$,`C5C_]]L:V_[#@TX$_X-F +M#`"$VW43.%X:=`Z-1B2Y4`]$`%#H3M7__UZ*PUO#N`00``#H:$T!`%.+G"00 +M$```B\-5T>A6)`&+\5?VPQ!U"H!^(@!U!#/MZP,S[47_M"08$```,\F)7AR$ +MP`^4P4F!X0```("!P0```,")3"04Z%DE```/MP"#^"YT!8/X('41]L,@=0R# +M3@3_,]N+?"00ZQV+?"00,]M34VH"4U57_[0D,!```/\5)#!#`(E&!(-^!/]U +M+V@`"```C40D&%#_M"0@$```Z/$>``"$P'054U-J`E-55XU$)"Q0_Q4D,$,` +MB48$:``(``#_M"0<$```C48DQD88`5")7@R(7A#HCF<``(-^!/]?7ET/EX($X``#E%#'8- +M4/]U"(O.Z*[____K.X-^#`%U#_\5`#!#`(/X;74$,\#K)H-^#`!U&+\`@``` +M.7T,=@[_%0`P0P"#^"%U`U?KP8/(_^L#BT7\7UZ+Y5W""`!145.+V5565XL# +MB5PD$(MP%(O._Q5@,D,`B\O_UHL+B^IJ`FH`:@"+<1"+SHE$)"#_%6`R0P"+ +MR__6BP.++TU]>75M96<-5B^Q15E>+^<9%_P!J`8U-_U&+!XMP#(O. +M_Q5@,D,`B\__UHI%_U]>B^5=PX-Y!/]U`S+`P_]Q!/\5/#!#`(/X`G0(@_@# +M=`,SP,,SP$##S,S,S+A4$```Z-9*`0!3BYPD8!```%57B_F#IR00````@'\B +M`'4)]L,$=00RR>L"L0&+P]'H5B0!#[;P]]X;]H'F````P('&````@/;#`70& +M@L#]].#XP&$R70#@\L",\"-3"0<.$<;#Y7`2"4````(B40D$.A, +MU?__@'\@`'0&@=!^#_?]T&H-,)!#_C40D$(-,)!3_:@!0:@!5_Q44 +M,$,`,\"#_?^(1Q@/E<.)1PR(1Q"#_?]T'&@`"```_[0D:!```(U/)(EO!%'H +M@F0``,9'(0!?78K#6X'$5!```,((`%97,_:+^5;_="04_W0D%.@D````A,!T +M&XO/Z'\#``"+!U965HMP$(O._Q5@,D,`B\__UE]>P@@`456+Z8-]!/]T>%.+ +M7"045XM\)!2%VW\X?`2%_W,RBTPD'(7)="Z#^0%U%HM%`%:+ZP>+S>A$_?__`_@3VC/)ZP2+3"0+^8!_(0!T!S/`Z1H!``"#9"0(`(-D)`P`559J`ETY;Q1U&8L' +MBW`4B\[_%6`R0P"+S__6B40D$(E4)!2^4`]$`%/_="0DB\__="0DZ`G\__^+ +MV(/[_P^%R````(!_&@")KR00```/A+@````Y;Q1T6S/`B$0D$HA$)!&(1"03 +M.4<4=2TY1PQU*(U$)!.+SE"-1"054(U$)!I0C4+^8%_'``!``!T#_9''`)U"?]W!/\53#!# +M`(M,)"PSVT.%R70+BP$+001T!(K3ZP(RTE:+="0TB%0D$X7V=`N+!@M&!(A< +M)!)U!<9$)!(`BVPD.(7M=`B+10`+101U`C+;A-)T"HU$)!10Z#9O``"`?"02 +M`'0,C40D)(O.4.@C;P``7H3;=`R-1"08B\U0Z!)O```/MD0D#XU,)!#WV!O` +M(\&-3"084`^VP_?8&\`CP8U,)"10#[9$)!;WV!O`(\%0_W<$_Q44,$,`7UU; +M@\0!'41@'X:`'1:C48DB\U0Z([/ +M__^#9"0,`(U$)`Q7:@%0:@#_=@3_%50P0P"+^#O[=1O_%0`P0P"%P'01@'X: +M`'0GC48DB\U0Z%7/__^+1"00,\F9`\^+T(O!@](`7UY=6UG#B\.+T^OUB\.+ +MT^ON_W$$_Q50,$,`2/?8&\!`P_]T)`C_="0(Z$+X__^$P'0$L`'K$/]T)`2Y +M4`]$`.C#S?__,L#""`!65XOY:@#_="00BP>+<`2+SO\58#)#`(O/_]9?7H3` +M=`2P`>L0_W0D!+E0#T0`Z'G.__\RP,($`%%14U6+;"08B]F%[74'L`'I!`$` +M`(-[#`%U"VKU_Q5`,$,`B4,$5E>_`$```(-D)!``@WL,`,9$)!0`=#TS]H7M +M=%N+Q2O&.\=R`HO':@"-3"0445"+1"0H`\90_W,$_Q5$,$,`2/?8&L`$`8E$ +M)!1T+`/W._5RR^L@:@"-1"044%7_="0H_W,$_Q5$,$,`2/?8&L#^P(E$)!2$ +MP'5Q@'L:`'1K@WL,`'5E:@"-75M96<((`+@$ +M$```Z#=$`0!6B[0D#!```(7V#X2X````,\!F.08/A*T```!35[,!B40D#(O^ +M58OHT?V!_0`(``!S7P^W!U#HR1@``(3`=#T[_G8YC48$._AU!V:#?@(Z="M5 +MC40D&%90Z-RX`0"#Q`PSP&:)1&P44&H!C40D'%#HC0$``(O8]]L:V_[#BT0D +M$(/'`H/``C/)B40D$&8Y#W65@+PD'!````!==296Z-(;```/MP!0Z%D8``"$ +MP'43,\!0:@%6Z$75N!Q"00``#"$`!5B^RX`!```.CL/P$`4_]U#/]U"/\56#!#`(7`#Y7# +MA-MU+6@`"```C84`\/__4/]U".CN$0``A,!T%?]U#(V%`/#__U#_%5@P0P"% +MP`^5PXK#6XOE7<((`(.)!!```/\SP&:)`8O!QH$`$````<.+@000``"#^/]T +M!U#_%6`P0P##5HMT)`S_="0(QH9$$````.A'%```A,!T!#+`ZT-6_W0D#&K_ +MZ`4!``"#^/]TZU#_%6`P0P#_M@@0``"#ID`0````Z-7\____M@@0``"(A@P0 +M``#HW/S__XB```+`!7L(,`%-65XM\)!"+\>F"````@+X`$````%=6=`]J +M_^BJ````B88$$```ZPO_M@00``#HEP```(/X_W1I_[<($```B9]`$```Z&_\ +M____MP@0``"(APP0``#H=OS__XB'#1```%>(G@`0``#H`!<``(O8:$@X0P!3 +MZ".1`0!9687`=!%H3#A#`%/H$I$!`%E9A#X5M____ +M,L!?7EO""`"P`>OV5F@`"```_W0D#(OQ5NA560``QH8`$````5["!`"X4!(` +M`.@_/@$`4U56B[0D8!(``(U$)`Q7B[PD;!(``(/+_[T`"```4#OS=7#_M"1L +M$@``_Q5D,$,`B_`[\P^%@````%6-A"1D`@``4/^T)'`2``#H'!```(3`=!F- +M1"004(V$)&0"``!0_Q5D,$,`B_`[\W5._Q4`,$,`@_@"=`^#^`-T"H/X$G0% +M,\!`ZP(SP(B'1!```.G0````5O\5:#!#`(7`=12+\_\5`#!#`(/X$@^5P(B' +M1!```#OS#X2I````5?^T)&P2``!7Z'A8``!5C40D0%!7Z#H6``"+3"0L,\`# +M1"0PB8<`$```BT0D$(/1`(F'"!```(M$)!2)AR@0``"+1"08B875N!Q%`2``#"#`"`?"0$`%:+\<9&"`!T'E>_`X```%?H +M;SX!`%=J`%")1@SH8$P!`(/$$%_K!(-F#`"+QE["!`"`>0@`=0G_<0SH3CX! +M`%G#5HOQ@WX,`'0/@'X(`'4)_W8,Z#4^`0!9BT0D"(E&#,9&"`%>P@0`BU$$ +M`U0D!(O"@^('P>@#`0&)403"!`#I`````%.+V597:@B+<("_C3[P^WQU]>6\,SP(E!"(D!B4$,B4$0B\'# +MS,S,S,S,S,S,S,S,5HOQZ*X#``#_="0(B\[H'`$``(O&7L($`%.+7"0(5597 +M:$"J0`!J"&@(`0``B^E35>B6`0``C;5`"```B\[H +M````C;-("0``N8````"-O4@)``#SI8N#2`L``(F%2`L``(N#3`L``(F%3`L` +M`(N#4`L``%^)A5`+``"+Q5Y=6\($`%-65XO9:@B+\U^+SN@4`P``@<8(`0`` +M@^\!=>Z-BT`(``#H_@(``%]>B\-;PU6+[&2A`````&K_:($?0P!09(DE```` +M`%:+\5>+?@R%_W04B\_H#E\``&@X`P``5^@2.@$`65EJ!(U&!%#HDT0``(-^ +M"`!T&;]4"P``5_]V".A_1```5_]V".CH.0$`65F+3?1?9(D-`````%Z+Y5W# +M5E>+?"0,B_$[]W0Q:+````#_M_````#_MO````#HOTL!`(N'``$``(/$#(F& +M``$``(J'!`$``(B&!`$``%^+QE["!`"#.0!T3XM4)`2#.@!T1H,Y`74%@SH! +M=`J#.0)U$(,Z`G4+BT$$.T($#Y3`ZRF#.0-U'H,Z`W49C4($:B!0C4$$4.BA +M5`$`@\0,]]@;P$#K!C+`ZP*P`<($`%>+?"04A?]T+5.+7"0058ML)!!6*^N+ +M3"0DC30K4_\58#)#`(O._U0D*`-<)!R#[P%UXUY=6U_"%`!5B^R#["2-1=Q0 +MZ+@```"#?0P`=`S_=0R-1=Q0Z*ZT____=0B-3=SH0?___XOE7<((`%6+[%%6 +MB_&#?@@`=2!H5`L``.B#.`$`B47\687`=`F+R.@S_O__ZP(SP(E&"(M%"(D& +M@_@!=02#9@0`@_@"=02#3@3_@_@#=0C_=@CH@JS__XM%#(/X"'(#:@A8B480 +M7HOE7<((`(M$)`2)`8/X`70%@_@"=02#800`@_@#=1-J((U!!&@`X$,`4.A) +M2@$`@\0,P@0`58OLBP&![%0+``!6BW4(B0:#.0%U!HM!!(E&!(,Y`G4(BT$$ +M]]")1@2#.0-U'O]Q"(V-K/3__^@0_?__C48$4(V%K/3__U#H8JO__UZ+Y5W" +M!`"XW")#`.CJ-P$`45:+\8,^`G41_W4,_W4(_W8$Z#NQ__^)1@2#/@-U7(-^ +M$`%V,%0!```(F>1!```(F>4!```(F>5!```(F>2!```(F>3!```(F> +MF!```(E>)(F>G!```(B>H!```(B>P1```(B>RA```(F>[!```(F>\!```(F> +M]!```&:)GO@0``"(GOH0``")G@`1``!FB9X$(0``7EO"!``SP&:)012)01AF +MB4$B4$@B4$DB4$HB4$LB4$PB4$TB4$XB4$\PU6+[(L-(.!#`('L%`$` +M`(/Y_W4\C87L_O__QX7L_O__%`$``%#_%6PP0P"+C?S^__^+A?#^__^+E?3^ +M__^)#2#@0P"C8`]$`(D59`]$`.L+H6`/1`"+%60/1`"#^0)U!\'@"`/"ZP6X +M`04``(OE7<.X!"```.C1-@$`BX0D$"```%-5B]C!ZQ]6@.,!#[?PB%PD#(ML +M)`Q7B[PD&"```(7V#X1'`0``5^CQB`$`B40D%%F#_@)T3(/^!'1'@_X#=$)0 +M_[0D("```%>$VW0*Z$"K`0"#Q`SK!>@D:P``AARA@$`65GK +M!>BT3@``7<(,`(!\)`@`=`:+1"0$ZPG_="0$Z$MH``#""`"XCB%#`.C=,@$` +M45:+\8EU\(V.)%```.C2.@``,\")1?R)AG!A``")AG1A``")AGAA``")AGQA +M``"(AH!A``")AK!A``"+SHF&M&$``(F&N&$``(F&O&$``(F&P&$``(F&Q&$` +M`(F&T&$``(F&U&$``(F&V&$``(F&W&$``,9%_`&)AN!A``")AN1A``#HA@`` +M`(M-](O&7F2)#0````"+Y5W#58OL9*$`````:O]H@1]#`%!DB24`````5HOQ +M@SX`=!R`?A``=`Z+1@C!X`-0_S;HCSP``/\VZ%.%`0!9BTWT9(D-`````%Z+ +MY5W#5FCP@@``B_%J`%;HA4(!`(/$#(V.<&$``.B7____C8XD4```7ND*.@`` +M5E=H\((``#/_B_%75NA90@$`@\0,QT8,`````KC___]_B;XP80``QX8T80`` +M`P```(F^*&$``&H"68F^D&$``(F.T'(``(F&\&$``(F&]&$``(F&^&$``(F& +M_&$``(F..&$``.@U6```7XF&X((``%[#5HMT)`A6Z(&$`0!9A6XOE7<(,`+@`$```Z%,Q`0!35HNT)`P0``!7:BY;#[<& +M9H7`=$.+R(U^!`^WP5#H_04``(3`=!QF.5_^=19F.1]U$0^W1P)0Z.0%``"$ +MP'0#C7<$#[='_H/'`HO(9H7`=#[?#4.AB!0``A,!T!8U] +M`NL%9CO>=0R#Q0(/MUT`9H7;==V+M"04$```:EQ;,\D[_G02B_>)M"04$``` +M9CD/#X5M____:BY;768Y'G4/9CE>`G4)9CE.!'4#@\8$@[PD%!````!T*&@` +M"```5HU$)!10Z"A+``#_M"08$```C40D$%#_M"0<$```Z!!+``!?B\9>6X'$ +M`!```,(,`%6+[+@`$```Z/0O`0#HI/C__ST`!@``+?"00A?]T-E:+ +M="0,3U;HT`<``"O&T?@[^'(,5NC"!P``B_@K_M'_5U:+="085NA9I`$`@\0, +M,\!FB01^7E_"#`!3BUPD##/`5XM\)`Q79HD#Z/H"``"$P'08#[<'4&B@.$,` +M_W0D'%/H?(C__X/$$.M75FI<7F8Y-W5-9CEW`G5'C4<$5E#HZ6`!`%E9A7UO"#`!7BWPD"&:#/P!U!(O'ZW]35E?H^(`!`$A9C1Q' +MZP<[WW80@^L"#[<#4.@82```A,!T[`^W`XOSZPH[]W9-@^X"#[<&4.C]1P`` +MA,!U[#OW=CE5:BY=#[<&9CO%="Q0Z.-'``"$P'4)@^X"._=WY^L95^B?!@`` +M55#H*6`!`%E9AB\-;7\($`%6+[(M%#%97BWT4A`F8Y`P^%!0$``(MU$(U'!COP#X;W````5FBL.$,`_W4,Z#I(``!6 +M:+@X0P#_=0SH!$@``%93Z<@```"-A0#P__^[_P<``%!3_Q5P,$,`A<`/A+D` +M```[PP^'L0````^W!E#HQ0$``(3`=#>-1P:+?1`[^`^&E@```%=HK#A#`/]U +M#.C91P``,\!FB84$\/__C84`\/__5U#_=0SHF$<``.M?:``(``"-A0#P__]0 +MZ'/Z__^-A0#P__]0Z/-^`0"#QP0#QXM]$%D[^'9#5VBL.$,`_W4,Z(9'``!7 +MC84`\/__4/]U#.A.1P``9H,^+G41#[=&`E#H,@$``(3`=`.#Q@175O]U#.@M +M1P``L`'K`C+`7UM>B^5=P@P`@WPD!#H/E,#"!`!6BW0D"`^W!E#HX$4```^W +MP(/`OV:#^!EW#&:#?@(Z=04SP$#K`C/`7L($`%:+="0(:EQ89CD&=09F.48" +M=!A6Z+O___^$P'03#[=&!%#HM````(3`=`4SP$#K`C/`7L($`%:+="0(5NB_ +M____A,!U$0^W!E#HC0```(3`=00SP.L#,\!`7L($`%-6BW0D##/;9CD>=!MF +M.5X"=!6-1@1J.E#H?5T!`%E9A_ +M``@``%=64.BW10``5NAV_O__A,!T!V:#?@0`=`U7C84`\/__4.A?^/__5_]U +M#(V%`/#__U#H844``/]U%(V%`/#__U#_=1#H=T4``%]>B^5=PA``45%358ML +M)!0SP%97B_");"04B]T/MP.)1"00#[?`4.@7____A,!U"&:#?"00`'5&C7[_ +MA?]^/VHN6P^W1'T`@_@@=`5F.\-U*68[PW4>#[=$??Y0Z.+^__^$P'45#[=$ +M??YF.\-U!8/_`70&3D^%_W_(BUPD%(M$)!!FB41U`#/`9CD#=`J#PP)&B5PD +M%.N$7UY=6UE9P@0`55:+="0,,^UF.2YT6U.*7"045XO]N8@X0P"$VW4%N9@X +M0P`/MP904>B26P$`65F%P'4*A-MT#F:#/B!S"&I?66:)#NL#:E]9B\>#X/Z# +M^`)^"6:#/CIU`V:)#H/&`H/'`F8Y+G6O7UM>7<((`%-55E>+?"045^BM^?__ +MBUPD&(OP,^V%]G464VA<.$,`5^@;1```5^B/^?__B_#K.F8Y;@)T'FAH.$,` +M5NB[70``A8UN!`^W10!0Z/5!``"$P'1,#[=&!E#HYT$``(3`=#Y6Z*9Z`0!(66HZ6XT$ +M1F;_`&8Y&'5$:C!=:BY:.\=V%F8Y4/YT$&:)*(/`_F;_`&8Y&'3HZR1J85EF +MB0CK'"OWT?XKWH/K`E-H@#A#`%7H!T,``.L%,\!FB0=?7EU;P@P`5E=J._]T +M)!`S_^@D7`$`B_!9687V=!>-1@)0Z%A<``"`?"00`(OX=`4SP&:)!HO'7U[" +M"`!6BW0D"%;H"WH!`%F%P'0&C31&@\;^B\9>P@0`4U:+="0,5U;H[7D!`(OX +M@^\!67@8C1Q^#[<#4.A3_/__A,!U((/K`H/O`7GK9H,^`'0*9H-^`CIU`X/& +M!(O&7UY;P@0`C4,"Z_56BW0D"%;HJ____XU.!#O!/!```@?N`````#X>#!```A=L/A'L$```S_XE\)#R%VW2U@V0D*`"- +M1"1(@V0D)``S]H-D)"``,^V#9"0<`"%T)!1J'%90B70D).B[-`$`(70D/(/$ +M#(E\)"P[?"0X#X.9`0``BT0D%(M4)"2+RBM,)""+?"0#Z`%T)H/H`705@^@!BT0D%'54@_@0 +M?4]`B40D%.M(BT0D%(/X\'P_2.ONBT0D%(/^$'TS1NL*BT0D%(/^\'PG3HET +M)!CK((M$)!2#_1!]%T7K%(M$)!2#_?!\"TWK"(MT)!B+1"04BTPD+`/+_T0D +M,(E,)"P[3"0X#X)O_O__BWPD/$>)?"0\._L/@AC^___IR/W__XM&!(M.%(M^ +M"(E$)""-6/V)3"0PC4']B5PD/(E\)$0]_?\!``^'6@(``#O9#X=2`@``@_\" +M#X=)`@``BP:)1"0LC2P(,\"+U8EL)!@KTXE$)"2)5"04,]L[P0^#NP```(T\ +M`HM$)#R+5"0@*\6+;"0\B40D*`/'.\)R;@^V!P^V3_V+\"OQB40D.`/SB4PD +M-(O&*\-0Z"N8`0")1"1$B\8K1"0\4.@;F`$`*W0D/%:)1"0HZ`V8`0"+3"1, +M@\0,BU0D'#O*?PX[R'\*BTPD,(M4)"#K%(M,)#`[T(M4)""+7"0X?@2+7"0T +MBT0D+"H80`^VVXE$)"R+1"0HB!PO@\<#`\<[P8M$)"@/@F;___^+;"08BT0D +M)(M4)!1`B40D)(/X`P^"+?___XM\)$2#P?[K#HI$+P$`!"\`1"\"@\<#._ER +M[NE__/__BT84BQZ->.N!_^O_`P`/AR\$1XE\)#@/M@.#X!^#Z!!X=8J`<.!#`(3`=&N+?"0L,\D/MM!J$HE,)#2) +M5"1`73/`0-/@A<)T.6H$C448B\Y04^C3````@_@%=1YJ%%5J%%53B\[HP``` +M`"O'B\XE__\/`%!3Z/L```"+5"0\BTPD,$&#Q2F)3"0P@_UD=K&+?"0XBU0D +M+(/#$$*#[P&)5"0LB7PD.`^%:____^FV^___BT84BPZ+=AR-6/R!^_S_`P!W +M7X/Z`@^4P#/_!.B(1"03A=L/A(W[__^*$4%'1H#ZZ'0$.M!U,HL1A=)Y$8T$ +M%H7`>!B-@@````&)`>L.C8(```#_A`("_#!XP@/MD07`H/*_PO#P>`0"\;3Z%DK3"087]/J7B/"6\(,`%6+ +M[(M%$%-6:B"#R_^+\%DK312#X`?3ZXO(TV4,BU4,T^,SR<'N`_?3`W4(B@0. +M(L/!ZP@*PH'+````_\'J"(@$#D&#^01RY%Y;7<(0`%:+\8,^`'4-:`0`!`#H +MR"$!`%F)!E[#BU0D!#/`4U:+="00,]M`BLL[\'8(,@P00#O&L&#[;;:@KHO^+__^L-:@;HMN+__\'K"H/C#XO#7UY;P@0`5HMT)`BZ +M```$`#ORBT0D$"O6.\)R`HO"ABN4P$` +M@\0,7L(,`%6+[%&+10@STHD1B5$(B5$,B%$0B4$4B\&)3?R)402)41R)41B) +M42"+Y5W"!`"+41P[41AS#8U"`8E!'(L!#[8$$,,SP,-6B_%7BWXPU.+V5>+ +M>QR-1P,[0QAS+HL35@^V=!<##[9$%P(/MDP7`<'F"`/&P>`(`\$/M@P7P>`( +M`\&-3P2)2QQ>ZP(SP%];PU97B_'HM?___XO.B_CHK/___S/)B]`#SU^#T@"+ +MP5[#4XO95597BW,8*W,75M96<.+QHO1Z_.+ +M1"0$BU$8.\)S#8L)@#P!`'T*0#O"7 +M__^+SO?9&\DC3"08`4T8ZSB+\`/"B448ZR^+7"08A=MT)U/H\DS__XM]%(M5 +M&`-5`%.+!U*+<`R+SO\58#)#`(O/_]:+\`%U&%^+QEY=6UG"!`"XXB%#`.@? +M&P$`45%35HOQ5XEU\(V.D````.C:W___,_^-CJ0```")??SHRM___XV.N``` +M`,9%_`'HN]___[O`$```QD7\`E/HFAH!`%F)1>S&1?P#AS&1?P$A6V2)#0````"+Y5W#4U:+\;O`$```5XM^0(7_=!"+S^B\E?__ +M4U?H6!H!`%E9BWY$A?]T$(O/Z*65__]35^A!&@$`65F-CK@```#H[=___XV. +MI````.CBW___7XV.D````%Y;Z=3?__^#24C_,]*($8A1#(E1((E1),=!*`$` +M``")44R(45")42R)43")41R)41B)431FB9',````B5%XB5%\B5%PB5%TB5%H +MB5%LB5%@B5%DB5$XB5$\B9&(````B9&,````B9&`````B9&$````PU6+[(!] +M"`!6_W4DB_'_=2#_=1S_=1C_=13_=1#_=0QT$HM.0&H!Z`F6__^(ALP```#K +M$(M.1&H`Z/>5__^(ALT```!>7<(@`(M$)`2%P'0#B4$LBT0D"(7`=`.)03"# +M24C_P@@`BT0D!(E!%(M$)`C&00P!B4$0P@@`58OL@'DH`'14BU$LA=)T35.+ +M70Q6B[&(````B\97B[F,````"\>+10AT#@.!@````!.9A````.L&BWT4BW40 +M5U934/^RY#(``/^RX#(``/]Q?/]Q>.C`20``7UY;7<(0`(/L$%-5BVPD((O9 +M5E>`N\T`````=`.#Y?"+3"0D,\")1"04B_")3"00A>T/A%H!``"+^8`[`(M3 +M+(E4)!QT'_]S!/]S"/]T)"SHDBH!`(MS!(/$##/`B4,$Z<(```"+2R0S_SOY +M?!!_!3MK('8)BWL@B7PD&.L&B_V);"08A?\/A)<```"`>T\`="F`N\T````` +M="`S]COQ?!I_!3MK('83`\>+R(/A\"O(`\^%R7X$B4PD&(L"BW`8B\[_%6`R +M0P"+3"0<_]:$P`^$MP```(M[+/]T)!C_="04BP>+<`R+SO\58#)#`(O/_]:+ +M\(M#.(7`=0F+1"0RL`=1F`N)D0````=!!6_W0D%(V+D````.C4 +MW___BWPD$(M,)!2+QID!0W`14W0#S@/^B4PD%"ONB7PD$"E#(!E3)(![3P!T +M1(M#(`M#)'4\A?9T#3B#S0```'0P]L$/="L/MT-,4&H!4_]T)"CH'+D``(3` +M=`V%[702BT0D%.FQ_O__QD-0`8/(_^M0BT,LA(-6?`"`?BH`=0U74XV.N````.BNWO__Z*`Z``!?7EO""`!1,\")#"2) +M`8E!!(E!"(E!#(A!$(E!%(E!&(E!'(E!((A!)(E!*(E!+(E!,(E!-(A!.(E! +M/(E!0(E!1(E!2(A!3(E!4(E!5(E!6(E!7(A!8(A!9(O!6<-5B^QDH0````!J +M_VB!'T,`4&2))0````!6B_&#/@!T&H!^$`!T#&M&"`Q0_S;HC2```/\VZ%%I +M`0!9BTWT9(D-`````%Z+Y5W#5HOQ5S/_.7XL=B=3B]^+1BC_=`,$Z"=I`0"+ +M1BC_=`,(Z!MI`0!'C5L,65D[?BQRW5N-3E#HLDT``(U./.BJ30``C4XHZ&W_ +M__^-3A3HFDT``%^+SE[ID4T``(M$)`16B_$!1@2+3@0[3@@/AJH```"+1@Q3 +M5;U0#T0`5X7`=!H[R'864&C8-4,`5>A[GO__@\0,B\WHY9[__XM&"(M>!,'H +M`H/`(`-&"#O8=P*+V(O#P>`"@'X0`%!T0NB&:`$`B_A9A?]U!XO-Z+&>__^# +M/@!T0(M&",'@`E#_-E?H$2__^)/E]=B5X(6U["!`"+1"0$5HOQ`48$ +MBTX$.TX(#X:D````BT8,4U6]4`]$`%>%P'0:.\AV%E!HV#5#`%7HMYW__X/$ +M#(O-Z"&>__^+1@B+7@3!Z`*#P"`#1@@[V'<"B]AKPPR`?A``4'0^Z,1G`0"+ +M^%F%_W4'B\WH[YW__X,^`'0\:T8(#%#_-E?H428!`&M&"`R#Q`Q0_S;HQ1X` +M`/\VZ(EG`0!9ZQ;_-NB/9P$`B_A9687_=0>+S>BNG?__B3Y?78E>"%M>P@0` +M58OLBU4,@^P,@#H`4U97B]ET>(M%"%*)1?3H];4!`%F+31")1?B+111J(E^% +MP'0RC5#_C111#[:%P'0.9CE\0?YU +M!S/29HE40?XSTF:)%$%F.3EU`X/!`E'H1Z(!`%%1B_R)1?R-=?2-2RBEI:7H +M0@L``%]>6XOE7<(0`,S,58UL))"+17B![*````"+"(M%?%97:_D,BS"-1=!J +M4/^W6.%#`%#HVRX``(U%T&HZ4.@Z1P$`65F%P'0#Q@``:_8,C44@:E#_MECA +M0P!0Z+,N``"-12!J.E#H$DC65P7 +MPQO`@^#^0%[#S(M$)`2+#90/1`"+$(M$)`B+`&O`#/]T"`1KP@S_=`@$Z)N- +M`0!96SP +M````C840____5O]U#(OQ_W4(:&0Y0P!J4%#H.6O__X/$%(U%L&I04(V%$/__ +M_U#H0T0``/]U%(U%L(O._W404.@,`0``7HOE7<(0`%6-;"2<@>RL````5HOQ +M@WXL`'<',L#II````(-]=`"+16R)15R-10C&10@`B45@=`YJ4(U%N%#_=73H +M[$,``(M%<(/H`'0N@^@!=!"#Z`%U-(U%N%!H8#E#`.L)C46X4&A<.4,`C44( +M:E!0Z%,+``"#Q!#K$&I0:%@Y0P"-10A0Z,XK``!HH-)``&H$_W88C458_W84 +M4.BKA@$`@\04A<`/A&[___]K``S_=7S_L%CA0P#_=7CH\XP!`(/$#+`!7HUE +M9%W"%`!5B^R#[%"-1;!6:E!0_W48B_'_=13_=0CH'/___X3`=!;_=1"-1;"+ +MSO]U#%#H#````(3`#Y7`7HOE7<(4`%6+[(/L#%>+^8-_+`!W!#+`ZSIHD--` +M`&H$_W=4_W=0_W4(Z!F&`0"#Q!2%P'3@5FLP#/]U$`-W*(U]]*6EI?]U_/]U +M#.A?*P``L`%>7XOE7<(,`%;_="0(B_'H&0```(O.Z#H'``"`?F0`7G0(:@'_ +M%3@A1@#"!`"X]R%#`.A)#P$`N/A"``#H&Q`!`%-65VI<6%#_=0B+\8E%P(EU +MQ.CN00$`63/;AC_ +M_U?_=0@SR6:)"(V%).W__U#HH"H``.L.:``(``#_=0A0Z+@J``"-C?S<___H +M,L'__VH$C84D[?__B5W\4(V-_-S__^BUQ/__A,`/A+T#``"+^SD]].5#`'8< +M5XO.Z#<&``!7C4X4Z"X&``!'.SWTY4,`L!BT7P`_B)?>#K!HM%\(M]X(M-V%.#P?`#P8V-_-S__U-0Z+_&__^+1=1` +MB474/0`!```/@MC^__^#__\/A#0"``!3B\>-C?S<__^94E#HD\;__V@"`"`` +MZ%Q@`0"+^(E]Y%F%_P^$"P(``&@``"``5XV-_-S__^@JQ?__B\B*1>N)3>"$ +MP'0'T>F)3>#K.(T$30(```!0Z!U@`0")1=!9A<`/A,X!``"+3>"('#E!45!7 +MZ/$]``!7Z/=?`0"+?=!9BTW@B7WDN```$``[R'<"B\$SR6ID9HD,1XV%M/[_ +M_VCT.$,`4.@!*```:`(``@#HQ%\!`(E%\%F%P'4,5^BQ7P$`6>EM`0``@WW@ +M`(O+B].)3>R(G7S___^+^XE5V`^&X@```,=%S`T```#'1<@*````QT70"0`` +M`(M%Y(7_#X0-`P``#[=4>/YF.U7,=`IF.U7(#X7X`@``:CI99CD,>`^%[P$` +M`(MUY(/(_XE%U,=%L/@X0P#'1;0(.4,`QT6X&#E#`,=%O"0Y0P")7=S_=)VP +MZ`%?`0!0_W2=L(U.`HE%W(T,>5'H8H$!`(/$$&H@6H7`=1:+3=P#SV8Y5$X" +M=PJ+PXUY`8E%U.L#BT740X/[!'*ZBW7$,]N%P`^%L@```&ID:/0X0P"-A;3^ +M__]0Z/P[?>`/@CG___^+1?"+5=A14(V%?/___XO.4%+H./?___]U +MY.B47@$`_W7PZ(Q>`0!963E>+'884XU./.C*`@``4XU.4.C!`@``0SM>+'+H +MBT8H:##30`!J!/]V0*.4#T0`_W8\Z#6#`0!H8--``&H$_W94_W90Z".#`0"# +MQ""-C?S<___HA;W__XM-]%]>6V2)#0````"+Y5W"!`"+1>0/CKD````/MPQX +M9CO*=`9F.TW0=0-'Z^Z-%'B)7=QJ(%B+RV8Y`G8?@_ECS]__^-A1C___]J9%"-A>S]__]0Z,<] +M```#?=R+1=2#^`-U(8V%[/W__V@X.4,`4.BV70$`]]A9&L#^P%F(1F3IS/[_ +M_X/X`;A`.4,`=`6X2#E#`(V-&/___U%0C86T_O__:F10Z`X%``"#Q!#IG_[_ +M_XT$>(E%W`^W`%#H2R0``(3`#X3?````:F3_==R-A23]__]0Z,DE``"-A23] +M__]H4#E#`%#H_'\!`(E%W%E9A<`/A+`````SR6:)"(V%4/[__VID4(V%)/W_ +M_U#H#CT``&IDC86T_O__4(V%&/___U#H(24``&IDC850_O__4(V%&/___U#H +MY20``&HRC848____4(V%?/___U#H]R0``&@0TT``:@3_=@2-A1C_____-E#H +MTG\!`(/$%(7`=`QK``R+@%#A0P")1=B+1=R-C23]__\KP='X0&H@`_B+1>1: +M#[<,>&8[RG0*9CM-T`^%K/W__T?KZHM-[(M%Y`^W%'A'9H72#X2A_?__9CM5 +MP'5.@?D```$`#X.&_?__#[<$>(/H(G0E@^@Z=!R#Z!)T$X/H!'0*2(/H`74T +M:@GK#FH-ZPIJ"NL&:ESK`FHBBT7P6F:)%$A!B4WL1^E$_?__:@U89CO0="1J +M"EAF.]!T'('Y```!``^#*/W__XM%\&:)%$A!B4WLZ1C]__]1_W7PC85\____ +MB\Y0_W78Z%OT__^(G7S___^+RXE=V.O65FH!B_'HPO+__XM6!(L.BT0D"%Z) +M1)'\P@0`5E=J`8OQZ&KS__]K5@0,BSZ-="0,@\?T`_JEI:5?7L(,`%9J`(OQ +M_Q6`,$,`:@5H.#E#`%#_%80P0P"%P'0$QD9D`5[#@'ED`'0>:NS_="0(_Q5` +M(48`#0``0`!0:NS_="0,_Q4\(48`P@0`@>Q`"0``4U565_^T)%@)``"-A"2T +M````B^EH=#E#`&I04(EL)"SH\6'__X/$$(U$)&!J4%"-A"2X````4.CY.@`` +MC40D8%#H05L!`(N\)%@)```SVUF)1"04.1WTY4,`=EN^5.%#`(,^`'9%4/]V +M!(U$)&A0Z,.#`0"#Q`R%P'4L:``$``"-A"14`0``B\U0_W8$Z'WW__^$P'01 +MC80D4`$``%#_-E?_%5`A1@"+1"040X/&##L=].5#`'*JC40D%(O-4(U$)!Q0 +M_[0D8`D``.AF]?__BMB-1"0L4%>(7"0;_Q5$(48`C40D4%!7_Q5((48`BTPD +M-"M,)"R+="0X02MT)#"+P8M4)%A&B^['1"0D9````"ML)%PKPHE$)"B$VP^$ +MG0```("\)%P)````#X7.````#Z]4)!AJ9%N+PIGW^XO8BT0D7`^O1"04`UPD +M*"O+B5PD/)GW?"0D`\6)1"0@B\$K="0@F2O"B]B+QIDKPM'[B_#1_@-T)#`# +M7"0L>0(SVX7V>0(S]FKP5_\50"%&`,'H"O?0@^`"#00"``!0_W0D)/]T)$16 +M4VH`5_\55"%&`(U$)"Q05_\51"%&`(I<)!.`O"1<"0```'4UBTPD'(V$)%`! +M``!H``0``%!H@#E#`/^T)&0)``#HSO3__X3`=`^-A"10`0``4%?_%5PA1@!J +M"/\53"%&`&H%5ROH_Q4T(48`B_B)?"0B`>0$`@\0$+@<&8#T0`4?]T)`SH`P```,($`%6+[%:+ +M=0PSP%!0_W40N>@.1`!FB096_W4(Z%'T__^$P'4J_W405O]U"/\UT`Y$`/\5 +M,"%&`(7`=1/_=1!6_W4(_S74#D0`_Q4P(48`B\9>7<(,`(`]H$]$``!6B_%U +M!>@(````QD8!`8O&7L-5B^R![`0#```SP%,SVT-6B].^&P$``(B4!?S\__^( +ME`7[_?__B(05_/[__T")1?R+PB2`#[;(C002]]D;R2/.,\B+1?PST3O3=L",]*-!!(SP@/`,\(#P#/"`\`ST(O*@?$`8P``P?D( +M,\J(BZ!/1`"(#)W!740`B`R=P%U$`(@,G<-91`"(#)W`640`B`R=PU5$`(@, +MG<)51`"(#)W"440`B`R=P5%$`(3)=!4/ML$/MH0%_/[__P^VA`45_?__ZP(S +MP(@$G<-=1`"(!)W"640`B`2=P55$`(@$G(#,];!X@(SU@/2B\+!^`@/ML@/ +MML(SR(/Q!0^VA`W\_O__C8W[_?__*\B*$>L",M*(DZ!01`"$TG05#[;"#[:$ +M!?S^__\/MH0%9/W__^L",\`/MLJ(!)W";40`B`2=P6E$`(@$GK]___K`C/` +MB`2=P6U$`(@$G40`B`2- +MPW5$`(@$C<)Q1`"$TG02#[:$#?S^__\/MH0%V_W__^L",\"(!)W#;40`B`2= +MPFE$`(@$G<%E1`"(!)W`840`0X@$C<-]1`"(!(W">40`B`2-P75$`(@$C6XOE7<.#["!35HOQN````(`SR0^B5XU\)`R)!S/` +MB5\$0(E/"(E7##/2BTPD#('A____?SO()7P2)3PB)5PR+1"04 +MP>@9)`$STH@&ZP*(%HM$)#B+^BV`````=".#Z$!T$(/H0'4C:B#'1@0.```` +MZQ=J&%_'1@0,````B]KK$&H0QT8$"@```%^+VH7_="-5BVPD.(O#C4PD$(/@ +M`XO3`\C!Z@**!"M#B`21.]]RY3/278M,)#R%R741:A!2C48(4.C<$`$`@\0, +MZPV*!`J(1!8(0H/Z$'SSC40D#(O.4.A)!@``@'PD,`!U!XO.Z(<%``!?7EN# +MQ"#"$`"+5"0,BTPD!%:+="0,BP8S`HD!BT8$,T($B4$$BT8(,T((B4$(BT8, +M,T(,B4$,7L(,`(/L7%57BWPD;(OIB6PD)(7_#X2C!```P>\$@'T``(E\)&QT +M$_]T)'!7_W0D<.B0!```Z8,$``"-10AJ$%")1"0XC40D7%#HBA$!`(/$#(7_ +M#X11!```BU0D:%-6C4((B40D)(M$)'@KT(E4)#2-2`B)3"0HBW4$@\+XB\8# +MRL'@!(/`&(E,)#`#Q5!1C40D5%#H./___XM4)$P/MDPD4P^VPHL@(P>D8#[;`P>L0BPR-P&U$ +M`#,,A@0#[;`,PR%P&E$``^VPL'J"#,,A@(#[;`,U0D&(M=+#-< +M)!2*@*!01`"(1"0]B\+!Z!`/ML"+="0@B50D5(E<)%"*@*!01`"(1"0^B\/! +MZ!B)3"18BH"@4$0`B$0D/P^VPXJ`H%!$`(A$)$"+QL'H"`^VP(J`H%!$`(A$ +M)$&+P<'H$`^VP(J`H%!$`(A$)$*+PL'H&(J`H%!$`(A$)$,/ML+!Z@B*@*!0 +M1`"(1"1$B\/!Z`@/ML#!ZQ"*@*!01`"(1"1%B\;!Z!`/ML#![AB*@*!01`"( +M1"1&B\'!Z!B*@*!01`"(1"1'#[;!BH"@4$0`B$0D2`^VPHM4)#PS51B*@*!0 +M1`"(1"1)#[;#BH"@4$0`B$0D2HJ&H%!$`(A$)$N+="1`BUPD1(M$)$@S120S +M=1PS72"`?0$`B40D('04,U0D7#-T)&`S7"1D,T0D:(E$)""+1"0PBP")1"1< +MBT0D)(M(_(E,)&"+"(E,)&2+2`2#P!")3"1HBTPD*(E$)"2)4?B+5"0@B5$$ +MBU0D-(EQ_(D9@\$0@^\!B4PD*(E\)'0/A<_[__]>6VH0C40D6%#_="0XZ!X- +M`0"#Q`Q?78/$7,(,`%&+T5:+="005XM\)!B-0AB)1"0(#Q!2"(7V=&2+3"00 +MB\&#P1")3"00BTH$#Q`8B\'!X`0#1"0(20\0"&8/[\N%R7X9B\'!X`0#1"0( +M#Q``28U`\&8/.-[(A6<(,`(/L(%57B^DS_T>);"04B7PD"#E]!`^.DP```%.- +M72A6B5PD%(U#`C/VB40D&(U\)""+Z&H$`_Y;#[9%`0^V3?^*E(;`?40`#[9% +M_C*4CL!U1``RE(;`<40`#[9%`(UM!#*4AL!Y1`"(%XU_!(/K`77'BT0D&$:# +M_@1\LHM<)!2-1"0@:A!04^C]"P$`BWPD'(/$#(ML)!Q'@\,0B7PD$(E<)!0[ +M?00/C'C___]>6U]=@\0@PX/L*%-55HOIC40D%%=J(/]T)$"+=02#[@:);"08 +M4(ET)"#HK@L!`(/$##/;,_\STH7V?D4[700/CYD!```[UGTLC6PD&(ULE0"# +M_P1]&XMT)!"-#)^+10!"@\4$1XE$CAB+="04.]9\X(ML)!"#_P1U`T,S_SO6 +M?+L[700/CU0!``"ZH%%$``^V1+05BDPD&#*(H$]$`(A,)!@/MD2T%HJ`H$]$ +M`#!$)!D/MD2T%XJ`H$]$`#!$)!H/MD2T%(J`H$]$`#!$)!N*`C!$)!A"B50D +M%(/^"'0O@_X!#XZD````C4;_C50D'(E$)!`SR8I$"OPP!`I!@_D$?/.#P@2# +M;"00`77GZWZ-3"0L/MD0D +M)(U,)"S'1"00`P```(J`H$]$`#!$)"@/MD0D)8J`H$]$`#!$)"D/MD0D)HJ` +MH$]$`#!$)"H/MD0D)XJ`H$]$`#!$)"MJ!%J*0?PP`4&#Z@%U]8-L)!`!=>LS +MTH7V?C\[701_/3O6?2J-1"08C020B40D$(/_!'T=BP"-#)^)1(T80HM$)!"# +MP`1'B40D$#O6?.&#_P1U`T,S_SO6?,$[702+5"04#XZQ_O__7UY=6X/$*,($ +M`%:+\6BT-4,`QH8!`0```.@9`@``B\9>PU:+\8,^`'0(_S;_%8@P0P`SP(D& +MB48(B48,7L/I;@```%6+[('L``(``(V%`/___U-6OH````!64.AD````BTT( +MC84`_O__5E#H5````(V%`/[__U"-A0#___]0Z.5*`0!9B]B-A0#___]9]]M6 +M&MM0_L/HZ`$``%:-A0#^__]0Z-L!``!>BL-;B^5=P@0`:``!``!1QH$``0`` +M`.B_`0``PX"Y``$```!T)%:+="0(5XM\)!!J`%=6:(````!1Z%4````SP&:) +M1'[^7U[K"8M$)`0SR6:)",((`%:+\8!^!`!U,VB<.4,`Z/\4``")!H7`=!]H +MM#E#`%#_%8PP0P!HR#E#`/\VB48(_Q6,,$,`B48,QD8$`5[#58OLBT4,5HMU +M%%>+^3O&<@*+Q@/`4/]U"/]U$.BC"`$`#[:'`0$``(/$#%#_=1B-!#90_W40 +MZ`8```!?7EW"%`!5B^Q6BS7(@40`A?9U$+G`@40`Z&G___^+-+?"0,,\"+\68Y!W47:``!``!05HB&``$` +M`.A'!@$`@\0,ZR!J`6B`````5E?&A@`!```!Z,!(`0!90(O.4%?HOO[__U]> +MP@0`BT0D!(7`=!&+3"0(A8):,\W!S@(# +MR@/!B40D*(M$)"#_,.AD<@$`BTPD)(M4)"S!P@6!PIEY@EJ)`0/0BT0D)(O. +M,\LC3"0HP4PD*`(SR_]P!`/*`^GH,'(!`(M,)"B+U8-$)"@4P<(%B4$$!9EY +M@EH#T(O.BT0D)#-,)"R#P`4C3"0PP4PD,`(SSHE$)"0#RHT$AP/9_S")1"0\ +MZ.IQ`0"+3"0\B].#Q!3!P@6)`8M,)!PS3"0@`]"+1"0H(\TS3"0<@<:9>8): +M`\K!S0(#\8-\)!0/#X73_O__BU8):`\'!S@*) +M1"08B\C1PHO&,\/!P04C1"00@<&9>8):`\J)5PB+5RPSPS-7%`/!,U<,`\6+ +M;"00B\@S%XE$)!R+QL'-`C/%B6PD$(ML)!@CQ='",\;!P04%F7F"6@/*B5<, +M`\$#P\'-`FH16HE$)!2);"08B50D*(U"!8O8B40D,(U*^XO"@^$/C6H#@^`/ +M@^4/@^,/B6PD+&H/BQ2/,Q2',Q2?,Q2OBT0D%#-$)!R+3"08T<*)%*^+;"0@ +M,\7!P04%H>O9;@/*P +M(\8CSB/N(]Z+="0DB6PD-&H/BQ2.,Q2&,Q2>,Q2NBT0D%#-$)!R+3"08T<*) +M%*Z+;"0@,\4#PL'!!0/'P#P`*#Y@^#X`^+%(J+3"0D,Q2!,Q29,Q2QT<*)%)F+3"00BUPD(,'!!8'! +MUL%BRHO#,T0D'#-$)!0#PL'+`@-$)!@#P8E<)""+7"0DB40D&(M$)"B-2/B# +MP/Z#X`^#X0^+%(LS%(,S%+N+1"0TBTPD&,'!!8'!UL%BRC,4@]'"B12[BWPD +M((O',T0D$#-$)!3!3"00`@/"`T0D'`/!B40D'(M$)"B-2/F#X0](@^`/BQ2+ +M,Q2#B\75N#Q"C"$`"#[$135597BWPD6&HX6XMW&(MO&(/F/XM' +M'`^DZ`/!Y0/&1#X@@$:)1"00._-T2G8<:D!9._%S$RO.C4<@40/&:@!0Z%3] +M``"#Q`PS]H7V=1%J`8U'(%"-1"0<4%?H.??__RO>C4<@4P/&:@!0Z"K]``"+ +M1"0<@\0,4.B!:@$`58E'6.AX:@$`65F)1UR-1R!J`5"-1"0<4%?H_?;__XM, +M)%R+]VH%*_%:BP0.B0&-202#Z@%U\U?H"@```%]>75N#Q$3""`"+1"0$@V`8 +M`(-@'`#'``$C16?'0`2)J\WOQT`(_MRZF,=`#'94,A#'0!#PX=+#P@0`@^Q` +M4XM<)%!65XM\)%"+3QB#X3\!7QB#5QP`C009@_@_=E55:D!>*_&-1R!6_W0D +M7`/!4.C,_0``@\0,C4<@:@%0C40D&%!7Z%?V__^-;C_K'8M$)%B#P,%J``/% +M4(U$)!A05^@[]O__@\9`@\5`.^MRWS/)7>L",_8[WG88BT0D5"O>`\934(U' +M(`/!4.AR_0``@\0,7UY;@\1`P@P`@^Q(4U6+;"145HMT)&!7BTT8:C]?(\\! +M=1B#51P`C00Q.\=V>FI`6RO9C44@4_]T)&0#P5#H+/T``(/$#(U%(&H!4(U$ +M)"!05>BW]?__C4,_.\9S1HM$)&`K^(E\)!2-%`.)5"00:@!2C40D(%!5Z)'U +M__^+5"00C70D&(M$)!2+^FH0@\)`@\-`6?.EBW0D9`/"B50D$#O&L" +M,]L[\W88BT0D8"OS`\-64(U%(`/!4.BL_```@\0,7UY=6X/$2,(,`%%35597 +MBWPD&&HX6XMW((MO((/F/XM')`^DZ`/!Y0/&1#XH@$:)1"00._-T/W8<:D!9 +M._%S$RO.C4[QT`(!;P@0`4XM<)!!6BW0D +M#%>+?B"#YS\!7B"#5B0`A=MT.55J0%TK[SO==P*+ZU7_="06\(,`('L'`$``%-5 +M5E>+O"0P`0``,_:-7RC_,^CT9@$`B42T,(U;!$99@_X0+S3/P]]$C +M3"08B\7!R`8S\(O"(\6+;"0@,\B+1"08`_&)5"08`[-0.D,`B]<#=!PL@\,$ +M`W0D)(E$)"0#[L'*#8O'P<`*,]"+Q\'(`C/0BT0D%(O((T0D$#-,)!`CSS/( +MBT0D$`/1B7PD$(M,)!2)3"0@B40D%(T\,H'[``$```^":/___XE\)!R+O"0P +M`0``BTPD'`$/BTPD$`%/!(O(`4\(BTPD(`%/#(M,)"@!3Q2+3"08`4\8`6\0 +MBTPD)`%/'%]>75N!Q!P!``#"!`!5B^R+30R+10@Y311_#'P%.440#H2R'___]UY(M=X%/_=0CH[````.L#BUT(BWT,5E=3Z`48``"-3>#H+1?_ +M_UN%]G0',\!FB41W_HM-]%]>9(D-`````(OE7<(0`%%6BW0D#%?K`X/&`@^W +M!E#H!`$``(3`=?`/MSYFA?]U!S/`Z8@```!358ML)!PSVXK#:B*(1"076H3` +M=10/M\=0Z-,```"$P'57BD0D$VHB6F8[^G4I9CE6`G48A>UT#XM$)"!(.]AS +M!F:)5%T`0X/&`NL>A,`/E,"(1"03ZQ>%[703BT0D($@[V',&9HE\70!#BD0D +M$X/&`@^W/F:%_W68A>UT!S/`9HE$70!=B\9;7UY9P@P`5E?_="0,Z(PY`0"+ +M?"080%D[^'8"B_B+="005U;_="04_Q4L(48`QD0^_P!?7L(,`(M$)`2#^$%\ +M!8/X6GX(@\"?@_@9=P4SP$#K`C/`P@0`BT0D!(/`T&H)63O(&\!`P@0`@WPD +M!"!T"X-\)`0)=`0SP.L#,\!`P@0`9HM$)`1F@_AI=05J25CK"0^WP%#HN!H` +M`,($`(/L=(M4)'PSR5.+7"1\0556,_:)3"0,5XO^.]9_%'P$.]YS#O?;B^F) +M;"04$];WVNL&B^Z)="04*:PDE````(NL))0````[S7,F5FH*4E/H?.H``(/! +M,(E<)!QFB4Q\((O8BTPD$$=!"\*)3"00==:+;"04A>UT"6HM6&:)1'P@1XN4 +M))````"%_W03C4Q\'F:+`8U)_F:)!')&._=R\3/`9HD$>E]>75N#Q'3"$`!6 +MBW0D"%;H1C@!`%F+3"00.\AV#RO(`\91_W0D$%#H!````%["#`"+3"0,AP@P`BTPD#(7) +M="J+1"0$5H/I`70:BU0D#"O0#[PSR6:)"%[" +M#`!15HOQ,\")="0$B0:)1@2)1@B)1@R(1A#HN````(O&7EG#4U97BWPD$(O9 +MA?]U!;^T-4,`BW,$5^C@-@$`64"+RU#H_!7__XL#5XT$<%#H'5D!`/]#&%E9 +M7UY;P@0`58OL48U%_%#H!P```(M%_(OE7<-6B_&+3A0[3@1R#XM$)`B%P'0# +M@R``,L#K'HL&5XT\2%?HA38!`$`!1A2+1"00687`=`*).+`!7U["!`!5B^Q1 +MC47\4.BW____A,!T$/]U#/]U_/]U".C^_O__L`&+Y5W""`!6B_ A0`Z)$[ +M__^#9A@`@V9<`%[#@V$4`,-5B^R#[!!35HUU\#/)N````(`/HHD&B5X$B4X( +MB58,BW7P:@>!YO___W]8._!R'S/)#Z)7C7WPB0>)7P2)3PB)5PSV1?0@7W0% +M:@58ZU&#_@%R2C/`C77P0#/)#Z*)!HE>!(E."(E6#/=%^```"`!T!&H$Z];W +M1?@``@``=`1J`^O)]T7\````!'0$:@+KO/=%_`````)T!3/`0.L",\!>6XOE +M7<-5B^R#[!!3,]MFQT7T``6-1?B)7?!04U-34U-3:"`"``!J(&H"C47P4/\5 +M&"!&`(O(B4W\AB^5=P@0`N,BS +M``#H?.(``%-55E=H8#M#`#+__Q6`,$,`B_"%]G1D:'0[0P!6_Q6,,$,`BIPD +MW+,``(OXA?]T&`^VR_?9&\F!X;0U0P!1B\__%6`R0P#_UVB(.T,`5O\5C#!# +M`(OPA?9T(3/)A-L/E,%)@>$`^/__@<$`$```48O._Q5@,D,`_]:W`:&`X$,` +M@\W_QT0D%*0[0P"^``@``,=$)!B\.T,`QT0D'-@[0P"`.'C'1"0@\#M#`,=$ +M)"0(/$,`QT0D*"`\0P#'1"0L.#Q#`,=$)#!0/$,`QT0D-&P\0P#'1"0X?#Q# +M`,=$)#R0/$,`QT0D0*@\0P#'1"1$P#Q#`,=$)$C8/$,`QT0D3/`\0P#'1"10 +M!#U#`,=$)%0$)(0```!`/D,`QX0DB````%@^0P#'A"2,````<#Y# +M`,>$))````",/D,`QX0DE````*0^0P#'A"28````O#Y#`,>$))P```#@/D,` +MQX0DH````/@^0P#'A"2D````$#]#`,>$)*@````@/T,`QX0DK````#P_0P#' +MA"2P````5#]#`,>$)+0```!P/T,`QX0DN````(@_0P#'A"2\````I#]#`,>$ +M),````"T/T,`QX0DQ````,P_0P#'A"3(````Y#]#`,>$),P```#X/T,`QX0D +MT````!!`0P#'A"34````*$!#`,>$)-@```!`0$,`QX0DW````%A`0P#'A"3@ +M````<$!#`,>$).0```",0$,`QX0DZ````*A`0P#'A"3L````Q$!#`,>$)/`` +M``#<0$,`QX0D]````/A`0P#'A"3X````$$%#`,>$)/P````P04,`QX0D``$` +M`$1!0P#'A"0$`0``7$%#``^$S````%#H-&T!`(OX687_#X2[````5HV$)!03 +M``!0:@#_%7PP0P`SP%!0:@-0:@%H````@(V$)"@3``!0_Q4D,$,`B_`[]71\ +M:@!J`%=6_Q54,$,`.\=U;&H`C40D%%!H_G\``(V$).0S``!05O\52#!#`(7` +M=$V+1"00T>@SR6@$`0``9HF,1-PS``"-A"0,`0``4(V$).`S``!0ZQN-A"0( +M`0``4.@F_/__:`0!``"-A"0,`0``4%?H9O?__XOXA?]UVE;_%1@P0P"^``@` +M`%:-A"04`P``4&H`_Q5\,$,`5HV$)!0#``!0Z`NW__]0C80DX",``%#HI?G_ +M_S/_,_;H4*?__ST`!@``<@O_=+04Z+O[___K`C/`AL$BWRT%(3_=38S]F@`"```_W2T.(V$ +M)!@#``!0Z.*V__^-A"00`P``4/\57#!#`#O%=0A&@_XU+\6I`7XD&.\=V +M`HD^,^TSVT4Y'G4"B2Z)G@0!```Y/G8"B3Z-AB`#``"(GA0#``!0_Q7(,$,` +M4U=34_\5[#!#`%-555.)AA@#``#_%>@P0P")AAP#```YGA@#``!T!(7`=1MH +MN$)#`+]0#T0`5^A89/__65EJ`HO/Z$AD__]?B9X,`P``B\:)GA`#``")G@@! +M``!>75O"!`!5B^QDH0````!J_VB!'T,`4&2))0````!35E>+\>BY`@``,__& +MAA0#```!5VI`_[88`P``_Q7@,$,`.;X$`0``=AZ-7@3_,^BG````_S/_%1@P +M0P!'C5L$.[X$`0``0P0P"#^/]U)U;_ +M%0`P0P!0:O]H4$)#`+Y0#T0`5N@48___@\00B\YJ`N@#8___7L($`%%35HOQ +M,]LY'G9P55>-?@2-1"004&H`5FB@#$$`:````0!J`/\5P#!#`(OHA>UU)V@H +M0D,`:%`/1`#HQ6+__UE9N5`/1`#H4V3__VH"N5`/1`#HJ&+__XDO_X8$`0`` +MH=B!1`"%P'0)4/\W_Q7$,$,`0X/'!#L>-OB`#``#_=?R+3?C_ +M%6`R0P#_5?A7_Q7,,$,`@ZX(`0```74,_[8<`P``_Q78,$,`5_\5T#!#`(U% +M^(O.4.@S____A,!UOU]>B^5=PU:+\8.^"`$```!T*_^V'`,``/\5W#!#`&H` +M_[8(`0``_[88`P``_Q7@,$,`_[8<`P``Z.']__]>PXM$)`0!`8M$)`@1003" +M"`"#[$A35597B_DSVU-J9/]W!/\WZ#[>``")1"08B50D'.AFH?__/0`&``!S +M$HU$)!!0C40D'%#_%0`Q0P#K:XU$)#A0C40D'%#_%0@Q0P"-1"1(4(U$)#Q0 +M4_\5]#!#`(U$)!!0C40D3%#_%?PP0P"-1"0@4(U$)#Q0_Q7\,$,`BTPD%#/` +M`TPD'"O#&TPD)"M$)"`;RP-$)!`3RP-$)!B)1"00$\N)3"04C40D*%"-1"04 +M4/\5"#%#`(MT)%PSVP^W1"0P0P^W3"0N#[=L)"H/MU0D*(E&#`^W1"0RB480 +M#[=$)#2)1A0/MT0D+(E&'(U!_XD6B6X$B4X(B48@.^MV(FH$NH3@0P!9@_DP +M=Q"+`H/!!`%&((/"!$,[W7+K#[=4)"B#_0)V#5+H/P```(3`=`/_1B!J`&@` +MRIH[_W<$_S?H@-T``%^)1AA>75N#Q$C"!`!J`&ID_W$$_S'H]=P``(M,)`2) +M`8E1!,($`/9$)`0#=2.+1"0$:F296??YA=)U$(M$)`2YD`$``)GW^872=04S +MP$#K`C/`P@0`58OL@^P85HU%Z(OQ4/\5\#!#`(U%^%"-1>A0_Q7\,$,`:@!J +M9/]U_/]U^.AJVP``B0:)5@1>B^5=PU6+[(/L)(M5"(O"@^`?@V7T``/`B47P +MB\+!Z`6#X#^)1>R+PL'H"X/@'XE%Z(O"P>@0@^`?B47DB\+!Z!6#X`_!ZAF) +M1>"!PKP'``"-1=R)5=Q0Z`8```"+Y5W"!`!5B^R#[$A3BUT(5E>+\6:+`V:) +M1=AFBT,$9HE%VF:+0PAFB47>9HM##&:)1>!FBT,09HE%XF:+0Q1FB47D,\!F +MB47F9HE%W(U%\%"-1=A0_Q7\,$,`A<`/A(H```#H]9[__S/_/0`&``!S%HU% +M^%"-1?!0_Q4$,4,`BT7\BTWXZU6-1.N^_S9HA0```.C@SO__4.N`_S9H!`(``.OO_W8$:(0```#KG/]V!&B#```` +MZY+_=@C_=@1HT@```.BPSO__4/\VZ!2?``"#Q!#IK0$``/]V!&IYZ6C_____ +M=@1HW````.E;_____S9HW0```.N;@_@X#X^Z````#X2M````@^@7@_@+#X=R +M`0``_R2%%Q1!`&C>````Z4K___]HX0```.E`____:+0```#H0,[__U#_-NDV +M____:FGK[VIJZ^O_=@1J:.GX_O__:&\$``#KVFAP!```Z]/_=@1H<00``.G= +M_O___W8$:G'IT_[___]V!&C(````Z/3-__]0C84`_O__:``!``!0Z,4L____ +M=@B-A0#^__]0:`Q#0P#_-N@XG@``@\0@Z=$```!J9^EX____@^@Y=$"#Z`%T +M-(/H`70B@^@)=!.#Z`$/A:T```!HA@```.E1____:$,#``#I1_____]V!&@& +M!```Z5'^__]J;^DS____:(P```#I*?___VA6!```Z1____\]@````'5JZ)"\ +M``"#?@0`="3_=@1HR@```.A%S?__4(V%`.K__V@`"@``4.@6+/__@\00ZQQH +M``H``&C)````Z!_-__]0C84`ZO__4.B7[?__:@!HE@```.@&S?__4(V%`.K_ +M_U#_-4R$1`#HW(T``%Z+Y5W#D%X100!($4$`;!%!`'D100"($4$`CQ%!`)81 +M00"@$4$`LA%!`+D100#`$4$`SQ%!`-@100#B$4$`N1-!`+D300"Y$T$`N1-! +M`.P100"Y$T$`#!)!`!8200!.$D$`6!)!`&(200!T$D$`>!)!`'P200"&$D$` +MC1)!`)0200"Y$T$`H1)!`*L200#IO\$``%6+[+@`%@``Z-?1``!35O]U"&B# +M````Z$3,__]0O@`)``"-A0#J__]64.@4*___@\00C84`_/__N5`/1`!H``(` +M`%#H%%K__X3`="96:!Q#0P"-A0#J__]0Z%_L__]6C84`_/__4(V%`.K__U#H +M2^S___\5`#!#`&HU:)8```"+\.C:R___4(V%`.K__U#_-4R$1`#HL(P``(/X +M!%8/E,/_%00P0P!>BL-;B^5=P@@`N``0``#H*M$``%-55HNT)!`0``!7:@)= +MBX8P80``.\5U"#/`0.GV````@+Z(80````^%VP```(/X`0^$T@```(N<)!@0 +M``"-1"00OP`(``!74U#HW>O___^T)"P0``"-1"04_[0D+!```/^T)"P0``#_ +MM"0L$```5U#HS<```(OXA?]T!#O]=193Z`6/__\[_74,QX8P80```0```.M_ +M@_\#=0N)KC!A``#I<____X/_!'5:C40D$%#HSZC__XN\)!P0``"-3"005SO! +MB\%04W4'Z"RI___K!>A7Z___4^B3C?__A,!T-O^T)"P0``#_M"0L$```_[0D +M+!```/^T)"P0``!74U;H]/[__^L2B\?K#O^T)!@0``#H=H[__S/`7UY=6X'$ +M`!```,(<`%6+[/]U)/]U(/]U'/]U&/]U%/]U$/]U#/]U".B.P```7<(@`/]T +M)`S_="0,:@#_="00Z*K```#"#`#IG)@``*!0A$0`PS+`PX!\)`0`_W0D"`^5 +MP(T$A50```!0Z$W!``#""`#IGL$``%-6BW0D$#/`5XM\)!BS`5=6:O__="0< +M9HD&4%#_%10Q0P#WV!K`(L.%_W0',\EFB4Q^_E]>6\(,`%6+[(/L%%97C47L +M,_905HOY_Q4,,4,`@WWL`0^7P(B'``$``%;_%1`Q0P"%P`^5P(@$/D:!_@`! +M``!RZ%]>B^5=PU6+[%8S]CEU$'8HBU4(5XM]#"OZ#[9*`0^V`L'A"`/!9HD$ +M%V:%P'0)1H/"`CMU$'+B7XM%#%Y=P@P`BT0D#%-55HMT)!"-:/]7BWPD&+,! +MZ3`!```/MM!&@?J`````#X+6````B\*#X.`]P````'4BB@Z*P23`/(`/A1(! +M``"#XA\/OL&#X#_!X@8+T$;IJ````(O"@^#P/>````!U.XH.BL$DP#R`#X7D +M````BF8!BL0DP#R`#X75````#[[)@^(/@^$_P>(&"\H/OL3!X0:#X#\+R(/& +M`NM?B\*#X/@]\`````^%IP```(H.BL$DP#R`#X69````BF8!BL0DP#R`#X6* +M````BGX"BL#X3_!X@8+R@^^Q,'A!H/@/PO(#[['P>$& +M@^`_"\B#Q@.+T8/M`7A3@?K__P``=C>#[0%X1H'Z__\0`'8$,MOK+(V"``#_ +M_X'B_P,``,'H"H'J`"0``"T`*```9HD'9HE7`H/'!.L&9HD7@\<"B@:$P`^% +MQO[__^L",MLSP&:)!XK#7UY=6\(,`%-6BW0D$#/`5XM\)!BS`5!05U9J__]T +M)"2(!E!0_Q48,4,`]]@:P"+#A?]T!<9$/O\`7UY;P@P`5HMT)`Q7,_^+SSE, +M)!1V'XM4)`R*`H@$3HI"`8A$3@%F.3IT"D&#P@([3"04P@P`BTPD +M"%-6BW0D%%>+?"003@^W!V:%P`^$[````(/N`0^(XP````^WT(/'`H'Z@``` +M`',%B!%!Z]B!^@`(``!S'(/N`7@7B\*`XC_!Z`:`RH`,P(@!B%$!@\$"Z[2- +M@@`H__\]_P,``'":+PL'H#`S@B`&+PL'H!H#B/R0_@,J`#("(00&( +M40*#P0/I3____X'Z```@``^#0____X/N`P^(.O___XO"P>@2#/"(`8O"P>@, +M)#\,@(A!`8O"P>@&@.(_)#^`RH`,@(A!`HA1`X/!!.D(____7U[&`0!;P@P` +M45-5BVPD$,9$)`L`9H-]`"UU"(/%`L9$)`L!#[=%`#/;:C!:,\EF.\)R-E97 +M9H/X.7/__ +M_P^W1"0$4/\5*"%&`,($`&K__W0D#&K__W0D$&@!$```:``$``#_%:@P0P"# +MZ`+""`!5B^Q65_]U".B0'0$`BW400%D[QG,._W4(Z'\=`0!9C7@!ZP*+_O]U +M#.AO'0$`0%D[QG,,_W4,Z&$=`0!9C7`!5O]U#%?_=0AH`1```&@`!```_Q6H +M,$,`7X/H`EY=P@P`5E>_@````(OQ5VH`5NB7V@``5XV&@````&H`4.B(V@`` +M@\08B\9?7L-1,\")#"2)@8Q*``")@40&``")@4P&``")@4@&``"+P5G#N%+\3/_1XEU\%>-3@3HN8W__S/;B5W\B5XDB5XHB5XLB5XP +MB%XTB5XXB5X\B5Y`B5Y$B%Y(B5Y,B5Y0B5Y4B5Y8B%Y-CHCF``#&1?P&Z%*-__^+10B+ +MSHF>F.8``(F>G.8``(F>H.8``(F>I.8``(B>J.8``(F>K.8``(F>L.8``(F> +MM.8``(F>N.8``(B>O.8``(F>P.8``(F>Q.8``(F>R.8``(F>S.8``(B>T.8` +M`%.)!HF>0$L``(B>1$P``&:)GE!,``"(GE),``")?AR)7A2)7B")7AB)GMCF +M``")GMSF``#H0BP``(M-](O&7UY;9(D-`````(OE7<($`,S,S,S,S,S,S,S, +M45:+\6H`B70D"(U.!.B(C/__@Z;42@```(O&7EG#S,Q6_W0D"(OQZ"0```#' +M!G150P"+QE["!`"#800`B\P@`QT$$.$-#`,`"4/\VZ%;2____-N@:&P$` +M68M-]&2)#0````!>B^5=PU6+[&2A`````&K_:($?0P!09(DE`````%:+\8,^ +M`'0<@'X0`'0.BT8(P>`$4/\VZ`O2____-NC/&@$`68M-]&2)#0````!>B^5= +MP^EK)@``@<&,2@``Z9`J``!6:@"+\>A;$@``BX9`2P``AZ?2*___,S,S,5HOQBX;42@``AZ=.*__]6BW0D"#NQ@````',$BP'K(3/2C8&$````0CLP<@U" +M@\`$@_H@L)BP21*T21?`/&7L($`%6+[/9%"`)DH0````!J_VB!'T,` +M4&2))0````!65XOQ=#%HL!Y!`(U^_/\W:.1*``!6Z(K'``#V10@!=!)I#^1* +M``"#P0115^A#S0``65F+Q^L:Z%/____V10@!=`UHY$H``%;HU\4``%E9B\:+ +M3?1?9(D-`````%Z+Y5W"!`#,S,S,S,S,S,S,S,Q6B_&-1@3'!FA50P!0Z$4! +M`0#V1"0,`5ET"FH,5NB3Q0``65F+QE["!`"+1"0$5HOQ`48$BTX$.TX(#X:J +M````BT8,4U6]4`]$`%>%P'0:.\AV%E!HV#5#`%7H>4[__X/$#(O-Z.-.__^+ +M1@B+7@3!Z`*#P"`#1@@[V'<"B]B+P\'@!(!^$`!0=$+HA!@!`(OX687_=0>+ +MS>BO3O__@SX`=$"+1@C!X`10_S97Z`_7``"+1@B#Q`S!X`10_S;H@<____\V +MZ$48`0!9ZQ;_-NA+&`$`B_A9687_=0>+S>AJ3O__B3Y?78E>"%M>P@0`4XO9 +M,\E6O@`@``!7.7-0+0``,\DYR)>P2).SE%$'<#BT404/]U#/^VE.8``.@GU@``C89DY@``@\0,B\B) +M1=CHW:3___9%"(!T'%/H1:7__XO8B5WPA=MU"E>+SNC[#@``ZPQ+ZP:+GM3F +M``")7?"+AISF``")1=P[V'=&.Y[$Y@``=SYJ.(F>U.8``.B)PP``B]B)7>!9 +MA=MT"(E[-(E[$.L%B]^)?>"+3?`[3=QU>H'Y`"```'8?:CA3Z(W#``!963+` +MBTWT7UY;9(D-`````(OE7<(,`(V.F.8``&H!Z-RM__]J..@OPP``B]")5>A9 +MA=)T"(EZ-(EZ$.L%B]>)?>B+CISF``"+AICF``!7B52(_(V.P.8``(N&G.8` +M`$B)0PSHS+K__^L/BX:8Y@``BP2(B47HB4L,B\>)?>0YAK#F``!V0HV.K.8` +M`(O?BQ&+R"O+BP2"B02*C8ZLY@``BQ&+1>0Y/()U`4.%VW0#B3R"0(E%Y#N& +ML.8``'+0B5WDA=N+7>!U(H&^L.8````@```/AR#___^-CJSF``!J`>@;K?__ +M,\!`ZP.+1>2+CK#F```KR(N&K.8``(DR)0R1T1HO.Z(.&___!Z`F+SFH'B47@Z%V&__^+5>"+ +MSXE-Y(U[%#/`0-/@A<)T#E;H^:+__XM-Y(M5X(D'08/'!(E-Y(/Y!W+=,_^+ +M1=PY1?`/A9(```!6Z-&B__^+\('^```!``^#\/W__X7V#X3H_?__BT7LBP@# +MSCM-$`^'V/W__U:-3<3HE>_^_XE]_(7V="R+3>R+`8/``ST`@```+^8"_J@````!U +M(L:'J@```/_H3@<``(N$G[@```"%P'0+BPB)C)^X````ZVZ-2RZ+PXT,CT"- +M202#^"9T)8,Y`'3R5HNTA[@```!34%:+#HF,A[@```"+S^BK(0``B\9>ZSC^ +MCZH````/MD0[!(N/7`$``&O0#(O!*X=0`0``.\)^%BO**9=4`0``BX=4`0`` +MB8]<`0``ZP(SP%];P@0`45%355:+="0@5XM\)!R)?"04BA:*PH3`#X3<```` +M/`)V9CP##X7,````@WPD(`.+J5A,``!V2FH"6VH$C5@'H"ZW4L#[9* +M`0^V`L'A"`/(B\7!Z`+!X0@KR`^V0O\#R(O!B$K_P>@(P>D0B`*(2@$#U@/N +MC0P3.TPD('+!B\?IK@```(N96$P``(#Z`FH$#Y3!@,'H7HA,)!,Y="0@=DR+ +MUHH'1T-"/.AT!#K!=3>+#XOK@>7___\`A!B-@0````&)!^L. +MC8$```#_A75M96<(,`%97B_F-MXQ*``"+SNB&(0``:@&+SN@A(0`` +M:@*+S^AJ(```7U[#:``!``"-@6P&``#&@6P*```!:@!0Z,C.``"#Q`S#55>+ +M?"04B^F%_W0C4XM<)!16BW0D%"O>C00SB\U0Z'[W__^*`(@&1H/O`77K7EM? +M7<(,`%%3BUPD%%6+;"005XL[*WPD&(E,)`R%[70R5HO'(T0D)%#H1O?___\S +MBTPD%(OPZ#GW__^*#D>("(L#BTPD$$`C1"0DB0.#[0%UT%Y?75M9PA``@>P( +M`0``4XO953/M5HN#4`8``$6`O"08`0```(NS1`8``%>+4`*-?"08=0Z#?@@` +MC7PD'(E$)!AT9(N,)"`!``"%R70%BW8(ZR&+=@AF.2YT%HN#4`8``(M.!(H` +MZP.#P08X`77YZP.-3@(Y40)U'(V$)!@!```[^`^#I@```(D/@\<$@WX(`'7` +MZP.+<0*-1"08._AU!XO&Z8D````/MRZ-0@&*"HE$)!(SP$"(3"009COH=$,[ +ML]Q+``!V9XM&!.L#@\`&.`AU^0^V4`$/MTX"2BO-*\J-+!([Z7<+:\(%.\@; +MP/?8ZPQKP0,ST@/)2`/%]_'^P.L#BD8#B$0D$8/O!(U$)!!0B\[_-U/HD58` +M`(OPA?9T#8U$)!@[^'7@Z7+___\SP%]>75N!Q`@!``#""`!55HOQBXY$!@`` +MBY;<2P``.\IV)(N&Y$L``#O(=QIF@SD!=!HY401V#SE!!'<*5NBP5P``A,!U +M#(/(_UY=PU;H;%8``+T`@```Z9P```"+CG!*``"+EGA*``"-!!$SP3T````! +M$H```C! +MX0@+P<&F<$H```B)AG1*``#KJHN&1`8``/^&7`8``(M("(F.1`8``#N.W$L` +M``^&<____SN.Y$L```^'9____P^W`3N&5`8``'3(5NA16```A,`/A$[___^+ +MEGA*``"+PHN.?$H```^OP0&&<$H``(N&@$H``"O!#Z_"B89X2@``@[Y0!@`` +M``^$+____X.^7`8```"+AE`&``!7#[8X=1F+0`([AMQ+``!V#HF&3`8``(F& +M1`8``.L7B\[H/5(``("^;`H```!U!XO.Z,7\__^+CG!*``"+EGA*``"-!!$S +MP3T````!$H```C!X0@+P<&F<$H```B)AG1*``#KJHO'7^E[_O__45-55HMT)!17B_F+ +MSNB$`0``B]C!Z`4D`8E$)!!T"XO.Z'`!``"+Z.L1@[^,2@```'4$,L#K9XML +M)!#VPT!T#8O.Z$\!``"+3"0+^0^V;#XI#[9$ +M/BH[Z'4&BT0D$.LU4XU&`5#HT/C__XO8A=MT(FO.#(MT)!115E/H9,L``(N$ +MK[@```"#Q`R)!HFTK[@```"+PUM?7EW""`!6BW0D"(V1@````#/`.S)R#4"# +MP@2#^"!R\S/`ZQ.+A(&`````*\8[1"0,<@2+1"0,7L((`%:+\8M.!('YXG\` +M`'X6B\[HZAT``(M.!('Y`(```'P$,\!>PXM&$`^V!`A!B4X$7L.#[`Q35HOQ +M,]M7BX:P````.X:T````=`*(&(U$)`R+^U6)1"08C9:X````B40D%+W__P`` +MZRN+"HL!B0*-1"00B4$(BT0D%(E!!(M$)!2)2`B)3"049HDI#[9$/@1FB4$" +M.1IUT4>#P@2#_R9\\XM4)!2-1"00.]!T2^LL#[=/`@^W0@(#R('Y```!`',H +MBT\(BT<$B4$$BT\$BT<(B4$(9HM'`F8!0@(/MT(":_@,`_IF.2]TQHM2!(U$ +M)!`[T'7GBU0D%%WIB0```(M*"(M"!(E!!(M*!(M""(E!"`^W3P*!^8````!V +M*(V1?____\'J!T)KPH`#R(N&3`$``(D'B;Y,`0``@<<`!@``@^H!=>)1"04Z&<6``"+;"0H,]LS_X7M='!6@_L@@%*_`[ +M="00<^3K1U9J`%#HJ<<``(M,)"0#_HM$)""#Q`R)!)F)O)F`````0SO] +M7UU;@\08P@0`._US\HU,)!SHCN[__V@$MT,`C40D(.L2C4PD'.AZ[O__:`2W +M0P"-1"0@4.@KZ@``S(/L%%.+7"0<5XOYA=MU"KE0#T0`Z"5`__^X```$`#O8 +MA^Q@`` +M@\0,@'PD#P!T0H._V.8```%R.8U+_S/;B4PD$$-6BW=\BY?8Y@``*_.+AT!+ +M``!*(]8CSD.*!`*(!"F+3"04.Y_8Y@``=M>+7"0H7HN'0$L``(7`=`=0Z-`( +M`0!9B:]`2P``C4/_B9_8Y@``B8?A?7L($ +M`%-6,]N+\5+^XF>Q.8``(F>U.8``#F>G.8``'8;BX:8Y@``:CC_ +M-+CHOK0``$=963N^G.8``'+EB9Z6\($`+B>(D,`Z(&T``!145-65XOY +M,]LY7R!U&;X`!$``5N@'MP``5E-0B4<@Z/G$``"#Q!`Y7Q@/A;L```"+=QPS +MR0/VNN1*``"+QHEU\/?B#Y#!]]D+R#/`@\$$#Y+`]]@+P5#HQ+8``%F)1>R) +M7?R%P'0;:+`>00!HT!Q!`%:-6`2),&CD2@``4^@(M0``@TW\_VG&Y$H``(E? +M&%!J`%/HA<0``(/$#(7V=$PSP(E%\(M?&`/8@[O42@```'4L:``,`P#'@]Q* +M````00``Z`H'`0")@]1*``!9A+V3/`:)@```!0B40D'(V#N``` +M`(E<)!A0Z/W#``"+JZP```"#Q`R)JU`!``"+&XO#F8/B!P/",]+!^`-J#%GW +M\3/2:_A4:@PKWXO#]_&-#"LSTD!K\`R+1"04B]@#]8F+7`$``(FP5`$``(FP +ML````(O'7_?W:@1KP`Q:4ED#QHF#M````#/`0(A$`P-`@^H!=?9`B$0+!$&# +MP`*#^0A\\T#K"(A$"P1!@\`#.\]\]$#K"(A$"P1!@\`$@_DF?/-JUS/`C7,J +M7XB#J@```"O[O8`````/MDP#!#/2C00W.\B+1"04#YS"`\*(!D:)1"04@^T! +M==]?7EU;65G#@>R(````C40D"%.+G"28````55:+M"2<````5VI`,_]74(D> +MZ/7"``"+K"2H````@\0,B\^%VW00#[8$*8/@#_]$A!A!.\MR\(T$&XE\)!A0 +MC8:(#```5U#HP,(``(U61(E^!#/`B3J#Q`R+]T"+VHE$)!"+Z`-TK!AJ$%DK +MS8O&T^`#]HE#Q(M$K!0#`T6)0P2-6P2#_1!RW&I`4HU$)&!0Z-?#``"+G"2P +M````@\0,B[0DH````(O7BZPDG````(7;=""*!"HD#W04#[;(BT2,6&:)E$:( +M#```0(E$C%A".]-RX('[*@$``'(<@?LK`0``=@B!^S(!``!U#,>&A`````H` +M``#K"L>&A`````<```"+CH0````SP$"+T-/BB50D%(72=&^-KH@$``!J$%DK +MCH0```"+U]/B@_@0-3@2-#($[$7()0(/!!(/X$'+SB40D$(B$/H@```"# +M^!!S)"L4AFH062O(T^H#5(9$.]-S$F:+A%:(#```9HE%`(M$)!#K!C/)9HE- +M`$>#Q0([?"04)="04B4PD$`/!B40D'#O(#X/'````:@-;BX[&8Y601U)HN&V.8``(M6?(/H +M!#O0W.8` +M`(N60$L``"/=BTY\18H$$X@$"HM&?(N>W.8``$`CPXE&?(/O`77:Z57^__\Y +M&0^%AP$``(M1"(MLEF");"08A=)T$XUZ&(T\OHM'_(D'C7_\@^H!=?.);F`/ +MMT$$B49T#[=Y!(M.?(O9BX;8Y@``*]T%_.___SO8#X,$`0``.\@/@_P```"+ +MAD!+```#V(TL"(T$.8E&?#E\)!AS28/_"')RB\_!Z0.*`X/O"(A%`(I#`8A% +M`8I#`HA%`HI#`XA%`XI#!(A%!(I#!8A%!8I#!HA%!HI#!X/#"(A%!X/%"(/I +M`77#ZRZ#_PAR*8O'P>@#B40D&(OP:@A35>A]OP``@\0,@\,(@\4(@^\(@^X! +M=>:+="04A?\/A&7]__^*`XA%`(/_`0^&5_W__XI#`8A%`8/_`@^&2/W__XI# +M`HA%`H/_`P^&.?W__XI#`XA%`X/_!`^&*OW__XI#!(A%!(/_!0^&&_W__XI# +M!8A%!6H#@_\,_?__BD,&B$4&Z0']__^%_P^$]_S__XNNW.8``(N60$L` +M`"/KBTY\0XH$*H@$"HM&?(NNW.8``$`CQ8E&?(/O`77:Z<;\__^#.0(/A0$! +M``"+?G2%_P^$M?S__XM.?(O9BX;8Y@``BU9@!?SO__\KVCO8#X.@````.\@/ +M@Y@```"+AD!+```#V(TL"(T$.8E&?#O7@#B40D&(OP:@A35>@&O@`` +M@\0,@\,(@\4(@^\(@^X!=>;IA/[__X7_#X3M^___BZ[+?"0HB^F);"08B5\,.%X(=1V+A80```"#Z`@( +MB\YJ"(E$)!CH#P`)! +MB4<,B4\$B\[H7&___\'H"(O.:@B)1"0@Z#5O__\Y7"00=CF+?"00B^N+SN@Y +M;___P>@(B\W3X(/%"(M.!`/8@\$(B\�?!Z`,!!HE.!(/O`775BWPD*(ML +M)!B+5"04B\O!^1"+P\'X"#+(B1\RRS+*@/%:.DPD'`^%,____XL&B4<(C4C_ +MBX6(`````\L[P7P"B\&)A8@```"*PL#H!B0!P.H'B$<0L`&(5Q%?7EU;@\00 +MP@@`4U97B_F-=P2+SNBH;O__BTX$B]`RV_?"`(```'0%L@%!ZPK!Z@ZS`2+3 +M@\$"B\&`\@'!Z`.#X08``(3;=`9?7C+`6\.+SU]>6^GJ```` +M5HMT)`A7B_F`?@@`=1:+AX0```"#Z!`Y!GX)Z(D.``"$P'1=4U:+S^A9```` +MBUPD%(O/5HE#!.A*````N0``0``[R!O)]]$CR(E+"(O.Z`AN___!Z`V+SFH# +MB`/HXVW__X`[`'48B\[H[FW__\'H"XO._L!J!8A##.C&;?__L`%;7U[""`!3 +M5HMT)`R+SE?HQVW__XM6!(OX@\("P>\.B\HSV\'I`X/B!P$.B58$@\;?__P>@(B\W3X(/%"(M.!`/8@\$(B\�?!Z`,!!HE.!(/O`775 +M75]>B\-;P@0`@>RL`0``5HOQ5XN&A````(U^!(/H&3D'?@WH$0T``(3`#X0! +M`P``BT8(B\_WV(/@!U#H(VW__XO/Z#-M__^I`(```'0BC8;$Y```QX97.8``(F>T)@``(F>U)@``*D` +M0```=15HE`$``(V&R.0``%-0Z-ZX``"#Q`QJ`HO/Z+EL__]5B\_HR&S__\'H +M#(O/#[;`:@2)1"04Z)YL__^+1"00@_@/=3>+S^BE;/__P>@,B\]J!`^VZ.A_ +M;/__A>UU!\9$'!0/ZQJ#Q0)-@_L4@#`0>#X0>)3P0/MXQ5B`0``.M@:@]90(E,)!`[P7,T-@\4#:@/K +M#^A8:___B^C![0F#Q0MJ!XO/Z#!K__^%VW1Y38'[E`$``'-?BD0<)XA$'"A# +MA>UUZNL^B\]U$>@B:___B^C![0V#Q0-J`^L/Z!%K__^+Z,'M"8/%"VH'B\_H +MZ6K__TV!^Y0!``!S',9$'"@`0X7M=>V-KE`\``"!^Y0!```/@H?^__^+!\:& +M8>8```$[AH0```!^!#+`ZWMH*P$``(V&H````(O.4(U$)#!0Z)+S__]J/(V& +MC`\``(O.4(V$)%L!``!0Z'KS__]J$8V&>!X``(O.4(V$))BRMP`` +M@\0,L`%=6U]>@<2L`0``PXM$)`B![,P!``"`>!$`58OI=0>P`>F6`@``5HNT +M)-@!``"`?@@`=1J+A80```"#Z!DY!GX-Z%0*``"$P`^$;0(``%@,B\YJ!`^VV.C-:?__@_L/=3>+SNC8:?__P>@,B\YJ!`^VV.BR:?__ +MA=MU!\9$/!@/ZQJ#PP)+@_\4%VW7P3^L$B%P\&$>#_Q1RI(N< +M).@!``"-1"08:A2!P[`[``"+S5-0B5PD(.AB\O__,_^`?@@`=1R+A80```"# +MZ`4Y!GX/B\WHL`D``(3`#X1@`0``B\[H6&G__XO0BX.$````@>+^_P``.U2# +M!',I:A!9*\C3Z@^VC!J(`````TX$B\'!Z`,!!H/A!XE.!`^WA%.(!```ZUMJ +M#UE`B4PD$#O!@#`0:+1"00B4X$:A!9*Q2#*\C3ZHM,@T0#RCL+&\`CP0^WA$.(#``` +M@_@0L)@\,+:@>+SNAB:/__A?]T>TN!_ZX!``!S6XI$/"N(1#PL1X7; +M=>KK/'41Z%9H__^+V,'K#8/#`VH#ZP_H16C__XO8P>L)@\,+:@>+SN@=:/__ +M2X'_K@$``',:QD0\+`!'A=MU[8M<)!2!_ZX!```/@I7^___&A6+F```!@'X( +M`'4.BP8[A80```!^!#+`ZV.+G"3H`0``C40D+&@R`0``4U"+S>C!\/__:D"- +M@^P.``"+S5"-A"1F`0``4.BI\/__:A"-@]@=``"+S5"-A"2F`0``4.B1\/__ +M:BR-B\0L``!1C8PDM@$``%&+S>AY\/__L`%;7UY=@<3,`0``P@P`N+`B0P#H +MXJ(``(/L((O!4U97C7@$B47LB\_H;&?__XM7!(/"",'H"(O*B47H:@=;P>D# +MB_`!#R/3(_.)5P1&._-U(HO/Z$%G__^+3P2+\(/!",'N"(O!`_/!Z`,!!R/+ +MB4\$ZR"#_@AU&XO/Z!IG__^+5P2+\(/"$(O*P>D#`0\CTXE7!(7V=00RP.M] +M5HU-U.B"T/[_,]N)7?R)7?"%]G1-BTWLBX&$````2#D'?!'HD`8``(3`=0B- +M1O\Y1?!R/XO/Z,-F__^+5?"+3=3!Z`B(!!&+3P2#P0B+P8/A!\'H`P$'0HE/ +M!(E5\#O6Q6_W74_W7HZ(7=__^*V(U-U.A2TO[_BL.+3?1?7EMDB0T` +M````B^5=P[C"(D,`Z,>A``"#[!Q35XOYZ(8"``"#R_^)1>P[PW4',L#IE0`` +M`%:+\(/F!T:#_@=U$(O/Z&("```[PW0KC7`'ZR*#_@AU'8O/Z$T"``"+\#OS +M=!2+S^A``@``.\-T"<'F"`/PA?9U!#+`ZTY6C4W8Z(?/_O\SVXE=_(E=\(7V +M=!^+S^@3`@``B]"#^O]T(8M%\(M-V(@4`4")1?`[QG+A5O]UV(O/_W7LZ+G< +M__^*V(U-V.B&T?[_BL->BTWT7UMDB0T`````B^5=PU97B_DS]H,\MP!T#?\T +MM^@[]```@R2W`%E&@_X@<```"+AF@&``"+TXF&9`8` +M`(O+B)YM"@``BX9$!@``BT`$B!0!0HN&1`8``(M`!,9$"`$!BX9$!@``BT`$ +MB5P(`H/!!H'Y``8``'S-C89P"@``B_N)1"00O4A#0P"+V`^W10"-3P*9]_EJ +M"(E$)!B+TUBY`$```"M,)!1FB0J-4A"#Z`%U[(/%`H/#`H']6$-#`'S+BT0D +M$+F`````1P/!B40D$#OY?+"+7"08@\8#C4,":A!KR"A89L=&_P,$9HE._8/& +M!(/H`77N0X/[&7S?7UY=6X/$&,.-3"0``!9B\B)3?`S +MP(E%_(7)=`C_=ASH#,/__XM-](E&%%YDB0T`````B^5=P@0`BT0D"(M4)`Q3 +M5XOY#[9<."D/MDPZ*3O9=0:+1"0,ZU!5BZR/N````(7M=#*+10")A(^X```` +M:\(,5HMT)!105E7H;;```(N,G[@```"#Q`R)#HO%B;2?N````%[K$5%3_W0D +M&(O/Z`H```"+1"0075];P@P`BT0D#%:+\5P@P`BT0D!%-6B_$SVT-7B)YL"@`` +MB89@!@``Z-_\__]J"8V&;@@``&;'AFP(`````FH$4.A%K@``:/4```"-AG<( +M``!J!E#H,JX``(/$&#/`B(0&;`<``$"#^`-\\XO(B]._``$``.L1B(P&;`<` +M`(/J`74$0T&+TT`[QWSK:D"-AFP)``!J`%#H\*T``&C`````C8:L"0``:@A0 +MZ-VM``"#Q!C&AD(&```'7UY;P@0`5HMT)`A7B_G!YA0Y-W4$L`'K1%/H0P`` +M`&H,63/2B\;W\8/``FO8#%/H4O```(F'K````%F%P'4.N5`/1`#H=B;__S+` +MZP^#P/2)-P/#B8=8`0``L`%;7U["!`"#.0!T#_^QK````(,A`.@,\```6<-3 +M,]M6B_$X7"0,=2MHE`$``(V&R.0``(B>8>8``%-0Z#BM``"#Q`S'AL3D```" +M````B9Y6\($`(!\)`0`=0?&@6+F```` +MP@0`5C/25XOY.%0D#'56:A!2C4=@4.CFK```,\!HG$H``%")1W")1W2)1WB- +MAZ````!0Z,FL``"+C]CF```STK@``$``B9>`````@\08B5=\.\AR`HO(BX?< +MY@``(\&)ASQ+``!J%(E74(VWC````(E7"(E7!%)6B9=83```B9=<3```B9>$ +M````B9>(````Z&RL``"##O^#Q`PSP(O/B(=%3```_W0D#.CW_O___W0D#(O/ +MZ#G___]?7L($`%:+\5>+CH0```"+^8M&!"OX>00RP.MU/0!```!^((7_?A"+ +M3A`#P5=04>@TT0``@\0,@V8$`(F^A````.L"B_F+#K@`@```*\=0BT80`\=0 +MZ&Z"__^+T(72?@8!EH0```"`OD5,````BX:$````C4CBB8Z(````=`L%#/[_ +M_XF&B````#/`@_K_#Y7`7U[#5HOQ5XN.A````(OYBU8$*_IY!S+`Z;,```"+ +MAI0````KP@&&C````%,SVX'Z`$```'X@A?]^$8M.$%>-!!%04>B/T```@\0, +MB5X$B;Z$````ZP*+^;@`@```._AT'(L.*\=0BT80`\=0Z,:!__^+V(7;?@8! +MGH0```"`OD5,````BX:$````C4CBB8Z(````=`L%#/[__XF&B````(N.C``` +M`(M&!(F&E````(/Y_W052`/(BX:(````.\%\`HO!B8:(````@_O_6P^5P%]> +MPU-5BVPD#(O95XM\)!0[_700QH-23````7,'QH-13````8"[1$P```!T1BO] +M([OANT___4(O+Z%P% +M```#[HV#1$L``".KW.8``"O^=ZS<[_7,BBX/8Y@``*\50BX-`2P```\50 +MZ"P%``!7_[-`2P``B\OK#(N#0$L``"O]5P/%4.@0!0``7UU;P@@`@^P44U56 +M5XOY,]N+3WR+KX`````KS2./W.8``#F?L.8```^&SP$``(N'K.8``(L$F(E$ +M)!2%P`^$K0$``(!X"`!T"<9`"`#IG@$``(L0BT`$B[?2`0``C2P0(^Z);"0@.]5R+87M="F+M]CF``"-CV3F``"+AT!+ +M```K\E8#PE!J`.BM>O__5?^W0$L``%;K#%"+AT!+```#PE!J`(V/9.8``.B, +M>O__BW0D%(O/@\805NCBWO__BT8@BW8DB40D%(N'K.8``&HXB70D%/\TF.AU +MF```BX>LY@``65F-2P&#))@`B4PD'#N/L.8```^#B0```(ML)!B+AZSF``"+ +M=)@$A?9T;SDN=6N+1"00.48$=6*`?@@`=5Q0_W0D&(V/9.8``&H`Z`EZ__^# +MQA"+SU;H8][__XM&((M<)!R+=B2)1"04BX>LY@``:CB)="04_S28Z/*7``"+ +MAZSF``!968,DF`"-0P&)1"0<.X>PY@``75N#Q!3#BX>LY@``BP28AWPK_8EL)"0CN]SF``"+UXE\)""(3"03B70D,#E+4`^&V0$``(E,)!B+0TP# +M1"08B40D+(`X"`^$@0$``(!X#0!T(XM`!"N#@````".#W.8``#O'#X=D`0`` +MBT0D+(A(#>E8`0``BW@$BT`(B40D%(O'*\4C@]SF```[P@^#.`$``#OO=!Q7 +M58O+Z'7\__^+4WR+[RO7B6PD)".3W.8``#/)BT0D%#O"#XBX/8Y@`` +M*\>`NT1,````B40D*%!T'U>-LT1+``!1B\[H)-C__XM$)"B+S@-$)!Q5:@!0 +MZS^+@T!+```#QU!1Z"FH``"+1"0T`T0D*%7_LT!+``!0Z!2H``"#Q!CK+X"[ +M1$P```"+1"044'0/5U&-BT1+``#HT-?__^L2BX-`2P```\=04>CCIP``@\0, +MBT0D+(O+BWPD%%!7_W0D).@DUO__BTM,BU0D&,8$"@B%P'0)BPM74.BX?O__ +M`;M83```BU-\BW0D,&H`61&+7$P``"O5(Y/75N#Q"3#4U:+\5>+GEQ,``"+EDQ,``"+OEA, +M``"+ADA,```[VG\V?`0[^',PBTPD%"O'B_D;TS/;.]I\"'\$._AV`HO(4?]T +M)!2+#NA'??__`;Y83```$9Y<3```7UY;P@@`@^P0@SWL@D0``%-55HOQ5XET +M)!1U48-D)!@`,_\S[8L#_Q-RN("^4$P` +M``#&AF!,```!=3G_="0DB\[H4/?__XO.Z`3X__^$P`^$?0P``(!\)"0`=`F` +MOF'F````=0^+SNBUZO__A,`/A%X,``"+AMSF``"-7@0A1GR+`SN&B````'X/ +MB\[HP/?__X3`#X0R#```BXZ`````B\$K1GPCAMSF```]!`$``',_.TY\=#J+ +MSNB@^?__BX9<3```.X9,3```#X\##```?!*+AEA,```[ADA,```/A^\+``"` +MOE!,````#X7$"P``@[YQ.0```^%.`,``(O.Z)OS__^%P'44B\[H[NG__X3`#X4Y____Z8L+ +M``"#^/\/A((+``"#^`(/A'D+``"#^`-U"8O.Z,GP___KTX/X!`^%L0$``#+` +M,_^(1"03,]N$P`^%4`L``(O.Z$'S__^#^/]U"+`!B$0D$^L>@_L#=0T/MLB* +M1"03B4PD'.L0#[;`P><(`_B*1"03BTPD'$.#^P1\O(3`#X4,"P``BX;8Y@`` +MC5<"C7D@!?SO__^+3GR+V2O:.]@/@P`!```[R`^#^````(N&0$L```/8C2P( +MC00/B49\.]=S28/_"')RB\_!Z0.*`X/O"(A%`(I#`8A%`8I#`HA%`HI#`XA% +M`XI#!(A%!(I#!8A%!8I#!HA%!HI#!X/#"(A%!X/%"(/I`77#ZRZ#_PAR*8O' +MP>@#B40D&(OP:@A35>B6HP``@\0,@\,(@\4(@^\(@^X!=>:+="04A?\/A/G] +M__^*`XA%`(/_`0^&Z_W__XI#`8A%`8/_`@^&W/W__XI#`HA%`H/_`P^&S?W_ +M_XI#`XA%`X/_!`^&OOW__XI#!(A%!(/_!0^&K_W__XI#!8A%!8/_!@^&H/W_ +M_XI#!HA%!NF5_?__A?\/A(W]__^+CMSF``"+ED!+``"+PR/!BTY\0XH$$(@$ +M"HM&?(N.W.8``$`CP8E&?(/O`778Z5K]__^#^`4/A38!``"+SNB9\?__@_C_ +M#X28"0``BUY\C7@$BX;8Y@``!?SO__^-:_\[Z`^#SP```#O8#X/'````BX9` +M2P``C0PHC108C00?B49\@_\!=D5J"%T[_7(^B]_!ZP.*`2O]B`**00&(0@&* +M00*(0@**00.(0@.*002(0@2*006(0@6*00:(0@:*00<#S8A"!P/5@^L!=<>% +M_P^$N?S__XH!B`*#_P$/AJS\__^*00&(0@&#_P(/AIW\__^*00*(0@*#_P,/ +MAH[\__^*00.(0@.#_P0/AG_\__^*002(0@2#_P4/AG#\__^*006(0@6#_P8/ +MAF'\__^*00:(0@;I5OS__X7_#X1._/__BX[45B@%``#K76H/7T`[QW,7C4@IC0R. +M.Q%R"T"#P02#^`]R\^L"B_B+2P0#SXO!@^$'B4L$P>@#`0,KE+Z@````:A!9 +M*\_3ZHN,ON0````#RCN.H````!O`(\$/MY1&*`T``(U&!('Z``$``',4BXY` +M2P``BT9\B!0!_T9\Z4?[__^!^@\!```/@FH#```/MKJEWT,`#[::P=]#`(/' +M`X7;=">+R.A"4___:A!9*\O3Z(M."`/X`\N-7@2+P<'H`P$#@^$'B4L$ZP.- +M7@2+R^@84___B]"+AA`0``"!XO[_```[E(:0#P``$5A04``#K7FH/6T`[PW,:C8CD`P``C0R. +M.Q%R"T"#P02#^`]R\^L"B]B+3@@#RXO!@^$'B4X(P>@#`48$*Y2>C`\``&H0 +M62O+T^J+C)[0#P```\H[CHP/```;P"/!#[>$1A0<```/M\"+'(7H@D0`#[:H +MZ(-$`$.)7"08A>T/A$8!``"#^`D/AA4!``"#_01V+8U.!.A&4O__:A19*\W3 +MZ(U-_`-."(UN!,'@!`/8B\'!Z`,!10"#X0>)303K`XUN!(N&U)@``(7`?@Q( +MB8;4F```Z;@```"+S>@!4O__B]"+AOP>``"!XO[_```[E(9\'@````!J$%DKS=/JBXRNO!X```/*.XYX'@``&\`CP0^WA$8`*P``#[?` +M@_@0=1+'AM28```/````BX;0F```ZP:)AM"8```#V.LDC4X$Z#91__]J$%DK +MS=/HBTX(`]@#S8O!P>@#`48$@^$'B4X(B5PD&('[`"```'(*1X'[```$`'(! +M1XM&:(E&;(M&9(E&:(M&8(E&9(E>8(M.?(OIBX;8Y@``*^L%_.___XE^=#OH +M#X.C````.\@/@YL```"+AD!+``"-'"B-+`B-!#F)1GPY?"08@#B40D +M&(OP:@A35>BBG0``@\0,@\,(@\4(@^\(@^X!=>;I!_K__X7_#X0$^/__BX[< +MY@``BY9`2P``B\4CP8M.?$6*!!"(!`J+1GR+CMSF``!`(\&)1GR#[P%UV.G1 +M]___@?H``0``=0R+SN@NX?__Z7SX__^!^@$!``!U#(O.Z$;H___I:/C__X'Z +M`@$```^%`P$``(M^=(7_#X22]___BTY\B]F+AMCF``"+5F`%_.___RO:.]@/ +M@Z`````[R`^#F````(N&0$L```/8C2P(C00/B49\.]=S4(/_"`^"3OG__XO/ +MP>D#B@.#[PB(10"*0P&(10&*0P*(10**0P.(10.*0P2(102*0P6(106*0P:( +M10:*0P>#PPB(10>#Q0B#Z0%UP^D'^?__@_\(#X+^^/__B\?!Z`.)1"08B_!J +M"%-5Z&N<``"#Q`R#PPB#Q0B#[PB#[@%UYNG0^/__A?\/A,WV__^+CMSF``"+ +MED!+``"+PR/!BTY\0XH$$(@$"HM&?(N.W.8``$`CP8E&?(/O`778Z9KV__^! +M^@$5NPQ``#K76H/7T`[QW,:C8A:"P`` +MC0R..Q%R"T"#P02#^`]R\^L"B_B+2P0#SXO!@^$'B4L$P>@#`0,KE+YD+0`` +M:A!9*\_3ZHN,OJ@M```#RCN.9"T``!O`(\$/MX1&[#D```^WP`^VN+3@0P`/ +MMIC0X$,`@\<"A=MT)(U.!.C&3?__:A!9*\O3Z(M."`/X`\N+P<'H`P%&!(/A +M!XE."(M.?(O9BX;8Y@``*]T%_.___XE^=#O8#X.B````.\@/@YH```"+AD!+ +M```#V(TL"(T$.8E&?#E\)!AS4(/_"`^"0??__XO/P>D#B@.#[PB(10"*0P&( +M10&*0P*(10**0P.(10.*0P2(102*0P6(106*0P:(10:*0P>#PPB(10>#Q0B# +MZ0%UP^GZ]O__@_\(#X+Q]O__B\?!Z`.)1"08B_!J"%-5Z%Z:``"#Q`R#PPB# +MQ0B#[PB#[@%UYNG#]O__A?\/A,#T__^+CMSF``"+ED!+``"+PR/!BTY\0XH$ +M$(@$"HM&?(N.W.8``$`CP8E&?(/O`778Z8WT__^!^A`!```/@X'T__\/MIHU +MX$,`#[:Z/>!#`$.%_W0CB\CHBDS__VH062O/T^B+3@@#V`//B\'!Z`,!1@2# +MX0>)3@B+1FB)1FR+1F2)1FB+1F")1F2)7F"+5GR+^HN&V.8``"O[!?SO___' +M1G0"````:@)=._AS(SO0GS +M\___BX[*!!"(!`J+1GR+CMSF``!`(\&)1GR# +M[0%UV.G`\___QH9@3````.L5B\_HR,C__X.F7.8```"+SNB+[?__7UY=6X/$ +M$,($`(/L(%-6B_%7B70D$("^4$P```#&AF!,```!=5?_="0PZ)7J__^+SNC8 +MZ___A,`/A#T&``"-OHP```"+SE>-7@13Z(3;__^$P`^$(P8``(V&H````(O. +M4%=3Z!CA__^$P`^$"P8``("^8N8````/A/X%``"-5GQ5B50D'.F["0``C59\ +MBX;+^_P``.Y2&I````',J:A!9*\C3Z@^VC#(H`0```TT$B\'!Z`,!10"#X0>) +M300/MYQ6*`4``.M;:@]?0#O'-2"F-#(X[$7(+0(/!!(/X#W+SZP*+^(M- +M!`//B\�>)303!Z`,!10`KE+Z@````:A!9*\_3ZHN,ON0````#RCN.H``` +M`!O`(\$/MYQ&*`T``('[``$``',Z@+Y$3````'0L"@\\$2XO+T^>#QP*%VW0CB\WH2$G_ +M_VH062O+T^B+300#^`/+B\'!Z`,!10"#X0>)302+S>@E2?__B]"+AA`0``"! +MXO[_```[E(:0#P``T`\```/*.XZ, +M#P``&\`CP0^WA$84'```#[?`@_@$L/B^B#X`'1[8/(`DV+S=/@0(E$ +M)!B+V(E<)!"%[0^$[@```(/]!`^"0`$``'8QC4X$Z.PA``!J)(O862O-T^N- +M3?P#3@B-;@2+P<'C!`-<)!C!Z`,!10"#X0>)303K`XUN!(O-Z!)(__^+T(N& +M_!X``('B_O\``#N4AGP>``!S*FH062O(T^H/MHPR`!\```--!(O!P>@#`44` +M@^$'B4T$#[>$5@`C``#K7FH/74`[Q7,:C8B?!P``C0R..Q%R"T"#P02#^`]R +M\^L"B^B+3@@#S8O!@^$'B4X(P>@#`48$*Y2N>!X``&H062O-T^J+C*Z\'@`` +M`\H[CG@>```;P"/!#[>$1@`K```/M\`#V(E<)!"-;@2!^P`!``!V$T>!^P`@ +M``!V"D>!^P``!`!V`4>+1FB)1FR+1F2)1FB+1F")1F2)7F"`OD1,````B7YT +M=%#_MMSF``"-3GQ14U>-CD1+``#H@<3__^G4^___C4X$Z*X@``!J((O862O- +MT^N+3@@#7"08`\V+P8E<)!#!Z`.-;@0!10"#X0>)303I=/___XN&V.8``(U6 +M?(L*!?SO__^+Z2OK.^@/@P8!```[R`^#_@```(N&0$L``(T<*(TL"(T$.8D" +M.7PD$'-)@_\(W.8``$`CPXD"@^\!==GI_P,``('[``$``'4VC40D((O.4%7H"M?_ +M_X3`=!2-1"0@B\Y0Z.6[__^$P`^%%_K__XO.Z$SI__]=7UY;@\0@P@0`@?L! +M`0``#X67`0``BWYTC59\A?\/A._Y__^`OD1,````=!+_MMSF``"-3GQ1_W9@ +MZ>S]__^+3GR+V8N&V.8``(M68`7\[___*]H[V`^#%P$``#O(#X,/`0``BX9` +M2P```]B-+`B-!#F)1GP[UW-(:@A:._IR;XO/P>D#B@,K^HA%`(I#`8A%`8I# +M`HA%`HI#`XA%`XI#!(A%!(I#!8A%!8I#!HA%!HI#!P/:B$4'`^J#Z0%UQNLN +M@_\(PD`@``4U565XO9 +MZ#'(____M"0X`@``B\OH3.#__XM#'#/2`\!T'S/)BT,8C8GD2@``0L9$".T` +MQD0([P"+0QP#P#O0QB-@Z````!J!5EHG$H``%"-LXP```"#QQCSI8M# +M&(/`,%#H68X``#/`@\0,,_:)1"0H,^V(1"03B6PD&(A$)!*+"[@``$``*\:# +MX/!0BT,@`\90Z$AC__^)1"0LA<`/B#8#```#\(ET)"`/A"H#``"%P`^.7`(` +M`('^``0``'S`Z4\"``"+0QPSR2%,)!2)3"0<`\`/A!0!``"+5"08,^V+>Q@# +M_8E,)"B`O]-*````B1]T"(FWS$H``.L\BT,@C4\$`\)0Z!9`__^+="0@,\F+ +MQHE/""M$)!B)3P2)A\Q*```/A,8```"(C]!*``"(3Q2(3RR+3"0<@WPD+`#& +MA]-*````#Y3`B8_@2@``@'\4`(B'TDH``'4QC4<8QD<4`5"-1P2+RU#H!M#_ +M_X3`='F`?RD`=0F`NV+F````=&J+3"01*```#1QB+5"08`]!!B\:)5"08 +M*\*)3"0<>`:`?R@`=1L]``0``'P4BT,<`\`[R`^"^?[__^L%QD0D$@&+3"04 +M,]*+P?=S'(OXA=)T`4#?"0<`8E!!'4*4HO+Z.H!``#K#E&+2Q1HT')! +M`.CJG___BU0D)`/O`U0D,(E4)"0[;"04````*_`#P59048ET)"SH-*\``(M%((/$#"M%!`%%&(-E +M)`"#92``BT,@@V4$`(E%$(M$)!2%P'0[BT,8:.1*``!54(NPU$H``(NXW$H` +M`.@SBP``BT,8B;#42@``BT,8BW0D+(FXW$H``,:%TTH```"#Q`PS[8EL)!CK +M&H7V>"%^\HM+(%:-!"E04>BWK@``Z]^+;"08@'PD$@`/A*;\__^+@]SF``"+ +MRR%#?.AZX?__:50D*.1*``"-NXP```"+0QAJ!5EHG$H``(UR&(/",`/P`\)0 +MC8.@````\Z50Z*2*``"#Q`Q?7EU;@<0D`@``P@0`@^PL55:+="0XB^F);"08 +M@'XL`'4EC48PQD8L`5"-1AA0C48$4.C(TO__A,!U#,:&T$H```'IR`4``(M& +M)(M.&`/!5XU^!#D'?@S&AM!*```!Z:L%``"+1B"+ELQ*``!(@Z;82@````/! +M@^H0B40D&(E4)!13B]@[PGP"B]J)7"00BP\[RWPS.\@/CW$%``!U#(M&"#M& +M'`^-8P4``#O*?`V`OM)*````#X1+!0``.X[,2@``#XT_!0``BX[<2@``C4'X +M.8;82@``=C"-!`F)AMQ*``!KP`Q0_[;42@``Z`_+``"+V%E9A=MU"KE0#T0` +MZ"L!__^)GM1*``"+AMA*``"+SVO8#`.>U$H``$")7"0HB8;82@``Z!L\__^+ +MT(N&M````('B_O\``#M4AC1S*6H062O(T^H/MHPRN`````-/!(O!P>@#`0># +MX0>)3P0/MXQ6N`0``.M5:@]=0#O%-3C2-#($[$7(+0(/!!(/X#W+SZP*+ +MZ(M/!`/-B\�>)3P3!Z`,!!RM4KC!J$%DKS=/JBTRN=(ML)"`#RCM.,!O` +M(\$/MXQ&N`P``+@``0``.\AS3(.^V$H```%V-8-[]`!U+P^W0_AJ`UIF.\)S +M(T!FB4/X#[?`B$P8_/^.V$H``(M4)!B+1"0L"62/!2X/( +M!(O+T^"-:`*);"04A=MT)HO/Z/4Z__]J$%DKR]/HBT\$`^@#RXEL)!2+P<'H +M`P$'@^$'B4\$B\_HSSK__XO0BX:@#P``@>+^_P``.Y2&(`\``',I:A!9*\C3 +MZ@^VC#*D#P```T\$B\'!Z`,!!X/A!XE/!`^WA%:D$P``ZUUJ#UM`.\-S&HV. +M(`\``(T,@3L1<@M`@\$$@_@/ +M'`\``&H062O+T^J+C)Y@#P```\H[CAP/```;P"/!#[>$1J0;```/M\"#^`1S +M!#/;ZP^+V(/@`='K@\@"2XO+T^!`B40D)(OHA=L/A`@!``"#^P0/@MD```!V +M+(O/Z)T3``!J)(OH62O+T^V+3P2#P?S!Y00#;"0D`\N+P<'H`P$'@^$'B4\$ +MB\_HRCG__XO0BX:,'@``@>+^_P``.Y2&#!X``',I:A!9*\C3Z@^VC#*0'@`` +M`T\$B\'!Z`,!!X/A!XE/!`^WA%:0(@``ZUUJ#UM`.\-S&HV.#!X``(T,@3L1 +M<@M`@\$$@_@/"!X``&H062O+ +MT^J+C)Y,'@```\H[C@@>```;P"/!#[>$1I`J```/M\`#Z.LFB\_HQA(``&H@ +MB^A9*\O3[8M/!`-L)"0#RXO!P>@#`0>#X0>)3P2!_0`!``!V(XM$)!1`B40D +M%(']`"```'820(E$)!2!_0``!`!V!4")1"04BT0D*(M,)!3'``$```!FB4@$ +MB6@(Z6@!```[R'5/C40D+(O-4%?H2LK__P^V1"0L9HE#!(M$)#")0PAJ!%J) +M$XN&V$H``&O(#`..U$H``$")AMA*```/MD0D.&:)002+1"0TB1&)00CI%?W_ +M_X'Y`0$``'4+QP,"````Z0+]__]J`UB)`XV!_O[__XO/B4,(Z$`X__^+T(N& +M>"T``('B_O\``#N4AO@L``!S*6H062O(T^H/MHPR?"T```-/!(O!P>@#`0># +MX0>)3P0/MX16?#$``.M=:@];0#O#)3P3!Z`,!!RN4GO0L``!J$%DKR]/JBXR>."T```/* +M.X[T+```&\`CP0^WA$9\.0``#[?8@_L(78/$+,($ +M`,S,S,S,S,S,S,Q65XM\)`PS]CEW!'8=4XO>BP^-!`N+"5#HS_G__T:-F^1* +M```[=P1RYUM?7L($`(/L*%97BWPD-(OQ@'\L`'4GC4T````@>+^_P``.U2'-',V:A!9*\C3Z@^VC#JX```` +M`TT$B\'!Z`,!10"#X0>-1P2)2`0/MY17N`0``.M>BUPD$.DB____:@];0#O# +M-2`V-#(\[$7(+0(/!!(/X#W+SZP*+V(M-!`/+B\�>)303!Z`,!10`K +M5)\P:A!9*\O3ZHM,GW0#RCM/,!O`(\$/MY1'N`P``(U'!+D``0``.]%S%XM& +M?(N.0$L``(@4`?]&?(U'!.FE_O__@?H&`0``#X(6!```C9KZ_O__@_L(L0B^N#XP/![0*#RP1-B\W3XX/#`H7M="B+R.CQ-/__:A!9*\W3Z(M/"`/8 +M`\V-;P2+P<'H`P%%`(/A!XE-!.L#C6\$B\WHQC3__XO0BX>@#P``@>+^_P`` +M.Y2'(`\``',J:A!9*\C3Z@^VC#JD#P```TT$B\'!Z`,!10"#X0>)300/MX17 +MI!,``.M>:@]=0#O%)3PC!Z`,!1P0KE*\<#P``:A!9*\W3ZHN,KV`/```#RCN/'`\``!O` +M(\$/MX1'I!L```^WT(/Z!',$,\#K#XO"@^(!T>B#R@)(B\C3XHE$)!B-2@&) +M3"0DB^F);"04$`VPD),'H`P$"@^$'B4H$ZP.-5P2+RNBJ,___ +MB]"+AXP>``"!XO[_```[E(<,'@`````#3PB+P<'H +M`P%'!(/A!XE/"`^WA%>0(@``ZVIJ#UE`B4PD&#O!@#`4<$BT0D&(E/"&H062N4 +MAP@>```KR-/JBXR'3!X```/*.X\('@``&\`CP0^WA$>0*@``#[?``^CK+(U/ +M!.B7#```:B"+Z%DK3"08T^V+3P@#3"08`VPD)(O!P>@#`4<$@^$'B4\(B6PD +M'(']``$``'830X']`"```'8*0X']```$`'8!0XM&:(E&;(M&9(E&:(M&8(E& +M9(EN8(M6?(O*BX;8Y@``*\T%_.___XE>=(E,)"0[R`^#*P$``#O0#X,C`0`` +MBX9`2P``C2P(C0P0C00:B4PD)(E&?#E<)!QS28/["')ZB]/!Z@.*10"#ZPB( +M`8I%`8A!`8I%`HA!`HI%`XA!`XI%!(A!!(I%!8A!!8I%!HA!!HI%!X/%"(A! +M!X/!"(/J`77#ZS:#^PAR,8O#P>@#B40D'(OX:@A54>A.?P``BTPD,(/$#(/! +M"(/%"(/K"(E,)"2#[P%UWHM\)#R-1P2%VP^$1/O__XI%`(@!C4<$@_L!#X8S +M^___BD4!B$$!C4<$@_L"#X8A^___BD4"B$$"C4<$@_L##X8/^___BD4#B$$# +MC4<$@_L$#X;]^O__BD4$B$$$C4<$@_L%#X;K^O__BD4%@_L&BUPD$(A!!8U' +M!`^&V?K__XI%!HA!!HU'!.G+^O__BVPD%(U'!(7;#X25^___BZ[=(ML)!2%VP^$$/O__XM&8(M6?(OJ*^B) +M1"0AH?0``BTPD,(/$#(/!"(/%"(/K"(E, +M)"2#[P%UWND5_O__C4<$A=L/A%WY__^+OMSF``"+ED!+```C_8M.?$6*!!>( +M!`J+1GR+OMSF``!`(\>)1GR#ZP%UVND8`@``@<+^_O__C4Y@C0R1BQF)7"0D +M=`V+0?R)`8U)_(/J`77SC6\$B5Y@B\WH@R___XO0BX=X+0``@>+^_P``.Y2' +M^"P``',J:A!9*\C3Z@^VC#I\+0```TT$B\'!Z`,!10"#X0>)300/MX17?#$` +M`.M>:@];0#O#)303!Z`,!10`KE)_T+```:A!9*\O3ZHN,GS@M```#RCN/]"P``!O`(\$/ +MMX1'?#D```^WV(/["',$,^WK$(OK@^,#P>T"@\L$38O-T^.#PP*%[70DC4\$ +MZ+DN__]J$%DKS=/HBT\(`]@#S8O!P>@#`4<$@^$'B4\(BU9\B^J+AMCF```K +M;"0D!?SO__^)7G0[Z`^#K@```#O0#X.F````BX9`2P```^B-#!"-!!J)3"0< +MB49\.5PD)'-0@_L(#X)^_/__B]/!Z@.*10"#ZPB(`8I%`8A!`8I%`HA!`HI% +M`XA!`XI%!(A!!(I%!8A!!8I%!HA!!HI%!X/%"(A!!X/!"(/J`77#Z3?\__^# +M^P@/@B[\__^+P\'H`XE$)"2+^&H(55'H2WL``(M,)"B#Q`R#P0B#Q0B#ZPB) +M3"0<@^\!==[I^/O__XU'!(7;#X1`]___B[[H(9HE$)"B` +M^A]S;8N&1`8``(M8"(7;=&!F.2MT3HM[!(I$)"0X!W0PB^^#QP8X!W7WBD)1"00@_@!=%RH`74@T>B-CHQ* +M``!0_W<$Z*"M__^)1P2%P`^$'O___XM$)!`/MU<"B\B+1"00P>$#.\H;R<'@ +M`D$Y1"04&\!`9B/(BT0D$`/`9@/).T0D%!O`]]AF`\AF`\KK46H!C8Z,2@`` +MZ$.F__^%P`^$S?[__XM/`HD(9HM/!F:)2`2)1P2*2`&`^1YS!P+)B$@!ZP3& +M0`%X#[9``6H#63M,)!0;R??99@..6`8``&8#R`^WP6:)3P*+3"0@08U0!@/( +M#Z]4)!QKP0:)3"08`]([T',@B\'!X`([T!O)03E4)!@;P/?80`/!9H-'`@.) +M1"08ZRMKP0\[T!O):T0D&`Q!.]`;P$`#R&M$)!@).]`;P(/!!$`#R&8!3P*) +M3"08BTPD$(I4)"1KP08#1P2($(M4)!B):`*(4`&-00%FB0>+?P@[OD0&```/ +MA:K^__^)GD0&``")GDP&``#I\?W__U97B_F+3"0,C8F,2@``Z`FE__^+\(7V +M="&+5"04,\!`9HD&BPJ)3@)FBT($9HE&!HM$)!")?@B)<`)?B\9>P@P`4U56 +MBW0D$(O15XN&4`8``(UJ`@^V`(J<,&P)``"(GFX*```/MD4`#[:,,&P)```/ +MMD4!P>`%`\B+0@@ST@^W``^VA#!K"```!?@$``"-/$B+AF0&``#!^!J#X"`# +M^`^VAFT*``#!KGA*```.`_@/ML,#^(N&=$H``"N&<$H``/>V>$H```^W#'X[ +MP7-#B:Y0!@``@'T!@`^2P`!%`8.F?$H````/MP1^B8:`2@``#[<,?HU!(,'H +M!RO(@^F`9HD,?O^&9`8``,:&;0H```'K78F.?$H```^W#'Z-02#!Z`&5`8```$````/MH!80T,`B898!@``#[9- +M`(J&;`H``(B$,6P&``"#IE`&````QH9M"@```%]>75O"!`!358O9,])6BW0D +M$%P2+R(N&=$H``"N&<$H``/?Q +MB8YX2@``BY:$2@``B^@[ZGP',L#IDP````^V3P$[Z7U%C00)B8Z`2@``.\*) +MOE`&``!J!`^7P(B&;0H```^VP`&&9`8``%@#R(A/`68!0P*#^7Q^"%:+R^@> +M`P``@Z9\2@```.M$BX90!@``A# +MQP8#R#O-?NZ)CH!*```/MD75O"!`"+ +MAE`&```/M@"*A#!L"0``B(9N"@``BH9L"@``B8Y\2@``#[8/B(0Q;`8```^W +M`X.F4`8```")AE0&``"-4/^*AFP*``"-?_H/M@^(A#%L!@``@^H!=>B+AH1* +M``")AH!*``#KDH'L%`0``%-55HNT)"0$``"+V5>)7"0<#[<[*[Y4!@``5U;H +MG0$``(M+!(U4)"2#Z0:)1"08B50D%#/MBI9L"@``@\$&#[8!.)0P;`8``'3Q +M#[9!`8M4)!0#Z(M<)!R-A"0D!```B6PD(#O0#X,``0``B0J#P@2)5"04@^\! +M=;P!KH1*```STHN&>$H``/>VA$H``#/2B\B+AG1*```KAG!*``#W\8F.>$H` +M`(N.A$H``(OH.^D/C;8```"+1"0@C50D)(M\)"0[Z'U*#[9/`>L:@\($C80D +M)`0``#O0#X..````BSH/MD<("_@/MD06`@^V5!8$P><("\?!X`@+P8M+!-/@ +M62I+!%_3ZEX+PEO#58OIN0`!``!6#[=%`&8[P71RBW0D$%.+7"005XOX,\`Y +MLU0&```/MHPS:P<```^?P(T4B(M%"#/)#[<`*\<[\`^!A$H```$```"+QEY=P@@`@^P44U6+;"0@ +M5E>+^8NU4`8```^W!XE$)""-6/\[=P1T+(UN^HM%`(L.9HM6!(D&9HM%!&:) +M1@2#[@:)30"-;?IFB54*.W<$==N+;"0HBT<$@$`!!#/`9H-'`@0/MDX!#[=7 +M`BO1.85(UV^D.`/@!T]P^W!P/3*\,SVT-FB0=F.\-U +M78MW!(L.9HM>!(E,)!C!Z0B*P='ZT.@JR(A,)!F#^@%^!HM,)!CKYHM$)""- +M0`'1Z`^VC"BU2@``BX2-1$L``(D&BT0D&(FTC41+``"-3P*)C5`&``")`6:) +M603K-HO"T?@KT`^W!V8!$8M,)"!!T>E`T>@[R'034%'_=P2-C8Q*``#H@<#_ +M_XE'!(M'!(F%4`8``%]>75N#Q!3"!`!358ML)`R+V5>+?"04B;U0!@``@$7^ +M_XL'BW`4B\[_%6`R0P"+S__6B40D)(E4)""%VW03B\_HL!+__P&#@````!&3 +MA````(L'BW`(B\[_%6`R0P"+S__6O@`(``"-1R164(U$)#!0Z"MY__^`O[IL +M````#Y3`#[;`4%:-1"0P4.BI-/__BT0D&,9$)!(`#[:(H6$``/?9&\F#X02) +M3"044>F.````A=MT#H.CB`````"#HXP`````@'PD$@!U3;X`"```C4/__:@%6C80D,!```%#H2#3__XL'C8PD*!```/]T)!3&1"06 +M`5&+<`2+SO\58#)#`(O/_]:$P'5\BT0D&("XB&$````/A80```!H``@``(U$ +M)"Q0Z(&+__^$P'1Q_W0D%(L'C4PD+%&+<`2+SO\58#)#`(O/_]:$P`^$5/__ +M_V:#O"0X(```5(U')%`/E<`/ML!0Z&R-__]J`8O/Z'6/_O^`?"03`(O/=&O_ +M="075N! +MQ!@@``#"$`!6B_$SP&H04(E&&(E&'(U&(%#'!FA#0P#'1@2,0T,`QT8(R$-# +M`,=&#`1$0P#'1A`@1$,`QT84`0```.B":P``@\0,B\9>PU%35HOQ,]MJ#(D> +MB5X$B5X(B5X,B5X0B5X4Z'Y:``")1"0,687`=!+'`&A$0P#'0`0!````B7`( +MZP*+PXE&&(O&B5X)(A>)HE>*%Y;6<-5B^QDH0````!J_VB!'T,` +M4&2))0````!65XOYBT\;_ +M___,S,S,S,R#;"0$".G6____S,S,S,S,@VPD!!#IQO___\S,S,S,S(-L)`0, +MZ;;____,S,S,S,R+3"0$BT$$0(E!!,($`%:+\8-^!`!T#?]V!/\5%"%&`(-F +M!`!>PU>+^8M/#(7)=&"#?Q@`=%I5Z`4/``"+Z(7M=$U3:"Q40P"+S^C>```` +MB]B%VW0Y5HLSC4\44?]W&(M.%%/_%6`R0P#_5A2+`U.+<`B+SO\58#)#`/_6 +MBT4`58MP"(O._Q5@,D,`_]9>6UU?P\S,S,S,S,S,S,S,S,S,N`%``(#""`#, +MS,S,S,S,S(-L)`0$Z>;____,S,S,S,RX`4``@,($`%97:"Q40P"+\>A7```` +MB_B%_W0CBQ?_=A17BW(8B\[_%6`R0P#_UHL'5XMP"(O._Q5@,D,`_]9?7L/, +MS,S,S,S,S,S,S,S,S(-L)`0(Z8;____,S,S,S,R+1"0,@R``,\!`P@P`58OL +M45&+20R%R74$,\#K;%?H_@T``(OXA?]T7X-E^`"-1?Q6BS=0:/Q30P!7BP[_ +M%6`R0P#_%H7`>"R+1?R-3?A1_W4(BS!0BTX0_Q5@,D,`_U80BT7\4(L(BW$( +MB\[_%6`R0P#_UHL'5XMP"(O._Q5@,D,`_]:+1?A>7XOE7<($`,RX`D``@,(( +M`,S,S,S,S,S,BT0D"(,@`#/`0,((`,S,S(M$)`B#8`@`QP`4````QT`$```` +M1#/`P@@`S,S,S,S,BT0D&(,(_[@&``*`PA@`S#/`0,(,`,S,S,S,S,S,S,RX +M`4``@,(0`,S,S,S,S,S,5HMT)`C_=A3_%1@A1@"%P'4#0.L+BT0D#(M.%(D( +M,\!>P@@`S,S,S,S,S,S,S,S,@VPD!`3IQO___\S,S,S,S%6+[(/L$%-6BW4, +M5XM]"(U/_/?9C4<$&\DSVR/(BT40B0Z)&(U%\%#_=Q3_%4@A1@"+312+1?A1 +M_W48B4$(BT7\B1F)602)00S_%0@A1@"+31S'`10```")602+1Q2)00B)60R) +M61"+!E"+"(MQ!(O._Q5@,D,`_]9?7C/`6XOE7<(8`,S,S,S,S,S,S,S,S+@# +M``*`PB0`S,S,S,S,S,R+1"0$BT@(ACO"P``,\#")`"+1"0$ZR!F@_D\=1=F@W@"+W40:@)99H,\2#YT%D&#^11R +M\X/``@^W"&:%R778,L#"!`"P`>OY45&+1"0,4U56BQ`S[5>+^8EL)!2-3"04 +MB6PD$(MR2%%0B\[_%6`R0P#_UHO8A=L/B(T```"+1"04A!J+1"00_W0D(%"+"(MQ%(O._Q5@,D,`_]:+V(M$)!!0BPB+<0B+SO\58#)# +M`/_6BT0D%%"+"(MQ"(O._Q5@,D,`_]:+1"04A=MX!(7`=4\Y;PAT2CEO('5% +M.6\<=$#_=QR+S^@P!@``B_"%]G0P:`0"``!55555:@'_=P3_%50A1@!J!?]W +M"/\5;"%&`%;_=PC_%5PA1@!6Z`VH``!97_?37L'K'UV*PUM96<((`(/L#%.+ +MV8-[$``/A#T!``"#9"0(`%97BWPD'%?HA_[__U>(1"03Z+:G``"-!$4``@`` +M4.C)IP``B_!9687V#X0'`0``56C@1$,`5NCDR0``:/!$0P!6Z%OC``!H>$5# +M`%;H4.,``(/$&(OO:B!89CD'=0F#Q0)F.44`=/=J!FC@1$,`5>B[B?__]]@: +MP`0!B40D&'0#C7T,5U;H%^,``(!\)"``65EU#6B814,`5N@#XP``65F`?"03 +M`'4*5HO+Z'\!``"+\%;H%:<``&OH!EF#Q0E5:D#_%1PQ0P"+^(7_="TSP(U- +M_5!048U/`U%J_U90:.G]``#_%1@Q0P"%P'0+9L<'[[O&1P*_ZP/&!P!6Z.>F +M``!9C40D%%!J`5?_%7PA1@!=AUT/XM-`(U#$%=0:!Q40P"+ +M,8O.58E$)!S_%6`R0P#_UHM-`(OX58MQ"(O._Q5@,D,`_]:%_U]Y"8M$)`R# +M(`#K-X-[$`!T,8O+Z)_Y__^+0Q`SR3E+(%&(2R6+,%%148M.+'0%_W,@ZP5H +MR$1#`%#_%6`R0P#_5BQ=7EM9P@0`S,S,S,S,S,PSP,((`%%158ML)!!75>B0 +MI0``:\@,@<$``@``4>BAI0``B_B)?"0465F%_W4'B\7IX0```%-6:.A%0P!7 +MZ+3'``!7Z%NE``"+V(/$##/`B_5F.44`#X2J````:@U9:@I:#[<&9CO!=5QF +M.58"=59J#5J-3@1F.1%J"HE,)!1:=41F.58&=3Y2C2Q?7V8Y?@9U)FBT14,` +M5>A9QP``BW0D&(/#!%E9:@V-1@2#Q0A9B40D$&8Y"'34BWPD%(/&`HML)!SK +M)3OU=B9J(%EF.\%U'F8Y3OYU&(T$7VA81D,`4.@1QP``65F#PP9J"EKK!6:) +M!%]#@\8",\!J#5EF.08/A5S___\SP%5FB01?Z*VD``!97HO'6U]=65G"!`#, +MS,Q5B^Q6BW40A?9U"K@#0`"`Z;^___,S,S,S,R#;"0$#.G6_O__S,S,S,S,58OL5HMU$(7V +M=0>X`T``@.M-:A!HG%-#`/]U#.A):P``@\0,A7<(, +M`%6+[(/L,%-6BW4(,]M7:`!_``!3B_G'1=`P````QT74*`@``,=%V"":00") +M7=R)7>")=>2)7>C_%00A1@")1>R-1=!0QT7P!@```(E=],=%^(1$0P")7?S_ +M%2`A1@")-U]>6XOE7<($`,S,S%:+="0(@VX4`8M&%'43B\[HM?3__VHP5N@H +M3P``65DSP%["!`#,S,S,S,S,S,S,S(-L)`0$Z<;____,S,S,S,R#;"0$".FV +M____S,S,S,S,@VPD!!#IIO___\S,S,S,S(-L)`0,Z9;____,S,S,S,R+3"0$ +M@VD$`8M!!'4,:@Q1Z,!.``!963/`P@0`@^P055:+="0<5U:+^>CEH0``C01% +M`@```%#H^*$``(OH65F%[0^$E`$``%:+S^B+^/__#[<.B_V(1"0/9H7)#X1X +M`0``4VH@QT0D'`T````SV\=$)"`*````6L=$)!0^````Z8H```!F@_D\#X2) +M````A,!T4V8[3"08=`=F.TPD''45._UT!F8Y5_YT!F:)%X/'`H/&`NM6A,!T +M+&:#^29U)C/`C10P#[<*9H7)=!*#^3MU!8UR`K,!@\`"@_@H#QP*#Q@**1"03,]L/MPYFAP0`=`G_L6A+?12#Z`%T%BV`````=23_-VKK_W4(_Q4\(48`ZQ5JZ_]U"/\50"%&`/]U +M"(O(Z)SW__]7_W40_W4,_W4(_Q4D(48`7UW"$`!5B^R#[!B-1>A35U#_=0B+ +MV?\5A"%&`(U['%=HC%-#`&H%:@"-1>A0_Q5X(48`BP>%P`^$A0```%:+,(U- +M_%%HO%-#`%"+#O\58#)#`/\6A":+ +M1?A0BPB+<2"+SO\58#)#`/_6BT7X4(L(BW$(B\[_%6`R0P#_UEY?6XOE7<($ +M`%:+\8-^(`!U#H!^)0!U"/]V'.A7]?__@'XF`,9&)0%T"HM.#&H!Z`4!``!> +MPU>+^8M7'(72=00SP%_#BP)64HMP!(O._Q5@,D,`_]:+1QQ>7\-5B^Q145>+ +M^8M''(7`#X3&````5HLPC4W\46B\4T,`4(L._Q5@,D,`_Q:%P'@]BT7\:@%0 +MBPB+<1B+SO\58#)#`/_6BT7\:@!0BPB+<0R+SO\58#)#`/_6BT7\4(L(BW$( +MB\[_%6`R0P#_UHM''(U-^%%HW%-#`%"+,(L._Q5@,D,`_Q:%P'@YBT7X4(L( +MBW$8B\[_%6`R0P#_UHM%^%"+"(MQ%(O._Q5@,D,`_]:+1?A0BPB+<0B+SO\5 +M8#)#`/_6BT<<4(L(BW$(B\[_%6`R0P#_UH-G'`!>7XOE7<-5B^Q15XOYBT<< +MA->R!7_W,855-5:OM0_Q5@,D,`_U8L +MBT0D$%?_6UG"!`!5B^Q15HOQC47\B77\ +M@V7\`(-]#`!0_W4(QP9P1D,`=`?H94<``.L%Z%A'``")1@B+1?R)1@2+QEZ+ +MY5W""`#,S%:+\?]V!,<&:$9#`.@M1P``]D0D"`%T&?9$)`@$=0A6Z`U'``#K +M"FH05NAQE```65F+QE["!`#,S,S,S,S,S,Q5B^Q148-E_`"-1?Q6B_%0_W8$ +MZ.!&``"%P'0#B48(:A#HQD8``(O0B57XA=)T%(M."(M%_,<":$9#`(E"!(E* +M".L",]*+PEZ+Y5W#58OL45%3C47\,]M0:&Q30P!J`5-H7%1#`/\5>"%&`(7` +M#X@.`0``BT7\C4WX5E%H3%1#`(LP4(L._Q5@,D,`_Q:%P`^(V````#A="'08 +MBT7X:@+_=1"+"%"+<12+SO\58#)#`/_6BT7\_W4,4(L(BW%0B\[_%6`R0P#_ +MUCE=&'06BT7\_W484(L(BW$BL-;B^5=PAP`:F3H&````(/X?7T/:F3H+0```(/X?7T#,\##,\!` +MPZ$HA$0`A5O\UT`Y$`/\5,#%#`(7`=`U0_Q4@,4,`B_"%]G4',\#I +MMP```%-55S/M:@*);"0<_Q4<,4,`B]B%VP^$E@```%/_%20Q0P"%P`^$@``` +M`%=64.A'5@``@\0,B6PD$(U$)!!055/_%7PA1@"%P'595?]T)!3HL/[__XM, +M)!"+^%&+$8MR"(O._Q5@,D,`_]:%_W0UBT<(B6\(A65G"!`!5B^R`/4P/1```BT44=`4-```8`%#_=1#_=0S_=0C_ +M%?0@1@!=PA``@^QPZ(S^__^$P'46_W0D?/]T)'S_="1\Z)P"``#ID0(``%.+ +M7"1XC40D,%50:AA3_Q5@($8`BT0D/(N,)(`````/K\&9]WPD.(OH.ZPDA``` +M`'P'BZPDA````%<[3"0\=0H[;"1`=00S_^L@C40D##/_4&B$1D,`,\!`4%=H +M;%1#`/\5>"%&`(7`>1!75U=74_\5Z"!&`.D4`@``BT0D#(U,)!!646H"BS!7 +M4U"+3E3_%6`R0P#_5E2%P(M$)!!X'R__A_@<$.``>`#XBD +M````BTPD$(U4)!Q248L!BW`LB\[_%6`R0P#_UHM$)!QJ`U7_M"20````BS#_ +M="0@4(M.(/\58#)#`/]6((N$)(@```#_="0HBTPD((EL)#P/K^B)1"0XP>`" +MB7PD,(E\)#2+,<'E`E50C40D.%!1BTX<_Q5@,D,`_U8B^5=P@0`_W0D!/\5.#%#`/?8 +M&\#WV,($`%6+[(/L'%97:)Q&0P"+\>B&7?__,_^)!E?_%8`A1@"-1?3'1?0( +M````4,=%^/\'``#_%30@1@!7C47DQT7D`0```%"-1?R)?>A0B7WLB7WPZ.L^ +M``!H,(1$`/\5B"!&`%^+QEZ+Y5W#58OL9*$`````:O]H@1]#`%!DB24````` +MH3"$1`!65XOYBQ!0BW((B\[_%6`R0P#_UO]W!.BE/@``_Q5T(48`BTWT7V2) +M#0````!>B^5=PU:+\8V.G*0``.A^;_[_C8X\I```Z'-O_O^-CMRC``#H:&_^ +M_XV.?*,``.A=;_[_C8X\0`0``='&#[P%U +M$@^WQ8/H`71-@^@!=#V#Z&5T!#/`ZVJAL`Q&`&H`_S#H:A?__U"AL`Q&`/\P +M:(X```#H>SG__U!6Z+AI_O^$P'0\H;`,1@#_,.LJ:@!6_Q6X($8`ZRBAL`Q& +M`/]P!/\P:F96_Q5H(48`:@'KX/\SB1VP#$8`:F96_Q50(48`,\!`7UY=6\(0 +M`(M$)`2+R%,SVV8Y&'0[5E=J7%\/MQ!F.]=U'@^W<`)F._=U"&:).8/`!.L3 +M@_YN=0AJ"EJ#P`3K`X/``F:)$8/!`F8Y&'7,7UXSP&:)`5O"!`!5B^RX)!`` +M`.A//@``9H,]:I1$```/A($```!6:@;_-?CE0P"^:I1$`%;HAA;__U#HW7+_ +M_X7`=6)H:(1$`.B<_?__:``(``!6C87<[___4.@(6?__C87<[___4.A.D``` +M,\EJ'E%FB8Q%WN___XU%X%#HI4T``(/$$,=%Y`,```!J%%AFB47PC87<[___ +MB47HC47@4/\5="!&`%Z+Y5W#BT0D!#/)AA<)0``_P5[``0``'4Q:F2- +MA=3^__]0:@]3_Q5L,4,`9HN%U/[__V:CJ.Q%`#/`9J.J[$4`QP40YD,`J.Q% +M`&HRC46<4/]U#/]U".C85O__BWT0,\"+=1165V@`YD,`9HD'C46<4&H`4_\5 +M>#%#`#/`9HE$=_Y?7EN+Y5W"$`"#[`Q355:+="0<5X7V#X34````#[<&9H7` +M#X3(````BUPD)#/M:B(S_XET)!PRR<=$)!@L````15H[;"0H#X."````9CO" +M=5IJ(HU6`EAF.0)U)83)=18[="08=1`/MT8$9CM$)!1T$&:%P'0+:B*+\EIF +MB11[ZSR*P8A$)!.$R70$,LGK%6HB6%!2Z#-N``!9A<"*1"0760^5P6HB6CK! +M=10/MP9F.T0D%'4$A,ET'6:)!'M'18/&`@^W!F:%P`^%=/___S/`9HD$>^L6 +M,\!FB01[@\8"#[<.4>B65?__A,!U\(O&ZPN+1"0D,\EFB0@SP%]>75N#Q`S" +M#`"X^2)#`.CW.@``4;@4?0``Z,@[``!35E___W0/C8W<@O__Z*]K_O\RP.MRB5W< +MB5W@B5WDB5WHB%WLC47+=>"-/#:-1P)0 +MZ,:-``!9B\B+11")"(7)=02+\^L3,\!79HD$#_]UW%'H4TP``(/$#(M%%(DP +MC4W,3^__]U".@)*```N%"K00##Z\;_=0CH^2<``+@8JT$` +MPU6+[+@,(```Z,,Z``"`/7"D1```#X24````:``(``"-A?3?__]0_W4(Z+(4 +M``"-1?A0:@%J`&CL4D,`:`$``(#_%2@@1@"%P'5DC47\QT7\`!```%"-A?3O +M__]0C47T4&H`C87TW___4/]U^/\5)"!&`(7`=2^+1?RY_P<``-'HB47\.\%R +M`HO!_W4,,\EFB8Q%].___XV%].___U#_=0CH+%7___]U^/\5!"!&`(OE7<(( +M`,S,S,S,S,S,S,S,S%6+[('L``$``%.+71!6BW4,5XM]"&H`:@!H;$]#`/]U +M%%-65^C"9O[_A,!U;8'N$`$``'19@^X!=0T/M\.#Z`%T%(/H`70$,\#K4FH` +M5_\5N"!&`.M$OH````"-A0#___]64&IF5_\5:"%&`(V%`/___[EX:D4`4.CK +M0O__5HV%`/___U#H*4/__VH!Z[__=11J9U?_%5`A1@`SP$!?7EN+Y5W"$`"X +M!"```.A@.0``BXPD%"```%,SVU:%R70"B!F+E"0@(```A=)T`H@:B[0D$"`` +M`(7V#X2T````#[<&9H7`#X2H````58NL)!@@``!7B[PD("```(E<)!`/M\"# +MQ@*#^#UU$X7_=!F%VW45AL#@\8",\!FB44`A?]T +M+V:)!X7;="AH`!```(U$)!A04_\58#%#`/^T)"P@``"-1"084%?HBU/__S/` +M9HD#7XO&7>L",\!>6X'$!"```,(8`%6+[%%14XU%^%#_%8@@1@"-1?Q0,\!0 +M4/]U#%#_%7P@1@"+V/?;&MN`PP%T+E;_=0C_=?S_%9`@1@#_=?Q(]]@:P(U8 +M`8M%^%"+"(MQ%(O._Q5@,D,`_]9>ZPB+10@SR6:)"(K#6XOE7<((`+@$(``` +MZ/PW``!35597:```"`#H88H``(OP687V=0JY4`]$`.B)P/[_BYPD&"```#/` +M,^UFB0:+_>MN9CDN=0AF@WPD%'MT86:#?"04?71[C40D%%#H_XD```/'63W[ +M_P,`=V>-1"044%;HO\4``%;HY(D``(OX@\0,A?]T%(U'_XT$1F:#."!U"(/H +M`H/O`77R@'PD$P!U$(T$?F@<0T,`4.@%K```65EH`!```(U$)!=0556-1"0D +M4/\SZ-O]__^)`X7`#X5P____7XO&7EU;@<0$(```P@0`58OL@^P10_Q6@($8`7HOE78```"![A`!``!T*H/N +M`74-#[?#@^@!=!F#Z`%T!S/`Z<@```!55_\5N"!&`.FX````:@'K\%?H*2`` +M`*%TQ40`AC___\UE.Q%`.@XB```_S60[$4`Z"V(``!963/`0%]> +M75O"$`!5B^R#[!A35VIE_S70#D0`_Q70($8`B_B%_P^4PX3;=`EJ9>C7[___ +MB_B%_W0/C47H4&H85_\58"!&`.L.QT7L70```,=%\"X!``#HK>[__X3`=#]6 +MA-MT%FIFZ)_O__^+\(7V=`E7_Q5,($8`B_[_=?#HQN[__U#_=>SHG.[__U!7 +MZ+GP__]7B_#_%4P@1@"+_EZ+QU];B^5=PX`]4(1$``!U2HM$)`A7,_]F.3AT +M/5;_%0`P0P"+\(U$)!105_]T)!B_L.Q%`&@`$```5^@2CO[_5VB(3T,`Z"WW +M__^#Q!R%]G0'5O\5!#!#`%Y?P\S,S,RX#B-#`.C:,P``N*@<`0#HK#0``%.+ +M71!6BW4,5XM]"&H`:@!H2%!#`/]U%%-65^AG8?[_A,!T"#/`0.FB"0``@>X0 +M`0``#X2@!@``@^X!=1(/M\.#Z`%T:8/H`70W@^AE=`*PXA%\NL#BD7RB@UQI$0`A,EU;832='W_ +M%40Q0P!0:)A00P"-A8SN__]64.@AB_[_@\00C8UDSO__Z#KC_O^#9?P`C86, +M[O__:A%0C8UDSO__Z"KD_O^(1?.$P'4._Q4`,$,`@_@%=0.(7?*#3?S_C8UD +MSO__Z#CC_O^*#7&D1`"`??,`#X4U`@``A,D/E<#^R")%\H3`#Y1%\X3`#X2X +M`0``5HV%C.[__U!J`/\5?#!#`&B`````C86,_O__N7+$1`!0Z`\Y__]H3H24$``(/$#.L&BT7LB47DC46H4/\5 +MA"!&`(OPC86,_O__:(````!0Z*0Y__]H#$,``(V%3./^_U#HDSG__X7V=#AH +M$"<``/]UX/\5K"!&`(-EZ`"+=>2`/@!U%&ID_Q6<,$,`BT7H0(E%Z(/X9'SG +MBT7@HZ3L10#K!HMUY(A=\X-][`!T$%;_%4PQ0P#_=>S_%1@P0P"`??,`#X2" +M^___:)H```#H`"K__U"-A8S>__]0:!!10P"-A62I__]H``H``%#HQ8C^_X/$ +M%+E0#T0`4^CBN/[_:C!HE@```.C(*?__4(V%9*G__U!7Z*/J____!5R$1`#I +M)_O__VH`:F=7B1U4A$0`Z-E;_O]J`&IF5^C/6_[_:.8```#HBRG__U!35_\5 +M4"%&`%-J:5?HLUO^_VBT-4,`:F57_Q50(48`:F57_Q5D(48`B_"%]G08:O!6 +M_Q5`(48`#8````!0:O!6_Q4\(48`:@7_-3B$1`!7Z`\)``!J`O\U.(1$`%?H +M`0D``&B0W$4`5X@=M`Q&`.@='```:@;_-3B$1`#&!;0,1@``5^C;"```@#U0 +MA$0``'4@@SU____-83<10#HW7X``%DY'6RD1`!T +M45?_%<@@1@`Y'6RD1`!T0H`]<:1$``!U.6H#_S4XA$0`5^B5!@``@SV0[$4` +M`'0B:@!H8*]!`&H`:'Q00P#_-=0.1`#_%;0@1@"%P`^$X/C__U/_-3B$1`!7 +MZ%T&``"`/6.$1```#X6C````@SV$W$4```^%E@```(,];*1$```/A8D````S +MP+ZJ````9HF%9&G__X'^J@```'4)@#V8[$4``'0_@?ZK````=0F`/9CL10`` +M=2YH`"```&B44$,`C85D:?__4.AT1O__:``@``!6Z`PF__]0C85D:?__4.A< +M1O__1H'^L````'ZGBPU`A$0`C85D:?__:@!J`%#_=>S_-=0.1`#HH]W__XMU +MZ(,];*1$``)U"6H`5O\58"%&`(`]:)1$``!T%&H`:F=7Z,M7_O]J`&IF5^C! +M5_[_H6RD1`"%P'0D@#U0A$0``'4;:@!3:!$!``!7.\-U"/\5`"%&`.L&_Q6H +M($8`@#U2A$0``'03:)````#H927__U!35_\54"%&`(O#BTWT7UY;9(D-```` +M`(OE7<(0`,S,S,S,S,S,S,S,N%`:``#HMBH``%.+G"1@&@``55:+M"1D&@`` +M,^U7B[PD9!H``%55:!A/0P#_M"1\&@``4U97Z&!7_O^$P'0(,\!`Z5`#``"! +M[A`!``!T;H/N`0^%/0,``&H"#[?#7BO&="*#Z&IT4H/H`71(@^@!=#^#Z`%T +M$8/H`70Q@^@!#X41`P``:@9>555H<0$``&IF5_\5P"!&`(7`=`=0_Q78($8` +M5E?_%;@@1@#KDVH#Z]9J!.O2,_9&Z\Z+]>O*:FQ7_Q5D(48`4/\5Q"!&`+X` +M"```C80D8`H``%;_M"1T&@``4.C:1/__5HV$)&0*``!04.CY`O__C80D8`H` +M`%!J95?_%5`A1@!H``$``&BT`@``C80DM`<``%!5C80D<`H``%#_%8`@1@!5 +M_[0DL`<``&AP`0``:F97_Q7`($8`C80D7`$``%"-A"1D"@``4/\59#!#`(O8 +M@_O_#X0V`@``C40D$%"-A"1T`0``4/\5`#%#`(U$)!A0C40D%%#_%0@Q0P!J +M,HU$)#1058U$)"10:@)>5F@`!```_Q5P,4,`:C*-A"28````4%6-1"0D4%5H +M``0``/\5=#%#`(U$)#!0C80DF````%!HF0```.AK(___4&A,3T,`C80DO`,` +M`&@``@``4.@V@O[_@\08C80DK`,``%!J:E?_%5`A1@!3_Q5@,$,`]H0D7`$` +M`!!U9&HRC80D_````#/)`XPD@`$``%"+A"2``0``$\504>@KZ___:)@```#H +M`2/__U"-A"3\````NP`"``!0:&!/0P"-A"2X`P``4U#HPX'^_X/$%(V$)*P# +M``!0:FA7_Q50(48`ZP6[``(``%7_M"2P!P``:'`!``!J9U?_%<`@1@"+#62$ +M1`"-1"0H4.B@4/__C40D$%"-1"0L4/\5`#%#`(U$)!A0C40D%%#_%0@Q0P!J +M,HU$)#1058U$)"105KX`!```5O\5<#%#`&HRC80DF````%!5C40D)%!55O\5 +M=#%#`(U$)#!0C80DF````%!HF0```.@V(O__4&A,3T,`C80DO`,``%-0Z`6! +M_O^#Q!B-A"2L`P``4&IK5_\54"%&`/:$)%P!```0BPV,W$4`BQ6(W$4`=`:+ +MP@O!=$MJ,HV$)/P```!045+H`>K__VB8````Z-@/[_@\04C80DK`,``%!J:5?_%5`A1@`SP%]>75N!Q%`: +M``#"$`"X`"```.@2)P``5E=H`!```(U$)`PS]E#_M"04(```Z'L___^+^(7_ +M#X3S````5;T`"```1H/^`0^$R````&:#?"0,+W0,9H-\)`PM#X6T````#[=$ +M)`Y0Z$1;__^#Z$0/A)````"#Z`%T:H/H"W14@^@##X6-````#[=$)!!0Z!U; +M__^#Z`!T*(/H,70C@^@!=!*#Z!YU;E6-1"064&ARM$0`ZUS'!6RD1``"```` +MZPK'!6RD1``!````Q@5Z:T4``>M"C40D$+ERQ$0`4.BA+___ZS$/MT0D$%#H +MP5K__X/X3'4A9H-\)!(`=1G&!7&D1``!ZQ!5C40D%%!H0+``"_``@``(V%L(+__U=0Z+;>__]7C86H(O__4(V% +M^,K__U"-A;""__]0Z.SY_O^-C:AR___H'.7^_XV%J"+__S/;4(V-J'+__XE= +M_.@_YO[_C8VPHO__Z(.O_O_I.@$``%.-A;"B__]0_Q58,$,`.)V\LO__#X2@ +M````5XV%^.[__U"-A;""__]0Z![U_O]7C87X[O__4.@A\O[_C86P@O__4.BA +M=@``B_!9@_X$3^_X3`#X6K +M_O__@TW\_XV-J'+__^BGX_[_Z1P*``"%VP^%%`H``*&$W$4`A<`/E,.$VW42 +M:+1%0P!0Z#.Q``"AA-Q%`%E9BGWSA/]T"(VU^,K__^L0C44,4.CFZO__B_"A +MA-Q%`(3;=0E0Z"YU``!9B_A6Z"5U```#QXT$10H```!0_S6$W$4`Z#MU``"# +MQ`R%P'07HX3<10"$VW0%,\EFB0A64.C)L```65F$_P^%APD``%;H_W0``%GI +M>PD``(7;#X5S"0``C87XRO__4/]U"/\57"%&`.E>"0``A=L/A58)``!F.3UR +MI$0`#X5)"0``,\"-O?C*__]J(F:)A?CN__]89CF%^,K__W4&C;WZRO__5^B% +M=```O@`(``!9.\8/@Q0)```/MP=J7%F#^"YU)V8Y3P)U(8/'!#/;9CD?#X3U +M"```5E>-A?CN__]0Z/@\___I^````&8[P0^$WP```&:%P'0+9H-_`CH/A,\` +M``"-1>0SVU!J`5-H(%)#`&@"``"`_Q4H($8`A3_%20@1@#_=>3_%00@1@"+1>RY_P<``-'H.\%R +M`HO!,\EFB8Q%^.[__V8YG?CN__]T+(V%^.[__U#HLG,``%EJ7%EF.8Q%]N[_ +M_W025FB44D,`C87X[O__4.@8//__5^B,!P``QP5LI$0``@```.D/!P``#[>%^,K_ +M_S/)*\%T+8/H,'07@^@!=".#Z`$/A>\&``#&!5.$1``!ZP:(#5.$1`"(#6"$ +M1`#IU08``(@-4X1$`,8%8(1$``'IPP8```^WA?C*__]0Z*:@``!9@_A&="*# +M^%5T$3/`HF&$1`"B8H1$`.F:!@``Q@5BA$0``>F.!@``Q@5AA$0``>F"!@`` +M,__&!9CL10`!1XV=^,K__V:#O?C*__\\#X6>````C87ZRO__:CY0Z%!1``!9 +M687`#X2&````C4@"B4WL,\EFB0B-A?C^__]J9%"-A?K*__]0Z&/B__^+V(7; +M=%UF@[WX_O__`'13:)A20P"-A?C^__]0Z*]3___WV&BD4D,`&\`C^(V%^/[_ +M_U#HF%/__X7`=0-J`U]HK%)#`(V%^/[__U#H@%/__X7`=0-J!E]J9(V%^/[_ +M_U!3ZYB+7>R#?1`%=16#_@D/A;<%``!J`5=3_W4(Z&H)``"#?1`$#X6A!0`` +M@_Xh!0``:@!74_]U".A+"0``Z8<%``#&!9GL10`!9CF]^,K__P^$LD:``"``"-A?K*__\#P5"-A?CJ__]0Z'XX__\SP&:)A'7X +MRO__9H.]^.K__P!U,&@`$```C86H0O[_4(V%^,K__U#H4CC__V@``@``C86H +M8O[_4(V%^.K__U#H.CC__XV%^,K__U#H?][__S/`9HF%^-K__XV%^.K__VHD +M4(V%^,K__U#_=0CH<=C__X/X!@^$\P,``&H!_W4(,\#&!5"$1``!9J-JE$0` +M_Q6X($8`@_L'#X70`P``@SULI$0``'4*QP5LI$0``@```,8%:)1$``'IL0,` +M`(/[`W4I9CF]^,K__W02C87XRO__4.ANJ@``6:.4[$4`C44,4.B2Y/__HY#L +M10#&!7MK10`!Z7<#``"#^P8/A6X#```SP&:)A?BR__\/MX6H0O[_4.A(G0`` +MO@`(``!95H/X4'0S@_A4C87XLO__=!1H@LM%`%#H1S?__\=%[!````#K+&B" +MJT4`4.@S-___QT7L!P```.L8:(*[10"-A?BR__]0Z!DW___'1>P"````,\!F +MB86H8O__9HF%^,+__XV%J&+^_U90C86PDO__4.CN-O__:B);9CF=L)+__W5/ +MOP`(``"-A:IB_O]74(V%L)+__U#HR3;__XV%LI+__U-0Z*5-``!9687`#X3U +M````,\EFB0B#P`)H``0``%"-A?C"__]0Z)@V___IU@```(V%L)+__U#HR=C^ +M_X3`#X6]````B]^-M;"2__]F.9VPDO__#X2H````:B!9#[<&9CO!=`AJ+UIF +M.\)U>8OX,\!FB0:-A;"2__]0Z(;8_O^$P'1:C86PDO__4.B*V/[_4.C2V/[_ +MA,!U1&HO6(O>9COX=1AFB87XPO__C48":/\#``!0C87ZPO__ZQ=J(%B#Q@)F +M.09T^&@`!```5HV%^,+__U#HZS7__V:).^L#9HD^:B!9,_^#Q@)F.3X/A6O_ +M__^_``@``(7;=`PSP&:)`^L%OP`(``!F@[VHXO[_`'045XV%J&+__U"-A:CB +M_O]0Z)?H_O]7C86H0O__4(V%L)+__U#H@^C^_V:#O?BR__\`=0__=>R-A?BR +M__]0Z/_A__]7C87XLO__4.@KZ/[_9H.]J(+^_P!T(5>-A:B"_O]0C87XLO__ +M4.@?-?__5XV%^++__U#H`.C^_U>-A?BR__]0C86H,O__4.@F-?__9H.]J,+^ +M_P"-A:C"_O]U!HV%J&+^_U=0Z&'R_O]0C87XLO__4.C4-/__C87XLO__4.A" +MZO[_A%J&+___?841O`(\(/ +MMY6H4O__]]I0C86HHO[_&])0(];HEMO__U!2C87XLO__4(V%J$+__U!3Z$C1 +M__]F.9VH,O__="-3C86H,O__4&H%:``0``#_%7@@1@#K#(/[!W4'Q@5PI$0` +M`6@`$```C47K4(U%\U"-A?C*__]0C86H`O__4/]U#.B#W___BUT0B44,A<`/ +MA8CS__]?7EN+3?1DB0T`````B^5=P@P`D#/!00`$PT$`I<-!`,+#00#0Q4$` +M$<9!`)[&00##QT$`;\E!`)[&00"IR4$`%,U!`%W&00"9QT$`4XM<)`A5:B!3 +MZ&]*``!9687`=&9J(EUF.2MU"U/HKO#^_V8Y*'135E=3Z+=J``"+^#/):@): +MC4<#]^(/D,'WV0O(4>@.&@``B_!3C4X"4>CEC```@\009HEL?@(SP&:)+F:) +M1'X$_W0D&%93Z",S__]6Z.@9``!97UY=B\-;P@@`@^Q<4U565^C:X/__:FC_ +M-5B$1`#_%60A1@"]L0```#/;B_"-?1$X'6.$1`!U-(L-0(1$`.C7O?__:@56 +M_Q5L(48`:O]355;_%0`A1@!HM#5#`%-75O\5`"%&`,8%8X1$``&X`.'U!5!0 +M55;_%0`A1@"-1"00QT0D$%P```!04V@Z!```5O\5`"%&`#/)B%PD*8I<)'!! +MB4PD%(3;=!^+1"08)?___[_'1"0DH`````O!QT0D%`$``$")1"08C40D$%!1 +M:$0$``!6_Q4`(48`_W0D=&H`5U;_%0`A1@"X`.'U!5!055;_%0`A1@"$VW0C +MBT0D&(/@_@T```!`B40D&(U$)!!0:@%H1`0``%;_%0`A1@!H'$-#`&H`5U;_ +M%0`A1@!?7EU;@\1\0`0``=#F#[P%U#0^WQ8/H`704@^@!=`0S +MP.M%:@!6_Q6X($8`ZS=H``@``/\UK.Q%`&IH5O\5:"%&`&H!Z]]3:F96B1VL +M[$4`_Q50(48`_S6L[$4`:FA6_Q50(48`,\!`7UY=6\(0`+ERQ$0`Z10>__^X +M&!```.@X%@``Z'W/__^$P`^$T0```%565VH%_[0D+!```/\5-"%&`(OP,_^+ +M[H7V#X2N````4X'_``(```^-H````&@`"```C40D+%!6_Q7L($8`:`A/0P"- +M1"0L4.AR2O__A#X1+`@`` +M5NB`9P``63WV!P``#X,Y`@``5VH\7U>-1"044U#HT20``(J,)&@0``"#Q`R) +M?"00QT0D%,`!``"$R70(QT0D%,`%```/MQ:-?@)5:B)=9CO5=`*+_HE\)"2+ +MPV:%TG0VB];'1"00(````&8Y*@^$B0$``(M4)!!F.11$`0``9H-\1@(O +M#X2(`0``0(T41F8Y&G74BT0D*%V%P'0%9CD8=16$R7419CD=6X'$0!```,(0`(,E5(1$``!J`?]T)`C&!5&$1``!Q@52A$0``?\5;"%& +M`&H`:@+_="0,Z$<__O^#/3R$1```=0F`/6.$1```=`F#/5R$1```=1-J`&H! +M:!$!``#_="00_Q4`(48`P@0`N#@C0P#HF!$``%&X`"$``.AI$@``4U97B67P +M:)!/0P!H,5$`(O.Z,Z'_O^#9?P`C8WPWO__:@)8HU`X10"C3#A%`*-(.$4` +MH&&$1`"BSR9%`*!BA$0`5L8%#"=%``'&!0\G10`!HM`F10#H/ZG^_XV-\-[_ +M_\9%_`'HIZK^_XV-\-[__^BXJ?[_BTWT7UYDB0T`````6XOE7<((`+Y0#T0` +MB\[H9YK^_VH(B\[H*9O^__]U".BZ_O__N)_400##Z\C_=0CHJO[__[AIU$$` +MPU6+[+@($```Z'01``"`/7"D1```='EF@SURI$0``'1O5F@`"```C87X[___ +M4&ARI$0`Z%KK__^-1?@S]E"-1?Q05F@&``(`5E96:.Q20P!H`0``@/\5$"!& +M`(7`=3#_=0CH;F,``%F-!$4"````4/]U"(V%^.___VH!5E#_=?S_%2`@1@#_ +M=?S_%00@1@!>B^5=P@0`58OLN``@``#HWQ```%;_=0AH7%!#`/\57#%#`&@` +M$```C84`X/__4/]U".@_*?__B_"%]G0B#[<.4>L'@\8"#[<&4.A`*O__A,!U +M\%9H;%!#`/\57#%#`%Z+Y5W"!`!5B^R#[!Q7:@K_=0C_%>0P0P"_`@$``#O' +M=496,_965E96C47D4/\5I"!&`(7`="%65E:-1>10_Q7@($8`C47D4/\5O"!& +M`(U%Y%#_%:`@1@!J"O]U"/\5Y#!#`#O'=+Y>7XOE7<($`%6+[%%1BT4(B47X +MBT4,B47\C47X4&C`ID$`_S58A$0`:)1/0P#_-=`.1`#_%;0@1@!(]]@;P$"+ +MY5W""`!5B^R`/6"$1```BT40HXC<10"+112CC-Q%`(M%&*-DA$0`=`0SP.MC +M@#U3A$0``'0%,\!`ZU535E>_<+M!`+L83T,`ZR/_=0AH4,]!`/\U3(1$`&@X +M3T,`_S70#D0`_Q6T($8`AF6````@WT(`HLU6(1$`'4-5O\5L"!&`/?8&\`C +M\%-H``@``(V%`/#__U#_=1#_=0SHG.#^_XV%`/#__U!H(*Q!`%9H;$]#`/\U +MU`Y$`/\5M"!&`(M=%(7`=!-J0%F^>&I%`(O[\Z4SP$!FI>L5:+0U0P"+R^C: +M%___Q@50A$0``3+`@+L``0```'0.:D!9B_._@)*___:``(``!H:(1$`.A4Q___C4PD'.@-S?__ +MN>"!1`#H"#[__[\$<0``,]M74VB`:T4`Z!H=``"#Q`S_%5@Q0P"+\(7V='Y6 +MZ"GF__\X'7&D1`!T:E5HK$]#`%.^'P`/`%;_%50Q0P"+Z(7M=$=74U-65?\5 +M2#%#`(O8A=MT+5=3:(!K10#H)QX``(/$#,8#`6B":T4`Z`O\__]J0%F^@MM% +M`+]RQ$0`\Z5FI5/_%4PQ0P`SVU7_%1@P0P!=ZP96Z.'[__]H``@``+^0W$4` +M5U/_%7PP0P!7:.!/0P#_%5PQ0P"-1"0,4/\50#%#``^W1"0:4`^W1"0<4`^W +M1"0>4`^W1"0@4`^W1"0B4`^W1"0B4`^W1"0D4&CP3T,`C80DG````&HR4.C% +M9?[_@\0HC40D?%!H-%!#`/\57#%#`%/_%8`P0P"+\&ID5HDUU`Y$`(DUT`Y$ +M`/\5U"!&`*-TQ40`Z'C6__]7N>@.1`"C?&M%`.C'^_[_C4PD4.A7L/__C4PD +M).A.L/__4VAPL4$`4XU$)%RC0(1$`(U$)#!H2%!#`%:C1(1$`/\5M"!&`(U, +M)"2)'42$1`")'4"$1`#HTK#__XU,)%#HR;#__Z&@[$4`AQ%``"+-5`/1`!T(H`]FNQ%``"A_.5#`'0.BS6<[$4`A6X'$U````,(0`+AL(48`Z0````!14E!H +MQ+U#`.B\!@``6EG_X+AD(48`Z>7___^X8"%&`.G;____N%PA1@#IT?___[A8 +M(48`Z7___^X6"!&`.G;____N$P@1@#IT?___[A0($8` +MZ7___^X#"!&`.G;____N``@1@#I +MT?___[@4($8`Z7___^XC"!& +M`.G;____N'0@1@#IT?___[B$($8`Z"%&`.GE +M____N(0A1@#IV____[B`(48`Z='___^X="%&`.G'____]P5@54,``!```'0F +MZ)X```"AX`Q&`$"CX`Q&`(/X`74,:.0,1@!J!.C4`0``Z7<"``##H=`,1@!3 +M,]M#.\-U!#+`6\.%P'0$BL-;PU9HC%1#`/\5@#!#`(OPA?9U!(OSZRIHJ%1# +M`%;_%8PP0P"%P'3L:,!40P!6H]0,1@#_%8PP0P"%P'37H]@,1@"+SKK0#$8` +M,\#P#[$*AR+3?PSS>C$#@``B^5=PXO_58OL@^Q`C47D:AQ0 +M_W4(_Q6@,4,`A-1``0`"%]G4$ +M,\#K/0^W@10`0`"-D1@`0``/MXD&`$```]!7B[X,`$``,_:%R707.WH,<@J+ +M0@@#0@P[^'(01H/"*#OQ7<((`(M%"(M*"(D(BT4,BTHDB0B+0@P% +M``!``.O@B_]5B^Q145:-1?A0C47\4.AH____B_"%]G4+BT4,QP`$````ZT.# +M/>@,1@``=2'W1?@```"`QP7H#$8``0```'4%:AE9S2G_=?Q6Z+O^____=0S_ +M=0C_=?Q6_Q6<,4,`AZPK' +M!=P,1@``````BTW\,\WHW0P``(OE7<.+_U6+[(/L.*%HYD,`,\6)1?Q35E?H +M\_S__XM-"+\``$``QT70)````(E-U(M!!(M9"`/'BU$,`]^+<1`#UP/WB5WX +MBWD4@<<``$``B47")?>2)?>B) +M?>R)??!U)(U%T(E%^.C\_O__C47X4&H!5VA7`&W`_Q64,4,`,\#IUP$``(M% +M#(L[*\+!^`*)1B%VW02C470B\M0:@+_%6`R0P#_TXOPA?8/A94` +M``"+10@SVSE8%'0M.5@<="B+1SR!/#A010``=1R+3_W7D5_\5C#!#`(OPA?9U3O\5`#!#`(LUW%1#`(E%\(7V +M=!:-1="+SE!J!/\58#)#`/_6B_"%]G4EC470B47TZ%;]__^-1?10:@%3:'\` +M;<#_%90Q0P#HSOK__XMU[(M%#(DPBQW85$,`A=MT&H-E\`"-1=!0:@6+RXE] +MZ(EU[/\58#)#`/_3Z`[]__^+QHM-_%]>,\U;Z%H*``"+Y5W""`"XF"!&`.D` +M````45)0:(2^0P#H9/W__UI9_^"X-"!&`.D`````45)0:*2^0P#H2?W__UI9 +M_^#_)5@R0P#_)50R0P#_)5`R0P#_)4PR0P#_)4@R0P#_)40R0P#_)4`R0P#_ +M)3PR0P#_)3@R0P!5B^SK'_]U".A^CP``687`=1*#?0C_=0?H3PH``.L%Z"L* +M``#_=0CH95,``%F%P'347<-5B^S_=0CH2PH``%E=P\QJ_U!DH0````!0BT0D +M#&2))0````");"0,C6PD#%#RP\S,S,S,S,S,S,S,S%=64S/_BT0D%`O`?11' +MBU0D$/?8]]J#V`")1"04B50D$(M$)!P+P'T41XM4)!CWV/?:@]@`B40D'(E4 +M)!@+P'48BTPD&(M$)!0STO?QB]B+1"00]_&+T^M!B]B+3"08BU0D%(M$)!#1 +MZ]'9T>K1V`O;=?3W\8OP]V0D'(O(BT0D&/?F`]%R#CM4)!1W"'('.T0D$'8! +M3C/2B\9/=0?WVO?8@]H`6UY?PA``S,S,S,S,48U,)`0KR!O`]]`CR(O$)0#P +M__\[R/)R"XO!692+`(D$)/+#+0`0``"%`.OG:A!H@+A#`.A'"0``,]N)7>"( +M7>>)7?P[71!T&HM-%.@?"0``BTT(_U44BT4,`44(0XE=X.OAL`&(1>?'1?S^ +M____Z`X```#H30D``,(4`(M=X(I%YX3`=0__=1A3_W4,_W4(Z'L```##:@QH +MH+A#`.C>"```QD7G`(M=#(O#BWT0#Z_'BW4(`_")=0B#9?P`B\=/B7T0A?'1?S^____Z!0```#HU0@``,(0 +M`(M]$(M=#(MU"(I%YX3`=0O_=1174U;H`0```,-J&&C`N$,`Z&0(```S]HEU +M_(M]"(EUY#MU$'1"*WT,B7T(BTT4Z#8(``"+S_]5%$;KXHM%[(E%X(M%X(L` +MB477<($`%6+[%WI%OW__^F:!P``58OL +MBT4(5HM(/`/(#[=!%(U1&`/0#[=!!FOP*`/R.]9T&8M-##M*#'(*BT((`T(, +M.\AR#(/"*#O6=>HSP%Y=PXO"Z_GH7PD``(7`=0,RP,-DH1@```!6OO@,1@"+ +M4`3K!#O0=!`SP(O*\`^Q#H7`=?`RP%[#L`%>PU6+[(-]"`!U!\8%%`U&``'H +M?`<``.@B.@``A,!U!#+`7OIL`%=PU6+[(/L +M#%:+=0B%]G0%@_X!=7SHW@@``(7`="J%]G4F:/P,1@#H7YD``%F%P'0$,L#K +M5V@(#48`Z$R9``#WV%D:P/[`ZT2A:.9#`(UU]%>#X!^__`Q&`&H@62O(@\C_ +MT\@S!6CF0P")1?2)1?B)1?REI:6_"`U&`(E%](E%^(UU](E%_+`!I:6E7UZ+ +MY5W#:@7H;`@``,QJ"&C@N$,`Z%H&``"#9?P`N$U:``!F.04``$``=5VA/`!` +M`(&X``!``%!%``!U3+D+`0``9CF(&`!``'4^BT4(N0``0``KP5!1Z&G^__]9 +M687`=">#>"0`?"''1?S^____L`'K'XM%[(L`,\F!.`4``,`/E,&+P<.+9>C' +M1?S^____,L#H(P8``,-5B^SHS0<``(7`=`^`?0@`=0DSP+GX#$8`AP%=PU6+ +M[(`]%`U&``!T!H!]#`!U$O]U".C.F0``_W4(Z,PX``!96;`!7<-5B^RA:.9# +M`(O(,P7\#$8`@^$?_W4(T\B#^/]U!^C.EP``ZPMH_`Q&`.@RF```6??861O` +M]]`C10A=PU6+[/]U".BZ____]]A9&\#WV$A=P\S,S,S,S,R`^4!S%8#Y(',& +M#Z7"T^##B]`SP(#A']/BPS/`,]+#S(M$)`B+3"00"\B+3"0,=0F+1"0$]^'" +M$`!3]^&+V(M$)`CW9"04`]B+1"0(]^$#TUO"$`#,S,S,S,S,S,S,S,Q75E4S +M_S/MBT0D%`O`?15'18M4)!#WV/?:@]@`B40D%(E4)!"+1"0<"\!]%$>+5"08 +M]]CWVH/8`(E$)!R)5"08"\!U*(M,)!B+1"04,]+W\8O8BT0D$/?QB_"+P_=D +M)!B+R(O&]V0D&`/1ZT>+V(M,)!B+5"04BT0D$-'KT=G1ZM'8"]MU]/?QB_#W +M9"0@P +M10``Z"M%``#HY08``.C1!@``4.@=F0``6>BUE0``A,!T!>A.D0``Z+<&```S +MP,-J!^AB!```S,S,S,S,S,S,S,S,S.C1!@``,\##S,S,S,S,S,SHC@4``.B& +M!@``4.@ZF0``6<-J%&@`N4,`Z"("``!J`>CE^O__683`=0=J!^@4!```,MN( +M7>>#9?P`Z);Z__^(1=RA]`Q&`#/)03O!=-R%P'5)B0WT#$8`:+0R0P!HF#)# +M`.B6EP``65F%P'01QT7\_O___[C_````Z?8```!HE#)#`&AD,D,`Z!27``!9 +M6<<%]`Q&``(```#K!8K9B%WG_W7A7^___65G'1?S^____B\;K/8M-[(L!BP")1>!1 +M4.BWA@``65G#BV7HZ(R)``"$P'4(_W7@Z%N*``"`?><`=07H,HH``,=%_/[_ +M__^+1>#H#0$``,/,S,S,S,SH9`0``.F(_O__.PUHYD,`\G4"\L/RZ>@%``#, +MS,S,S%6+[%;_=0B+\>@"+O__QP:`54,`B\9>7<($`(-A!`"+P8-A"`#'002( +M54,`QP&`54,`P\S,S,S,S,S,S,S,S,R-003'`6A50P!0Z(@Q``!9PU6+[(/L +M#(U-].B9+?__:`2W0P"-1?10Z$LI``#,58OL@^P,C4WTZ)____]H'+E#`(U% +M]%#H+BD``,SI_D@``/\E8#)#`,S,S,S,S,S,S,QH4"%"`&3_-0````"+1"00 +MB6PD$(UL)!`KX%-65Z%HYD,`,47\,\50B67H_W7XBT7\QT7\_O___XE%^(U% +M\&2C`````/+#BTWP9(D-`````%E?7UY;B^5=4?+#58OL@R48#48``(/L*%,S +MVT,)'7#F0P!J"NA#*@$`A<`/A&T!``"#9?``,\"##7#F0P`",\E65XD=&`U& +M`(U]V%,/HHOS6XD'B7<$B4\(B5<,BT78BTWDB47X@?%I;F5)BT7@-6YT96P+ +MR(M%W&H!-4=E;G4+R%AJ`%E3#Z*+\UN)!XEW!(E/"(E7#'5#BT78)?`__P\] +MP`8!`'0C/6`&`@!T'#UP!@(`=!4]4`8#`'0./6`&`P!T!SUP!@,`=1&+/1P- +M1@"#SP&)/1P-1@#K!HL]'`U&`(-]^`>+1>2)1>B+1>")1?R)1>Q\,FH'6#/) +M4P^BB_-;C5W8B0.)PD`P``4U9J%^BE*`$`APS3?PSR#O/=0>Y +M3^9`N^L0A6\/,S,S,S,S,S,S,4U:^-+%#`+LTL4,` +M._-S&%>+/H7_=`F+S^CB^O___]>#Q@0[\W+J7UY;PU6+[&H`_Q6T,4,`_W4( +M_Q6P,4,`:`D$`,#_%0PP0P!0_Q7,,4,`7<-5B^R!["0#``!J%^AI)0$`A+?"0$AL3#[HE<.9#``%S/F8/;L!F#W#``(/Y('(<\P]_ +M!_,/?T<0@\<@@^D@@_D@<^SWP1\```!T8HU\.>#S#W\'\P]_1Q"+1"0$B_K# +M]\$#````=`Z(!T>#Z0'WP0,```!U\O?!!````'0(B0>#QP2#Z03WP?C___]T +M((VD)`````"-FP````")!XE'!(/'"(/I"/?!^/___W7MBT0D!(OZP\S,S,S, +MS%=6BW0D$(M,)!2+?"0,B\&+T0/&._YV"#OX#X*4`@``@_D@#X+2!```@?F` +M````-?P0/NN<# +M$(/I,&8/;T8@9@]O;C"-=C"#^3!F#V_39@\Z#]D,9@]_'V8/;^!F#SH/P@QF +M#W]'$&8/;\UF#SH/[`QF#W]O((U_,'VWC78,Z:\```!F#V].^(UV^(U)`&8/ +M;UX0@^DP9@]O1B!F#V]N,(UV,(/Y,&8/;]-F#SH/V0AF#W\?9@]OX&8/.@_" +M"&8/?T<09@]OS68/.@_L"&8/?V\@C7\P?;>-=@CK5F8/;T[\C7;\B_]F#V]> +M$(/I,&8/;T8@9@]O;C"-=C"#^3!F#V_39@\Z#]D$9@]_'V8/;^!F#SH/P@1F +M#W]'$&8/;\UF#SH/[`1F#W]O((U_,'VWC78$@_D0?!/S#V\.@^D0C7809@]_ +M#XU_$.OH#[KA`G,-BP:#Z02-=@2)!XU_!`^ZX0-S$?,/?@Z#Z0B-=@AF#]8/ +MC7\(BP2-M/E!`/_@]\<#````=!.*!H@'28/&`8/'`??'`P```'7MB]&#^2`/ +M@JX"``#!Z0+SI8/B`_\DE;3Y00#_)(W$^4$`D,3Y00#,^4$`V/E!`.SY00"+ +M1"0,7E_#D(H&B`>+1"0,7E_#D(H&B`>*1@&(1P&+1"0,7E_#C4D`B@:(!XI& +M`8A'`8I&`HA'`HM$)`Q>7\.0C30QC3PY@_D@#X)1`0``#[HE<.9#``$/@I0` +M``#WQP,```!T%(O7@^(#*\J*1O^(1_].3X/J`77S@_D@#X(>`0``B]'!Z0*# +MX@.#[@2#[P3]\Z7\_R258/I!`)!P^D$`>/I!`(CZ00"<^D$`BT0D#%Y?PY"* +M1@.(1P.+1"0,7E_#C4D`BD8#B$<#BD8"B$<"BT0D#%Y?PY"*1@.(1P.*1@*( +M1P**1@&(1P&+1"0,7E_#]\#___]UW??!_/___W05@^\$@^X$BP:)!X/I!/?!_/___W7KA#Z0%U\8M$)`Q>7\/K`\S,S(O&@^`/A<`/A>,```"+T8/A?\'J +M!W1FC:0D`````(O_9@]O!F8/;TX09@]O5B!F#V]>,&8/?P=F#W]/$&8/?U<@ +M9@]_7S!F#V]F0&8/;VY09@]O=F!F#V]^<&8/?V=`9@]_;U!F#W]W8&8/?W]P +MC;:`````C;^`````2G6CAH%A=)T(8V;`````/,/;P;S#V].$/,/ +M?P?S#W]/$(UV((U_($IUY8/A'W0PB\'!Z0)T#XL6B1>#QP2#Q@2#Z0%U\8O( +M@^$#=!.*!H@'1D=)=?>-I"0`````C4D`BT0D#%Y?PXVD)`````"+_[H0```` +M*]`KRE&+PHO(@^$#=`F*%H@71D=)=??!Z`)T#8L6B1>-=@2-?P1(=?-9Z>G^ +M__]5B^R#[!BA:.9#`(U-Z(-EZ``SP8M-"(E%\(M%#(E%](M%%$#'1>P`_T$` +MB4WXB47\9*$`````B47HC47H9*,`````_W484?]U$.@])P``B\B+1>ADHP`` +M``"+P8OE7<-5B^R#[#A3@7T((P$``'42N-/]00"+30R)`3/`0.FV````@V7( +M`,=%S,7_00"A:.9#`(U-R#/!B470BT48B474BT4,B478BT4P`B67DB6WH9*$`````B47(C47(9*,`````QT7X`0```(M% +M"(E%\(M%$(E%].BJ)0``BT`(B47\BTW\_Q5@,D,`C47P4(M%"/\P_U7\65F# +M9?@`@WWL`'079(L=`````(L#BUW(B0-DB1T`````ZPF+1+?0B+3PR+T8M?$(E-_(7V>#9KP12#P`@#PX/Y_W1) +MBWT0@^@423EX_(M]"'T*BWT0.SB+?0A^!8/Y_W4'BU7\3HE-_(7V>=*+111! +MB0B+11B)$#M7#'<0.\IW#&O!%%]>`\-;B^5=P^B[=@``S%6+[%%3BT4,@\`, +MB47\9(L=`````(L#9*,`````BT4(BUT,BVW\BV/\_^!;B^5=P@@`58OL45%3 +M5E=DBS4`````B77XQT7\U?Y!`&H`_W4,_W7\_W4(_Q70,4,`BT4,BT`$@^#] +MBTT,B4$$9(L]`````(M=^(D[9(D=`````%]>6XOE7<((`%6+[%;\BW4,BTX( +M,\[HZ.___VH`5O]V%/]V#&H`_W40_W80_W4(Z)$Q``"#Q"!>7<-5B^R+30Q6 +MBW4(B0[H&B0``(M()(E.!.@/)```B7`DB\9>7<-5B^Q6Z/XC``"+=0@[<"1U +M$.CQ(P``C4@DBT8$B0%>7#^R`/@J$$``"+!CL"#X2`````#[;X#[8"*_AT%C/)A?\/ +MG\&-#$W_____A0<```^V?@D/MD() +M*_AT%C/)A?\/G\&-#$W_____A@& +M```/MGX-#[9"#2OX=!8SR87_#Y_!C0Q-_____X7)#X7&!@``#[9^#@^V0@XK +M^'06,\F%_P^?P8T,3?____^%R0^%I`8```^V3@\/MD(/*\AT$C/`A8-``"+1N,[0N-T=0^V^`^V0N,K^'02,\F% +M_P^?P8T,3?____^%R773#[9^Y`^V0N0K^'02,\F%_P^?P8T,3?____^%R76U +M#[9^Y0^V0N4K^'02,\F%_P^?P8T,3?____^%R767#[9.Y@^V0N8KR'02,\"% +MR0^?P(T,1?_____K`C/)A?7__P^V?N\/MD+O*_AT%C/)A?\/G\&-#$W_____AF,````BU4(BW4,#[8*#[8&*\AT$C/`A6UW#B_^D"4(`P`U"``420@`[ +M%D(`(0E"`"D-0@!N$4(`I!5"`(H(0@"1#$(`UA!"``T50@#R!T(`^@M"`#\0 +M0@!U%$(`6P="`&,+0@"H#T(`WA-"`,0&0@#,"D(`$0]"`$<30@`M!D(`-0I" +M`'H.0@"P$D(`E@5"`*X)0@#C#4(`&!)"`%.+W%%1@^3P@\0$58MK!(EL)`2+ +M[(M+"(/L((,]&`U&``%FBU,,?$8/M\)F#V[`\@]PP`!F#W#0`(O!)?\/```] +M\`\``'<\#Q`!9@_OR68/=LD#[+"X/I!%&+`8MP((O.BW@8Z)[6____UHE=^(E]_(7_=`SV +M!PAT!\=%]`!`F0&-1?10_W7P_W7D_W7@_Q64,4,`7UY;B^5=P@@`S,S,S,S, +MS,S,S(,]&`U&``%R7P^V1"0(B]#!X`@+T&8/;MKR#W#;``\6VXM4)`2Y#P`` +M`(/(_R/*T^`KT?,/;PIF#^_29@]TT68/=,MF#^O19@_7RB/(=0B#R/^#PA#K +MW`^\P0/"9@]^VC/).A`/1<'#,\"*1"0(4XO8P>`(BU0D"/?"`P```'05B@J# +MP@$ZRW19A,ET4??"`P```'7K"]A7B\/!XQ!6"]B+"K___OY^B\&+]S/+`_`# +M^8/Q_X/P_S//,\:#P@2!X0`!`8%U(24``0&!=-,E``$!`74(@>8```"`=<1> +M7ULSP,.-0O];PXM"_#K#=#:$P'3J.N-T)X3D=.+!Z!`ZPW05A,!TUSKC=`:$ +MY'3/ZY%>7XU"_UO#C4+^7E];PXU"_5Y?6\.-0OQ>7UO#58OL5C/V@ST8#48` +M`GTMBTT(B]%FBP&#P0)FA7,!```/NB4< +M#48``7,)\Z2+1"0,7E_#B\-=@SI +MKP```&8/;T[XC7;XC4D`9@]O7A"#Z3!F#V]&(&8/;VXPC78P@_DP9@]OTV8/ +M.@_9"&8/?Q]F#V_@9@\Z#\((9@]_1Q!F#V_-9@\Z#^P(9@]_;R"-?S!]MXUV +M".M69@]O3OR-=OR+_V8/;UX0@^DP9@]O1B!F#V]N,(UV,(/Y,&8/;]-F#SH/ +MV01F#W\?9@]OX&8/.@_"!&8/?T<09@]OS68/.@_L!&8/?V\@C7\P?;>-=@2# +M^1!\$_,/;PZ#Z1"-=A!F#W\/C7\0Z^@/NN$"V+T8/Y(`^"K@(``,'I`O.E@^(#_R25=!U"`/\DC80=0@"0 +MA!U"`(P=0@"8'4(`K!U"`(M$)`Q>7\.0B@:(!XM$)`Q>7\.0B@:(!XI&`8A' +M`8M$)`Q>7\.-20"*!H@'BD8!B$#X@,KRHI&_XA'_TY/@^H! +M=?.#^2`/@AX!``"+T<'I`H/B`X/N!(/O!/WSI?S_))4@'D(`D#`>0@`X'D(` +M2!Y"`%P>0@"+1"0,7E_#D(I&`XA'`XM$)`Q>7\.-20"*1@.(1P.*1@*(1P*+ +M1"0,7E_#D(I&`XA'`XI&`HA'`HI&`8A'`8M$)`Q>7\/WQP\```!T#TE.3XH& +MB`?WQP\```!U\8'Y@````')H@>Z`````@>^`````\P]O!O,/;TX0\P]O5B#S +M#V]>,/,/;V9`\P]O;E#S#V]V8/,/;WYP\P]_!_,/?T\0\P]_5R#S#W]?,/,/ +M?V=`\P]_;U#S#W]W8/,/?W]P@>F`````]\&`____=9"#^2!R(X/N((/O(/,/ +M;P;S#V].$/,/?P?S#W]/$(/I(/?!X/___W7=]\'\____=!6#[P2#[@2+!HD' +M@^D$]\'\____=>N%R70/@^\!@^X!B@:(!X/I`77QBT0D#%Y?P^L#S,S,B\:# +MX`^%P`^%XP```(O1@^%_P>H'=&:-I"0`````B_]F#V\&9@]O3A!F#V]6(&8/ +M;UXP9@]_!V8/?T\09@]_5R!F#W]?,&8/;V9`9@]O;E!F#V]V8&8/;WYP9@]_ +M9T!F#W]O4&8/?W=@9@]_?W"-MH````"-OX````!*=:.%R71?B]'!Z@6%TG0A +MC9L`````\P]O!O,/;TX0\P]_!_,/?T\0C78@C7\@2G7E@^$?=#"+P<'I`G0/ +MBQ:)%X/'!(/&!(/I`77QB\B#X0-T$XH&B`=&1TEU]XVD)`````"-20"+1"0, +M7E_#C:0D`````(O_NA`````KT"O*48O"B\B#X0-T"8H6B!=&1TEU]\'H`G0- +MBQ:)%XUV!(U_!$AU\UGIZ?[__U6+[%>+?0B`?P0`=$B+#X7)=$*-40&*`4&$ +MP'7Y*\I35HU9`5/H]1<``(OP687V=!G_-U-6Z.9F``"+10R+SH/$##/VB0C& +M0`0!5NC*%P``65Y;ZPN+30R+!XD!QD$$`%]=PU6+[%:+=0B`?@0`=`C_-NBC +M%P``68,F`,9&!`!>7+?0R+!H/X_G0-BTX$ +M`\\S##CHR\W__XM&"(M.#`//,PPX7UY=Z;C-___,S,S,S,S,S,S,S,S,S%6+ +M[(/L'%-6BW4,5\9%_P#'1?0!````BUX(C480,QUHYD,`4%.)1>R)7?CHD/__ +M_XM]$%?HQQ```(M%"(/$#/9`!&8/A;H```")1>2-1>2)?>B+?@R)1OR#__X/ +MA,D```"-1P*-!$>+3(,$C02#BQB)1?"%R71EC580Z(\1``"Q`8A-_X7`>&9^ +M58M%"($X8W-MX'4W@SW(54,``'0N:,A50P#HV/@``(/$!(7`=!J+-3KV!O`@\@!7,_96Z!!D``!97E?_%00P +M0P!?B\-;PVA`(T(`Z&$1``"C@.9#`%F#^/]U`S+`PVA4$$8`4.CV$0``65F% +MP'4'Z`4```#KY;`!PZ&`YD,`@_C_=`Y0Z&(1``"##8#F0P#_6;`!P\S,S,S, +MS%6+[(/L!%-1BT4,@\`,B47\BT4(5?]U$(M-$(MM_.C)$P``5E?_T%]>B]U= +MBTT058OK@?D``0``=06Y`@```%'HIQ,``%U96\G"#`#,S,S,:@AHR+E#`.@$ +MR___BT4(AX$X8W-MX'5S@W@0`W5M@7@4(`63&702@7@4(063&70)@7@4 +M(@63&752BT@#9?P`4O]P&.C/"```QT7\_O___^LN,\`X +M10P/E<##BV7HZ")0``#V`1!T&(M`&(L(AC2]_[_QP;054,`B\9>7<($`(-A +M!`"+P8-A"`#'003854,`QP'054,`P\S,S,S,S,S,S,S,S,Q5B^Q6B_&-1@3' +M!FA50P!0Z%+[___V10@!670*:@Q6Z*&___]968O&7EW"!`!J.&B`N4,`Z/?) +M__^+11B)1>2#9<0`BUT,BT/\B474BWT(_W<8C46X4.A6V?__65F)1=#H=_W_ +M_XM`$(E%S.AL_?__BT`4B47(Z&']__^)>!#H6?W__XM-$(E(%(-E_``SP$") +M1<")1?S_=2#_=1S_=1C_=113Z)S6__^#Q!2)1>2#9?P`Z9````#_=>SHWP$` +M`%G#BV7HZ!/]__^#8"``BU44BUT,@7H$@````'\&#[Y#".L#BT,(B47@BWH0 +M,\F)3=@Y2@QV.FO9%(E=W#M$.P2+70Q^(HM=W#M$.PB+70Q_%FO!%(M$.`1` +MB47@BTH(BP3!B47@ZPE!B4W8.TH,2#?<0`=2F%VW0E_W<8Z%38__]9 +MA+?0QT$O]U(/]U'%?_=0CH,P8``(/$$(-]+`#_=0AU`U?K`_]U+.C5 +MUO__5HMU)/\V_W48_W445^@,"```BT8$0&@``0``_W4HB4<(BT4<_W`,_W48 +M_W405_]U".BA_?__@\0L7H7`=`=74.A>UO__7UW#58OLBT4(BP"!.&-S;>!U +M-H-X$`-U,(%X%"`%DQET$H%X%"$%DQET"8%X%"(%DQEU%8-X'`!U#^@"^___ +M,\E!B4@@B\%=PS/`7<-5B^R#[$13BUT,5E>+?1C&1=@`QD7_`(%_!(````!_ +M!@^^0PCK`XM#"(E%^(/X_P^,[@(``#M'!`^-Y0(``(MU"($^8W-MX`^%GP(` +M`(-^$`,/A!U*X-^$`-U)8%^%"`%DQET$H%^%"$%DQET"8%^%"(% +MDQEU"H-^'``/A$("``#H#OK__X-X'`!T0>@#^O__BT`!6 +M@V`<`.AZ`P``65F$P'4>_W7@Z`@$``!9A,`/A`,"``#I`P(``(M-$(E-].L& +MBTWTBT7X@3YCR+6?R%VXE=Y(M=#`^.E@```(M&'(M-[(M`#(L0@\`$B470BT7D +MB57,BWW0B7WPBWT8B57A.!P``@\0,A2)3>R%P'XNBU7,Z[/_==B+1?#_=23& +M1?\!_W4@_W7(_S#_=>Q7_W44_W7T4U;HY/S__X/$+(M5Z(M-X(M%^$*#P12) +M5>B)3>`[5=0/@B;___^`?1P`=`IJ`5;HM/G__UE9@'W_``^%@0```(L')?__ +M_Q\](063&7)S@W\<`'4,]D<@!'1G@WT@`'5A]D<@!'5M_W<<5NC$`0``65F$ +MP'5,Z"KX___H)?C__^@@^/__B7`0Z!CX__^#?20`BTWT5HE(%'5?4^M?BTT0 +M@W\,`'8<@'T<`'4H_W4D_W4@4%?_=1114U;H6@```(/$(.C>]___@W@<`'4' +M7UY;B^5=P^BC20``:@%6Z`CY__]968U-O.BY^?__:%RZ0P"-1;Q0Z!CM____ +M=23H\]+__VK_5_]U%%/H,`0``(/$$/]W'.B:^___S%6+[%%15XM]"($_`P`` +M@`^$^P```%-6Z'#W__^+71B#>`@`=$5J`/\5U#%#`(OPZ%CW__\Y<`AT,8$_ +M34]#X'0I@3]20T/@="'_=23_=2!3_W44_W40_W4,5^CUT/__@\0PP`#X2A````C47\4(U%^%#_=1S_=2!3Z*G1__^+3?B#Q!2+5?P[RG-Y +MC7`,BT4<.T;T?&,[1OA_7HL&BWX$P>`$BWP'](7_=!.+5@2+7`+TBU7\@'L( +M`(M=&'4XBWX$@\?P`\>+?0CV`$!U*&H!_W4DC4[T_W4@46H`4%/_=13_=1#_ +M=0Q7Z-SZ__^+5?R#Q"R+3?B+11Q!@\84B4WX.\IRC5Y;7XOE7%]@^$@@```(L^,]N%_WYQBT4(B].)7?R+0!R+0`R+"(/` +M!(E-\(E%Z(O(BT7PB4WTB47XA+?0@S]CDW?B6+WHM'!&AD[D,` +MBT0#!(/`!%#H4?7__UE9A2% +MP'03B\CHN\#___]5Y(O(ZQ#H0D8``(M%"/;!"'04BT@8A@3A-3T/@=!:!.&-S;>!U(>B(\___@V`8`.E610``Z'KS__^#>!@`?@CH +M;_/___](&#/`7<-J$&A8N4,`Z+"___^+11"!>`2`````BT4(?P8/OG`(ZP.+ +M<`B)=>3H///___]`&(-E_``[=11T7(/^_WY2BTT0.W$$?4J+00B+%/")5>#' +M1?P!````@WSP!`!T)XM%"(E0"&@#`0``4(M!"/]T\`3HZ//__^L-_W7LZ#W_ +M__]9PXMEZ(-E_`"+=>")=>3KI.BK1```QT7\_O___^@4````.W44=>J+10B) +M<`CH4K___\.+=>3HK_+__X-X&`!^".BD\O___T@8PU6+[%-65_]U$.B&`0`` +M6>B,\O__BTT8,_:+50B[____'[\B!9,9.7`@=2*!.F-S;>!T&H$Z)@``@'02 +MBP$CPSO'<@KV02`!#X6G````]D($9G0E.7$$#X28````.74<#X6/````:O]1 +M_W44_W4,Z,7^__^#Q!#K?#EQ#'4:BP$CPSTA!9,9<@4Y<1QU"CO'!U.8-Z$`-R,SEZ%'8NBT(7<.+ZHOQB\%J`>C#!```,\`SVS/),](S___F58OL4U97:@!2:*(S +M0@!1Z-#F``!?7EM=PU6+;"0(4E'_="04Z*G^__^#Q`Q=P@@`5E>_@!!&`#/V +M:@!HH`\``%?H?@(``(/$#(7`=!7_!9@01@"#QAB#QQB#_AARV[`!ZP?H!0`` +M`#+`7U[#5HLUF!!&`(7V="!KQAA7C;AH$$8`5_\5U#!#`/\-F!!&`(/O&(/N +M`77K7[`!7L-5B^RA:.9#`(/@'VH@62O(BT4(T\@S!6CF0P!=PU6+[(M%"#/) +M4U97C1R%K!!&`#/`\`^Q"XL5:.9#`(//_XO*B_*#X1\S\-/.._=T:87V=`2+ +MQNMCBW40.W44=!K_-NA9````687`=2^#Q@0[=11U[(L5:.9#`#/`AM5BQR=Z%5#`%9H``@``&H`4_\5[#%#`(OPA?9U)_\5`#!# +M`(/X5W4-5E93_Q7L,4,`B_#K`C/VA?9U"8/(_X<',\#K$8O&AP>%P'0'5O\5 +MB#!#`(O&7E];7<-5B^Q6:(Q60P!HA%9#`&B,5D,`:@3HQ?[__XOP@\00A?9T +M#_]U"(O.Z`RZ____UEY=PUY=_R7<,4,`58OL5FB@5D,`:)A60P!HH%9#`&H% +MZ(O^__^#Q!"+\/]U"(7V=`N+SNC2N?___];K!O\5Z#%#`%Y=PU6+[%9HL%9# +M`&BH5D,`:+!60P!J!NA1_O__@\00B_#_=0B%]G0+B\[HF+G____6ZP;_%>`Q +M0P!>7<-5B^Q6:,160P!HO%9#`&C$5D,`:@?H%_[__X/$$(OP_W4,_W4(A?9T +M"XO.Z%NY____UNL&_Q7D,4,`7EW#58OL5FC85D,`:-!60P!HV%9#`&H(Z-K] +M__^+\(/$$(7V=!3_=1"+SO]U#/]U".@;N?___];K#/]U#/]U"/\5V#%#`%Y= +MPZ%HYD,`NM`01@!6@^`?,_9J(%DKR+BL$$8`T\XSR3,U:.9#`#O0&]*#XO># +MP@E!B3"-0`0[RG7V7L-5B^R`?0@`=2=6OIP01@"#/@!T$(,^_W0(_S;_%8@P +M0P"#)@"#Q@2!_JP01@!UX%Y=PZ%HYD,`@^`?:B!9*\@SP-/(,P5HYD,`H]`0 +M1@##S,S,S,S,S,S,S,S,S,S,58OL4U9756H`:@!H2#="`/]U".@JXP``75]> +M6XOE7<.+3"0$]T$$!@```+@!````=#*+1"04BTC\,\CHBK?__U6+:!"+4"A2 +MBU`D4N@4````@\0(78M$)`B+5"00B0*X`P```,-35E>+1"0055!J_FA0-T(` +M9/\U`````*%HYD,`,\10C40D!&2C`````(M$)"B+6`B+<`R#_O]T.H-\)"S_ +M=`8[="0L=BV--':+#+.)3"0,B4@,@WRS!`!U%V@!`0``BT2S".A)````BT2S +M".A?````Z[>+3"0$9(D-`````(/$&%]>6\,SP&2+#0````"!>010-T(`=1"+ +M40R+4@PY40AU!;@!````PU-1NY#F0P#K"U-1NY#F0P"+3"0,B4L(B4,$B6L, +M55%06%E=65O"!`#_T,-6Z._J__^+<`2%]G0)B\[H);?____6Z+$\``#,B_]5 +MB^R+10AFBPB#P`)FAEM4```B_]5B^R+50Q6BW4(5P^W.@^W#BO/=14K\F:%_W0.@\("#[06#R/]=PS/`A#`[ +M\W8LZV*+A8S[__^#R`!T4X7;=!N%]GD',\!FB0?K$(N%F/O__SO#=%`SR6:) +M#$>-C>3[___HY00``("]B/O__P!T#8N-?/O__X.A4`,``/U?B\9>BTW\,\U; +MZ)&R__^+Y5W#A=MU!8/._^O#BX68^___.\-ULVK^7C/`9HE$7_[KK8.Y!`0` +M``!U!K@``@``PXN!``0``-'HPXO_58OL48/(_S/25HMU"/?V5X/@_HOY@_@" +MB^5=P@0`B_]5B^R+111(@^@!="Z#Z`%T)8/H"70@@WT4 +M#70>BD40/&-T"#QS=`0RR>L"L0$SP(3)#Y3`7<.P`5W#,L!=PXO_58OLBT44 +M2(/H`70]@^@!=#2#Z`ET+X-]%`UT*8M%"#/)@^`$L@$+P74"BM%F@WT08W0' +M9H-]$'-U`K$!,\`ZT0^4P%W#L`%=PS+`7<.+_U:+\5>+O@0$``#HPO[__X7_ +M=00#QNL"`\=?7L.+_U6+[%-6B_%7C4Y`B[D$!```A?]U`HOYZ)?^__^+70A( +M`_B)?C2+3BB%R7\$A=MT,#/2B\/W=0Q)@,(PB4XHB]B`^CE^$8!]$``/E,#^ +MR"3@!&$L.@+0BT8TB!#_3C3KQ8M&-"OXB7XX0%^)1C1>6UW"#`"+_U6+[%%1 +M4U:+\5>-3D"+N00$``"%_W4"B_GH(/[__XM5#$B+70@#^(E^-(M.*(7)?P:+ +MPPO"=#IJ`/]U$(U!_U)3B48HZ&G=``"`P3")7?R+V(#Y.7X1@'T4``^4P/[( +M).`$82PZ`LB+1C2("/].-.NYBT8T*_B)?CA`7XE&-%Y;B^5=PA``B_]5B^Q6 +M,_8Y=1!^'%>+?12+30A7_W4,Z$D8``"#/_]T!D8[=1!\Z5]>7<.+_U6+[%8S +M]CEU$'XA4V8/OET,5XM]%(M-"%=3Z%L8``"#/_]T!D8[=1!\ZU];7EW#B_]5 +MB^Q1,\")3?R)`8E!!(E!"(E!#(E!$(E!%(E!&(E!'(E!((E!)(E!*&:)03") +M03B(03R)@4`$``")@40$``"+P8OE7<.+_U6+[%$STHE-_#/`B1%FB4$RB\&) +M402)40B)40R)41")412)41B)41R)42")422)42B(43")43B(43R)D4`$``") +MD40$``"+Y5W#B_]5B^Q6B_'H8/___XM%"(L`B89(!```BT4,B0:+11")1@2+ +M11B)1@B+112)1A"+11R)1A2+QEY=PA@`B_]5B^Q6B_'H:____XM%"(L`B89( +M!```BT4,B0:+11")1@2+11B)1@B+112)1A"+11R)1A2+QEY=PA@`B_]5B^Q6 +M_W42P`` +MB48,B\9>7<(8`(O_58OL5XOYBTT(QD<,`(7)=`J+`8E'!(M!!.L6H6P21@"% +MP'42H1#H0P")1P2A%.A#`(E'".M$5NC140``C5<$B0=2C7<(BTA,B0J+2$A0 +MB0[H#5,``%;_-^@R4P``BP^#Q!"+@5`#``!>J`)U#8/(`HF!4`,``,9'#`&+ +MQU]=P@0`B_]6B_'_M@0$``#HQ48``(.F!`0```!97L.+_U6+[%:+\?\VZ*Q& +M``"+50B#)@!9BP*)!HO&@R(`7EW"!`"+_U6+[(M%#(M-"%.+`(N`B````(L` +MBACK!3K#=`=!B@&$P'7UB@%!A,!T*.L)/&5T"SQ%=`=!B@&$P'7QB]%)@#DP +M=/HX&74!28H"04*(`83`=?9;7<.+_U6+[(I-"(U!X#Q:=P\/OL$/MH@X7D,` +M@^$/ZP(SR8M%#`^VA,A87D,`P>@$7<((`(O_58OLBTT(C4'@9H/X6G)1A"P`>L",L"#/P!U!H7;=`*)'U]>6XOE7<($`(O_5HOQ +MC8Y(!```Z-43``"$P'4%@\C_7L-3,]LY7A`/A;L```#H%DD``,<`%@```.CJ +M1P``@\C_Z;D```")7CB)7ASIA0```/]&$#E>&`^,C````/]V'`^V1C&+SE#H +M(?[__XE&'(/X"'2Z@_@'=\7_)(4V1$(`B\[H.`(``.M%@TXH_XE>)(A>,(E> +M((E>+(A>/.LXB\[HH`$``.LGB\[HMPH``.L>B5XHZR&+SNCG`@``ZQ"+SN@O +M`P``ZP>+SN@+!@``A,`/A&C___^+1A"*`(A&,83`#X5K_____T80_X90!``` +M@[Y0!````@^%2O___XM&&%M>PXU)`+%#0@"Z0T(`ST-"`-A#0@#A0T(`YD-" +M`.]#0@#X0T(`B_]6B_&-CD@$``#HN1(``(3`=06#R/]>PU,SVSE>$`^%P``` +M`.CZ1P``QP`6````Z,Y&``"#R/_IO@```(E>.(E>'.F&````@T80`CE>&`^, +MD````/]V'`^W1C*+SE#H-OW__XE&'(/X"'2Y@_@'=\3_)(5614(`B\[H.@$` +M`.M%@TXH_XE>)(A>,(E>((E>+(A>/.LXB\[HP````.LGB\[HQ0D``.L>B5XH +MZR&+SNCR`0``ZQ"+SNA[`P``ZP>+SN@=!P``A,`/A&?___^+1A`/MP!FB48R +M9H7`#X5G____@T80`O^&4`0``(.^4`0```(/A47___^+1AA;7L.+_\Y$0@#7 +M1$(`[$1"`/5$0@#^1$(``T5"``Q%0@`514(`#[Y!,8/H('0M@^@#="*#Z`AT +M%TB#Z`%T"X/H`W4<@TD@".L6@TD@!.L0@TD@`>L*@TD@(.L$@TD@`K`!PP^W +M03*#Z"!T+8/H`W0B@^@(=!=(@^@!=`N#Z`-U'(-)(`CK%H-)(`3K$(-)(`'K +M"H-)("#K!(-)(`*P`PXU&&%`/MD8QC8Y(!```4.CF$```L`%>PXU1&,9!/`%2#[=1,H'!2`0` +M`%+H#!$``+`!PXO_5HOQ5[\`@```BT8(BDXQQD8\``^VT8L`BP!FA3Q0=#B- +M1AA048V.2`0``.B5$```BTX0B@&(1C&-00&`?C$`B480=13HO$4``,<`%@`` +M`.B01```,L#K`K`!7U["!`"`>3$J=`J-02A0Z)W[___#@T$4!(M!%(M`_(E! +M*(7`>02#22C_L`'#9H-Y,BIT"HU!*%#HT/O__\.#010$BT$4BT#\B4$HA2P`=>L```"+01"` +M.&AU$$#'02P!````B4$0Z=,```#'02P"````Z<<```#'02P-````Z;L```#' +M02P(````Z:\```"+41"*`CPS=1B`>@$R=1*-0@+'02P*````B4$0Z8X````\ +M-G45@'H!-'4/C4("QT$L"P```(E!$.MU/&1T%#QI=!`\;W0,/'5T"#QX=`0\ +M6'5=QT$L"0```.M4QT$L!0```.M+@_AL="J#^'1T'(/X=W0.@_AZ=3?'02P& +M````ZR['02P,````ZR7'02P'````ZQR+01"`.&QU#4#'02P$````B4$0ZP?' +M02P#````L`'##[=!,H/X1G4:BP&#X`B#R``/A6(!``#'01P'````Z8@#``"# +M^$YU)HL!:@A:(\*#R``/A4$!``")41SHK$,``,<`%@```.B`0@``,L##@WDL +M`'7G@_AJ#X_-````#X2^````@_A)=%.#^$QT0H/X5'0Q:FA:.\(/A?P```"+ +M01!F.1!U$H/``L=!+`$```")01#IX@```,=!+`(```#IU@```,=!+`T```#I +MR@```,=!+`@```#IO@```(M1$`^W`H/X,W499H-Z`C)U$HU"!,=!+`H```") +M01#IF@```(/X-G469H-Z`C1U#XU"!,=!+`L```")01#K?X/X9'09@_AI=!2# +M^&]T#X/X=70*@_AX=`6#^%AU8<=!+`D```#K6,=!+`4```#K3VIL6CO"="J# +M^'1T'(/X=W0.@_AZ=3G'02P&````ZS#'02P,````ZR?'02P'````ZQZ+01!F +M.1!U#X/``L=!+`0```")01#K!\=!+`,```"P`<.+_U6+[%%35HOQ,]M#,\D/ +MOD8Q@_AD?VP/A),```"#^%A_/G0W@_A!#X23````@_A#=#Z#^$1^'8/X1P^. +M@````(/X4W4/B\[HH0L``(3`#X6?````,L#IS0$``%-J$.M7@^A:=!6#Z`=T +M5DB#Z`%UY%&+SNA8"```Z]*+SNB]!```Z\F#^'!_370_@_AG?C&#^&ET'(/X +M;G0.@_AO=;:+SN@1"P``ZZ6+SNB4"@``ZYR#3B`046H*B\[H.@D``.N,B\[H +M/04``.N#B\[H!0L``.EW____@^AS#X1G____2(/H`730@^@##X5G____4>EI +M____@'XP`'0'BL/I*`$``(M6(#/`5V:)1?R+^(A%_HO"P>@$A,-T)XO"P>@& +MA,-T!L9%_"WK%H33=`;&1?PKZPR+PM'HA,-T!L9%_""+^XI.,8#Y>'0%@/E8 +M=0F+PL'H!83#=0(RVX#Y870)@/E!=`0RP.L"L`&$VW4$A,!T)\9$/?PP@/E8 +M=`F`^4%T!#+`ZP*P`83`#Y3`_L@DX`1XB$0]_8/'`HM>)"M>."O?]L(,=1:- +M1AA04XV&2`0``&H@4.@3\___@\00_W8,C4884%>-1?R-CD@$``!0Z!@-``"+ +M3B"-?AB+P<'H`Z@!=!O!Z0+VP0%U$U=3C89(!```:C!0Z-+R__^#Q!!J`(O. +MZ+,+``"#/P!\'8M&(,'H`J@!=!-74XV&2`0``&H@4.BG\O__@\00L`%?7EN+ +MY5W#B_]5B^R#[`RA:.9#`#/%B47\4U:+\3/;:D%::E@/MT8R68/X9']K#X22 +M````.\%_/G0V.\(/A)0```"#^$-T/X/X1'X=@_A'#XZ!````@_A3=0^+SNC8 +M"0``A,`/A:`````RP.GD`0``:@%J$.M7@^A:=!6#Z`=T5DB#Z`%UXU.+SNBK +M!@``Z]&+SNCC`@``Z\B#^'!_370_@_AG?C&#^&ET'(/X;G0.@_AO=;6+SNC4 +M"```ZZ2+SNA7"```ZYN#3B`04VH*B\[H_08``.N+B\[H6@0``.N"B\[HR`@` +M`.EV____@^AS#X1F____2(/H`730@^@##X5F____4^EI____.%XP#X5``0`` +MBU8@,\E7B\*)7?3!Z`1!9HE=^&H@7X3!="B+PL'H!H3!=`EJ+5AFB47TZQ2$ +MT70$:BOK\8O"T>B$P70&9HE]](O9#[=.,H/Y>'0(:EA89CO(=0V+PL'H!:@! +M=`2T`>L",N2#^6%T#&I!7V8[SW0$,L#K`K`!:C!?A.1U!(3`=#!J6%AFB7Q= +M]&8[R'0,:D%89CO(=`0RP.L"L`&$P`^4P/[().`$>&:89HE$7?:#PP*+?B0K +M?C@K^_;"#'46C4884%>-AD@$``!J(%#H[/#__X/$$/]V#(U&&%!3C47TC8Y( +M!```4.A8"P``BTX@C5X8B\'!Z`.H`70;P>D"]L$!=1-35XV&2`0``&HP4.BK +M\/__@\00:@"+SN@'"@``@SL`?!V+1B#!Z`*H`7034U>-AD@$``!J(%#H@/#_ +M_X/$$%^P`8M-_%XSS5OH:*#__XOE7<.`>3$J=`J-0210Z-OS___#@T$4!(M! +M%(M`_(E!)(7`>0>#22`$]UDDL`'#9H-Y,BIT"HU!)%#H"_3__\.#010$BT$4 +MBT#\B4$DA#1A0$BT84BWC\A?]T-HM? +M!(7;="__=BP/MD8Q4/]V!/\VZ+/M__^#Q!")7C2$P`^W!W0+T>B)1CC&1CP! +MZQ>)1CCK#L=&-+1>0P#'1C@&````QD8\`%]>L`%;PXO_4U:+\5>#1A0$BT84 +MBWC\A?]T-HM?!(7;="__=BP/MT8R4/]V!/\VZ)#M__^#Q!")7C2$P`^W!W0+ +MT>B)1CC&1CP!ZQ>)1CCK#L=&-+1>0P#'1C@&````QD8\`%]>L`%;PXO_58OL +M45%6B_%7@TX@$(M&*(7`>1V*1C$\870-/$%T"<=&*`8```#K'<=&*`T```#K +M%'42BD8Q/&=T!#Q'=0?'1B@!````BT8HC7Y`4[M=`0``B\\#PU#H..S__X3` +M=0R+S^@5[/__*\.)1BB+AP0$``"%P'4"B\>#9?@`@V7\`(E&-(-&%`B+3A2+ +M0?B)1?B+0?R+SXE%_.C?Z___BY\$!```B\B%VW4"B]__=@@/OD8Q_W8$_S;_ +M=BA048O/Z.;L__]0B\_HL>O__U"-1?A34.A)3```BT8@@\0HP>@%6Z@!=!.# +M?B@`=0W_=@C_=C3H'_'__UE9BD8Q/&=T!#Q'=1>+1B#!Z`6H`74-_W8(_W8T +MZ$#P__]968M&-(`X+74(@TX@0$")1C2+5C2*`CQI=`P\270(/&YT!#Q.=03& +M1C%SC7H!B@I"A,EU^2O7L`%?B58X7HOE7<.+_U6+[%%15E>+\6IG66I'@TX@ +M$(M&*%J%P'D@#[=&,H/X870.@_A!=`G'1B@&````ZR#'1B@-````ZQ=U%0^W +M1C)F.\%T!68[PG4'QT8H`0```(M&*(U^0%.[70$``(O/`\-0Z-+J__^$P'4, +MB\_HK^K__RO#B48HBX<$!```A>K__XN?!`0``(O(A=MU`HO?_W8(#[Y&,O]V!/\V_W8H +M4%&+S^B`Z___4(O/Z$OJ__]0C47X4U#HXTH``(M&((/$*,'H!5NH`703@WXH +M`'4-_W8(_W8TZ+GO__]960^W1C)J9UEF.\%T"&I'668[P747BT8@P>@%J`%U +M#?]V"/]V-.C1[O__65F+1C2`."UU"(-.($!`B48TBU8TB@(\:70,/$ET"#QN +M=`0\3G4':G-89HE&,HUZ`8H*0H3)=?DKU[`!7XE6.%Z+Y5W#B_]6B_%7_W8L +M#[9&,5#_=@3_-N@WZO__@\00C7Y`A,!T.8-&%`2+1A13BY\$!```#[=`_(7; +M=0*+WU"+S^AOZ?__4(U&.%-0Z/([``"#Q!!;AP@0` +MB_]5B^Q14U:+\5?&1CP!@T84!(M&%/]V+`^W6/P/MT8R4/]V!/\VZ-/I__^# +MQ!"-?D"$P'4RBX\$!```B%W\B$7]A17&1C`!ZP^+AP0$``"%P'4"B\=FB1B+AP0$``"%P'0"B_B)?C2P +M`5_'1C@!````7EN+Y5W"!`"+_U6+[%-6B_'_=BSHV?K__UF+V(O+@^D!='B# +MZ0%T5DF#Z0%T,X/I!'07Z$@$J`&+1A2+2/B+4/SK6(M&((-&%`3!Z`2H`8M&%'0%BT#\ZS^+2/PSTNL[ +MBT8@@T84!,'H!*@!BT84=`8/OT#\ZR$/MT#\ZQN+1B"#1A0$P>@$J`&+1A1T +M!@^^0/SK!`^V0/R9B\A7BWX@B\?!Z`2H`707A=)_$WP$A@'J`%T&H-^ +M.`!T"(M&-(`X,'0,_TXTBTXTQ@$P_T8XL`%>6UW""`"+_U:+\5>#1A0$BT84 +MBWC\Z()*``"%P'44Z`\W``#'`!8```#HXS4``#+`ZT3_=BSH:_G__UF#Z`%T +M*X/H`70=2(/H`700@^@$=)5P3K%8M&&(D'ZPYFBT889HD'ZP6* +M1AB(!\9&,`&P`5]>PXM1((O"P>@%J`%T"8'*@````(E1(&H`:@CH)/[__\-J +M`6H0QT$H"````,=!+`H```#H#/[__\.+_U-6B_%7@T84!(M&%(M^*(M8_(E> +M-(/__W4%O____W__=BP/MD8Q4/]V!/\VZ/_F__^#Q!"$P'0:A=MU!\=&-+Q> +M0P!7_W8TQD8\`>@=$@``ZQ2%VW4'QT8TM%Y#`%?_=C3HX!```%E97XE&.+`! +M7EO#B_]35HOQ5X-&%`2+1A2+?BB+6/R)7C2#__]U!;____]__W8L#[=&,E#_ +M=@3_-NC,YO__@\00A,!T'(7;=0?'1C2\7D,`5_]V-,9&/`'HJA$``%E9ZQ6% +MVW4'QT8TM%Y#`&H`5XO.Z`D```!?B48XL`%>6\.+_U6+[%97B_DS]HM7-#EU +M"'XE4XH"A,!T'0^VR+L`@```BT<(BP"+`&:%'$AT`4)"1CMU"'S=6U^+QEY= +MP@@`@SD`=1/H434``,<`%@```.@E-```,L##L`'#B_]5B^R+T8L*BT$(.T$$ +MBT4,=12`>0P`=`3_`.L#@PC_BP**0`SK%O\`BP+_0`B+`HL(BD4(B`&+`O\` +ML`%=P@@`B_]5B^R+T8L*BT$(.T$$BT4,=12`>0P`=`3_`.L#@PC_BP**0`SK +M&?\`BP+_0`B+`HL(9HM%"&:)`8L"@P`"L`%=P@@`B_]5B^R#[!"A:.9#`#/% +MB47\4U:+\5>`?CP`=%V+1CB%P'Y6BWXT,]N%P'1E#[<'C7\"@V7P`%!J!HU% +M]%"-1?!0Z!(W``"#Q!"%P'4F.47P="'_=@R-1AA0_W7PC47T4(V.2`0``.C& +M````0SM>.'6[ZQZ#3AC_ZQC_=@R-1AA0_W8XC8Y(!```_W8TZ*````"+3?RP +M`5]>,\U;Z)B6__^+Y5W"!`"+_U6+[%%14U:+\5>`?CP`=5:+1CB%P'Y/BUXT +M,_^%P'1>,\!FB47\BT8(4(L`_W`$C47\4U#H0C0``(/$$(E%^(7`?AV-3AA1 +M_W7\C8Y(!```Z+W^__\#7?A'.WXX=<+K'H-.&/_K&/]V#(U&&%#_=CB-CD@$ +M``#_=C3HG@```%]>L`%;B^5=P@0`B_]5B^Q14597BWT4B\&)1?B+#X,G`(L` +MB4W\BW`$.7`(=1B`>`P`=`J+31"+10P!`>M*BT40@PC_ZT4K<`A3BUT,._-R +M`HOS5O]U"/\PZ`J>__^+3?B#Q`R+`0$PBP$!<`B+`8!X#`"+11!T!`$8ZPL[ +M\W0%@PC_ZP(!,%N+3?R#/P!U!H7)=`*)#U]>B^5=PA``B_]5B^Q145.+712+ +MP5>)1?B+"X,C`(L0B4W\BWH$.7H(=1B`>@P`=`J+31"+10P!`>M1BT40@PC_ +MZTPK>@B+10P[^'("B_A6C30_5O]U"/\RZ'2=__^+3?B#Q`R+`0$PBP%>`7@( +MBP&`>`P`BT40=`>+30P!".L,.WT,=`6#"/_K`@$XBTW\@SL`=0:%R70"B0M? +M6XOE7<(0`(O_58OL_W4@_W4<_W48_W44_W40_W4,_W4(Z$S?__^#Q!Q=PXO_ +M58OL_W4@_W4<_W48_W44_W40_W4,_W4(Z*3@__^#Q!Q=P\S,S,S,S,S,B_]5 +MB^R#[!"-1?A0_Q7P,4,`A7<.+_U6+[(M-$%>+?0B%R70MBU4,*]GSJQ/)9O.KBT4(7UW#B_]5B^R+10@SR5-6 +M5V8Y"'0LBW4,#[<^B\YFA?]T%0^W&(O79CO3=!>#P0(/MQ%FA=)U\(/``C/) +M9CD(==HSP%]>6UW#B_]5B^R+10B9,\(KPEW#B_]5B^Q14:%HYD,`,\6)1?R+ +M10Q7BWT0A1&+10R+WBO:A?^+??AU#$_K"8M]^(T$%HE% +M##O#=J\S]HO&7EN+3?PSS5_H@I+__XOE7<.%_W3GBTT84/]U"/\58#)#`/]5 +M&(OP]]Y9&_;WUB-U#%GKRLR+_U6+[%&A:.9#`#/%B47\BTT(4XM=##O9=FR+ +M11!65XT4`8ORB_D[\W>7UZ+3?PSS5OHR)'__XOE7M>7UW#S,S,S,S,S(O_58OL@>P<`0``H6CF0P`SQ8E%_(M-"(M5#(F- +M_/[__U:+=12)M0#___]7BWT0B;T$____A@AD?__B^5=PX7_=-R%]G38QX7X_O__`````(/Z`@^"$@,` +M`$H/K]=3`]&)E0C___^+PC/2*\'W]XU8`8/["'<65E?_M0C___]1Z'W^__^# +MQ!#IMP(``-'K#Z_?`]E348O.B9WP_O___Q5@,D,`_]:#Q`B%P'X05U/_M?S^ +M___HZ/[__X/$#/^U"/___XO._[7\_O___Q5@,D,`_]:#Q`B%P'X55_^U"/__ +M__^U_/[__^BV_O__@\0,_[4(____B\Y3_Q5@,D,`_]:#Q`B%P'X05_^U"/__ +M_U/HCO[__X/$#(N%"/___XOXB[7\_O__BY4$____B87L_O__D#O>=C<#\HFU +M]/[__SOS+ +MSO\58#)#`/_6@\0(AC^__^) +MO>3^__\[]W0SB]Z+UXNUZ/[__RO?B@*-4@&*3!/_B$03_XA*_X/N`77KB[7T +M_O__BYWP_O__BY4$____BX4(____.]\/A?K^__^+WHF=\/[__^GM_O__`_H[ +MWW,RC:0D`````"OZ._MV)8N-`/___U-7_Q5@,D,`_Y4`____BY4$____@\0( +MA+SO\58#)#`/_6BY4$____@\0( +MA+O03____I*_W__XNU`/___^L&B[T$____BX7X_O__@^@!B87X_O__>!:+ +MC(4,____BU2%A(F-_/[__^GV_/__6XM-_%\SS5[HY(W__XOE76\/,S,S,S,S, +MS(M,)`Q7A#ZP%U[8M$)!!;7E_#]\<#````=!:(!X/'`8/I`0^$F````/?' +M`P```'7JB]G!Z0)U=(@'@\]\(``/\`=`SWP@```/]U +MQ(D7ZQB!XO__``")%^L.@>+_````B1?K!#/2B1>#QP0SP(/I`70,,\")!X/' +M!(/I`77V@^,##X5W____BT0D$%M>7\.+_U6+[(M5"(O"5KX`_P``B\HCQL'A +M$`/!B\K!Z0@CSL'@"`/!P>H8`\)>7<.+_U6+[(/L'(U-Y%/_=1#H$=W__XM= +M"('[``$``'-+C47H4%/H:P(``%E9A,!T)(!]\`"+1>B+@)@````/M@P8=`J+ +M1>2#H%`#``#]B\'I\@```(!]\`!T"HM-Y(.A4`,``/V+P^G;````,\!FB47\ +MB$7^BT7H@W@$`7XNB\.-3>C!^`B)1?11#[;`4.A+/@``65F%P'03BT7TB$7\ +M,\!J`HA=_8A%_EGK%NA**```,\G'`"H````SP(A=_$&(1?UFB47XC57XB$7Z +MBT7H:@'_<`AJ`U)1C4W\4?]U#/^PJ````(U%Z%#H&$$``(/$)(7`=1@X1?`/ +MA&?___^+1>2#H%`#``#]Z5C___^#^`%U%H!]\``/MD7X="N+3>2#H5`#``#] +MZQ\/ME7X#[9%^<'B"`O0@'WP`'0*BTWD@Z%0`P``_8O"6XOE7<.+_U6+[(/L +M'(U-Y%/_=1#HQ]O__XM="('[``$``'-+C47H4%/H/@$``%E9A,!T)(!]\`"+ +M1>B+@)0````/M@P8=`J+1>2#H%`#``#]B\'I\@```(!]\`!T"HM-Y(.A4`,` +M`/V+P^G;````,\!FB47\B$7^BT7H@W@$`7XNB\.-3>C!^`B)1?11#[;`4.@! +M/0``65F%P'03BT7TB$7\,\!J`HA=_8A%_EGK%N@`)P``,\G'`"H````SP(A= +M_$&(1?UFB47XC57XB$7ZBT7H:@'_<`AJ`U)1C4W\4?]U#/^PJ````(U%Z%#H +MSC\``(/$)(7`=1@X1?`/A&?___^+1>2#H%`#``#]Z5C___^#^`%U%H!]\``/ +MMD7X="N+3>2#H5`#``#]ZQ\/ME7X#[9%^<'B"`O0@'WP`'0*BTWD@Z%0`P`` +M_8O"6XOE7<.+_U6+[/]U#&H"_W4(Z%(```"#Q`SWV!O`]]A=PXO_58OL_W4, +M:@'_=0CH-0```(/$#/?8&\#WV%W#B_]5B^R+11"%P'0-BP"+"(M%"`^W!$'K +M#.C*.P``BTT(#[<$2"-%#%W#B_]5B^R+31"%R706BP&#>`0!?@Y1_W4,_W4( +MZ/T[``#K#%'_=0S_=0CHJ/___X/$#%W#B_]5B^S_=0QH``$``/]U".@*_O__ +M@\0,7<.+_U6+[/]U#&@``@``_W4(Z*;\__^#Q`Q=PXO_58OLH6P21@"%P'00 +M:@#_=0CHM/___UE9B\CK#HM-"(U!OX/X&7<#@\$@B\%=PXO_58OLH6P21@"% +MP'00:@#_=0CHGO___UE9B\CK#HM-"(U!GX/X&7<#@\'@B\%=PXO_58OLH1@- +M1@!65X/X!7Q\BW4(B]:#XA]J(%@KPO?:&](CT(M%##O"#X!\K^,7T5\D#^>L/Q?5T +M`<7]U\"%P'4'@\$@.\]U[8M%#`/&ZP:`.0!T!4$[R'7V*\[%^'?IE````(/X +M`7QUBW4(B]:#X@]J$%@KPO?:&](CT(M%##O"#X`\K^`/YZQ(/*`%F#W3!9@_7P(7` +M=0>#P1`[SW7JBT4,`\;K!H`Y`'0%03O(=?8KSNL:BU4(B\J+10P#PCO0=`J` +M.0!T!4$[R'7V*\I?B\%>7<.+_U6+[%&A&`U&`(M-"%97@_@%#XR\````]L$! +M=">+10R+T8T$03O(#X1]`0``,_]F.3H/A'(!``"#P@([T'7PZ68!``"+\8/F +M'VH@6"O&]]X;]B/PBT4,T>X[QG,"B_"-%'$S_XE5_(O1.TW\=`UF.3IT"(/" +M`CM5_'7S*]'1^CO6#X4G`0``C111B\@KSHO!@^`?*\C%]%?)C0Q*ZP_%]74" +MQ?W7P(7`=0>#PB`[T77MBT4(BTT,C0Q(ZPAF.3IT!X/"`CO1=?0KT-'ZQ?AW +MZ=H```"#^`$/C+,```#VP0%T)XM%#(O1C01!.\@/A+@````S_V8Y.@^$K0`` +M`(/"`CO0=?#IH0```(OQ@^8/:A!8*\;WWAOV(_"+10S1[CO&#P@([T77T*]#K'(M%#(O1C01!.\AT#C/_9CDZ=`>#P@([T'7T*]'1^E^+ +MPEZ+Y5W#B_]5B^R+10BH!'0$L`%=PZ@!=!N#X`)T"8%]#````(!WZH7`=0F! +M?0S___]_=]TRP%W#B_]5B^R+10B+31"+50R)$(E(!(7)=`*)$5W#B_]5B^R# +M["B-30Q35^BA[/__A,!T(8M]%(7_=#"#_P)\!8/_)'XFZ.(A``#'`!8```#H +MMB```#/;BU40A=)T!8M-#(D*7XO#6XOE7<-6_W4(C4W8Z.'5__^+10PS]HEU +M](E%Z.L#BT4,BAA`B44,C47<4`^VPVH(4(A=_.B,^___@\0,A1HA=_(EU#.L#BW4,A?]T!8/_ +M$'5XBL,L,#P)=P@/OL.#P-#K(XK#+&$\&7<(#[[#@\"IZQ.*PRQ!/!EW"`^^ +MPX/`R>L#@\C_AL3BL,L03P9=P@/ +MOLN#P1HA=_(EU#.N8_W7\C4T,B57XZ%('``"+7?CVPPAU"HM%Z#/; +MB44,ZT&+=?164^C;_?__65F$P'0HZ"P@``#'`"(```#VPP%U!8/._^L:]L," +M=`>[````@.L0N____W_K"?;#`G0"]]Z+WH!]Y`!>#X0@_O__BT78@Z!0`P`` +M_>D1_O__B_]5B^R#[!R-30Q35^AYZO__A,!T(XM%%&H"7X7`="\[QWP%@_@D +M?B;HN!\``,<`%@```.B,'@``,]N+51"%TG0%BTT,B0I?B\-;B^5=PU;_=0B- +M3>3HM]/__XM%##/VB77XB47TZP.+10P/MS`#QVH(5HE%#.CA.```65F%P'7G +M,]LX71@/E<-F@_XM=00+W^L&9H/^*W4.BWT,#[`7``#K,[@0&```9COPX&O\``&8[\',*#[?&+1#_``#K`X/(_X/X_W4P +M:D%89CO&=PAJ6EAF._!V"8U&GV8[1?QW%(U&GV8[1?P/M\9W`X/H((/`R>L# +M@\C_A#QP*)?0R#^'AT'H/X6'09A#QP*)?0R#R/\STO=U%(O( +M:C!89COP#X)5`@``:CI89COP`7``#K,[@0&```9COPX&O\` +M`&8[\',*#[?&+1#_``#K`X/(_X/X_W4P:D%89CO&=PAJ6EAF._!V"8U&GV8[ +M1?QW%(U&GV8[1?P/M\9W`X/H((/`R>L#@\C_@_C_=#$[111S+(MU^(/+"#OQ +M<@MU!#O"=@6#RP3K"0^O=10#\(EU^`^W-X/'`HE]#.DY_?__5HU-#.B2```` +M]L,(=0J+1?0SVXE%#.M!BW7X5E/H]O;__UE9A,!T*.A'&0``QP`B````]L,! +M=06#SO_K&O;#`G0'NP```(#K$+O___]_ZPGVPP)T`O?>B]Z`??``7@^$9?G_ +M_XM%Y(.@4`,``/WI5OG__XO_58OL_PF*10B+"83`=!0X`700Z.@8``#'`!8` +M``#HO!<``%W"!`"+_U6+[(,!_F:+10B+"6:%P'059CD!=!#HO!@``,<`%@`` +M`.B0%P``7<($`(O_58OL46H!:@I148O$:@#_=0A0Z&OV__^#Q`QJ`.A\]O__ +M@\04B^5=PXO_58OL@WT(`'4$,\!=PXM-"%O__B^5=PVH,:)BZ0P#HPWK__X-EY`!J`.@),@``68-E_`"+ +M-6CF0P"+SH/A'S,U(!%&`-/.B77DQT7\_O___^@+````B\;HT'K__\.+=>1J +M`.@@,@``6<-J#&BXND,`Z&&G``#H<1T``(MP#(7V=!Z#9?P`B\[_%6`R0P#_ +MUNL',\!`PXMEZ,=%_/[____H&!,``,R+_U6+[%%1H6CF0P`SQ8E%_%;HLQT` +M`(OPA?8/A$,!``"+%HO*4S/;5XV"D````#O0=`Z+?0@Y.70)@\$,.\AU]8O+ +MA".L0_W$$B5D(B\__ +M%6`R0P#_UXM%^%F)1@2#R/]?6XM-_#/-7N@<>/__B^5=PXO_58OL,\"!?0AC +MCH-_W_ +M_XMU$&H"Z$LO``!9P^C@( +MJ`%U$/]U"/\5##!#`%#_%B3#HIQ$``(O&Z?0```!35^C@ +M.P``:`0!``"^,!%&`#/_5E?_%?@Q0P"+'>`61@")->@61@"%VW0%@#L`=0*+ +MWHU%](E]_%"-1?R)??105U=3Z+$```!J`?]U]/]U_.@9`@``B_"#Q""%]G4, +MZ%X2``!J#%^)..LQC47T4(U%_%"+1?R-!(905E/H>0```(/$%(-]"`%U%HM% +M_$BCU!9&`(O&B_>CV!9&`(O?ZTJ-1?B)??A05NA.-@``B]A9687;=`6+1?CK +M)HM5^(O/B\(Y.G0(C4`$03DX=?B+QXD-U!9&`(E%^(O?B178%D8`4.A@#0`` +M68E]^%;H5@T``%E?B\-;7HOE7<.+_U6+[%&+1113BUT85HMU"%>#(P"+?1#' +M``$```"+10R%P'0(B3B#P`2)10PRR8A-_X`^(G4-A,FP(@^4P4:(3?_K-?\# +MA?]T!8H&B`='B@9&B$7^#[[`4.@;/@``687`=`S_`X7_=`6*!H@'1T:*1?Z$ +MP'09BDW_A,EUM3P@=`0\"76MA?]T!\9'_P#K`4[&1?\`@#X`#X3"````B@8\ +M('0$/`EU`T;K\X`^``^$K````(M-#(7)=`B).8/!!(E-#(M%%/\`,])",\#K +M`D9`@#Y<=/F`/B)U,:@!=1Z*3?^$R70/C4X!@#DB=02+\>L+BDW_,]*$R0^4 +M1?_1Z.L+2(7_=`3&!UQ'_P.%P'7QB@:$P'0[@'W_`'4(/"!T,3P)="V%TG0C +MA?]T`X@'1P^^!E#H0CT``%F%P'0,1O\#A?]T!8H&B`='_P-&Z7?___^%_W0$ +MQ@<`1_\#Z37___^+30Q?7EN%R70#@R$`BT44_P"+Y5W#B_]5B^Q6BW4(@?[_ +M__\_<@0SP.L]5X//_XM-##/2B\?W=1`[R',-#Z]-$,'F`BO^._EW!#/`ZQF- +M!#%J`5#H7PP``&H`B_#HBPL``(/$#(O&7UY=PXO_58OL7>D'_?__@STX$D8` +M`'0#,\##5E?H!CD``.@!/0``B_"%]G4%@\__ZRI6Z#````!9A+_NL,4.@S +M"@``C7\$BP=9A- +M?@3K$8M-"%;_%6`R0P#_50A9@\8$._=UZXM-_%\SS5[HX'#__XOE7<($`(O_ +M58OLBT4(BP`[!4021@!T!U#H>?___UE=P\S,S,S,B_]5B^R+10B+`#L%0!)& +M`'0'4.A9____65W#:"!^0@"Y.!)&`.AV____:$!^0@"Y/!)&`.AG_____S5$ +M$D8`Z"W_____-4`21@#H(O___UE9P^GP_?__:@QH`+M#`.@-3'1?S^____Z`T```"+QN@@3'1?S^____Z`T```"+QNC/A3BP"+&(7;=0B#R/_IZ0```(L5:.9#`%97BSN+\HM;!(/F'S/Z +MB77LB\XSVM//T\N%_P^$O@```(/__P^$M0```(E]](E=\&H@62O.,\#3R#/" +M@^L$.]]R8#D#=/6+,XM-[#/RT\Z+SHD#_Q5@,D,`_]:+1>B+%6CF0P"+\H/F +M'XEU[(L`BP"+"(M`!#/*B4WX,\*+SM--^-/(BTWX.TWT=0MJ(%D[1?!TH(M- +M^(E-](OYB47PB]CKCH/__W0-5^A[!P``BQ5HYD,`68O",]*#X!]J(%DKR-/* +MBTWH,Q5HYD,`BP&+`(D0BP&+`(E0!(L!BP")4`A?,\!>BTW\,\U;Z#9N__^+ +MY5W#B_]5B^R#[`R+P8E%^%:+`(LPA?9U"(/(_^D>`0``H6CF0P"+R%.+'H/A +M'U>+?@0SV(MV"#/X,_#3S]/.T\L[_@^%M````"OSN``"``#!_@([\'<"B\:- +M/#"%_W4#:B!?._YR'6H$5U/H[C@``&H`B47\Z+\&``"+3?R#Q!"%R74H:@2- +M?@174^C..```:@")1?SHGP8``(M-_(/$$(7)=0B#R/_ID0```(T$L8O9B47\ +MC32YH6CF0P"+??R#X!]J(%DKR#/`T\B+SS,%:.9#`(E%](O&*\>#P`/!Z`([ +M]QO2]](CT(E5_'00BU7T,\!`B1&-200[1?QU]8M%^(M`!/\PZ+K]__]3B0?H +M4K+__XM=^(L+BPF)`8U'!%#H0++__XL+5HL)B4$$Z#.R__^+"X/$$(L)B4$( +M,\!?6UZ+Y5W#B_]5B^S_=0AH2!)&`.A>````65E=PXO_58OL48U%"(E%_(U% +M_%!J`N@#_?__65F+Y5W#B_]5B^Q6BW4(A?9U!8/(_^LHBP8[1@AU'Z%HYD,` +M@^`?:B!9*\@SP-/(,P5HYD,`B0:)1@2)1@@SP%Y=PXO_58OL45&-10B)1?B- +M10R)1?R-1?A0:@+HROS__UE9B^5=P\S,S&A8YT,`N9`21@#H40$``+`!P\S, +MS,S,S,S,S,S,S,S,:$@21@#HZ%5J +M__^+Y5W#B_]5B^S_=0CHT_K__UFC9!)&`%W#B_]35NC9,```BS7@%D8`A?9U +M!;YH$D8`,MN*!CP@?PB$P'0JA-MT(#PB=06$VP^4PP^^P%#H,S0``%F%P'0! +M1D;KUSP@?P=&B@:$P'7UB\9>6\.+_U6+[%%1H6CF0P`SQ8E%_(M%#%-6BW4( +M*\:#P`-7,__!Z`(Y=0P;V_?3(]AT'(L&B47XA2+3?Q?7C/-6^B1:?__B^5=PXO_58OL4:%HYD,`,\6)1?Q6BW4(5^L7 +MBSZ%_W0.B\__%6`R0P#_UX7`=0J#Q@0[=0QUY#/`BTW\7S/-7NA,:?__B^5= +MPXO_58OLBT4(/0!```!T(ST`@```=!P]```!`'05Z*8&``#'`!8```#H>@4` +M`&H66%W#N0`71@"'`3/`7<,SP+EL$D8`0(#X?WK`X/)`HF.4`,``.L'@PV@[4,`_UY=PZ%P$D8`PXO_58OL +MBT4(A7<.+_U6+[(-]"`!U!#/`7<.+30B-40&*`4&$P'7Y*\I35XU9`5/H +M++'__XOX687_=01?6UW#_W4(4U?H&````(/$#(7`=02+Q^OG,\!04%!04.C& +M`P``S(O_58OLBU4(5H72=!&+30R%R70*BW40A?9U%\8"`.BS!```:A9>B3#H +MB`,``(O&7EW#5XOZ*_**!#Z(!T>$P'0%@^D!=?%?AP61@#_%0`R0P"%P'485NA6!```B_#_ +M%0`P0P!0Z,\#``!9B09>7<.+_U6+[%:+=0B#_N!W,(7V=1=&ZQ3H8O[__X7` +M="!6Z$'L__]9AC_`P``QP`,```` +M,\!>7P6 +M1@#_%00R0P"%P'39ZPWH7P,``,<`#````#/`7EW#B_]5B^Q7BWT(A?]U"_]U +M#.C]_O__6>LD5HMU#(7V=0E7Z++^__]9ZQ"#_N!V)>@A`P``QP`,````,\!> +M7UW#Z$K]__^%P'3F5N@IZ___687`=-M65VH`_S7L%D8`_Q4(,D,`A:?__66I0C87@_/__ +M:@!0Z"QL__]HS`(``(V%,/W__VH`4.@9;/__C87@_/__@\08B878_/__C84P +M_?__B87<_/__B87@_?__B8W<_?__B978_?__B9W4_?__B;70_?__B;W,_?__ +M9HR5^/W__V:,C>S]__]FC)W(_?__9HR%Q/W__V:,I<#]__]FC*V\_?__G(^% +M\/W__XM%!(F%Z/W__XU%!(F%]/W__\>%,/W__P$``0"+0/R)A>3]__^+10R) +MA>#\__^+11")A>3\__^+102)A>S\____%:PQ0P!J`(OX_Q6T,4,`C878_/__ +M4/\5L#%#`(7`=1.%_W4/@WT(_W0)_W4(Z)=H__]9BTW\,\U?Z#1D__^+Y5W# +MB_]5B^S_=0BY>!)&`.@D^?__7<.+_U6+[%&A:.9#`#/%B47\5NA%"```A +MZ-%C__^+Y5W#_W48BS5HYD,`B\[_=10S-7@21@"#X1__=1#3SO]U#/]U"(7V +M=;[H$0```,PSP%!04%!0Z'G___^#Q!3#:A?H_(X``(7`=`5J!5G-*59J`;X7 +M!`#`5FH"Z`;^__^#Q`Q6_Q4,,$,`4/\5S#%#`%[#B_]5B^R#[!#_=0R-3?#H +M][3__XU%]%!J!/]U".B\VO__@\0,@'W\`'0*BTWP@Z%0`P``_8OE7<.+_U6+ +M[*%L$D8`A7HM% +M"(7`=`.#"/]6@?____]_=A'H0_[__VH67HDPZ!C]___K4_]U&(U-[.A8LO__ +MBT7P,_8YL*@```!U76:+112Y_P```&8[P78VA=MT#X7_=`M75E/H=V?__X/$ +M#.CY_?__:BI>B3"`??@`=`J+3>R#H5`#``#]B\9>7UN+Y5W#A=MT!H7_=%^( +M`XM%"(7`=-;'``$```#KSHU-_(EU_%%65U-J`8U-%%%6_W`(_Q48,4,`B\B% +MR700.77\=9^+10B%P'2BB0CKGO\5`#!#`(/X>G6)A=MT#X7_=`M75E/H[6;_ +M_X/$#.AO_?__:B)>B3#H1/S__^EL____B_]5B^QJ`/]U%/]U$/]U#/]U".C' +M_O__@\047<-J"&B`NT,`Z&U@__^+10C_,.BT%P``68-E_`"+30R+002+`/\P +MBP'_,.@%`P``65G'1?S^____Z`@```#H?F#__\(,`(M%$/\PZ,P7``!9PVH( +M:*"[0P#H'6#__XM%"/\PZ&07``!9@V7\`(M%#(L`BP"+2$B%R708@\C_\`_! +M`74/@?D@ZT,`=`=1Z#?X__]9QT7\_O___^@(````Z!U@___"#`"+11#_,.AK +M%P``6<-J"&C`NT,`Z+Q?__^+10C_,.@#%P``68-E_`!J`(M%#(L`_S#H60(` +M`%E9QT7\_O___^@(````Z-)?___"#`"+11#_,.@@%P``6<-J"&A@NT,`Z'%? +M__^+10C_,.BX%@``68-E_`"+10R+`(L`BT!(\/\`QT7\_O___^@(````Z(I? +M___"#`"+11#_,.C8%@``6<.+_U6+[(/L#(M%"(U-_XE%^(E%](U%^%#_=0R- +M1?10Z.C^__^+Y5W#B_]5B^R#[`R+10B-3?^)1?B)1?2-1?A0_W4,C47T4.AP +M_O__B^5=PXO_58OL@^P,BT4(C4W_B47XB47TC47X4/]U#(U%]%#H^?[__XOE +M7<.+_U6+[(/L#(M%"(U-_XE%^(E%](U%^%#_=0R-1?10Z!S___^+Y5W#B_]5 +MB^Q148M%"#/)06I#B4@8BT4(QP#07D,`BT4(B8A0`P``BT4(6<=`2"#K0P"+ +M10AFB4ALBT4(9HF(<@$``(M%"(.@3`,```"-10B)1?R-1?Q0:@7H??___XU% +M"(E%^(U%#(E%_(U%^%!J!.@6____@\00B^5=P\S,S,S,S,S,S,S,S(O_58OL +M@WT(`'02_W4(Z`X```#_=0CH0_;__UE97<($`(O_58OL48M%"(L(@?G07D,` +M=`I1Z"3V__^+10A9_W`\Z!CV__^+10C_<##H#?;__XM%"/]P-.@"]O__BT4( +M_W`XZ/?U__^+10C_<"CH[/7__XM%"/]P+.CA]?__BT4(_W!`Z-;U__^+10C_ +M<$3HR_7__XM%"/^P8`,``.B]]?__C44(B47\C47\4&H%Z"G^__^-10B)1?R- +M1?Q0:@3H:/[__X/$-(OE7<.+_U6+[%:+=0B#?DP`="C_=DSHW30``(M&3%D[ +M!9`21@!T%#U8YT,`=`V#>`P`=0=0Z/(R``!9BT4,B49,7H7`=`=0Z&,R``!9 +M7<.+_U97_Q4`,$,`B_"AK.9#`(/X_W0,4.A:%@``B_B%_W5):&0#``!J`>CF +M]?__B_A9687_=0E0Z`WU__]9ZSA7_S6LYD,`Z($6``"%P'4#5^OE:)`21@!7 +MZ`G^__]J`.CE]/__@\0,A?]T#%;_%00P0P"+QU]>PU;_%00P0P#H3O7__\R+ +M_U-65_\5`#!#`(OP,]NAK.9#`(/X_W0,4.C3%0``B_B%_W51:&0#``!J`>A? +M]?__B_A9687_=0E3Z(;T__]9ZRM7_S6LYD,`Z/H5``"%P'4#5^OE:)`21@!7 +MZ(+]__]3Z%_T__^#Q`R%_W4)5O\5!#!#`.L)5O\5!#!#`(O?7UZ+PUO#S,QH +MH)%"`.BU%```HZSF0P"#^/]U`S+`P^A=____A+30BAH.U#`(6!4`,``'4'Z*TS``")!EY=PXO_58OL5HMU#(L&.P5`[4,` +M=!>+30BAH.U#`(6!4`,``'4'Z%\A``")!EY=PXO_58OLBT4(N?\'``!35C/2 +MBQB+<`2+QL'H%"/!5SO!=4,[TG4_B_Z+PX'G__\/``O'=0-`ZS"+SHO"@>$` +M``"`"\&X```(`'0-.]IU"3OX=05J!%CK$"/P"]9T!&H"Z_-J`^OO,\!?7EM= +MPXO_58OLBT4(,]*+2`2+PH'A````@`O!=`%"BL)=PXO_58OL@^PP4U97BWT< +M,]N%_WD"B_N+=0R-3=#_=2B('NB2J___C4<+.440=Q3H6??__VHB7XDXZ"[V +M___IJ`(``(M5"(L"BTH$B47@B\'!Z!0E_P<``#W_!P``=5([VW5.4_]U)%-7 +M_W48_W44_W405E+HBP(``(OX@\0DA?]T!X@>Z6("``!J95;H$```"`B\,+P70$Q@8M1HM* +M!#/;.%T@:C`/E,/'1?3_`P``2S/`@^/@@>$``/!_@\,G"\&)7>18=1^(!D:+ +M0@2+"B7__P\`"\AU!2%-].L-QT7T_@,``.L$Q@8Q1HO.1HE-Z(7_=07&`0#K +M#XM%U(N`B````(L`B@"(`8M"!"7__P\`B47P=PF#.@`/AL4```"#9?P`N0`` +M#P!J,%B)1?B)3?"%_WY3BP*+4@0C1?PCT8M-^('B__\/``^_R>A/4?__:C!9 +M9@/!#[?`@_@Y=@(#PXM-\(M5"(@&1HM%_`^LR`2)1?R+1?C!Z02#Z`1/B4WP +MB47X9H7`>:EFA@-4___!#")5>2(!D9J +M,%@"R#/_B`[&1@$`@'W<`'0*BTW0@Z%0`P``_8O'7UY;B^5=PXO_58OL@^P, +MC47T5HMU'%?_=1C_=12-?@%0BT4(5_]P!/\PZ$4[``"#R?^#Q!@Y31!T%XM- +M$#/`@WWT+0^4P"O(,\"%]@^?P"O(C47T4%>+?0Q1,\F#??0M#Y3!,\"%]@^? +MP`//`\%0Z&PU``"#Q!"%P'0%Q@<`ZQS_=2B-1?1J`%#_=23_=2!6_W405^@) +M````@\0@7UZ+Y5W#B_]5B^R#[!!65XM]$(7_?@2+Q^L",\"#P`DY10QW%^C* +M\___:B)>B3#HG_+__XO&7UZ+Y5W#4_]U)(U-\.C8I___BE4@BUT(A-)T)8M- +M'#/`A?\/G\!0,\"#.2T/E,`#PU#_=0Q3Z`0$``"*52"#Q!"+11R+\X,X+74& +MQ@,MC7,!A?]^%8I&`8@&1HM%](N`B````(L`B@"(!C/`A-(/E,`#QP/P@\C_ +M.44,=`>+PRO&`T4,:+AA0P!05NA8[O__@\0,6X7`=7:-3@(X111T`\8&18M5 +M'(M""(`X,'0OBU($@^H!>0;WVL9&`2UJ9%\[UWP(B\*9]_\`1@)J"E\[UWP( +MB\*9]_\`1@,`5@2#?1@"=12`.3!U#VH#C4$!4%'H8('__X/$#(!]_`!T"HM% +M\(.@4`,``/TSP.GR_O__,\!04%!04.B3\?__S(O_58OL@^P,,\!65_]U&(U] +M]/]U%*NKJXU%](M]'%"+10A7_W`$_S#H6CD``(/)_X/$&#E-$'0.BTT0,\"# +M??0M#Y3`*\B+=0R-1?10BT7X`\=0,\"#??0M40^4P`/&4.B.,P``@\00AB^5=PXO_58OL@^P0C4WP +M4U97_W46XOE7<.+ +M_U6+[(/L2*%HYD,`,\6)1?R+512+31!3BET,#[;#@\`$.]!S%6H,Q@$`6(M- +M_#/-6^C`4O__B^5=PX3;=`C&`2U!2L8!`+AX84,`QT72484,`B474@^,"B478B47HB47X +MBT4(5KZ`84,`QT7LH&%#`%>-/(7\____B77,C00?B770B77@B77PQT7TK&%# +M`(MTA;R-1@&)1;B*!D:$P'7Y*W6X._(;P$<#QP/#_W2%O%)1Z,/J__^#Q`Q? +M7H7`#X1!____,\!04%!04.AO[O__S(O_58OLBU44A=)T)E:+=1"+SE>->0&* +M`4&$P'7Y*\^-00%0C0065E#HZ'W__X/$#%]>7<.+_U6+[%%15E>+?0R%_W46 +MZ#;O__]J%EZ),.@+[O__B\;I'@$``%.+71"%VW0,@WT4`'0&@WT8`'<6Z`SO +M__]J%EZ),.CA[?__B\;I\P```(MU'(/^0703@_Y%=`Z#_D9T"<9%_`"#_D=U +M!,9%_`&+122#X`B#R`!U,O]U".BS]O__B47X687`="+_=?Q35_]U".@*]___ +M60^VP%#_=?CH,/[__X/$%.F7````BT4D@^`0@\@`=`1J`^L":@)8@_YA?RAT +M"H/N070%@^X$ZQ__=2Q0_W7\_W4@_W48_W444U?_=0CHUO;__^M5@^YE_W4L +M=#:#[@%T&5#_=?S_=2#_=1C_=1135_]U".C]_/__ZR__=2#_=1C_=1135_]U +M".B$^___@\0+QJ-\$D8`:@10Z`+J__]J`*.`$D8`Z"OI__^# +MQ`R#/8`21@``=2MJ!%:)-7P21@#HW.G__VH`HX`21@#H!>G__X/$#(,]@!)& +M``!U!8/(_U[#5S/_OK#F0P!J`&B@#P``C48@4.BX"@``H8`21@"+U\'Z!HDT +MN(O'@^`_:\@PBP25F!)&`(M$"!B#^/]T"8/X_G0$AP\S,S,S,S,S,B_]6Z,](``#H?4<``#/VH8`21@#_-`;H +MG$D``*&`$D8`68L$!H/`(%#_%=0P0P"#Q@2#_@QUV/\U@!)&`.A,Z/__@R6` +M$D8``%E>PXO_58OLBT4(@\`@4/\5S#!#`%W#B_]5B^R+10B#P"!0_Q70,$,` +M7<.+#6CF0P`SP(/)`3D-A!)&``^4P,.+_U6+[(/L2(U%N%#_%;@Q0P!F@WWJ +M``^$E0```(M%[(7`#X2*````4U:+,(U8!(T$,XE%_+@`(```._!\`HOP5NA9 +M'P``H9@41@!9._!^`HOP5S/_A?9T5HM%_(L(@_G_=$"#^?YT.XH3]L(!=#3V +MP@AU"U'_%3PP0P"%P'0AB\>+SX/@/\'Y!FO0,(M%_`,4C9@21@"+`(E"&(H# +MB$(HBT7\1X/`!$.)1?P[_G6M7UY;B^5=PXO_4U97,_^+QXO/@^`_P?D&:_`P +M`S2-F!)&`(-^&/]T#(-^&/YT!H!.*(#K>XO'QD8H@8/H`'00@^@!=`=J](/H +M`>L&:O7K`FKV6%#_%4`P0P"+V(/[_W0-A=MT"5/_%3PP0P#K`C/`A#_P,/A57___]?7EO#S,S,S,S,S,S,S,QJ#&C@NT,` +MZ#1.__]J!^A^!0``63/;B%WGB5W\4^@&'@``687`=0_H7?[__^@.____LP&( +M7>?'1?S^____Z`L```"*P^@]3O__PXI=YVH'Z(T%``!9P\S,S,S,S,S,S,R+ +M_U8S]HN&F!)&`(7`=`Y0Z'X=``"#II@21@``68/&!('^``(``'+=L`%>PXO_ +M58OLBT4(,\F)"(M%"(E(!(M%"(E("(M%"(-($/^+10B)2!2+10B)2!B+10B) +M2!R+10B#P`R'"%W#B_]5B^Q1Z'/P__^+2$R)3?R-3?Q14.BX\?__BT7\65F+ +M`(OE7<.+_U6+[(/L$/]U#(U-\.@VGO__BT7T#[9-"(L`#[<$2"4`@```@'W\ +M`'0*BTWP@Z%0`P``_8OE7<.+_U6+[(/L)*%HYD,`,\6)1?Q3_W40BUT(C4W@ +MZ.^=__^-0P$]``$``'<+BT7DBP`/MP18ZWJ+PXU-Y,'X"(E%W%$/ML!0Z'S_ +M__]9687`=!.+1=R(1?`SP&H"B%WQB$7R6>L+,\"(7?`SR8A%\4&)1?1FB47X +MBT7D:@'_<`B-1?1048U%\%"-1>1J`5#HT"```(/$'(7`=1,X1>QT"HM%X(.@ +M4`,``/TSP.L7#[=%]"-%#(!][`!T"HM-X(.A4`,``/V+3?PSS5OHEDO__XOE +M7<.+_U6+[%%1H6CF0P`SQ8E%_%-6BW485X7V?A16_W44Z#!&``!9.\99C7`! +M?`*+\(M])(7_=0N+10B+`(MX"(E])#/`.44H:@!J`%;_=10/E<"-!,4!```` +M4%?_%10Q0P")1?B%P`^$C0$``(T4`(U*"#O1&\"%P712C4H(.]$;P"/!C4H( +M/0`$``!W'3O1&\`CP>@!>0``B]R%VP^$3`$``,<#S,P``.L=.]$;P"/!4.@; +MY/__B]A9A=L/A"T!``#'`]W=``"#PPCK`C/;A=L/A!@!``#_=?A35O]U%&H! +M5_\5%#%#`(7`#X3_````BWWX,\!04%!04%=3_W40_W4,Z,\%``"+\(7V#X3> +M````]T40``0``'0XBT4@A<`/A,P````[\`^/P@```#/)45%14/]U'%=3_W40 +M_W4,Z),%``"+\(7V#X6D````Z9T```"-%#:-2@@[T1O`A<%T2HU*"#O1&\`C +MP8U*"#T`!```=QD[T1O`(\'H''@``(O\A?]T9,<'S,P``.L9.]$;P"/!4.@Z +MX___B_A9A?]T2<<'W=T``(/'".L",_^%_W0X:@!J`&H`5E?_=?A3_W40_W4, +MZ`\%``"%P'0=,\!04#E%('4Z4%!65U#_=23_%1@Q0P"+\(7V=2Y7Z'P```!9 +M,_93Z',```!9B\:-9>Q?7EN+3?PSS>B*2?__B^5=P_]U(/]U'.O`5^A.```` +M6>O2B_]5B^R#[!#_=0B-3?#H#IO___]U*(U%]/]U)/]U(/]U'/]U&/]U%/]U +M$/]U#%#HK_W__X/$)(!]_`!T"HM-\(.A4`,``/V+Y5W#B_]5B^R+10B%P'02 +M@^@(@3C=W0``=0=0Z!'B__]97<.+_U6+[%%19HM%"+G__P``9CO!=00SP.M" +MN0`!``!F.\%S#@^WR*$7<-7B_HK\@^W!#YFB0>- +M?P)FA-N(@41@!7_Q74,$,`_PW8%48` +M@^\8@^X!=>M?L`%>PXO_58OL:T4(&`6@%$8`4/\5T#!#`%W#B_]5B^R+10A3 +M5E>-'(4P%D8`BP.+%6CF0P"#S_^+RHOR@^$?,_#3SCOW=&F%]G0$B\;K8XMU +M$#MU%'0:_S;H60```%F%P'4O@\8$.W44=>R+%6CF0P`SP(7`="G_=0Q0_Q6, +M,$,`B_"%]G035NA/C/__68<#Z[F+%6CF0P#KV8L5:.9#`(O":B"#X!]9*\C3 +MSS/ZASLSP%]>6UW#B_]5B^R+10A7C3R%X!5&`(L/AM7 +M4XLPQ0P"+\(7V=2?_%0`P0P"#^%=U#5964_\5 +M[#%#`(OPZP(S]H7V=0F#R/^'!S/`ZQ&+QH<'AZ"M&__^+Y5W"!`"+_U6+ +M[%&A:.9#`#/%B47\5FA`@Q0P"+3?PSS5[HU47__XOE7<($`(O_58OL4:%H +MYD,`,\6)1?Q6:$AS0P!H0'-#`&BP5D,`:@7H%O[__X/$$(OP_W4(A?9T#(O. +M_Q5@,D,`_];K!O\5X#%#`(M-_#/-7NA_1?__B^5=P@0`B_]5B^Q1H6CF0P`S +MQ8E%_%9H4'-#`&A(Z"9%__^+Y5W""`"+_U6+[%&A:.9#`#/% +MB47\5FATZ#Q$__^+Y5W")`"+_U6+ +M[%&A:.9#`#/%B47\5FB4L,:@)8N;`61@"'`3+`7HM-_#/-Z#%#__^+Y5W#S,S,B_]5B^R` +M?0@`=2=6ON`51@"#/@!T$(,^_W0(_S;_%8@P0P"#)@"#Q@2!_C`61@!UX%ZP +M`5W#S,S,S,S,S,S,S(O_58OLBT4,.T4(=@6#R/]=PQO`]]A=PXO_58OLBT4, +M@^P@5H7`=1;H/>#__VH67HDPZ!+?__^+QNE8`0``BW4(,\E35XD(B_F+V8E] +MX(E=Y(E-Z#D.=%:-1?QFQT7\*C]0_S:(3?[H!#\``%E9A@".]^)5?0;]O?6(_!T,(O7 +MB]F+"HU!`8E%_(H!083`=?DK3?Q#BT7X`]F#P@1`B47X.\9UW8M5](E=_(M= +MY&H!_W7\4N@*S___B_"#Q`R%]G4%@\__ZV>+1?2-!(:)1?"+T(E5]#O[=$Z+ +MQBO'B47LBP^-00&)1?B*`4&$P'7Y*TWXC4$!4/\WB47XBT7P*\(#1?Q04N@# +M/@``@\00A#H,`(``(O'7UM>B^5=PS/`4%!04%#HLMW__\R+_U6+[%&+30B-40&* +M`4&$P'7Y*\J#R/]7BWT002O'B4W\.\AV!6H,6.M94U:-7P$#V6H!4^C7VO__ +MB_!9687_=!)7_W4,4U;H;#T``(/$$(7`=37_=?PKWXT$/O]U"%-0Z%,]``"# +MQ!"%P'4)M;C^___K&8H! +M/"]T%SQ<=!,\.G0/45/H-#T``%E9B\@[RW7CBA&`^CIU%XU#`3O(=!!6,_]7 +M5U/H"____X/$$.MZ,_^`^B]T#H#Z7'0)@/HZ=`2+Q^L#,\!`#[;`*\M!]]AH +M0`$``!O`(\&)A;3^__^-A;S^__]74.@"1___@\0,C86\_O__5U=74%=3_Q44 +M,D,`B_"+A;C^__^#_O]U+5!75U/HG_[__X/$$(OX@_[_=`=6_Q5@,$,`B\>+ +M3?Q?7C/-6^C!/___B^5=PXM(!"L(P?D"B8VP_O__@+WH_O__+G48BHWI_O__ +MA,ET*8#Y+G4)@+WJ_O__`'0;4/^UM/[__XV%Z/[__U-0Z#C^__^#Q!"%P'65 +MC86\_O__4%;_%1@R0P"%P(N%N/[__W6LBQ"+0`2+C;#^__\KPL'X`CO(#X1G +M____:!"L0@`KP6H$4(T$BE#HMJW__X/$$.E,____B_]65XOYBS?K"_\VZ!O8 +M__]9@\8$.W<$=?#_-^@+V/__65]>PXO_58OL5E>+\>@G````B_B%_W0-_W4( +MZ.O7__]9B\?K#HM.!(M%"(D!@T8$!#/`7UY=P@0`B_]6B_%7BWX(.7X$=`0S +MP.MR@SX`=2MJ!&H$Z'W8__]J`(D&Z*G7__^+!H/$#(7`=05J#%CK38E&!(/` +M$(E&".O,*S[!_P*!_____W]WXU-J!(TPB#Q`R)NQP"``"Y`0$``(U[#*NKJ[\@ZT,`*_N* +M!#>(!D:#Z0%U]8V+&0$``+H``0``B@0YB`%!@^H!=?5?7EM=PXO_58OL@>P@ +M!P``H6CF0P`SQ8E%_%-6BW4(C87H^/__5U#_=@3_%0PQ0P`SV[\``0``A<`/ +MA/````"+PXB$!?S^__]`.\=R](J%[OC__XV-[OC__\:%_/[__R#K'P^V40$/ +MML#K#3O'$3?SX__^H`70.@$P.&1"*A`W\_?__ZQ"H`G05@$P.&2"*A`W\_/__B(0. +M&0$``.L'B)P.&0$``$$[SW+!ZUEJGXV6&0$``(O+6"O"B87@^/__`]$#PHF% +MY/C__X/`((/X&7<*@$P.&1"-02#K$X.]Y/C__QEW#HT$#H!(&2"-0>"(`NL" +MB!J+A>#X__^-EAD!``!!.\]RNHM-_%]>,\U;Z&ATU___QP`6````B_-7Z.K2__]97XO&7EN+Y5W#@'T,`'4%Z,;0 +M__^+1?R+0$CP#\$82W45BT7\@7A((.M#`'0)_W!(Z+32__]9QPB`^___ +M@'T,`%E9=(6A0.U#`*,4Z$,`Z7;____,S,S,S,S,S(`]T!9&``!U$FH!:OWH +MY?[__UE9Q@70%D8``;`!PVH,:`"\0P#HYCG__S/VB77DZ.'<__^+^(L-H.U# +M`(6/4`,``'01.7=,=`R+=TB%]G5HZ)'2__]J!>@%\?__68EU_(MW2(EUY#LU +M0.U#`'0PA?9T&(/(__`/P09U#X'^(.M#`'0'5NC5T?__6:%`[4,`B4=(BS5` +M[4,`B77D\/\&QT7\_O___^@%````ZZ"+=>1J!>C[\/__6<.+QNB7.?__PXO_ +M58OL@^P@H6CF0P`SQ8E%_%-6_W4(BW4,Z*S[__^+V%F%VW4.5N@2_/__63/` +MZ:T!``!7,_^+SXO'B4WD.9@HZ$,`#X3J````08/`,(E-Y#WP````A04_\5 +M##%#`(7`#X2$````:`$!``"-1AA74.CL/O__B5X$@\0,,]N)OAP"``!#.5WH +M=E&`?>X`C47N="&*2`&$R70:#[;1#[8(ZP:`3`X9!$$[RG;V@\`"@#@`==^- +M1AJY_@```(`("$"#Z0%U]_]V!.B2^O__@\0$B88<`@``B5X(ZP.)?@@SP(U^ +M#*NKJ^F^````.3W,%D8`=`M6Z!?[___IL0```(/(_^FL````:`$!``"-1AA7 +M4.A-/O__@\0,:T7D,(E%X(V`..A#`(E%Y(`X`(O(=#6*00&$P'0K#[81#[;` +MZQ>!^@`!``!S$XJ'(.A#``A$%AE"#[9!`3O0=N6#P0*`.0!USHM%Y$>#P`B) +M1>2#_P1RN%.)7@3'1@@!````Z-_Y__^#Q`2)AAP"``"+1>"-3@QJ!HV0+.A# +M`%]FBP*-4@)FB0&-20*#[P%U[U;HQOK__UDSP%^+3?Q>,\U;Z*TV__^+Y5W# +MB_]5B^Q6BW44A?9U!#/`ZVV+10B%P'43Z`S4__]J%EZ),.CATO__B\;K4U>+ +M?1"%_W04.74,<@]65U#HOS[__X/$##/`ZS;_=0QJ`%#H33W__X/$#(7_=0GH +MR]/__VH6ZPPY=0QS$^B]T___:B)>B3#HDM+__XO&ZP-J%EA?7EW#B_]5B^R# +M[!!6_W4(C4WPZ,"'__\/MG4,BT7XBDT4A$PP&74;,](Y51!T#HM%](L`#[<$ +M<"-%$.L"B\*%P'0#,])"@'W\`%YT"HM-\(.A4`,``/V+PHOE7<.+_U6+[&H$ +M:@#_=0AJ`.B4____@\007+V%L"B]^%]G0' +M5O\5+#)#`%]>B\-;B^5=PXO_58OL7>D`````B_]5B^Q6BW4,A?9T&VK@,])8 +M]_8[11!S#^@NTO__QP`,````,\#K0E.+70A7A=MT"U/H&C(``%F+^.L",_\/ +MKW405E/HK\[__XO865F%VW05._YS$2OWC00[5FH`4.A?.___@\0,7XO#6UY= +MP\S,S,S,_Q60,4,`A<"C[!9&``^5P,/,S,S,S,S,S,S,S,S,S,R#)>P61@`` +ML`'#B_]5B^Q1H6CF0P`SQ8E%_%>+?0@[?0QU!+`!ZU=6B_=3BQZ%VW0.B\O_ +M%6`R0P#_TX3`=`B#Q@@[=0QUY#MU#'4$L`'K+#OW=":#QOR#?OP`=!.+'H7; +M=`UJ`(O+_Q5@,D,`_]-9@^X(C48$.\=UW3+`6UZ+3?PSS5_HL3/__XOE7<.+ +M_U6+[%&A:.9#`#/%B47\5HMU##EU"'0C@\;\5XL^A?]T#6H`B\__%6`R0P#_ +MUUF#[@B-1@0[10AUXE^+3?RP`3/-7NAD,___B^5=PVH,:&"\0P#H"C3__X-E +MY`"+10C_,.A-Z___68-E_`"+-6CF0P"+SH/A'S,U^!9&`-/.B77DQT7\_O__ +M_^@-````B\;H%#3__\(,`(MUY(M-$/\QZ%_K__]9PXO_58OL@^P,BT4(C4W_ +MB47XB47TC47X4/]U#(U%]%#H@O___XOE7<.+_U6+[(M%"$B#Z`%T+8/H!'03 +M@^@)=!R#Z`9T$(/H`70$,\!=P[CX%D8`7<.X]!9&`%W#N/P61@!=P[CP%D8` +M7<.+_U6+[&L-8%]#``R+10P#R#O!=`^+50@Y4`1T"8/`##O!=?0SP%W#B_]5 +MB^Q1C47_4&H#Z%W___]968OE7<.+_U6+[/]U"+GP%D8`Z%''____=0BY]!9& +M`.A$Q____W4(N?@61@#H-\?___]U"+G\%D8`Z"K'__]=P^C8U?__@\`(PVHL +M:$"\0P#HLU\``#/;B5W4(5W,L0&(3>.+=0AJ"%\[]W\8=#6-1O^#Z`%T(DB# +MZ`%T)TB#Z`%U3.L4@_X+=!J#_@]T"H/^%'X[@_X6?S96Z.;^__^#Q`3K1>CY +MU?__B]B)7=2%VW4(@\C_Z9(!``#_,U;H!?___UE9,\F%P`^5P87)=1+H#\__ +M_\<`%@```.CCS?__Z]&#P`@RR8A-XXE%V(-ET`"$R70+:@/H;^G__UF*3>.# +M9=P`QD7B`(-E_`"+1=B$R704BQ5HYD,`B\J#X1\S$-/*BDWCZP*+$(O"B47< +M,]*#^`$/E,*)5*$T@^%B@```(7`=1.$R70(:@/H:.G__UEJ`^@YN___ +M._=T"H/^"W0%@_X$=2.+0P2)1="#8P0`._=U.^C&_O__BP")1+3=S_%6`R0P#_5=Q9ZRMJ"%^+=0B+7=2*1>*)1,` +M=`AJ`^BCZ/__6<-6BTW<_Q5@,D,`_U7<63OW=`J#_@MT!8/^!'45BT70B4,$ +M._=U"^C:T___BTW,B4@(,\#H`5X``,.+_U6+[%%14U=J,&I`Z,[)__^+^#/; +MB7WX65F%_W4$B_OK2(V'``P``#OX=#Y6C7<@B_A3:*`/``"-1N!0Z*_J__^# +M3OC_B1Z-=C")7M2-1N#'1M@```H*QD;<"H!FW?B(7MX[QW7,BWWX7E/HI,C_ +M_UF+QU];B^5=PXO_58OL5HMU"(7V="53C9X`#```5XO^._-T#E?_%=0P0P"# +MQS`[^W7R5NALR/__65];7EW#:A1H@+Q#`.@,,/__@7T(`"```!O`]]AU%^C$ +MS/__:@E>B3#HF1J!^@MY___68EU_(O^H9@41@") +M?>`Y10A\'SDTO9@21@!U,>CT_O__B02]F!)&`(7`=11J#%Z)=>3'1?S^____ +MZ!4```#KK*&8%$8`@\!`HY@41@!'Z[N+=>1J!^@CY___6<.+_U6+[(M%"(O( +M@^`_P?D&:\`P`P2-F!)&`%#_%%]GAG.S68%$8`L#4&KV_Q6,,4,`BP2]F!)&`(-,`QC_,\#K%NB) +MR___QP`)````Z&O+__^#(`"#R/]?7EM=PXO_58OLBTT(@_G^=17H3LO__X,@ +M`.A9R___QP`)````ZT.%R7@G.PV8%$8`D".\8;V_?3(]ET$/\VZ/C$__]'C78$ +M63O[=?!?7EM=PXO_58OL5HMU"(7V#X30````:@=6Z*O___^-1AQJ!U#HH/__ +M_XU&.&H,4.B5____C49H:@Q0Z(K___^-AI@```!J`E#H?/____^VH````.B7 +MQ/___[:D````Z(S$____MJ@```#H@<3__XV&M````&H'4.A-____C8;0```` +M:@=0Z#____^#Q$2-ANP```!J#%#H+O___XV&'`$``&H,4.@@____C89,`0`` +M:@)0Z!+_____ME0!``#H+<3___^V6`$``.@BQ/___[9<`0``Z!?$____MF`! +M``#H#,3__X/$*%Y=PXO_58OL@^P8H6CF0P`SQ8E%_%-65_]U"(U-Z.B.?/__ +MBTT%]G0T4U=6Z#0Q__^#Q`S_=?A6_W44_W40:@'_ +M=1S_%10Q0P"%P'00_W484%;_=0S_%0PR0P"+^%;HXN#__UF`??0`=`J+1>B# +MH%`#``#]B\>-9=Q?7EN+3?PSS>CI*?__B^5=PXO_58OLBT4(\/]`#(M(?(7) +M=`/P_P&+B(0```"%R70#\/\!BXB`````A@7GX&.A#`'0)BQ&%TG0#\/\"@WGT`'0*BU'\A=)T`_#_`H/!$(/N +M`776_["<````Z$X!``!97EW#B_]5B^Q14U:+=0A7BX:(````A@S@`=5F+AH0```"%P'08@S@`=1-0Z"["____MH@```#HEOO_ +M_UE9BX:`````A7<.+_U6+[(M-"(7)=!:! +M^2!E0P!T#H/(__`/P8&P````2%W#N/___W]=PXO_58OLBT4(A+=TR%]G5#:@3H[][__UF#9?P`_S60$D8`C4=,4.@P +M````65F+\(EUY,=%_/[____H#````(7V=1'H1,#__XMUY&H$Z`7?__]9PXO& +MZ*$G___#B_]5B^Q6BW4,5X7V=#R+10B%P'0UBS@[_G4$B\;K+5:),.B8_/__ +M687_=.]7Z-;^__^#?PP`677B@?]8YT,`=-I7Z/7\__]9Z]$SP%]>7<.+_U6+ +M[(M-"#/`]L$0=`6X@````%-65[\``@``]L$(=`(+Q_;!!'0%#0`$``#VP0)T +M!0T`"```]L$!=`4-`!```+X``0``]\$```@`=`(+QHO1NP`#```CTW0?.]9T +M%CO7=`L[TW43#0!@``#K#`T`0```ZP4-`"```+H````#7R/*7EN!^0````%T +M&('Y`````G0+.\IU$0T`@```7<.#R$!=PPU`@```7<.+_U6+[(/L#-U]_-OB +M@ST8#48``0^,@P```&:+1?PSR8O15[\```@`J#]T*:@!=`-J$%JH!'0#@\H( +MJ`AT`X/*!*@0=`.#R@*H('0#@\H!J`)T`@O7#ZY=^(M%^(/@P(E%]`^N5?2+ +M1?BH/W0IJ`%T`VH06:@$=`.#R0BH"'0#@\D$J!!T`X/)`J@@=`.#R0&H`G0" +M"\\+RHO!7^L]9HM-_#/`]L$_=#+VP0%T`VH06/;!!'0#@\@(]L$(=`.#R`3V +MP1!T`X/(`O;!('0#@\@!]L$"=`4-```(`(OE7<.+_U6+[(/L$)O9??AFBT7X +M,\FH`70#:A!9J`1T`X/)"*@(=`.#R02H$'0#@\D"J"!T`X/)`:@"=`:!R0`` +M"`!35@^W\+L`#```B]97OP`"```CTW0F@?H`!```=!B!^@`(``!T##O3=1*! +MR0`#``#K"@O/ZP:!R0`!``"!Y@`#``!T##OW=0Z!R0```0#K!H')```"`+H` +M$```9H7"=`:!R0``!`"+?0R+]XM%"/?6(_$CQPOP._$/A*8```!6Z#\"``!9 +M9HE%_-EM_)O9??QFBT7\,_:H`70#:A!>J`1T`X/."*@(=`.#S@2H$'0#@\X" +MJ"!T`X/.`:@"=`:!S@``"``/M]"+RB/+="J!^0`$``!T'('Y``@``'0,.\MU +M%H'.``,``.L.@0-J$%FI``(``'0#@\D(J0`$``!T`X/)!*D`"```=`.#R0*% +MPG0#@\D!J0`!``!T!H')```(`(O0NP!@```CTW0J@?H`(```=!R!^@!```!T +M##O3=1:!R0`#``#K#H')``(``.L&@L.@ALOO__:B+KS(MU%(7V=+Y3C5H! +MB\-7BWX(Q@(PA+?0R+ +M#X7)=0I?,\`STEN+Y5W#5HUP_XU!_XEU](7`#X4M`0``BT\$B4W8@_D!=2^+ +MC]__]0:,P!``!1Z#/I__^#Q!"+QC/27E];B^5= +MPX7V=4F+C]__]J`%"->P3'A>3]__\`````:,P!``!7QP,`````Z/?H +M__\STHO&]W78@\00,\D[RHD7&\E>]]DSTE^)"UN+Y5W#,__'1?@`````QT7\ +M`````(E]\(/^_W1$BT7T1D")1>2--+.-9"0`:@!1,\`+!E=0Z%),``")5<"- +M=OPSTHE=\(OY`]"+3?B#T0")5?B#;>0!B4W\BTW8=% +MY/W__P````!0C7,$QP,`````:,P!``!6Z%7H__^+1?"#Q!"+5?PSR3O(B3Z) +M0PB+1?@;R??97D%?B0M;B^5=PSO&=T>+UHU(`2O0B4W(B\X[\GPRB\%&*\*- +M-+.-/(>#QP2+!SL&=0U)@^\$@^X$.\I][^L1BW4,B\$KPHM$A@0[1(L$+1<@#1>2+3<2+1(/XT^@+\(M%_(EU[&H` +M_W7,4%+H@DH``(E=V#/VB]B)==B+PHE=_(E%Z(OYB5V\B47`AQJ`/]UX(E-_.BD&/__.]9R*7<%.T7\=B*+1>B# +MP_^)7;R#T/\#?B#5=@`B47`=0J#__]VO^L#BT7HB5W\AR)3?2+`(E%V(M%P/=EV(O(BT6\ +M]V78`]$#^(L#B\\3\HO^,_8[P7,%@\0#PXM-M(OXBT7X@]8`@VWP!$J+70B#Z01(B7VXB57DB4VT +MB47XA=(/B>[]___K`C/_BU7T0HO".P-S'(U(`8T,B^L&C9L`````QP$````` +MC4D$0#L#QD"0``H6CF0P`SQ8E%_%.+71B-C6SX__]65XM]%(F]@/C__XF=A/C__^CS +M^O__BW4,,\"+SH'A````@`O!L"UU`@3S#[[`B\Z)!X'A``#P?S/`B5\("\&+ +M?0AU(HO.B\>!X?__#P`+P744BX6`^/__:+1]0P"#8`0`Z=,2``"-10A0Z'C` +M__]9AD4B\$E_P<``(/(`'4&L@$S]NL),M*^```0`#/`BYV8 +M^/__@>?__P\``]@3_C/`A-(/E<"!X?\'``!`C;',^___`_")M;3X___H,1H` +M`%%1W1PDZ#<;``!96>B`2```B864^/__/?___W]T!ST```"`=0@SP(F%E/C_ +M_XF=,/[__S/;A?^)O33^__\/E<-#B9TL_O__A?8/B.T#``"#I9#Z__\`:@)> +MQX64^O__```0`(FUC/K__SO>#X4``@``,\F+A`V0^O__.X0-,/[__P^%Z@$` +M`(/!!(/Y"'7DBX6T^/__,]*#P`*+\(/@'VH@62O(B86D^/__,\#![@5`B;6P +M^/__B8V0^/__Z!`5__^#I9SX__\`2`^]SXF%J/C___?0B86,^/__=`-!ZP(S +MR6H@6"O!C58".86D^/__B96L^/__#Y?`@_ISB(6[^/__#Y?!@_IS=0B$P'0$ +ML`'K`C+`A,D/A>\```"$P`^%YP```&IR63O1<@B+T8F-K/C__XO*B8V@^/__ +M@_K_#X26````B_*-A3#^__^+E;#X__\K\HT$L(F%M/C__SO*)A(TP_O__28N%M/C__TZ#Z`2)C:#X__^)A;3X__^# +M^?]T"(N=+/[__^N/BY6L^/__B[6P^/__A?9T#(O.C;TP_O__,\#SJX"]N_C_ +M_P"[S`$``'0+C4(!B84L_O__ZS.)E2S^___K*S/`N\P!``!0B86,^O__B84L +M_O__C860^O__4(V%,/[__U-0Z(#A__^#Q!"#I93Z__\`,\EJ!%A!B860^O__ +MB8V,^O__B8U<_/__4(V%D/K__U"-A6#\__]34.A)X?__@\00Z5P$``"+A;3X +M__\STD"+^(/@'VH@62O(B86P^/__,\#![P5`B;VT^/__B8V0^/__Z#`3__^+ +MC)TL_O__2(.EG/C__P`/OL",\EJ(%@KP8T4 +M.SF%L/C__XF5H/C__P^7P(/Z0```!J+C9#X___3Z(N-I/C__POX +MBX6L^/__@^D$B8VD^/__B;R%,/[__TA.B86L^/__@_C_=`B+G2S^___KE8N5 +MH/C__XN]M/C__VH"7H7_=`R+SS/`C;TP_O__\ZN`O;OX__\`N\P!``!T"XU" +M`8F%+/[__^LSB94L_O__ZRLSP+O,`0``4(F%C/K__XF%+/[__XV%D/K__U"- +MA3#^__]34.B`"P>H> +M,]"+A:SX__].B1"#Z`2)A:SX__^#_O]T"(N=+/[__^NM,\`XA;OX__\/E<`# +MP2N-M/C__XOYB84L_O__P>\%C860^O__B_>)C:CX___!Y@)6:@!0Z`T<__^+ +MC:CX__\SP$"#X1_3X(F$-9#Z__^-1P'I0`$``(N$G2S^__^#I9SX__\`#[W` +M=`6-2`'K`C/):B!8*\&#^`$/DL"#^W.(A;OX__\/E\&#^W-U"(3`=`2P`>L" +M,L"$R0^%FP```(3`#X63````:G)9.]ES`HO+@_G_=&F-O3#^__^+\8T\CXF] +MK/C__SOSHN]D/K__X7_=1,SP(F%O/C__XF%7/S_ +M_^F?`@``@_\!#X2N`@``@[U<_/__``^$H0(``(N%7/S__S/)B86H^/__,_:+ +MQ_>DM6#\__\#P8F$M6#\__^#T@!&B\H[M:CX__]UX.FL````B8R%8/S___^% +M7/S__^E:`@``@[U<_/__`0^'O@```(N]8/S__XO!P>`"4(V%D/K__XF-7/S_ +M_U"-A6#\__]34.B.V___@\00A?]U&C/`B86,^O__B85<_/__4(V%D/K__^GU +M`0``@_\!#X3]`0``@[U<_/__``^$\`$``(N%7/S__S/)B86H^/__,_:+Q_>D +MM6#\__\#P8F$M6#\__^#T@!&B\H[M:CX__]UX(7)#X2X`0``BX5<_/__@_AS +M#X(]____,\")A8SZ__^)A5S\__]0C860^O__Z>P!```[C5S\__^-O9#Z__\/ +MDL"$P`^%@P```(V]8/S__XV5D/K__XF5L/C__X3`=0:+C5S\__^)C:SX__^$ +MP'0,BX5<_/__B86@^/__,](S]HF5O/C__X7)#X01`0``C87`^/__*_B)O7SX +M__^-!+>+A`7`^/__B86H^/__A````(82UP/C__XU6`8F5O/C_ +M_^G)````C95@_/__ZX$SP#/_B\Z)A;3X__\YA:#X__\/A)0```"#^7-T5SO* +M=1>#I(W`^/__`$`#QHF%O/C__XN%M/C__XN5L/C__XL$@O>EJ/C__P/'@](` +M`82-P/C__XN%M/C__X/2`$!!B86T^/__B_J+E;SX__\[A:#X__]UI(7_=#2# +M^7,/A+0````[RG41@Z2-P/C__P"-00&)A;SX__^+QS/_`82-P/C__XN5O/C_ +M_Q/_0>O(@_ES#X2`````B[U\^/__BXVL^/__1COQ#X7]_O__B\*)E5S\___! +MX`)0C87`^/__4(V%8/S__U-0Z&K9__^#Q!"P`83`=&R+A9#X__\KA:3X__^) +MA9#X__\/A97\__^+C9SX__^%R0^$$P4``(L\C8Q]0P"%_W5=,\")A9SV__^) +MA5S\__]0ZSHSP(F%G/;__XF%7/S__U"-A:#V__]0C85@_/__4U#H_-C__X/$ +M$#+`ZY"#I9SV__\`@Z5<_/__`&H`C86@]O__4(V%8/S__^FA!```@_\!#X2B +M!```BX5<_/__B86<^/__A<`/A(X$```S]C/)B\?WI(U@_/__`\:)A(U@_/__ +M@](`08OR.XV<^/__=>"%]@^$8@0``(N%7/S__X/XDM3#^__\#P8F$M3#^__^#T@!&B\H[M9SX__]UX.E2____.XTL_O__C;V0 +M^O__#Y+`A,`/A8,```"-O3#^__^-E9#Z__^)E9#X__^$P'4&BXTL_O__B8VP +M^/__A,!T#(N%+/[__XF%H/C__S/2,_:)E;SX__^%R0^$$0$``(V%P/C__ROX +MB;U\^/__C02WBX0%P/C__XF%G/C__X7`=24[\@^%W@```"&$M<#X__^-5@&) +ME;SX___IR0```(V5,/[__^N!,\`S_XO.B86D^/__.86@^/__#X24````@_ES +M=%<[RG47@Z2-P/C__P!``\:)A;SX__^+A:3X__^+E9#X__^+!(+WI9SX__\# +MQX/2``&$C<#X__^+A:3X__^#T@!`08F%I/C__XOZBY6\^/__.X6@^/__=:2% +M_W0T@_ES#X0*`0``.\IU$8.DC<#X__\`C4$!B86\^/__B\`"4(V%P/C__U"-A3#^__]34.@NU?__@\00L`&$P`^$P0```(N%K/C_ +M_RN%M/C__XF%K/C__P^%NOS__XN-J/C__X7)#X33````BP2-C'U#`(F%G/C_ +M_X7`#X28````@_@!#X2U````BXTL_O__A"%_W1_BX4L_O__@_ASG_ +M_UE9:@I:.\(/A9$```#_A93X__^-=P&+A5S\___&!S&)M;3X__^%P`^$BP`` +M`#/_B_`SR8N$C6#\___WXFH*`\>)A(U@_/__@](`08OZ6CO.=>&+M;3X__^% +M_W1) +MM;3X__^+A93X__^+C8#X__^)002+C8CX__^%P'@*@?G___]_=P(#R(M%'$@[ +MP7("B\$#A83X__^)A8CX__\[\`^$TP```(N%+/[__X7`#X3%````,_^+\#/) +MBX2-,/[__[H`RIH[]^(#QXF$C3#^__^#T@!!B_H[SG7?B[6T^/__A?]T0(N% +M+/[__X/X@1 +M"/__B^5=PS/`4%!04%#H<*3__\QJ$&C`O$,`Z*H(__^#9>0`:@CH\+___UF# +M9?P`:@->B77@.S5\$D8`=%BA@!)&`(L$L(7`=$F+0`S!Z`VH`706H8`21@#_ +M-+#H3!,``%F#^/]T`_]%Y*&`$D8`BP2P@\`@4/\5U#!#`*&`$D8`_S2PZ(^@ +M__]9H8`21@"#)+``1NN=QT7\_O___^@)````BT7DZ&8(___#:@CHN;___UG# +MB_]5B^R+30A6C7$,BP8D`SP"=`0SP.M+BP:HP'3VBT$$5XLY*_B)`8-A"`"% +M_WXP5U!1Z*>V__]94.BT#@``@\0,._AT"VH06/`)!H/(_^L1BP;!Z`*H`70& +M:OU8\"$&,\!?7EW#B_]5B^Q6BW4(A?9U"5;H/0```%GK+E;H?O___UF%P'0% +M@\C_ZQZ+1@S!Z`NH`7025NA#MO__4.B7$P``65F%P'7?,\!>7<-J`>@"```` +M6<-J'&C@O$,`Z%0'__^#9>0`@V7<`&H(Z):^__]9@V7\`(LU@!)&`*%\$D8` +MC02&B474BUT(B77@._!T=(L^B7W8A?]T5E?H(K?__UG'1?P!````BT<,P>@- +MJ`%T,H/[`7415^A)____68/X_W0A_T7DZQR%VW48BT<,T>BH`70/5^@K____ +M68/X_W4#"47<@V7\`.@.````BT74@\8$ZY6+70B+=>#_==CHT[;__UG#QT7\ +M_O___^@4````@_L!BT7D=`.+1=SHVP;__\.+70AJ".@KOO__6<.+_U6+[%:+ +M=0A7C7X,BP?!Z`VH`70DBP?!Z`:H`70;_W8$Z*^>__]9N+_^___P(00```!S"8L$Q=A]0P!=PS/`7<.+_U6+ +M[%&+512+30A6A=)U#87)=0TY30QU(3/`ZRZ%R709BT4,AOI +MBW40A?9U&<8!`.AZH?__:A9>B3#H3Z#__XO&7HOE7<-3*_&+V%>+^8/Z_W41 +MB@0^B`='A,!T)8/K`77QZQZ*!#Z(!T>$P'0*@^L!=`6#Z@%U[(72BU44=0/& +M!P!?A=M;=8>#^O]U#8M%#&I0QD0!_P!8ZZ?&`0#H#:'__VHBZY&+_U6+[%WI +M1/___\S,S,Q5B^Q6,\!04%!04%!04(M5#(U)`(H""L!T"8/"`0^K!"3K\8MU +M"(O_B@8*P'0,@\8!#Z,$)'/QC4;_@\0@7LG#B_]5B^QJ`/]U#/]U".@%```` +M@\0,7<.+_U6+[(/L$(-]"`!U%.B0H/__QP`6````Z&2?__\SP.MG5HMU#(7V +M=1+H=*#__\<`%@```.A(G___ZP4Y=0AR!#/`ZT/_=1"-3?#H?U3__XM5^(-Z +M"`!T'(U._TDY30AW"@^V`?9$$!D$=?"+QBO!@^`!*_!.@'W\`'0*BTWP@Z%0 +M`P``_8O&7HOE7CKG___QP`6````Z+^>__^#R/]=P_]U"&H`_S7L%D8`_Q6(,4,`7<-J +M"&@(O4,`Z/("__^#/1@-1@`!?%N+10BH0'1*@SVP[4,``'1!@V7\``^N50CK +M+HM%[(L`@3@%``#`=`N!.!T``,!T`S/`PS/`0,.+9>B#);#M0P``@V4(OP^N +M50C'1?S^____ZPJ#X+^)10@/KE4(Z,\"___#B_]5B^Q1W7W\V^(/OT7\B^5= +MPXO_58OL45&;V7W\BTT,BT4(]]%F(TW\(T4,9@O(9HE-^-EM^`^_1?R+Y5W# +MB_]5B^R+30B#[`SVP0%T"MLM2)Y#`-M=_)OVP0AT$)O?X-LM2)Y#`-U=])N; +MW^#VP1!T"MLM5)Y#`-U=])OVP01T"=GNV>C>\=W8F_;!('0&V>O=7?2;B^5= +MPXO_58OL49O=??P/OT7\B^5=PXO_58OL5N@Z$P``BW4(B0;HB^5=PXO_58OL45 ?@`C47X +M@V7\`%#H@O___UF%P'0%,\!`ZRF+30B+5?B+1?R)002-1?B)$8/*'U")5?CH +M>/___UF%P'79Z,[:__\SP(OE7EI%``` +MD(,])!=&``!T,H/L"`^N7"0$BT0D!"6`?P``/8`?``!U#]D\)&:+!"1F@^!_ +M9H/X?XUD)`AU!>D5%```@^P,W10DZ"(;``#H#0```(/$#,.-5"0$Z,T:``!2 +MF]D\)'1,BT0D#&:!/"1_`G0&V2UHH$,`J0``\']T7JD```"`=4'9[-G)V?&# +M/0P71@``#X7L&@``C0U@GD,`NAL```#IZ1H``*D```"`=1?KU*G__P\`=1V# +M?"0(`'46)0```(!TQ=W8VRT@H$,`N`$```#K(N@X&@``ZQNI__\/`'7%@WPD +M"`!UOMW8VRW*GT,`N`(```"#/0P71@``#X6`&@``C0U@GD,`NAL```#H>1L` +M`%K#@STD%T8```^$OAT``(/L"`^N7"0$BT0D!"6`?P``/8`?``!U#]D\)&:+ +M!"1F@^!_9H/X?XUD)`@/A8T=``#K`/,/?D0D!&8/*!6`GD,`9@\HR&8/*/AF +M#W/0-&8/?L!F#U0%H)Y#`&8/^M!F#]/*J0`(``!T3#W_"P``?'UF#_/*/3(, +M``!_"V8/UDPD!-U$)`3#9@\N_WLDNNP#``"#[!")5"0,B]2#PA2)5"0(B50D +M!(D4).CY&@``@\00W40D!,/S#WY$)`1F#_/*9@\HV&8/PL$&/?\#``!\)3TR +M!```?[!F#U0%<)Y#`/(/6,AF#]9,)`3=1"0$P]T%L)Y#`,-F#\(=D)Y#``9F +M#U0=<)Y#`&8/UEPD!-U$)`3#B_]5B^R#[#BA:.9#`#/%B47\BT4,B\B#X#_! +M^093:]@P5HL$C9@21@!7BWT0B7W0B4W4BT08&(E%V(M%%`/'B47<_Q6$,4,` +MBW4(BTWB+1=2(;>6+%(68 +M$D8`BDP:+?;!!'09BD0:+H#A^XA%](U%]&H"B&WUB$P:+5#K.NB;L/__#[8/ +MN@"```!FA11(="0[?=P/@\$```!J`HU%Z%=0Z""<__^#Q`R#^/\/A-(```!' +MZQAJ`5>-1>A0Z`6<__^#Q`R#^/\/A+<````SR8U%[%%1:@50:@&-1>A'4%'_ +M=Q0_W78_Q5$,$,`A4*=2QJ#5AJ`&:)1>2-1>!0:@&-1>10_W78 +M_Q5$,$,`A+#)68$D8` +MB$09+HL$E9@21@"`3!@M!/]&!.L(_Q4`,$,`B0:+3?R+QE]>,\U;Z$[\_O^+ +MY5W#B_]5B^Q14U:+=0@SP%>+?0R)!HE&!(E&"(M%$`/'B47\._AS/P^W'U/H +MAAL``%EF.\-U*(-&!`*#^PIU%6H-6U/H;AL``%EF.\-U$/]&!/]&"(/'`CM] +M_'++ZPC_%0`P0P")!E^+QEY;B^5=PXO_58OL45:+=0A6Z#GV__]9A-A?SK__]04?\51#!#`(7`=!^+A?3K__\!1@0[ +MQW(:BX7XZ___BXWPZ___.]ARE^L(_Q4`,$,`B0:+3?R+QE]>,\U;Z(SZ_O^+ +MY5W#B_]5B^RX$!0``.BO\?[_H6CF0P`SQ8E%_(M-#(O!P?@&@^$_:\DP4XM= +M$(L$A9@21@!6BW4(5XM,"!B+110#PXF-\.O__S/2B87XZ___B1:)5@2)5@CK +M=8V]_.O__SO8#QP)FB0>-1?J#QP([ +M^(N%^.O__W+1C87\Z___*_B-A?3K__]J`%"#Y_Z-A?SK__]74%'_%40P0P"% +MP'0?BX7TZ___`48$.\=R&HN%^.O__XN-\.O__SO8^?[_B^5=PXO_58OLN!@4``#HP?#^_Z%HYD,`,\6)1?R+30R+ +MP<'X!H/A/VO),%-6BP2%F!)&`#/;BW4(5XM$"!B+31"+^8F%[.O__XM%%`/! +MB1Z)7@2)A?3K__^)7@@[R`^#N@```(NU].O__XV%4/G__SO^AE +ME?__QP`)````Z$>5__^#(`#K%/]U$/]U#%;H1P```(/$#(OXB7WDQT7\_O__ +M_^@*````B\?K*8MU"(M]Y%;H_LC__UG#Z`N5__^#(`#H%I7__\<`"0```.CJ +MD___@\C_Z'_X_O_#B_]5B^R#[#"A:.9#`#/%B47\BTT0B4WX5HMU"%>+?0R) +M?="%R74',\#IS@$``(7_=1_HN)3__R$XZ,24___'`!8```#HF)/__X/(_^FK +M`0``4XO&B][!^P:#X#]KT#")7>2+!)V8$D8`B474B57HBEP0*8#[`G0%@/L! +M=2B+P??0J`%U'>AEE/__@R``Z'"4___'`!8```#H1)/__^E1`0``BT74]D00 +M*"!T#VH":@!J`%;HT@$``(/$$%;HY/K__UF$P'0YA-MT(O[+@/L!#X?N```` +M_W7XC47L5U#H5OK__X/$#(OPZ9P```#_=?B-1>Q75E#HB_C__X/$$.OFBT7D +MBPR%F!)&`(M%Z/9$`2B`=$8/OL.#Z`!T+H/H`709@^@!#X6:````_W7XC47L +M5U90Z,/[___KP?]U^(U%[%=64.BA_/__Z['_=?B-1>Q75E#HQ/K__^NABT0! +M&#/)48E-[(E-\(E-](U-\%'_=?A74/\51#!#`(7`=0G_%0`P0P")1>R-=>R- +M?=BEI:6+1=R%P'5CBT78AO7^_XOE7<.+_U6+ +M[%%15HMU"%=6Z'''__^#S_]9.\=U$>C7DO__QP`)````B\>+U^M-_W44C4WX +M4?]U$/]U#%#_%7PQ0P"%P'4/_Q4`,$,`4.AQDO__6>O3BT7XBU7\(\([QW3' +MBT7XB\Z#YC_!^09K]C"+#(V8$D8`@&0Q*/U?7HOE7<.+_U6+[/]U%/]U$/]U +M#/]U".AL____@\007<.+_U6+[%:+=0B%]G45Z$N2___'`!8```#H'Y'__X/( +M_^M1BT8,5X//_\'H#:@!=#E6Z$?M__]6B_CHS>[__U;H&*3__U#H]`(``(/$ +M$(7`>06#S__K$X-^'`!T#?]V'.A]C?__@V8<`%E6Z'"G__]9B\=?7EW#:A!H +M2+U#`.@1]?[_BW4(B77@,\"%]@^5P(7`=17HQ9'__\<`%@```.B9D/__@\C_ +MZSN+1@S!Z`Q6J`%T".@GI___6>OH@V7D`.C;I/__68-E_`!6Z#'___]9B_") +M=>3'1?S^____Z`L```"+QNCQ]/[_PXMUY/]UX.B_I/__6<-J#&AHO4,`Z)'T +M_O\S]HEUY(M%"/\PZ`+%__]9B77\BT4,BP"+.(O7P?H&B\>#X#]KR#"+!)68 +M$D8`]D0(*`%T(5?HK<7__UE0_Q5,,$,`AC\D/__B_#_%0`P0P")!N@` +MD?__QP`)````@\[_B77DQT7\_O___^@-````B\;H7?3^_\(,`(MUY(M-$/\Q +MZ*K$__]9PXO_58OL@^P,BT4(C4W_B47XB47TC47X4/]U#(U%]%#H1/___XOE +M7<.+_U6+[%%6BW4(@_[^=0WHDY#__\<`"0```.M+A?9X-SLUF!1&`',OB\:+ +MUH/@/\'Z!FO(,(L$E9@21@#V1`@H`704C44(B47\C47\4%;HA?___UE9ZQ/H +M2Y#__\<`"0```.@?C___@\C_7HOE70`BT4(_S#H93'1?S^____Z`T```"+QNC5\O[_P@P`BW7DBT40_S#H(L/__UG#B_]5B^R# +M[`R+10B-3?^)1?B)1?2-1?A0_W4,C47T4.A:____B^5=PXO_58OL45:+=0B# +M_OYU%>CXCO__@R``Z`./___'``D```#K4X7V>#<[-9@41@!S+XO&B]:#X#_! +M^@9KR#"+!)68$D8`]D0(*`%T%(U%"(E%_(U%_%!6Z'W___]96>L;Z*B.__^# +M(`#HLX[__\<`"0```.B'C?__@\C_7HOE7<.+_U6+[%97BWT(5^@=P___68/X +M_W4$,_;K3J&8$D8`@_\!=0GV@(@````!=0N#_P)U'/9`6`%T%FH"Z.["__]J +M`8OPZ.7"__]963O&=,A7Z-G"__]94/\5&#!#`(7`=;;_%0`P0P"+\%?H+L+_ +M_UF+SX/G/\'Y!FO7,(L,C9@21@#&1!$H`(7V=`Q6Z-J-__]9@\C_ZP(SP%]> +M7<.+_U6+[(M5"#/)]\*`?@``=&>$TGD#:A!95[\``@``A==T`X/)"/?"``0` +M`'0#@\D$]\(`"```=`.#R0+WP@`0``!T`X/)`5:^`&```(O"(\8[QEYU"(') +M``,``.L:]\(`0```=`B!R0`!``#K"O?"`"```'0""\]?B\%=PXO_58OLBU4( +M,\GWPCT,``!T7?;"`70#:A!9]L($=`.#R0CVP@AT`X/)!/;"$'0#@\D"]L(@ +M=`.#R0%6O@`,``"+PB/&.\9>=0B!R0`#``#K'O?"``@``'0(@]\(``@``=`B!R0`$``#K#O?"``$``'0&@=0.#R1"X`0`!`"/0.]!U`X/)((O! +M7<.+_U6+[%%1,\`A1?AFB47\V7W\@ST8#48``7P$#ZY=^`^W1?Q64.BO_?__ +M_W7XB_#H*/W__UD+QEDE'P,``%Z+Y5W#B_]5B^Q143/`,\EFB47\B4WXW7W\ +M@ST8#48``7P$#ZY=^`^W5?R+P?;"/70R]L(!=`6X$``0`/;"!'0%#0@`"`#V +MP@AT!0T$``0`]L(0=`4-`@`"`/;"('0%#0$``0"+5?CVPCUT-O;"`70%N1`` +M`!#VP@1T!H')"```"/;""'0&@ +M6XOE7<.+_U6+[(/L(%-65S/_B7W@B7WDB7WHB7WLB7WPB7WTB7WXV77@NQ\` +M'Q]3Z`3^____=0B+\/?6(W7DZ/7]__]9"_!9B77DV67@@ST8#48``7PGB7W\ +M#ZY=_%/H=/W___]U"(OP]]8C=?SH9?W__UD+\%F)=?P/KE7\7UY;B^5=P\S, +MS,S,S,S,S,S,S&H*Z%47``"C)!=&`#/`P\Q5B^R#[`B#Y/#='"3S#WX$).@( +M````R<-F#Q)$)`2Z`````&8/*.AF#Q3`9@]SU31F#\7-`&8/*`W`GD,`9@\H +M%=">0P!F#R@=,)]#`&8/*"7@GD,`9@\H-?">0P!F#U3!9@]6PV8/6.!F#\7$ +M`"7P!P``9@\HH/"D0P!F#RBXX*!#`&8/5/!F#US&9@]9]&8/7/+R#UC^9@]9 +MQ&8/*.!F#UC&@>'_#P``@^D!@?G]!P``#X>^````@>G^`P```\KR#RKQ9@\4 +M]L'A"@/!N1````"Z`````(/X``]$T68/*`V`GT,`9@\HV&8/*!60GT,`9@]9 +MR&8/6=MF#UC*9@\H%:"?0P#R#UG;9@\H+0"?0P!F#UGU9@\HJA"?0P!F#U3E +M9@]8_F8/6/QF#UG(\@]9V&8/6,IF#R@5L)]#`&8/6=!F#RCW9@\5]F8/6L-QH5P_____C+MV>K>R>@K`0``V>C> +MP?:%8?___P%T!-GHWO'VPD!U`MG]"NUT`MG@Z;("``#H1@$```O`=!0R[8/X +M`G0"]M79R=GAZZ_IM0(``.E+`P``W=C=V-LMP)]#`,:%W9R=GD +MF]V]8/___YOVA6'___]!==+9\W9R0K)=:[9\2;W;U@ +M____F_:%8?___P%U#]W8VRW`GT,`"NUT`MG@P\:%GT,`WMF;W;U@____ +MF_:%8?___T%UE=G`V?S9Y)O=O6#___^;BI5A____V=`VX`0```,.X```` +M`.OXN`(```#K\5:#['2+]%:#[`C='"2#[`C='"2;W78(Z(('``"#Q!3=9@C= +M!H/$=%Z%P'0%Z=`!``##S,S,S,S,S,S,@'H.!7419HN=7/___X#/`H#G_K,_ +MZP1FNS\39HF=7O___]FM7O___[M.H$,`V>6)E6S___^;W;U@____QH5P____ +M`)N*C6'____0X=#YT,&*P20/UP^^P('A!`0``(O:`]B#PQ#_(X!Z#@5U$6:+ +MG5S___^`SP*`Y_ZS/^L$9KL_$V:)G5[____9K5[___^[3J!#`-GEB95L____ +MF]V]8/___\:%*X-#AT/G0P8K!)`_7T.30Y`K$#[[`@>$$!```B]H#V(/#$/\CZ,X` +M``#9R=W8P^C$````Z_;=V-W8V>[#W=C=V-GNA.UT`MG@P]W8W=C9Z,/;O6+_ +M___;K6+____VA6G___]`=`C&A7#___\`P\:%(``P``@\I_9HE4)`;9;"0&PZD```@` +M=`:X`````,/9H/@ +M('05F]_@9H/@('0,N`@```#HV0```%K#V2PD6L.#[`C=%"2+1"0$@\0()0`` +M\'_K%(/L"-T4)(M$)`2#Q`@E``#P?W0]/0``\']T7V:+!"1F/7\"="IF@^`@ +M=2&;W^!F@^`@=!BX"````(/Z'70'Z'L```!:P^A=````6L/9+"1:P]T%C*!# +M`-G)V?W=V=G`V>'<'7R@0P";W^">N`0```!SQ]P-G*!#`.N_W06$H$,`VW`V4H$,`ZY;,S,S,58OL@\3@B47@ +MBT48B47PBT4#=7?B)3>2+11"+312)1>B)3>R-10B- +M3>!045+HO@0``(/$#-U%^&:!?0A_`G0#V6T(R<.+_U6+[(/L)*%HYD,`,\6) +M1?R#/1`71@``5E=T$/\U(!=&`/\5,#)#`(OXZP6_8(1"`(M%%(/X&@^/(0$` +M``^$#P$``(/X#@^/IP````^$C@```&H"62O!='B#Z`%T:H/H!716@^@!#X6; +M`0``QT7@J*!#`(M%"(O/BW40QT7<`0```-T`BT4,W5WDW0"-1=S=7>S=!E#= +M7?3_%6`R0P#_UUF%P`^%60$``.@X@/__QP`A````Z4D!``")3=S'1>"HH$,` +MZ00!``#'1>"DH$,`ZZ*)3=S'1>"DH$,`Z>P```#'1=P#````QT7@L*!#`.G9 +M````@^@/=%&#Z`ET0X/H`0^%`0$``,=%X+2@0P"+10B+SXMU$,=%W`0```#= +M`(M%#-U=Y-T`C47"PH$,`Z[O9Z(M%$-T8Z:D```"#Z!MT6X/H`71*@^@5=#F#Z`ET*(/H`W07 +M+:L#``!T"8/H`0^%@````(M%"-T`Z\;'1>"XH$,`Z=G^___'1>#`H$,`Z#(H$,`Z<'^___'1>"TH$,`Z;7^___'1=P"````QT7@M*!#`(M%"(O/ +MBW40W0"+10S=7>3=`(U%W-U=[-T&4-U=]/\58#)#`/_7687`=0OHZG[__\<` +M(@```-U%]-T>BTW\7S/-7NA3X?[_B^5=PXO_58OL45%35K[__P``5F@_&P`` +MZ'??___=10B+V%E9#[=-#KCP?P``(\A14=T<)&8[R'4WZ$0+``!(65F#^`)W +M#E93Z$??___=10A96>MCW44(W070H$,`4X/L$-C!W5PD"-T<)&H,:@CK/^@M +M`P``W57XW44(@\0(W>'?X/;$1'H25MW94]W8Z`+?___=1?A96>L>]L,@=>E3 +M@^P0V'?X%E9W=GVQ$1Z*]P-`*E#`%%1W57XW1PDZ%8"``#=1?C:Z=_@ +M65GVQ$1Z!6H"6.L),\!`ZP3=V#/`B^5=PXO_58OLW44(N0``\'_9X;@``/#_ +M.4T4=3N#?1``=779Z-C1W^#VQ`5Z#]W9W=C=!9"J0P#IZ0```-C1W^#=V?;$ +M08M%&`^%V@```-W8V>[IT0```#E%%'4[@WT0`'4UV>C8T=_@]L0%>@O=V=W8 +MV>[IK0```-C1W^#=V?;$08M%&`^%G@```-W8W060JD,`Z9$```#=V#E-#'4N +M@WT(``^%@@```-GNW440V-'?X/;$00^$<____]C9W^#VQ`6+11A[8MW8V>CK +M7#E%#'59@WT(`'53W44045'='"3HM?[__]GNW44065G8T8O(W^#VQ$%U$]W9 +MW=C=!9"J0P"#^0%U(-G@ZQS8V=_@]L0%>@^#^0%U#MW8W06@JD,`ZP3=V-GH +MBT48W1@SP%W#B_]3B]Q148/D\(/$!%6+:P2);"0$B^R![(@```"A:.9#`#/% +MB47\BT,05HMS#%+ +M2PB#^1!T$(/Y%G0+@_D==`:#9<#^ZQ*+1<#=1A"#X..#R`/=7;")1<"-1AA0 +MC48(4%%7C85\____4(U%@%#H0@,``(/$&(N-?/___VC__P``4>@HW/__@SX( +M65ET%.@2<___A,!T"U;H-W/__UF%P'4(_S;H(`8``%F+3?Q?,\U>Z+C=_O^+ +MY5V+XUO#B_]5B^Q14=U%"-G\W5WXW47XB^5=PXO_58OLBT4(J"!T!&H%ZQ>H +M"'0%,\!`7<.H!'0$:@+K!J@!=`5J`UA=PP^VP(/@`@/`7<.+_U.+W%%1@^3P +M@\0$58MK!(EL)`2+[('LB````*%HYD,`,\6)1?Q6BW,@C4,85U90_W,(Z)4` +M``"#Q`R%P'4F@V7`_E"-0QA0C4,04/]S#(U#(/]S"%"-18!0Z'$"``"+[<&=_@]L0%>RS= +M!9BJ0P#K,HM-#-GNW!G?X/;$!7H>W068JD,`ZQZ+30S9[MP9W^#VQ`5Z"-T% +MD*I#`.L(W060JD,`V>#=&8/F_NG4````]L,"#X3+````]D40$`^$P0```%[:Z=_@]L1$#XN1````W0&-1?Q045'='"3HG`0``(M% +M_(/$#`4`^O__B47\W57PV>X]SOO__WT',__>R4?K6=[9,]+?X/;$074!0HM% +M]KD#_/__@^`/@\@09HE%]HM%_#O!?2LKR(M%\/9%\`%T!87_=0%'T>CV1?0! +MB47P=`@-````@(E%\-%M](/I`77:W47PA=)T`MG@BT4,W1CK`S/_1X7_7W0( +M:A#H3=G__UF#YOWVPQ!T$?9%$"!T"VH@Z#?9__]9@^;O,\"%]EX/E,!;B^5= +MPXO_58OL:@#_=1S_=1C_=13_=1#_=0S_=0CH!0```(/$'%W#B_]5B^R+10@S +MR5,SVT.)2`2+10A7OPT``,")2`B+10B)2`R+31#VP1!T"XM%"+^/``#`"5@$ +M]L$"=`R+10B_DP``P(-(!`+VP0%T#(M%"+^1``#`@T@$!/;!!'0,BT4(OXX` +M`,"#2`0(]L$(=`R+10B_D```P(-(!!"+30A6BW4,BP;!X`3WT#-!"(/@$#%! +M"(M-"(L&`\#WT#-!"(/@"#%!"(M-"(L&T>CWT#-!"(/@!#%!"(M-"(L&P>@# +M]]`S00B#X`(Q00B+!HM-",'H!??0,T$((\,Q00CH?]C__XO0]L(!=`>+30B# +M20P0]L($=`>+10B#2`P(]L((=`>+10B#2`P$]L(0=`>+10B#2`P"]L(@=`:+ +M10@)6`R+!KD`#```(\%T-3T`!```="(]``@``'0,.\%U*8M%"(,(`^LABTT( +MBP&#X/Z#R`*)`>L2BTT(BP&#X/T+P^OPBT4(@R#\BP:Y``,``"/!="`]``(` +M`'0,.\%U(HM%"(,@X^L:BTT(BP&#X.>#R`3K"XM-"(L!@^#K@\@(B0&+10B+ +M313!X04S"('AX/\!`#$(BT4("5@@@WT@`'0LBT4(@V`@X8M%&-D`BT4(V5@0 +MBT4("5A@BT4(BUT<@V!@X8M%"-D#V5A0ZSJ+30B+02"#X..#R`*)02"+11C= +M`(M%"-U8$(M%"`E88(M-"(M='(M!8(/@XX/(`HE!8(M%"-T#W5A0Z*#6__^- +M10A0:@%J`%?_%90Q0P"+30CV00@0=`.#)O[V00@(=`.#)OOV00@$=`.#)O?V +M00@"=`.#)N_V00@!=`.#)M^+`;K_\___@^`#@^@`=#6#Z`%T(H/H`70-@^@! +M=2B!#@`,``#K((L&)?_[__\-``@``(D&ZQ"+!B7_]___#0`$``#K[B$6BP'! +MZ`*#X`>#Z`!T&8/H`70)@^@!=1HA%NL6BP8CP@T``@``ZPF+!B/"#0`#``") +M!H-](`!>=`?905#9&^L%W4%0W1M?6UW#B_]5B^R+10B#^`%T%8/`_H/X`7<8 +MZ`MU___'`"(```!=P^C^=/__QP`A````7<.+_U6+[(M5#(/L(#/)B\$Y%,68 +MJ4,`=`A`@_@=?/'K!XL,Q9RI0P")3>2%R715BT40B47HBT44B47LBT48B47P +MBT4<5HMU"(E%](M%(&C__P``_W4HB47XBT4DB77@B47\Z%'5__^-1>!0Z&UL +M__^#Q`R%P'4'5NA5____6=U%^%[K&VC__P``_W4HZ"?5____=0CH.?___]U% +M((/$#(OE7<.+_U6+[-U%"-GNW>'?X%?VQ$1Z"=W9,__IKP```%9FBW4.#[?& +MJ?!_``!U?(M-#(M5"/?!__\/`'4$A=)T:M[9OP/\___?X/;$074%,\!`ZP(S +MP/9%#A!U'P/)B4T,A=)Y!H/)`8E-#`/23_9%#A!TZ&:+=0Z)50BY[_\``&8C +M\6:)=0Z%P'0,N`"```!F"_!FB74.W44(:@!14=T<).@Q````@\0,ZR-J`%'= +MV%'='"3H'@````^W_H/$#,'O!('G_P<``('O_@,``%Z+11").%]=PXO_58OL +M45&+31`/MT4.W44()0^```#=7?B-B?X#``#!X00+R&:)3?[=1?B+Y5W#B_]5 +MB^R!?0P``/!_BT4(=0>%P'450%W#@7T,``#P_W4)A$`@```9H7`=1[W10S__P\`=0:#?0@`=`_WV1O)@^&0C8&` +M````7"-04!=P_?9&\F!X0C___^-@0`! +M``!=P\S_):@Q0P#_)=`Q0P#,S,S,S,S,S%6+[(M%"#/24U97BT@\`\@/MT$4 +M#[=9!H/`&`/!A=MT&XM]#(MP##O^<@F+2`@#SCOY<@I"@\`H.]-RZ#/`7UY; +M76XOE7<.+1>R+`#/)@3@%``#`#Y3!B\'#BV7HQT7\_O__ +M_S/`BTWP9(D-`````%E?7EN+Y5W#S,S,S,S,58OLBT4(N4U:``!F.0AT!#/` +M7<.+2#P#R#/`@3E010``=0RZ"P$``&8Y41@/E,!=PU!D_S4`````C40D#"MD +M)`Q35E>)*(OHH6CF0P`SQ5")9?#_=?S'1?S_____C47T9*,`````\L/,S,S, +MS,S,S%:+1"04"\!U*(M,)!"+1"0,,]+W\8O8BT0D"/?QB_"+P_=D)!"+R(O& +M]V0D$`/1ZT>+R(M<)!"+5"0,BT0D"-'IT=O1ZM'8"\EU]/?SB_#W9"04B\B+ +M1"00]^8#T7(..U0D#'<(<@\[1"0(=@E.*T0D$!M4)!0SVRM$)`@;5"0,]]KW +MV(/:`(O*B].+V8O(B\9>PA``S,S,S,S,S,S,S,QH4"%"`&3_-0````"+1"00 +MB6PD$(UL)!`KX%-65Z%HYD,`,47\,\6)1>10B67H_W7XBT7\QT7\_O___XE% +M^(U%\&2C`````/+#BTWD,\WRZ`;2_O_RZ?S2_O_,S,S,S,Q1C4PD""O(@^$/ +M`\$;R0O!6>D:R?[_48U,)`@KR(/A!P/!&\D+P5GI!,G^_\S,S,R#/1@-1@`` +M=#=5B^R#[`B#Y/C='"3R#RP$),G#@ST8#48``'0;@^P$V3PD6&:#X']F@_A_ +M=-.-I"0`````C4D`58OL@^P@@^3PV<#95"08WWPD$-]L)!"+5"08BT0D$(7` +M=#S>Z872>1[9'"2+#"2!\0```("!P?___W^#T`"+5"04@](`ZRS9'"2+#"2! +MP?___W^#V`"+5"04@]H`ZQ2+5"04]\+___]_=;C97"08V5PD&,G#S,S,S,S, +MS,S,S,Q5B^Q7@ST8#48``0^"_0```(M]"'=W#[95#(O"P>(("]!F#V[:\@]P +MVP`/%MNY#P```"//@\C_T^`K^3/2\P]O#V8/[])F#W319@]TRV8/U\HCR'48 +M9@_7R2/(#[W!`\>%R0]%T(/(_X/'$.O04V8/U]DCV-'A,\`KP2/(22/+6P^] +MP0/'AMF#V["@\<09@\Z8T?P0(U,#_`/0L%U[5_)P[CP____(\=F#^_`9@]T +M`+D/````(\^Z_____]/B9@_7^"/Z=11F#^_`9@]T0!"#P!!F#]?XA?]T[`^\ +MUP/"Z[V+?0@SP(/)__*N@\$!]]F#[P&*10S]\JZ#QP$X!W0$,\#K`HO'_%_) +MPXM-\.G!>/W_BTWP@<$H$```Z65!_?^+3?"!P>@@``#I@ZO]_XM-\('!@"(` +M`.E@]_S_BTWP@<'010``Z5+W_/]H\((``/]U[.C1Q?[_65G#N(BQ0P#IX^#^ +M_[@XL4,`Z=G@_O^-3#I4O;\_[@0LD,`Z:/@_O^-323IZ__\_[@\LD,`Z9'@_O^-33#IV?_\ +M_[AHLD,`Z7_@_O^-C109___I__W]_[B4LD,`Z6K@_O^+3?#I69/]_XM-\('! +M'*,``.G$._W_BTWP@<%\HP``Z;8[_?^+3?"!P=RC``#IJ#O]_XM-\('!/*0` +M`.F:._W_BTWP@<&SH +M6<3^_UE9P[A4M$,`Z6O?_O^-C:AB___I3_7\_[CLLT,`Z5;?_O^-C<3^___I +M=LS]_XV-G-[__^G,=OW_N(BT0P#I-M_^_XV-N.___^FW=OW_C4W@Z8'T_/^X +M(+1#`.D9W_[_C4W@Z6_T_/^XM+1#`.D'W_[_C8W(W___Z8AV_?^XX+1#`.GR +MWO[_BTWP@<$D4```Z0_,_?^+3?"!P7!A``#I@I']_[@4M4,`Z_O^+3?"! +MP9````#I6(G]_XM-\('!I````.E*B?W_BTWP@<&X````Z3R)_?]HP!```/]U +M[.AVP_[_65G#:,`0``#_=>SH9L/^_UE9P[@XM4,`Z7C>_O^-C?S<___I^77] +M_[B,M4,`Z6/>_O^+3?"#P03IE(?]_XM-\(/!).FK\_S_BTWP@\$XZ:#S_/^+ +M3?"#P4SI9_O]_XM-\('!1$L``.FD^_W_BTWP@<'8F```Z9O[_?^+3?"!P63F +M``#I4)W]_[A@MD,`Z0/>_O^-3<3I6?/\_[@\MD,`Z?'=_O\SVXM%\+GD2@`` +M]^$/D,/WVPO8,\"#PP0/DL#WV`O#4/]U[.CZR?[_65G#N+BU0P#IO-W^_XU- +MU.D2\_S_N.2U0P#IJMW^_XU-V.D`\_S_N!"V0P#IF-W^_V@X`P``_W7PZ&S" +M_O]96<.XQ+9#`.E^W?[_C8W<@O__Z6+S_/^-3=SI$//\_[@`N$,`Z6'=_O^- +MC63.___IXG3]_[@LN$,`Z4S=_O^-C:AR___I@X/]_[A8N$,`Z3?=_O^-C?#> +M___IZ5K]_[B(MT,`Z2+=_O^+5"0(C4(,BTKL,\CHI\O^_[@8ND,`Z0?=_O_, +MS,RYZ`Y$`.GSJ_W_S,S,S,S,N<"!1`#I^M0#`(S4`P"HU`,`OM0#`-34`P#> +MU`,`ZM0#`/;4`P`$U0,`%M4#`";5`P`ZU0,`2M4#`%S5`P!HU0,`>M4#`)35 +M`P`2U@,``````*#2`P".T@,`<-(#`%#2`P`RT@,`'M(#``S2`P``T@,`]-$# +M``````!0,D(``````'#M00``$$``$!!``"`00`!`$$``4!!``&`00`"P$$`` +MT!!``'`00`"0$$````````````"P[$$`8.U!`'!:0@"@GD(`<.Q"`!`#0P`` +M``````````"&0@"P&4,`<)]"```````````````````0````$!`````@$``` +M`$`0````4!````!@$````'`0````D!````"P$````-`0````T!8```#`'0`` +M`+`_````D&`````080```$"8````<)@```!0FP```)"=````T)X```#@GP`` +M`$"J````T-$```!PT@```*#2````$-,````PTP```````D-,```"@#`$` +M`-`<`0``\!P!```@'0$``+`>`0``D!\!``#0<@$``/"&`0``T(L!``#@BP$` +M`/"+`0```(P!```0C`$``"",`0``P(P!``#0C`$``.",`0``,(T!``!`C0$` +M`-"-`0``X(T!``#PC0$``!".`0``((X!```PC@$``$".`0``<(X!``"`C@$` +M`!"/`0``((\!``#@D@$```"4`0``\)0!````E0$``!"5`0``()4!```PE0$` +M``"6`0``,)8!``!`E@$``%"6`0``8)8!``!PE@$``&"8`0``<)@!``#`F0$` +M`-"9`0``X)D!``#PF0$```":`0``$)H!```@F@$``+"=`0``\)T!``#`I@$` +M`""L`0``8*\!``!PL0$``'"[`0``4,\!``#0YP$``+#L`0``8.T!``!P[0$` +M`/#N`0``$.\!``!0[P$``!#S`0```/0!``"@]`$``%`A`@`!0","``"@)`(` +M`$`E`@``@"4"``!0,@(``/`R`@``4#<"``!P6@(``"!^`@``0'X"``"@@@(` +M`,""`@``X(("``#P@@(```"#`@``0(,"``!0@P(``&"$`@```(8"``"@D0(` +M`,"3`@``\),"``"@G@(``'"?`@``<*$"``#0H0(``,"F`@``(*<"```@JP(` +M`-"K`@``$*P"``"@M0(``%"Y`@``H+H"``#`N@(``'#L`@``$`,#``"P&0,` +M`&`C`P``<",#``"`(P,``)`C`P``H",#``"P(P,``````````````````"H` +M````````T!9``%";0`!PF$``D)U``-">0`#@GT``P!U```````!-`&$`>`!I +M`&T`=0!M`"``80!L`&P`;P!W`&4`9``@`&$`<@!R`&$`>0`@`',`:0!Z`&4` +M(``H`"4`=0`I`"``:0!S`"``90!X`&,`90!E`&0`90!D````0P!-`%0```!2 +M`%(``````&@`)0!U````:`!C`"4`=0``````>``E`'4```!X`&,`)0!U```` +M```````````````````[`"4`=0```````````0(#!`4&!P@)"@L,#0X/#@H$ +M"`D/#08!#``""P<%`PL(#``%`@\-"@X#!@!;9^8):H6N9[MR\VX\.O5/I2X`7```````4P!E`%,`90!C`'4` +M<@!I`'0`>0!0`'(`:0!V`&D`;`!E`&<`90```%,`90!2`&4`0````!#`'(`>0!P`'0` +M4`!R`&\`=`!E`&,`=`!-`&4`;0!O`'(`>0`@`&8`80!I`&P`90!D````0P!R +M`'D`<`!T`%4`;@!P`'(`;P!T`&4`8P!T`$T`90!M`&\`<@!Y`"``9@!A`&D` +M;`!E`&0`````````F"^*0I%$-W'/^\"UI=NUZ5O"5CGQ$?%9I((_DM5>'*N8 +MJ@?8`5N#$KZ%,23#?0Q5=%V^!1XR(0(`L>,^O^^D.ML4*3WH_F^\GAQQ@`` +M``!X;&ES='!O5<`````4V5T1&5F875L=$1L;$1I0!P`'0`8@!A`',` +M90`N`&0`;`!L````;`!P`&L`+@!D`&P`;````'4`0!P`'0`,P`R`"X`9`!L`&P```!M`',`80!S`&X`,0`N`&0`;`!L``````!C +M`'(`>0!P`'0`=0!I`"X`9`!L`&P```!W`&D`;@!T`'(`=0!S`'0`+@!D`&P` +M;```````0!L`&4`/@```#P`+P!S`'0`>0!L`&4` +M/@```````````#P`0![`&8`;P!N`'0`+0!F +M`&$`;0!I`&P`>0`Z`"(`00!R`&D`80!L`"(`.P!F`&\`;@!T`"T``!M`&$`<`!P`&D`;@!G`&8`:0!L`&4`+@!T`&T`<````````!P`&$`<@``````3`!)`$,`10!.`%,`10!$`$P`1P``````(``` +M`%\`7P!T`&T`<`!?`'(`80!R`%\`&-L=7-I=F4`4F5L96%S95-25TQO8VM% +M>&-L=7-I=F4```````````!32$Q705!)+F1L;```````0T]-0U1,,S(N9&QL +M`````!2K0P#0YT$`7``````````````````````````````````````````` +M````````````````````````````````````:.9#`)"L0P`E````8#)#```` +M``#4,D,`D``````U`1!`!```` +M```````````#````(`63&0``````````H"1"`$"L0P"`)4(`\(9!`&)A9"!E +M>&-E<'1I;VX```#X54,`#%9#`$A60P!@.T,`80!D`'8`80!P`&D`,P`R```` +M```\`'``:0`M`&T`0!N`&,`:``M`&P`,0`M`#(`+0`P```````!`````P```$9L0P!?7V)A/0``8'9F=&%B;&4G````8'9B=&%B;&4G```` +M8'9C86QL)P!@='EP96]F)P````!@;&]C86P@2!C;VYS +M=')U8W1O'AX>`@'"`<`!P`( +M"`@```@'"``'"``'`"AN=6QL*0``*`!N`'4`;`!L`"D````````````%``#` +M"P`````````=``#`!`````````"6``#`!`````````"-``#`"`````````". +M``#`"`````````"/``#`"`````````"0``#`"`````````"1``#`"``````` +M``"2``#`"`````````"3``#`"`````````"T`@#`"`````````"U`@#`"``` +M```````,`````P````D```!M`',`8P!O`'(`90!E`"X`9`!L`&P```!#;W)% +M>&ET4')O8V5S0``5'5E0!7961N97-D87D` +M``!4:'5R0````!&0````!! +M=6=U0````!D9&1D+"!-34U-(&1D+"!Y>7EY +M`$A(.FUM.G-S`````%,`=0!N````30!O`&X```!4`'4`90```%<`90!D```` +M5`!H`'4```!&`'(`:0```%,`80!T````4P!U`&X`9`!A`'D``````$T`;P!N +M`&0`80!Y``````!4`'4`90!S`&0`80!Y````5P!E`&0`;@!E`',`9`!A`'D` +M``!4`&@`=0!R`',`9`!A`'D``````$8`<@!I`&0`80!Y``````!3`&$`=`!U +M`'(`9`!A`'D``````$H`80!N````1@!E`&(```!-`&$`<@```$$`<`!R```` +M30!A`'D```!*`'4`;@```$H`=0!L````00!U`&<```!3`&4`<````$\`8P!T +M````3@!O`'8```!$`&4`8P```$H`80!N`'4`80!R`'D```!&`&4`8@!R`'4` +M80!R`'D``````$T`80!R`&,`:````$$`<`!R`&D`;````$H`=0!N`&4````` +M`$H`=0!L`'D``````$$`=0!G`'4`0``````9`!D`&0`9``L`"``30!-`$T`30`@`&0`9``L`"``>0!Y`'D`>0`` +M`$@`2``Z`&T`;0`Z`',`&1# +M`(AD0P"<9$,`L&1#`+AD0P#`9$,`U&1#`/QD0P`094,`````````(``@`"`` +M(``@`"``(``@`"``*``H`"@`*``H`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(``@`"``(``@`$@`$``0`!``$``0`!``$``0`!``$``0`!``$``0`!`` +MA`"$`(0`A`"$`(0`A`"$`(0`A``0`!``$``0`!``$``0`($!@0&!`8$!@0&! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$0`!`` +M$``0`!``$`""`8(!@@&"`8(!@@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$" +M`0(!`@$"`0(!`@$"`0(!$``0`!``$``@`"``(``@`"``(``H`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``( +M`!``$``0`!``$``0`!``$``0`!(!$``0`#``$``0`!``$``4`!0`$``2`1`` +M$``0`!0`$@$0`!``$``0`!```0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`1```0$!`0$!`0$!`0$!`0$"`0(!`@$"`0(! +M`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$0``(!`@$" +M`0(!`@$"`0(!`@$!`0`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````(``@`"``(``@`"``(``@`"``*``H`"@`*``H`"``(``@`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`$@`$``0`!``$``0`!``$``0`!``$``0 +M`!``$``0`!``A`"$`(0`A`"$`(0`A`"$`(0`A``0`!``$``0`!``$``0`($` +M@0"!`($`@0"!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`! +M``$``0`0`!``$``0`!``$`""`((`@@""`((`@@`"``(``@`"``(``@`"``(` +M`@`"``(``@`"``(``@`"``(``@`"``(`$``0`!``$``@```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````"`@8*#A(6&AXB)BHN,C8Z/D)&2DY25EI>8 +MF9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*SM+6VM[BYNKN\O;Z_P,'"P\3% +MQL?(R+CY.7FY^CIZNOL[>[O\/'R +M\_3U]O?X^?K[_/W^_P`!`@,$!08'"`D*"PP-#@\0$1(3%!46%Q@9&AL<'1X? +M("$B(R0E)B7I;7%U>7V!A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY +M>GM\?7Y_@(&"@X2%AH>(B8J+C(V.CY"1DI.4E9:7F)F:FYR=GI^@H:*CI*6F +MIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+V^O\#!PL/$Q<;'R,G*R\S-SL_0T=+3 +MU-76U]C9VMOKK[.WN[_#Q\O/T]?;W^/GZ^_S]_O^` +M@8*#A(6&AXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRM +MKJ^PL;*SM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P`!`@,$!08' +M"`D*"PP-#@\0$1(3%!46%Q@9&AL<'1X?("$B(R0E)B7V!! +M0D-$149'2$E*2TQ-3D]045)35%565UA96GM\?7Y_@(&"@X2%AH>(B8J+C(V. +MCY"1DI.4E9:7F)F:FYR=GI^@H:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[ +MO+V^O\#!PL/$Q<;'R,G*R\S-SL_0T=+3U-76U]C9VMOKK[.WN[_#Q\O/T]?;W^/GZ^_S]_O_@;D,`*&]#``Q60P!H;T,`H&]#`.AO +M0P!(<$,`E'!#`$A60P#0<$,`$'%#`$QQ0P"(<4,`V'%#`#!R0P"(@!A`'0`:0!O`&X`+0!L`#$`+0`R +M`"T`,0```#P`<`!I`"T`;0!S`"T`=P!I`&X`+0!C`&\`<@!E`"T`;`!O`&,` +M80!L`&D`>@!A`'0`:0!O`&X`+0!O`&(`0!S`&D`;@!F`&\`+0!L`#$`+0`R`"T`,0``````/`!P`&D`+0!M`',` +M+0!W`&D`;@`M`&,`;P!R`&4`+0!W`&D`;@!R`'0`+0!L`#$`+0`Q`"T`,``` +M````/`!P`&D`+0!M`',`+0!W`&D`;@`M`&,`;P!R`&4`+0!X`',`=`!A`'0` +M90`M`&P`,@`M`#$`+0`P````80!P`&D`+0!M`',`+0!W`&D`;@`M`'(`=`!C +M`&\`<@!E`"T`;@!T`'4``!T`"T`;0!S`"T`=P!I`&X`+0!N`'0`=0!S`&4`<@`M`&0`:0!A +M`&P`;P!G`&(`;P!X`"T`;``Q`"T`,0`M`#```````&4`>`!T`"T`;0!S`"T` +M=P!I`&X`+0!N`'0`=0!S`&4`<@`M`'<`:0!N`&0`;P!W`',`=`!A`'0`:0!O +M`&X`+0!L`#$`+0`Q`"T`,```````=0!S`&4`<@`S`#(```````(````2```` +M`@```!(````"````$@````(````2``````````X```!'971#=7)R96YT4&%C +M:V%G94ED``@````2````!````!(```!,0TUA<%-TQVL%````````0.KM=$;0G"R?#`````!A];FK +MOZ1DCJ]6J9]'!C:R +M2UW@7]R`"JK^\$#9CJC0@!IK(V,``&0X3#*6QU>#U4)*Y&$BJ=D]$#R]6V%/;FDJ>Q@^=71E"F[S5MFEBX[HMM]^F6L +M4]YWFZ(@L%/YO\:K)91+3>,$`($MP_OTT")24"@/M_/R$U<3%$+)3W`L!T&XP`7?"P +M=<;;J12YV>+?<@]E3$LH=Q;@]FW"D4-1S\F5)U6KXM8GYJBX<6:#Z*/#TS3^E+AF@<=:\AT1I?0%N +M^1"=5AIY=:2/``#ALKD\=8B"DQ8_S6LZM(G>AYX(1D5-:`RFV_V1DR3?$^QH +M,"=$M)GN08&VP\H"6/%1:-FB)79]C7%.`0``9/OF@UKR#ZU7E!&U@`!FM2D@ +MS]+%UWUM/Z4<3;?-WG"=VCU!%K=.RM!QF!/DUY`Z0$_B/ZOY;W=-)N:O"@,` +M```0,56K"=)8#*;+)F%6AX,<:L'TAW5VZ$0LST>@09X%",D^!KJ@Z,C/YU7` +M^N&R1`'OL'X@)',EZ8L2FF5OQXI',3'JM+5V';'-M$,5=J3D)W'FJC+2R48=O`-"8BH +M]W00'SK\$4CEK8YC61#GRY?H:=5Y3@.4Y`$```````"AZ=1< +M;&]]Y)OGV3OYH6]B=U$TB\;H62O>6-X\SUC_1B(5?%>H677G)E-G=Q=CM^;K +M7PK]XVDYZ#,UH`6HA[DQ]D,/'R';0UK8EO4;JZ(9/V@$````9/Y]OB\$R4NP +M[?7AVDZACW/;">2<[D]G#9\5J=:UM?8.ECASD<))Z\R7*U^5/S@/]K.1(!0W +M>-'?0M'!WB(^%5??KXI?Y?5WB\KGHUM2+P,]3^=""@`````0W?12"45=X4*T +MKBXTLZ-OH\T_;GHHM/=WP4O0R-)GX/BHKF<[R:VS5LAL"YV=E0#!2%L]BKY* +M]#;94DWHVW'%(1SY"8%%2FK8JM=\3.$(G*6;=0"(/.07``````!`DM00\02^ +M!0IKU'\.9?K)14P*TP+#@.A.SS^*+K\B'=80YZXI.0]<\+R +M1GR88G2/#R$9VZZVHRZR%%"JC:LYZD(TEI>IW]\!_M/STH`">:`W`````9N< +M4/&MW,H&J)M1^/(#Q*+A4J`Z(Q#7J7.%1+K9$L\#&(=P +MFSK<4NA2LN5.^Q<'+Z9-ON'7JPI/[6*,>^RYSB%`9M0`@Q6AYG7CS/(I+X2! +M`````.07=V3[]=-Q/7:@Z2\4?69,]#,N\;CSC@T/$VF43'.H#R9@0!,!/`J( +M<)\[9=2Q&'#8JK8VH?>ZC.X86CP +ME+V:S!-JU<&-+0$`````$!/H-GK&GBD6]`H_2?//IJ5WHR.^I();HLPOO+K^K'8R(4PN,LT3/K21_G`VV5R[A9<40OT:S$;X +MW3CFTH<':1?1`AK^\;4^KJNYPV_N"!R^`@``````0*K"0('9=_@L/=?A<9@O +MY]4)8U%RW1FHKT9:*M;.W`(J_MU&SHTD$R>MTB.W&;L$Q"O,!K?*Z[%'W$L) +MG8Q@%;#CJA8+S1"'@2+%.6__A/\_P4/>6-G_3;59G90X;EB!@`` +M`&&P9QH*`=+`X070.W,2VS\NGZ/BG;)AXMQC*KP$)I2;U7!AEB7CPKEU"Q0A +M+!T?8&H3N*([THES??%@W]?*QBO?:08WA[@D[0:39NMN21EOVXV3=8)T7C:: +M;L4QMY`VQ4(HR(YYKB3>#@````!D0<&:B-69+$/9&N>`HBX]]FL]>4F"0ZGG +M>4KF_2*:<-;@[\_*!=>DC;UL`&3CL]Q.I6X(J*&>18]TR%2._%?&=,S4P[A" +M;F/95\Q;M37I_A-L85'$&MNZE;6=3O&A4.?YW'%_8PG2(``````!") +MO5X\5C=WXSBCRSU/GM*!+)[WI'3'^<.7YQQJ..1?K)R+\P?Z[(C5K,%:/L[, +MKX5P/Q^=TVTMZ`P8?1=OE&E>X2R.9$@YH941X`\T6#P7M)3V2">]5R9\+MJ+ +M=:"0@#L3MMLMD$C/;7X$Y"294````````@(```,%```$"0`!!`T``042``$& +M&``"!AX``@(5#`!$```"`A4,`$@```(B%0P`3````D(5#`!0```"8A4,` +M%0```*"%0P`6````J(5#`!@```"PA4,`&0```+B%0P`:````P(5#`!L```#( +MA4,`'````-"%0P`=````V(5#`!X```#@A4,`'P```.B%0P`@````\(5#`"$` +M``#XA4,`(@```.AS0P`C`````(9#`"0````(AD,`)0```!"&0P`F````&(9# +M`"<````@AD,`*0```"B&0P`J````,(9#`"L````XAD,`+````$"&0P`M```` +M2(9#`"\```!0AD,`-@```%B&0P`W````8(9#`#@```!HAD,`.0```'"&0P`^ +M````>(9#`#\```"`AD,`0````(B&0P!!````D(9#`$,```"8AD,`1````*"& +M0P!&````J(9#`$<```"PAD,`20```+B&0P!*````P(9#`$L```#(AD,`3@`` +M`-"&0P!/````V(9#`%````#@AD,`5@```.B&0P!7````\(9#`%H```#XAD,` +M90````"'0P!_````M#5#``$$```(AT,``@0``!2'0P`#!```((=#``0$``#< +M(I#`($$``"$BD,``0@``)"* +M0P`$"```Q'-#``<(``"0``````80!Z``````!E`'4``````&T`:P``````80!F``````!K +M`&$``````&8`;P``````:`!I``````!M`',``````&L`:P``````:P!Y```` +M``!S`'<``````'4`>@``````=`!T``````!P`&$``````&<`=0``````=`!A +M``````!T`&4``````&L`;@``````;0!R``````!S`&$``````&T`;@`````` +M9P!L``````!K`&\`:P```',`>0!R````9`!I`'8```!A`'(`+0!3`$$```!B +M`&<`+0!"`$<```!C`&$`+0!%`%,```!C`',`+0!#`%H```!D`&$`+0!$`$L` +M``!D`&4`+0!$`$4```!E`&P`+0!'`%(```!F`&D`+0!&`$D```!F`'(`+0!& +M`%(```!H`&4`+0!)`$P```!H`'4`+0!(`%4```!I`',`+0!)`%,```!I`'0` +M+0!)`%0```!N`&P`+0!.`$P```!N`&(`+0!.`$\```!P`&P`+0!0`$P```!P +M`'0`+0!"`%(```!R`&\`+0!2`$\```!R`'4`+0!2`%4```!H`'(`+0!(`%(` +M``!S`&L`+0!3`$L```!S`'$`+0!!`$P```!S`'8`+0!3`$4```!T`&@`+0!4 +M`$@```!T`'(`+0!4`%(```!U`'(`+0!0`$L```!I`&0`+0!)`$0```!U`&L` +M+0!5`$$```!B`&4`+0!"`%D```!S`&P`+0!3`$D```!E`'0`+0!%`$4```!L +M`'8`+0!,`%8```!L`'0`+0!,`%0```!F`&$`+0!)`%(```!V`&D`+0!6`$X` +M``!H`'D`+0!!`$T```!A`'H`+0!!`%H`+0!,`&$`=`!N``````!E`'4`+0!% +M`%,```!M`&L`+0!-`$L```!T`&X`+0!:`$$```!X`&@`+0!:`$$```!Z`'4` +M+0!:`$$```!A`&8`+0!:`$$```!K`&$`+0!'`$4```!F`&\`+0!&`$\```!H +M`&D`+0!)`$X```!M`'0`+0!-`%0```!S`&4`+0!.`$\```!M`',`+0!-`%D` +M``!K`&L`+0!+`%H```!K`'D`+0!+`$<```!S`'<`+0!+`$4```!U`'H`+0!5 +M`%H`+0!,`&$`=`!N``````!T`'0`+0!2`%4```!B`&X`+0!)`$X```!P`&$` +M+0!)`$X```!G`'4`+0!)`$X```!T`&$`+0!)`$X```!T`&4`+0!)`$X```!K +M`&X`+0!)`$X```!M`&P`+0!)`$X```!M`'(`+0!)`$X```!S`&$`+0!)`$X` +M``!M`&X`+0!-`$X```!C`'D`+0!'`$(```!G`&P`+0!%`%,```!K`&\`:P`M +M`$D`3@``````@`M`$(`3P``````;@!S`"T`6@!!````;0!I`"T`3@!:````80!R`"T`20!1 +M````9`!E`"T`0P!(````90!N`"T`1P!"````90!S`"T`30!8````9@!R`"T` +M0@!%````:0!T`"T`0P!(````;@!L`"T`0@!%````;@!N`"T`3@!/````<`!T +M`"T`4`!4````0!R`&P` +M`````',`90`M`$8`20```'$`=0!Z`"T`4`!%``````!A`'(`+0!,`%D```!Z +M`&@`+0!3`$<```!D`&4`+0!,`%4```!E`&X`+0!#`$$```!E`',`+0!'`%0` +M``!F`'(`+0!#`$@```!H`'(`+0!"`$$```!S`&T`:@`M`$X`3P``````80!R +M`"T`1`!:````>@!H`"T`30!/````9`!E`"T`3`!)````90!N`"T`3@!:```` +M90!S`"T`0P!2````9@!R`"T`3`!5````8@!S`"T`0@!!`"T`3`!A`'0`;@`` +M````````0)E#`-D```!,F4,` +MQ@```!"&0P`C````6)E#`&4```!(AD,`*@```&290P!L````*(9#`"8```!P +MF4,`:````%"%0P`*````?)E#`$P```!HAD,`+@```(B90P!S````6(5#``L` +M``"4F4,`E````*"90P"E````K)E#`*X```"XF4,`30```,290P"V````T)E# +M`+P```#HAD,`/@```-R90P"(````L(9#`#<```#HF4,`?P```&"%0P`,```` +M])E#`$X```!PAD,`+P````":0P!T````P(5#`!@````,FD,`KP```!B:0P!: +M````:(5#``T````DFD,`3P```#B&0P`H````,)I#`&H```#XA4,`'P```#R: +M0P!A````<(5#``X```!(FD,`4````'B%0P`/````5)I#`)4```!@FD,`40`` +M`("%0P`0````;)I#`%(```!@AD,`+0```'B:0P!R````@(9#`#$```"$FD,` +M>````,B&0P`Z````D)I#`((```"(A4,`$0```/"&0P`_````G)I#`(D```"L +MFD,`4P```(B&0P`R````N)I#`'D````@AD,`)0```,2:0P!G````&(9#`"0` +M``#0FD,`9@```-R:0P".````4(9#`"L```#HFD,`;0```/2:0P"#````X(9# +M`#T`````FT,`A@```-"&0P`[````#)M#`(0```!XAD,`,````!B;0P"=```` +M))M#`'<````PFT,`=0```#R;0P!5````D(5#`!(```!(FT,`E@```%2;0P!4 +M````8)M#`)<```"8A4,`$P```&R;0P"-````J(9#`#8```!XFT,`?@```*"% +M0P`4````A)M#`%8```"HA4,`%0```)";0P!7````G)M#`)@```"HFT,`C``` +M`+B;0P"?````R)M#`*@```"PA4,`%@```-B;0P!8````N(5#`!<```#DFT,` +M60```-B&0P`\````\)M#`(4```#\FT,`IP````B<0P!V````%)Q#`)P```#( +MA4,`&0```""<0P!;````"(9#`"(````LG$,`9````#B<0P"^````2)Q#`,,` +M``!8G$,`L````&B<0P"X````>)Q#`,L```"(G$,`QP```-"%0P`:````F)Q# +M`%P```#LCD,`XP```*2<0P#"````O)Q#`+T```#4G$,`I@```.R<0P"9```` +MV(5#`!L````$G4,`F@```!"=0P!=````D(9#`#,````@```/B&0P!` +M````*)U#`(H```"XAD,`.````#B=0P"`````P(9#`#D```!$G4,`@0```."% +M0P`<````4)U#`%X```!````C)U#`&````"8AD,` +M-````)B=0P">````L)U#`'L````PAD,`)P```,B=0P!I````U)U#`&\```#@ +MG4,``P```/"=0P#B`````)Y#`)`````,GD,`H0```!B>0P"R````))Y#`*H` +M```PGD,`1@```#R>0P!P````80!F`"T`>@!A````80!R`"T`80!E````80!R +M`"T`8@!H````80!R`"T`9`!Z````80!R`"T`90!G````80!R`"T`:0!Q```` +M80!R`"T`:@!O````80!R`"T`:P!W````80!R`"T`;`!B````80!R`"T`;`!Y +M````80!R`"T`;0!A````80!R`"T`;P!M````80!R`"T`<0!A````80!R`"T` +M0!E````80!Z +M`"T`80!Z`"T`8P!Y`'(`;```````80!Z`"T`80!Z`"T`;`!A`'0`;@`````` +M8@!E`"T`8@!Y````8@!G`"T`8@!G````8@!N`"T`:0!N````8@!S`"T`8@!A +M`"T`;`!A`'0`;@``````8P!A`"T`90!S````8P!S`"T`8P!Z````8P!Y`"T` +M9P!B````9`!A`"T`9`!K````9`!E`"T`80!T````9`!E`"T`8P!H````9`!E +M`"T`9`!E````9`!E`"T`;`!I````9`!E`"T`;`!U````9`!I`'8`+0!M`'8` +M`````&4`;``M`&<`<@```&4`;@`M`&$`=0```&4`;@`M`&(`>@```&4`;@`M +M`&,`80```&4`;@`M`&,`8@```&4`;@`M`&<`8@```&4`;@`M`&D`90```&4` +M;@`M`&H`;0```&4`;@`M`&X`>@```&4`;@`M`'``:````&4`;@`M`'0`=``` +M`&4`;@`M`'4`````&4`0```&4`0```&4`0`M`&$`;0```&D` +M9``M`&D`9````&D`@```&L`;@`M`&D` +M;@```&L`;P!K`"T`:0!N``````!K`&\`+0!K`'(```!K`'D`+0!K`&<```!L +M`'0`+0!L`'0```!L`'8`+0!L`'8```!M`&D`+0!N`'H```!M`&L`+0!M`&L` +M``!M`&P`+0!I`&X```!M`&X`+0!M`&X```!M`'(`+0!I`&X```!M`',`+0!B +M`&X```!M`',`+0!M`'D```!M`'0`+0!M`'0```!N`&(`+0!N`&\```!N`&P` +M+0!B`&4```!N`&P`+0!N`&P```!N`&X`+0!N`&\```!N`',`+0!Z`&$```!P +M`&$`+0!I`&X```!P`&P`+0!P`&P```!P`'0`+0!B`'(```!P`'0`+0!P`'0` +M``!Q`'4`>@`M`&(`;P``````<0!U`'H`+0!E`&,``````'$`=0!Z`"T`<`!E +M``````!R`&\`+0!R`&\```!R`'4`+0!R`'4```!S`&$`+0!I`&X```!S`&4` +M+0!F`&D```!S`&4`+0!N`&\```!S`&4`+0!S`&4```!S`&L`+0!S`&L```!S +M`&P`+0!S`&D```!S`&T`80`M`&X`;P``````0``````=`!A +M`"T`:0!N````=`!E`"T`:0!N````=`!H`"T`=`!H````=`!N`"T`>@!A```` +M=`!R`"T`=`!R````=`!T`"T`<@!U````=0!K`"T`=0!A````=0!R`"T`<`!K +M````=0!Z`"T`=0!Z`"T`8P!Y`'(`;```````=0!Z`"T`=0!Z`"T`;`!A`'0` +M;@``````=@!I`"T`=@!N````>`!H`"T`>@!A````>@!H`"T`8P!H`',````` +M`'H`:``M`&,`:`!T``````!Z`&@`+0!C`&X```!Z`&@`+0!H`&L```!Z`&@` +M+0!M`&\```!Z`&@`+0!S`&<```!Z`&@`+0!T`'<```!Z`'4`+0!Z`&$````` +M````````@!!$```!````````@``P``!L;V\?/0``````````_____________________P`` +M````````````````\#\```````#P/P`````````````````````````````P +M0P```````#!#````````\/\```````#P?P$``````/!_`0``````\'_YSI?& +M%(DU0#V!*60)DPC`580U:H#))<#2-9;<`FK\/_>9&'Z?JQ9`-;%WW/)Z\K\( +M02Z_;'I:/P```````````````````(#_?P````````"`___YA69QL0U` +M````````__\-0/'`````````````!%`#! +M!4,`R@A#`,\(0P#Q!D,``````````````````,#__S7":"&BV@_)_S\UPF@A +MHMH/R?X_````````\#\````````(0`@$"`@(!`@(``0,"``$#`@````````` +M`/`_?P(UPF@AHMH/R3Y`________[W\````````0`````````)C````````` +MF$````````#P?P``````````;&]G`&QO9S$P````97AP`'!O=P!A+/P4P^_X):S@]`("6WJYPE#\= +MX9$,>/PY/0``/HXNVIH_&G!NGM$;-3T`P%GWV*V@/Z$```E1*AL]``!CQO?Z +MHS\_]8'Q8C8(/0#`[UD>%Z<_VU3//QJ]%CT``,<"D#ZJ/X;3T,A7TB$]`$## +M+3,RK3\?1-GXVWH;/0"@UG`1*+`_=E"O*(OS&ST`8/'L'YRQ/]154QX_X#X] +M`,!E_1L5LS^59XP$@.(W/0!@Q8`GD[0_\Z5BS:S$+ST`@.E>BI8XJ/0`@/,6;;<`_1?KA[HV!,CT``-ZL +M/@W!/Z[P@\M%BAX]`-!T%3^XP3_4_Y/Q&0L!/0#03P7^4<(_P'#_>@(@)#T`P-)''^G)/R`D\FP.,S4]`$`#BZ1NRC]_6RNYK.LS/0#P +M4L6W`,L_"(C_S(]`$`NNN,&S#]\O57-%\ +M(WL@/0!@?E(]%LX_Y),N\FF=,3T`H`+<+)K./X?Q@9#UZR`]`)"4=E@?SS\` +MD!?JZZ\'/0!PVQ^`F<\_:);R]WUS(CT`T`E%6PK0/W\E4R-;:Q\]`.C[-X!( +MT#_&$KFYDVH;/0"H(58QA]`_KO._?=IA,CT`N&H=<<;0/S+!,(U*Z34]`*C2 +MS=G_T#^`G?'V#C46/0!XPKXO0-$_B[HB0B`\,3T`D&D9EWK1/YE<+2%Y\B$] +M`%BL,'JUT3]^A/]B/L\]/0"X.A7;\-$_WPX,(RY8)ST`2$)/#B;2/_D?I"@0 +M?A4]`'@1IF)BTC\2&0PN&K`2/0#80\!QF-(_>3>>K&DY*ST`@`MVP=72/[\( +M#[[>ZCH]`#"[I[,,TS\RV+89F9(X/0!XGU`31-,_6+,2'S'O'ST``````,#; +M/P``````P-L_``````!1VS\``````%';/P````#PZ-H_`````/#HVC\````` +MX(#:/P````#@@-H_`````,`?VC\`````P!_:/P````"@OMD_`````*"^V3\` +M````@%W9/P````"`7=D_`````%`#V3\`````4`/9/P`````@J=@_`````""I +MV#\`````X%78/P````#@5=@_`````"C_US\`````*/_7/P````!@K]<_```` +M`&"OUS\`````F%_7/P````"87]<_`````-`/US\`````T`_7/P````"`P]8_ +M`````(##UC\`````J'K6/P````"H>M8_`````-`QUC\`````T#'6/P````!P +M[-4_`````'#LU3\`````$*?5/P`````0I]4_`````"AEU3\`````*&75/P`` +M``!`(]4_`````$`CU3\`````T.34/P````#0Y-0_`````&"FU#\`````8*;4 +M/P````!H:]0_`````&AKU#\`````^"S4/P````#X+-0_`````'CUTS\````` +M>/73/P````"`NM,_`````("ZTS\``````(/3/P``````@],_`````/A.TS\` +M````^$[3/P````!X%],_`````'@7TS\`````<./2/P````!PX](_`````."R +MTC\`````X++2/P````#8?M(_`````-A^TC\`````2$[2/P````!(3M(_```` +M`+@=TC\`````N!W2/P````"@\-$_`````*#PT3\`````B,/1/P````"(P]$_ +M`````'"6T3\`````<);1/P````!8:=$_`````%AIT3\`````N#_1/P````"X +M/]$_`````*`2T3\`````H!+1/P``````Z=`_``````#IT#\`````V,+0/P`` +M``#8PM`_`````#B9T#\`````.)G0/P`````0<]`_`````!!ST#\`````<$G0 +M/P````!P2=`_`````,`FT#\`````P";0/P````"8`-`_`````)@`T#\````` +MX+3//P````#@M,\_`````(!OSS\`````@&_//P`````@*L\_`````"`JSS\` +M````P.3./P````#`Y,X_`````&"?SC\`````8)_./P``````6LX_``````!: +MSC\`````D!O./P````"0&\X_`````##6S3\`````,-;-/P````#`E\T_```` +M`,"7S3\`````4%G-/P````!066X`7VQO9V(```!? +M;F5X=&%F=&5R````````%````+"@0P`=````M*!#`!H```"DH$,`&P```*B@ +M0P`?````@*I#`!,```"(JD,`(0````BI0P`.````N*!#``T```#`H$,`#P`` +M`!"I0P`0````&*E#``4```#(H$,`'@```""I0P`2````)*E#`"`````HJ4,` +M#````"RI0P`+````-*E#`!4````\J4,`'````$2I0P`9````3*E#`!$```!4 +MJ4,`&````%RI0P`6````9*E#`!<```!LJ4,`(@```'2I0P`C````>*E#`"0` +M``!\J4,`)0```("I0P`F````B*E#`'-I;F@`````8V]S:`````````````#P +M?________^]_`````````(!#`$\`3@!/`%4`5``D```````````````````` +M_RG#8``````"````40```"2M`P`DE0,``````/\IPV``````#````!0```!X +MK0,`>)4#``````#_*<-@``````T```"<`P``C*T#`(R5`P`````````````` +M```@[D,`**M#`````````````0```#BK0P!`JT,``````"#N0P`````````` +M`/____\`````0````"BK0P````````````````#H[4,`<*M#```````````` +M`0```("K0P"(JT,``````.CM0P```````````/____\`````0````'"K0P`` +M```````````````$[D,`N*M#`````````````@```,BK0P#4JT,`B*M#```` +M```$[D,``0````````#_____`````$````"XJT,`````````````````..Y# +M``2L0P````````````,````4K$,`)*Q#`-2K0P"(JT,``````#CN0P`"```` +M`````/____\`````0`````2L0P````````````````!@[D,`5*Q#```````` +M`````@```&2L0P!PK$,`B*M#``````!@[D,``0````````#_____`````$`` +M``!4K$,```````#_`0#%_P$`4"$"`/`R`@!0-P(`=Q\#`($?`P"3'P,`I1\# +M`+(@,`L"(#`,(B`P#< +M(@,`^2(#``XC`P`C(P,`.",#`$(C`P!24T135G1."$!&@$&S-:[+8A2E&@$` +M``!$.EQ0')A'0D;6X`````)Q\#`#8$```N +M=&5X="1X`%TC`P!=````+G1E>'0D>60``````#`#`&`"```N:61A=&$D-0`` +M``!@,@,`!````"XP,&-F9P``9#(#``0````N0U)4)%A#00````!H,@,`!``` +M`"Y#4E0D6$-!00```&PR`P`H````+D-25"180U4`````E#(#``0````N0U)4 +M)%A#6@````"8,@,`!````"Y#4E0D6$E!`````)PR`P`$````+D-25"1824%! +M````H#(#``0````N0U)4)%A)04,```"D,@,`$````"Y#4E0D6$E#`````+0R +M`P`$````+D-25"1825H`````N#(#``0````N0U)4)%A000````"\,@,`"``` +M`"Y#4E0D6%!8`````,0R`P`$````+D-25"184%A!````R#(#``0````N0U)4 +M)%A06@````#,,@,`!````"Y#4E0D6%1!`````-`R`P`$````+D-25"185%H` +M````U#(#`-P"```N8V9G=6%R9`````"P-0,`9'4``"YR9&%T80``%*L#`'P! +M```N&1A=&$````DK0,`!`0` +M`"YR9&%T821Z>GID8F<````HL0,`!````"YR=&,D24%!`````"RQ`P`$```` +M+G)T8R1)6EH`````,+$#``0````N+1#```````````` +M`````````````````0```/____]+(4,`(@63&0$```"LM$,````````````` +M```````````````!````_____UTA0P`B!9,9`0```-BT0P`````````````` +M``````````````$```#_____X]"``````#^____ +M`````-C___\`````_O___P````#00@``````_O___P````#4____`````/[___\`````NJ%"```` +M``#^____`````-3___\`````_O___P````!,MD(``````/[___\`````V/__ +M_P````#^____`````/6P0@``````Y/___P````"T____`````/[___\````` +MDKY"``````#^____`````-3___\`````_O___P````#ENT(``````/[___\` +M````S/___P````#^____`````"3`0@``````_O___P````#4____`````/[_ +M__\`````0LA"``````#^____`````-#___\`````_O___P````"1YT(````` +M`/[___\`````Q/___P````#^____`````!SI0@```````````._H0@#^____ +M`````-C___\`````_O___^'L0@#][$(``````/[___\`````S/___P````#^ +M____`````$GW0@``````_O___P````#0____`````/[___\`````!OM"```` +M``#^____`````-3___\`````_O___P````"<^T(``````/[___\`````U/__ +M_P````#^____`````"3]0@``````_O___P````#8____`````/[___]9&T,` +M;!M#``$````@4P,`N`P&`*`@!@"$OP,`H,8#`````````````0```#!3`P"\ +M#`8`3"`&`#"_`P!TQP,````````````!````0%,#`,`,!@`\(`8`(+\#`)S' +M`P````````````$```!04P,`Q`P&```@!@#DO@,`K,<#`````````````0`` +M`&!3`P#(#`8`="`&`%B_`P#@QP,````````````!````@%,#`,P,!@!T(08` +M6,`#``3(`P````````````$```#@5`,`[`P&`)@@!@!\OP,`',@#```````` +M`````0```/!4`P#P#`8`-"`&`!B_`P`DR`,````````````````````````` +M`````````````````````````````+K$`P`DQ0,`CL0#`*+$`P`RQ0,`SL0# +M`.;$`P`"Q0,`:,4#`%3%`P!$Q0,`#,4#``````"(Q@,``````&+$`P!VQ`,` +M3L0#``````#NPP,`_L,#``[$`P#BPP,`+,0#`$#$`P#,PP,`LL,#`![$`P`` +M````ML4#``3&`P#NQ0,`W,4#`,K%`P!ZQ0,`H,4#`(C%`P``````=L8#```` +M``"FP@,`NL(#`,K"`P#:P@,`[L(#``##`P`2PP,`DL(#`###`P!&PP,`4L,# +M`&C#`P!VPP,`A,,#`)##`P">PP,`A,(#`';"`P!JP@,`6L(#`$K"`P`\P@,` +M,,(#`"C"`P`8P@,`"L(#`/[!`P#LP0,`W,$#`,S!`P#`P0,`KL$#`)K!`P"( +MP0,`>L$#`&C!`P!:P0,`3L$#`#3!`P`BP0,`$,$#``#!`P#PP`,`W,`#`,K` +M`P"ZP`,`KL`#`)S``P",P`,`?L`#`![#`P!PP`,``````&3&`P`NQ@,`%L8# +M`%3&`P!"Q@,`````````4VAO=U=I;F1O=P````!'971$;&=)=&5M`````$5N +M86)L95=I;F1O=P````!39717:6YD;W=497AT5P````!'971087)E;G0```!3 +M9717:6YD;W=0;W,`````4V5T1&QG271E;51E>'17````1V5T4WES=&5M365T +M%<`````0W)E871E5VEN9&]W17A7````27-7:6YD;W<` +M````1&5S=')O>5=I;F1O=P```%5P9&%T95=I;F1O=P````!-87!7:6YD;W=0 +M;VEN=',```!#;W!Y4F5C=`````!,;V%D0W5RM0#`(S4`P"H +MU`,`OM0#`-34`P#>U`,`ZM0#`/;4`P`$U0,`%M4#`";5`P`ZU0,`2M4#`%S5 +M`P!HU0,`>M4#`)35`P`2U@,``````*#2`P".T@,`<-(#`%#2`P`RT@,`'M(# +M``S2`P``T@,`]-$#```````"`D=E=$QA&5C=71I;VY3=&%T90"R!%-L965P`#\#3&]A9$QI8G)A5<`9`!#;VUP87)E4W1R:6YG5P``$`!!;&QO +M8T-O;G-O;&4``%\!1G)E94-O;G-O;&4`%P!!='1A8VA#;VYS;VQE`"0%5W)I +M=&5#;VYS;VQE5P!&`D=E=%!R;V-E4UAE-P96-I9FEC3&]C86Q4:6UE5&]3>7-T96U4:6UE +M`+T$4WES=&5M5&EM951O1FEL951I;64``"0!1FEL951I;654;TQO8V%L1FEL +M951I;64`1@-,;V-A;$9I;&54:6UE5&]&:6QE5&EM90`E`49I;&54:6UE5&]3 +M>7-T96U4:6UE``!R`4=E=$-026YF;P#^`DES1$)#4TQE861">71E``!G`TUU +M;'1I0GET951O5VED94-H87(`$057:61E0VAA71E`+,"1VQO +M8F%L06QL;V,`5`-,;V-K4F5S;W5R8V4``+X"1VQO8F%L3&]C:P``Q0)';&]B +M86Q5;FQO8VL``+H"1VQO8F%L1G)E90``00-,;V%D4F5S;W5R8V4``+$$4VEZ +M96]F4F5S;W5R8V4``$T$4V5T0W5R5<``-\!1V5T17AI +M=$-O9&500-/<&5N1FEL94UA<'!I;F=7``"'`4=E=$-O;6UA;F1, +M:6YE5P!7!%-E=$5N=FER;VYM96YT5F%R:6%B;&57`!T!17AP86YD16YV:7)O +M;FUE;G13=')I;F=S5P"%`D=E=%1E;7!0871H5P``8`--;W9E1FEL945X5P`& +M`D=E=$QO8V%L94EN9F]7``"7`D=E=%1I;65&;W)M8717``#(`4=E=$1A=&5& +M;W)M8717```S`D=E=$YU;6)E&-E<'1I;VX``',"1V5T4WES +M=&5M26YF;P#O!%9I0``/0-, +M;V%D3&EB45X00``!`-)&-E<'1I;VY&:6QT97(` +M`*4$4V5T56YH86YD;&5D17AC97!T:6]N1FEL=&5R`&,"1V5T4W1A%<``*@#475E0`7`D=E=$UO9'5L94AA;F1L945X5P``$P)'971-;V1U +M;&5&:6QE3F%M94$``&@!1V5T04-0``#/`DAE87!&F4``)H!1V5T0V]NM`0```#D```!^Y=<\`@```'@````_B6DW`P`` +M`!T```!]!P8.!@```)4```#(72P````'P```!\````> +M````'P```!X````?``````$"`P0%!@<("@P.$!08'"`H,#A`4&!P@*#`X``` +M`````````0$!`0("`@(#`P,#!`0$!`4%!04`````!`````(````"`````@`` +M``(````"`````@````(````"`````@````(````"`````@````(````"```` +M`@````X`````````#``````$"!`@0(#``@(#!`4&!@8`````X$ZV*&0```"X +M1D,`/6;WPF4```#,1D,`"$D8YF8```#@1D,`I+G"7F<```#P1D,`D@:5CF@` +M````1T,`,61B6&D````81T,`,7X*&6H````L1T,`"98Z?FX```!$1T,`6,VT +M3F\```!<1T,`OS>5`'````!L1T,`0GT137$```"$1T,`V#`>?'(```"81T,` +M6`8D8G@```"L1T,`+WM/9'D```#`1T,`Z2]#97H```#41T,`R(GOK'L```#H +M1T,`C*;B7'P```#\1T,`>["%#8,````82$,`2D2H:(0````L2$,`L.22_(4` +M```\2$,`@ZZ"PH8```!02$,`@JSNC8P```!D2$,`[C:ZO8T```!X2$,`\,-U +M/XX```",2$,`+$`GL8\```"D2$,`$8>6*)````"\2$,`I+I*9I8```#(2$,` +M2[@9^)<```#42$,`'VK/2Y@```#D2$,`8KBO#YD```#P2$,`C6I:H)H````$ +M24,`DHDBRJ`````424,`#39P>Z$````H24,`OF#T.Z(````X24,`@&J\3JH` +M``!(24,`#NP:4*L```!824,`X+E!OZP```!H24,`IJ?26:T```!X24,`(:)! +MY:X```"(24,`[LV#$*\```"824,`_KG@M;````"H24,`8G`61+0```"X24,` +MS*+":;D```#(24,`)O-)Z+H```#<24,`)IYV*[X```#T24,`K"1@@+\````( +M2D,`ZS6Q[,,````@2D,`>IU=O<@````T2D,`7:^1R\D```!(2D,`&B^NILH` +M``!<2D,`2)#K5](```!T2D,`F8#4WMP```"$2D,`P[TON=T```"<2D,`0'CZ +MN-X```"T2D,`AXS7&N$```#(2D,`.)0-[.8```#82D,`7GR0H.<```#D2D,` +MA4"07?````#T2D,``S&LEO$````(2T,`,=)X-``````82T,`!"[:CP`````H +M2T,`.!&.A64````\2T,`BJ[`W6<```!82T,`_2+C9&L```!P2T,`WU-^!P$` +M``"02T,`2OU`X`(```"@2T,`Y'*V0(````T34,`#6\H=64```!(34,`&UFW+F<```!D34,`(HM= +MPP````!\34,`K,_@-P````"034,`]02GQ&4```"H34,`^`;N"@$```#(34,` +MG!IF=P(```#<34,`-0>8/P````#T34,`[O.U-@`````(3D,`ZLG8!0$````< +M3D,`X4BS]0(````P3D,`6`>%=`````!(3D,`B^(%%#`(110P"844,`J%%#`+Q10P#0 +M44,`Y%%#`/110P#_____````````````````=9@``+$9OT1.YD"[``````$` +M```!``````````````#_____````````````````(`63&0`````````````` +M``(````,````"````/____\````````````````!(``````````````````` +M``````````````````````````````````````````````````````(@```! +M```````````````````````````````````````````````````````````` +M`````````B````(````````````````````````````````````````````` +M``````"0:4,``0`````````!```````````````!```````````````````` +M```````````8Z$,`````````````````&.A#`````````````````!CH0P`` +M```````````````8Z$,`````````````````&.A#```````````````````` +M````````4.U#````````````$&Q#`)!M0P`@94,````````````````````` +M````````````6.=#`"#K0P!#````BF9#``$"!`@`````I`,``&"">8(A```` +M`````*;?````````H:4```````"!G^#\`````$!^@/P`````J`,``,&CVJ,@ +M``````````````````````````````"!_@```````$#^````````M0,``,&C +MVJ,@``````````````````````````````"!_@```````$'^````````M@,` +M`,^BY*(:`.6BZ*);``````````````````````"!_@```````$!^H?X````` +M404``%':7MH@`%_::MHR``````````````````````"!T]C>X/D``#%^@?X` +M```````````````````````````````````````````````````````````` +M````````````````````````````````$!`0$!`0$!`0$!`0$!`0$!`0$!`0 +M$!`0$!`````````@("`@("`@("`@("`@("`@("`@("`@("`@(``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>@`` +M`````$%"0T1%1D=(24I+3$U.3U!14E-455976%E:```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````!`0$!`0$!`0$!`0$!`0$!`0 +M$!`0$!`0$!`0````````("`@("`@("`@("`@("`@("`@("`@("`@("`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````!A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>@`````` +M`$%"0T1%1D=(24I+3$U.3U!14E-455976%E:```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````@ZT,`+@```"X````` +M````1.U#``071@`$%T8`!!=&``071@`$%T8`!!=&``071@`$%T8`!!=&`']_ +M?W]_?W]_2.U#``@71@`(%T8`"!=&``@71@`(%T8`"!=&``@71@#^____```` +M`````````````0```````````````````/[___\````````````````$54,` +M`````"X_05&-E<'1I;VY`5]N97=?;&5N9W1H0'-T +M9$!````$54,``````"X_059B861?97AC97!T:6]N0'-T9$!````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````";>00!8WD$`$MY!`!S>00!BWD$`,-Y!`#K>00!$ +MWD$`@-Y!`';>00!LWD$`3MY!``````#!Y$$``````.W=00#WW4$`TMU!```` +M``"6W4$`H-U!`*K=00",W4$`OMU!`,C=00""W4$`9]U!`+3=00``````N=Y! +M`.'>00#7WD$`S=Y!`,/>00"*WD$`K]Y!`*7>00``````IN1!``````#'W$$` +MT=Q!`-O<00#EW$$`[]Q!`/G<00`#W4$`O=Q!`!?=00`AW4$`*]U!`#7=00`_ +MW4$`2=U!`%/=00!=W4$`L]Q!`*G<00"?W$$`E=Q!`(O<00"!W$$`=]Q!`&W< +M00!CW$$`6=Q!`$_<00!%W$$`.]Q!`#'<00`GW$$`'=Q!`!/<00`)W$$`_]M! +M`/7;00#KVT$`X=M!`-?;00#-VT$`P]M!`+G;00"OVT$`I=M!`)O;00"1VT$` +MA]M!`'W;00!SVT$`:=M!``W=00!.VT$``````"3?00`&WT$`Z]Y!`!K?00`0 +MWT$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`0`%`+`%`(!```"``P```&```(`%````J```@`8```#H``"`#@```$@!`(`8 +M````8`$`@````````````````````@!E````>`$`@&8```"0`0"````````` +M```````````'``$```"H`0"``@```,`!`(`#````V`$`@`0```#P`0"`!0`` +M``@"`(`&````(`(`@`<````X`@"`````````````````!@```"P&`(!0`@"` +M_`4`@&@"`(`6!@"`@`(`@.@%`("8`@"`R@4`@+`"`("X!0"`R`(`@``````` +M````````````"@`'````X`(`@`@```#X`@"`"0```!`#`(`*````*`,`@`L` +M``!``P"`#````%@#`(`-````<`,`@`X```"(`P"`#P```*`#`(`0````N`,` +M@````````````````````0!D````T`,`@````````````````````0`!```` +MZ`,`@````````````````````0`)!`````0``````````````````````0`) +M!```$`0``````````````````````0`)!```(`0````````````````````` +M`0`)!```,`0``````````````````````0`)!```0`0````````````````` +M`````0`)!```4`0``````````````````````0`)!```8`0````````````` +M`````````0`)!```<`0``````````````````````0`)!```@`0````````` +M`````````````0`)!```D`0``````````````````````0`)!```H`0````` +M`````````````````0`)!```L`0``````````````````````0`)!```P`0` +M`````````````````````0`)!```T`0``````````````````````0`)!``` +MX`0``````````````````````0`)!```\`0``````````````````````0`) +M!`````4``````````````````````0`)!```$`4````````````````````` +M`0`)!```(`4``````````````````````0`)!```,`4````````````````` +M`````0`)!```0`4``````````````````````0`)!```4`4````````````` +M`````````0`)!```8`4``````````````````````0`)!```<`4````````` +M`````````````0`)!```@`4``````````````````````0`)!```D`4````` +M`````````````````0`)!```H`4``%`V!@!%"P````````````"8008`J14` +M````````````2%<&`&@%`````````````+!.4BZ&.MA#/(B+",,!J&3 +M#KH8?+(Q_E\Z[$D@^Z2#O+"+,/@A6SX(9`M=).R#O7A&LZN97>]T^]"[P\QV +M=4]U969W958D>1OHJ?HJXLN(+R(S"6X=\9R>!#RJ!N/"N#`NC`OCPK@P+HP+ +MX\*X!([+F.?T9'MA/V)<;.#"9%(UV5[8CQ@7QL4'7,3QB?[L\^233Y<_]6>? +MB^.3UJU'>/JP^/"CM?=NY;?OI+__P_)G?OO.VGNWB@\_HM.SMJQ'='I6OO^! +M^N++E1N_^N++WON_H=.S5OA1=O=C<73<$EX01\?9W8]7CXLX.FZ#I3QC->;? +MR107^<]_M7`U,7\J4]ZEL[,6XB+N/^`\H&J,1AS758WQ>-6XC,,$UJV]_&_0 +M_^_/?W;OU[^T/'_UBY.?_F0L98OUE[GC_H]_-$I3^_H(XJ/#PX6 +M=T=IZO#'BYSS:=89&)=VX^*2=]VJTR[_-=M+>''=V.%3$;`C5=>G&1;F%UZG +M&1>.7YA?.'YIZ[\.5<=D7)AWF7.7EOG1>.3N +MM_'Q8U]Q45]]Y>JG1Z/HZZ\=XS(>-Y]S1W[[=_G=.\G?/K4[TT_^7/[V`_F? +M?\\UU;'))(C0'?/C^;G^Q]_3/_W1[DS^^A=Y[YYC?E%,O=6XB!!?BXQQ$0"B +M>10SBG4+83G/,N/X90R@FZ/[>'NGA;B8/Q4!@`G%G/?*1S<.6P7*HQN'Y[W2 +M!BX2@;"QR3UX[:;YZ1C +M>[J4V6H]TO')&V\>O?/N_9NOG[[TRNEWO[?4^=(K#W[X^M$[[YZ\\:854"[E +M`8H`C6VX*!X^_^*W+[_Z[?=_L-3Y\JMG+[QX7A1N\B/%>\PK=08.?*MUJ2`# +M7PM^A``1FTRE_L(44ZUC:K:72GL1"!(9%*BH!VAVIHSI60[65Z8$?K)S7>.1:&O6H^ +MSAJX*`+$[ME+G;;JF-B/.%>JCTM$)HU#09\'WS&3J1VV=0Z7FD,@1,1^U'57 +M6@073=W)"1;!A;`[O4,+4D8BF%]FY`0"V8^ZR[Y-<>FZ+E51L+JAO((-O+M+B)$`OFEQF!#-M+Q9`4=AN>P;L%;3(&N`0=R%#S8@*&'/N: +M<40B&9=*/3S8'AGC-250DS&6;.,P"_O&]A(H^]J(S5+)_%(9^P:H/%AZGU0$ +MAXL5PWO25M5Q_:62?<,J%=CCA50ROU0-@2'U^UHMQ0>T8%M=7Q4%L]'-=MP1 +M"LO8QB64=,EVJP\B))+Y)5A7X>+K_:$^AJU]'CVO8M*-1N&OR\=:52"+N*V>X2%]; +MH0D`MC4Z?/9,>IH?C27"@;L#7Y27'40TH<@MA1*\LMDEA'V'&U*D^A+FU"-<F-6A+N.:":/ +MO.27B[$=NR'@1+3V5&BJ"9X3`@9L[<)4ESK*"-S(-X"PDB;:/$N1AK;&FRKUIA&U5Q6O05AA-@K#<1D;?\\O1@!MRQ +M?B(OMBYC:O*&VS'%UKTIDZW:P=0$%T(8I`Y,)H^\[VO.)6XJ"GAA:A[%[L6H +M$"W7WEJ3,5'CMR#$01*LR1B]6!'A?K#DG`1 +MMB*:;$GZP_*RCT3@?F+C^-:EK-FTS"AR7=.Z^25MB01)7N8!\U*GE&)S1^A% +MX?C1$S]`&&9DBHP6KH]J6D&JJ@C[YN?2.C:9U:@^180[AF*PX\Q@96U*FS&M +M&09[$Y,)@W>O["/%IA%1@1!CE)D^0ICT"$Y4=/60+[)@4Y!"B4 +M3WK=`I%]A+LF<7#JI&;0BO;0C9@V3"K_/15"_%(Y=U.1-Q8]M8!8AK,>/4,4 +M_WGBG`P*?TW$X#MJ7FMV\><2=Q/ +MF]XJ:4^:H9;MXX`Q0*EHLUGVE$6VSCYKZ;[WK:2I5%XJ6[BT=&OW049I@Y5; +M"RMWM+9WTSL"#+)&S<$]!1BH'UTDS,-<+&PTDLSS[+:?JZ$(!KE8^"GSR+"< +MXL')E8F`@VS!S8.(A@3LQXF>18.<.Y9@L'/!FY-.US5N+KI+>4T'%=?-FIL) +M;2QT3H2DQCN0/3L9=R>A'ZU +M`1_6TH!#NW^]U+A[;9-:+*[MM2((R6#&`&,H%>ZFUYTH5RJ8N[J'9B]/XW[: +MF:]C$4*I0HY?9NM8M#._;IG.$_2"Q64"S?9\:&:',R'C`@`;FK;G.%0TLZ(2 +M."X`L!'/M9I"59YV$#XN$ZN9R358+8]W`I=K:%B+Z?L4NX++!)K=6="4SZHS +M'<(%`-8T[54>"$O/UB>[A0L`E)KV*G<4IA)B<>E^DNZ-GJ+]RBZ^4E]X4X#Y +M4:UR6U0E90F\:)'NHKU<2%D5T&311.OL+BX`D$H<%%,=P^L:$#N-"P`D`H>% +MN"+@"8)242?IY%N)):9U'7[>5I_HC#0EPNHC`N%]Z#PT(D$AF7Z:`7 +M!SGE$3(N4]DUXD$N2H6,2\78S03C,L.G&`+&A7&Q@`L'O#/J:@Q#*_?;,[\P +M+HP+X\*X\&!<&!?&A7%A7!@7QH5Q85P8%\:EF[BP.->I_0'L1XP+X\*X,"Z, +M"^/"N#`N/!@7QF7!\7_UL1ZD2@_N/P````!)14Y$KD)@@@```(E03D<-"AH* +M````#4E(1%(```"Z```"7`@"````P>XI$`````1G04U!``"QCPO\804````@ +M8TA230``>B8``("$``#Z````@.@``'4P``#J8```.I@``!=PG+I1/`````EP +M2%ES```+$@``"Q(!TMU^_`````9B2T=$````````^4.[?P``%0U)1$%4>-KM +MW=ES',=]P/%=$,3!2Q`@D9(HBA1O4A2MPTZ8V;SG-[..+H-`SV)G +MNGOF6_5]U,.B^Z.>GNG992JU6"12C2$@N!!<""X$%X(+$4-`<"&X$%P(+@07 +M(H:`X$)P(;@07`@N1`P!P87@0@9P*1"IQA`07`@N!!>""\&%B"$@N%!(7!8* +M1*HQ!`07@@O!A>!"<"%B"`@N!!>""UG%9;Y`I!I#0'`AN!!<""X$%R*&@.!" +M<"&XD%5""\&%X$)P(6((""X$%]+/9;9@8'4CGS:__HL#?SO_ +M^%\.MGZGL^W/;\6^UN]VM_Q@5/YD^^0U<-J_IC?](^J*R64T_^158\"'V_?V'F-@ZV?G"Q5]:AC]ARZ)RKV3$W;7V +M3]#\^B_1H)(,E`%<9@IZDP=34%!)!DK[9.GG(L]MH:"2#!1<"@EYQE^#7NN` +M2P$'ZL$%+G"!"US@`A?ADM<;"()PT3Q9<(%+("[3>;V!(``7W9-E-Y>6[V<: +MKOXVG5O1/XX*R>>43RN?&2X:N+3\()/.+EL!Y2MHLLORR>$2-1?Y/]4Z*Y7D +MD\,E:B[I[(JE7-*Y5;A$S<52*SOYJ^$"%[C`!2YP@4LJ-9776_5<='_RZ/]J +M_9\<+G"!"US@`A>XP`4N<($+7.`"%[@$X3*9UUOU7'1_\NC_:OV?'"YP@0M< +MX`(7N,`%+G"!"US@`A>X!.$RD==;]5QT?_+H_VK]GQPN<($+7.`"%[C`!2YP +M@0MXP`4N<($+7.`"%[@$ +MX9+;T%OU7'1_\NC_:OV?'"YP@0M<0N(B!P%P@8LJE[DB7."BS.6N`Q>X*'/Y +MUS)D"7."BS&6QE,INZ*IZ+OH^LZZ_6O\G][A\Y,(%+FI<9.\B +MR?<9X0(752[S1;C`19G+/1_B]+N<@GCPL7>5O*$BXMWQ]-#R[9M[0,+LDGCPN7 +M>ZXM7#PQ?Y61_U-MN2K)YY1/*Y_9XNW:U[E\[#_>'=V(K)UP25I1SLOF;<)% +M'N_"!2ZJ7.3Q+ES@HLKEH[)WE8(+7)2X?.P_WH4+7#;A\E%YDQ8=N,!%FMW.G&@U&L=IG*1)@NIS$8$/?Z]`2BH)`,5S8QLU2.YR'%C))_@P-_, +M04$E&2B#NM?]&-B42U37(ZGIGW[%)F:3'>X__M(4*]MSN>NF1M8CJ^'M +MW[9^EZO2%]>@QC=_'>7X;]\V7"K7HP@_4%WG[[V=;\*7F4OM,@@R%&994>(R +M6XS^8\E(-?_#OQ_XZSGOF>]K'0EYQB]_K/S)\H?OZOAOXZ"HD1&MST7 +M*9MGI$B9RTR1D2)E+G>X'E&%R_VR4F/YU/`Z)3U5+M-%!HN4N=QV&"Q2YG+? +M_WH`XP47KD<4`A>N1Q2`RWW_ZP$,&5P"7(^&UBFYI>Z5`W3;9='#!Q,(%R" +M78\81+BHEBLPB$GB7*E)DUR/X*+>HLMHPB5(HWD& +M%"[*39=2?6L4YVK)1:Y'\N"/,86+:O*#S8PI7%2;Y7H$ET`--8E@H7.1`@)&%BVH+KK=P,;AP44T.!!A;RYP;7?(`1G;7##I<5!O.,^AP46ZRQ*##)4A];'CAHMX8&UZX +MJ#?CI+K8\,)%/3EQ[%PE^]+#9:+$T-O)19Z%:*EWG=&'BW*C!48?+LIY&UXF +M`"[J#;+AA8MZ\AU')@`N`9)7OCM6R9HT<\D4F`.X*#?M>$LIL$: +M+C..YF3#RS3`)4!L>.$2H%$VO'!1K[+A;2?C,X++C+_A93+@HIJ\TL!DP"5` +M\DH#\P&7`!M>YL-T+M..0;'AA4N`AO),"5R4JVQX;ZV0H9G%9=K?\#(K<%%M +MK,BLP"5(\J4U)@8NJLFO-#`Q<%%MD@TO7`+5O\'<&,EERC&Q'!M>N`1*?I;L +MY@J9E;EF!O+,&5R4 +MDSOJ&TP;7-23.VJF#2ZJR1TUTP:7`,G7')DYN*C&'35<@E3R[JBOKU#4>4-O +M8_+6]_5EBKKF2<=*+I4S:N8OXDXONM[0VYA\CYKYB[@_N_^_S9472JPK6_(V +M7TQAQ%Q.+UB[P/2L,X51<_GV_;*M"\QHD2F,FHMTRMX%1EZ"818CYB(+3).E +M"XP\LGM_F2*JPL7N!48>V3&1$7/Y]KURTX2="XP\LF,BH^)2_KQ3\W8N,#G_ +MCIJYC)C+G]XK-\L"DRO95]\&BYG+5U@Y)$=TQD]%VG_I)T+C+QE]]XRA=BF7,XOVKG`C!2940U=;RJ%JG[%Q@;JXRKQJXO%A98+*V)5^,95ZC +MYR(=E`4F:Z$8.1-@:J/G\O+M?5.N=[&!4;.!)C=Z+E(QV9=^[B,^H_LF.#HN7SK;KG1Q@6FBP6FUOW) +MW;)*)^]Z.->98#Y=S\Q8N,,,%YE@/%^EQ[^>02Y8E +MWQ-@FK5PN;A83EO'10X=KRU3;0K$17IZRL(%1@X=KRU1#0K*Y97;Y?JL;5SD +MT)&9K@V7.^6@'9MQ[5M@Y-"1R=YYW[I3#MHW[Y2;<[9QZ6.!T<1%.C-GVP(S +M*H>.+#":N$@M$[;M>7LWF&]M7%Y<<-/6+3!RZ,B4:^$B>3?5HR6;ZF&!T<=% +M;JIW9ZWB4CETO+I$5;83+M)QN:FV:X'I7F?6M7&1F^I].188N"CWPKQM"TPG +M"TRU?=-?(7;8P4FK]KSR5>IK+##5<;E=WGDO+9;KQZQ:8.2U*>9>%Q?IV+15 +M"\QPD;G7R>75V^6]=MU4M[/`Z.,BG9NS:L\KKTW)WW^%@E1#+M)!.4C*E*SI +MUAH"='+YPY[7%BXL,'JY2,_+2R6`ZOUG%[%I@/5E.7EVB;0N5R<<'=95[ZZA@:]7"3OZ-&:!68% +M$)JYO+)8WI_U7S$QOWX6&-U<)/\Q3-$.,==98+;L%7\!"+O#\AB&!08NBLEC +MF.:Q$@L,7%0[*[^V:LT"\Y`V+S(NTJ$)QYX%!ARZN;RT4&X<+5FSP+Q#?U24 +M7*33,ZXU"PPXM'.1GAQW[%A@P+$)EX5RQ'UCWFW(V'!)NKZ*#_U"XPA7*0G,&2PF(0O,*9QD4O27N^'XUA@X*+6^5FW;MCL!>;MAPG- +M0"[2B$D9N8=U?@8FAM8^9M8GKS_@4>+N;UXJS;9.!]]?LK<#&T,]-NG6E<^O+> +MLRRXF-D1`P\'Y.NQ,>9RT;\[M;=6.1P8*!J4_,!'C!<8V[E.1OXDQ2_%!K@8WE-98S8Q"&#D6L)O+C)N$+LSXS^ZTMG4OE6``N5G0X9\`FYOU5N%A36T:W&.]8`"[V;'OW#NG> +MQ'RPEGKS@7TED(MT=LK9K??979]_+``7:[:]$[JWO;?6X6)3S\J1=5]!9W(L +M`!>+>B*C54SGAF5<+OA;OR2W3Y[V:A0C+_.^^9DUP>7N-C54V/ZMKWR&Q]PL:QIMV5$WR;F +MYTLV<)EVZ?/.3[M[AC2)Z=B`BWV=JYP/:!%S91DN]G5J0M.-4E?>>Q3VQF?F +M!HY-.Y9STEH6F/=6X&)ESVBY4:J\:P<7&VO3F';W1W^CU.N_ +M"@,72V^4FN3[`[V%2)-_HZ&N6MM9Q4P\7VGHKLUKIR4PT7VVL=B>I&25[_AHOMR:WU@:&H +MQ,CKWW"Q/3FUWC,0"1=Y_1LN,4A.K1N\WYT+OZO+<(E#?W@8$S:7;O_U;[C$ +MH)/CSJ[>\,7(01)3,F5"[RE4;R$EQBU>D)IZ$O-#&=_LM3/_XT +MBIC+:#HU[M3WAB;FO56XQ*WCNRI71/(;0]+UQB +MUW-C(B:D/>\R7&+8,_*&KZ5[7B9/2X?D#=_N?.T+>\_+S.GJB>%PQ+SU$"[Q +M[/&A$,3<6H=+/),C@L<&0Q!S91DNL16S?Z!08RZ=_KL-__)I[6/"3!"SM^9B +MY-T&N,2ULQ/.GOY:BY'W>>$2U\Y,.$U]A=KO>>$2U^3@NK&V8F3/"Y<8)P?7 +M#;T%<_>\S)!IR7?;=M=0S/55N,1=3,ZI[RF8N.=E;LSL>*ZTJZ=&7-HW:K;G +M96*,[?ELJ:Y68JZMP"7^'1TKU=6$2^6?[=LYEW/^4T4R-A&3KHD8^:TRN"2A +MYVHEYIVE'7.9<,C\CHS60DRG_UME<$E"SU;$=.VL'1X],@V)$_/60[@DI60SS`"[)V_E6+2;08Q@&.D[W2NDJ'\.L +MP`4QRG4J/X9AB&/683DEJ$+,C76X)/4DLCHQEY?A@ACU2Y+_-@Q<$*/:]36X +M)/L=O-J>##"FB/FCDP&X)+CG1DMU@4\&/MD\1C,)>=]7"OJ")ER2W+&QTJ[* +M;S*H5#D9^.=/OA[CF)R>'RO5JXN1[\ENPF71T/!M$C)P,P"7AGH +M<;GIGPS`)>&=S)8:%,7(SY7!A4[E2HV*8MYX`!=R3N=*3?*K9MMRN?&E2Q*C +MEG`Q>U3$7%Z&"WF=&7?V]6TGIL/_EY+@0M+9<>=`_W9BY&ML<*'/Q;0,;"=& +M?DWHK/^?$DEM\J_E;'U)8HSHRQT" +M"Q%<""X$%X(+P87@0@07@@O!A>!"<"&X$,&%X$)P(;@07`@N1'`AN!!<""X$ +M%X(+$5P(+@07@@O!A6++)5LB4@PN!!>""\&%X$)P(8(+P87@0G`AN!!""\&%""X4H/\#9IGG&MFY;-<`````245.1*Y" +M8((`````````*````!`````@`````0`(`````````0``$@L``!(+`````0`` +M``$````````D-)L`)S6:`"DZF@`W)\H`.BG2`#LIU@`\*MH`/BO>`"U!FP`S +M2K<`,TNX`#)-N@`S3KL`,U&_`#-3OP`Z5;D`,UC%`#9ESP`\;LT`-F;0`#9F +MT0`U:M0`-FO4`#5OV``U;]H`,W3>`#1RW``T=]\`-7C?`#]UV0`S=^$`,WCA +M`#=XX``W>N``-WSD`#E^Y0!)-;H`5#S@`%8]Y0!90.L`0';;`%ERS`!I3,<` +M>5?F`'M9Z0!!D"H`2K$P`$NT,0!;ICL`4[,J`%:Y*P!7O"P`4KTV`&F]1`!9 +MP"T`7<4P`%;2-P!:W#H`6]\[`%SB.P!=Y3L`:\%%`&C%1``VG=8`(X;S`#J` +MYP`Z@.@`.H'J`#N!Z@`[@NH`/(/K`#Z%[0`_ANX`(;+-`#[C]0`Z\ND`2('; +M`$**\@!$CO4`4H7A`%>1Z`!^I-@`:Z/N`&ND[@!BI/X`8Z;_`%[NZ@#$738` +MX5XJ`.MB+`#O8RT`ZW0^`/1E+@#X92X`\'<_`/EX/P#-?DT`@U_P`.2'-P#K +MBSD`[XXZ`/20.P#XDSP`ZY!8`/"36@#YD58`JXGC`+./[0"VD?``N)/S`+F4 +M]0"DQ^0`L]_\`+3Q_P"[\?\`O?/_`,GU_P`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!/3DE(1D0!441&1TE.3P``244C +M(!H;`DT;&A\C0TD``$(=&1<5$@,3$A06&!PD```B$0\-"PH)$`H+#`X1(0!P +M*5565E965E965E9651YP4E!S='1T='1T='1T='-04BI4#X$`'Q"%`!$\NP`B$(P`)Q66`"L6J``N&+4`,!JN`"XA +MA0`['\<`/B'0`"%=E0`K1J,`.5*J`!)[`$AGOP!M6*H`2VO!`$MKQP!.>]<` +M6WC*`%%\U@!N1MX`3@!HGE$`;;-2`$O% +M%@!3RQ8`7\8H`%OA&@!MS%(``%2*XP!=C^(` +M59#I`%R0Y`!>_@!9E_$`7IST`%N>^P!K'U`%CN_P!0\O\`A#8M`(HW +M+P"7/#0`G$,Y`*=%/`"+7%D`E6->`*U21P"V2T(`NU%&`+I:3`"D:64`N7%K +M`,%/10##6DT`Q5Y1`,YH60#49%<`UFQ<`,A[?_4` +MTX%X`(Z)O0"-A6YO;V]N;V]N +M;FYK:P```````&MK;V]O;V]W=7=N=RAY=V]O;W=O;VYN;FYK````````;FYN +M;6UM;75U=75U*'AU=6UU=75U=6YN;FX```````!N;75J=75J:FEI:6DR>&EJ +M:6IJ:FIJ:FUN;@```````&UJ:6EH:&AH:69F9C)T9F9F:&AF:&9G:6QM```` +M````;&=H9&-C8G)R8F)B,G)B8F)D("XP/I,``````````$Q$/T5)44D-%!E\ +M?H60C84&"A\A+C`^F@``````````3$`/$$%*10X6%1<:@(N+B0<%"!\D,#Z: +M``````````!,6E=<7%Y<#A0F6%E=>WJ%!QTI5UM>>IH``````````%)*1DI0 +M4U!#&!I\?X6.C(8C(Q\B+#Z1FP``````````54].3U165$V!@8*'B)2/B)65 +MEI:7FYRB```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````/_______________^````?@```'X```!^````?@ +M```'X```!^````?@```'`````(````&````!@````<````/````#X```!^`` +M``?P```/\```#_````_P```/\```#_````_P```/\```#_````_P```/____ +M____________*````#````!@`````0`(````````"0``$@L``!(+`````0`` +M``$````````0/@4`#0=8`!4+9P`9#7D`(!!T`!)%!@`65`8`&5X'`!IC!P`E +M7@H`)V<*`"QT#``M?0P`,GD.`#A[*`!0%A(`8QP7`&P?&0!G+"4`="TF`'9)H` +M,TZH`#=JBP`:2]\`#T[W`!17_P`68_\`*W#0`#1OV0!-+J\`0!_X`$LER@!' +M(]<`1"'K`$HE^0!7*_``5RWZ`&TVY@!C-/\`>CW\`$UCJ@!*:K8`4VRT`%=U +MN0!A?KP`3G/"`$Y^V0!3;,@`47;$`%5YQ@!6>\@`6G[+`%1]TP!M9M``=&O< +M`'5H[``N@@P`,XP.`#B'#@`TE`X`.Y,/`#F=#P`[EA$`.:4/`#NH$``_M1`` +M0)X1`$2E$0!'JA8`2+@3`%*]%@!@ET\`:[!1`$C#$P!4R!<`4=(9`&#'*P!Q +MT%(`.X>T`!JPVP`:I_\`+I#9`"*YV@`LKOP`',WZ`![D_P`KR,`7)/G +M`%:?_P!<` +M:YWJ`&2>\0!QF^(`;Z+N`&>B]`!CIO\`:Z3T`&FF^P!KJ?T`=:3K`'BF[0!Y +MJ>\`:ST`'BN^0!^NOH`1MS_`%G;_P!,Y/\`:50"C96$`MVUH`,9.1`#&6$L` +MRUY0`-5?40#*958`U&56`-AG5P#*>7$`AD+_`(QO_P"9?O\`B:W7`)*]W@") +ML>T`B+KX`)K`WP"KRN8`I^7_`*[P_P"QY_\`L_'_`+OR_P#![?\`P_3_`,CU +M_P`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````#(S,S,S,S,S,S,S,S,S,S,S,RQY,S,S,S,S,S,S +M,S,S,S,S,S,S`````````````'M\?'Q\?'Q\?'Q\?'Q\BWQ\>RR_?'R+?'Q\ +M?'Q\?'Q\?'Q\?'M[`````````````'Q\?(N+BXN+BXN+BXN+BXN+BRR_BXN+ +MBXN+BXN+BXN+BXM\?'Q\`````````````'R+BXN.CHZ.CHZ.CHZ.CHZ.C2R_ +MCHZ.BXZ.C8Z.CHZ.BXZ+BWQ\`````````````(N+CHZ.E)24E(Z4CI24E)24 +ME$"_EI24E)24E)24E)24E)2.CHN+`````````````(N.CI26E)26E):6E):6 +ME):4ED&_E9:4EI:4EI24E)26E)24E(Z+`````````````(V4E)26EI:6OY65 +MEI65E9:5E4&_E965E965E965EI65EI:4E(Z.`````````````(V.DY.5E965 +MD9&1D9&1D9&1D4*^D9&1D9&1D9&1D;Z5E963DXR-`````````````(V,DY*1 +MD)"0D)"0CX^/CXB/CT*^CX^/CX^/CX^/D)"1D(^2DHR*`````````````(J, +MCX:&B(B(@8&!@8&!@8&!B$*(@8&!A(&!@8&!@8B(B(B&B8J*```````````` +M`(J'A7>`=75U=75U=75U=75U=4*`=75U=75U=75U?7]_?W=_A8>*``````#! +MO(*"@GJ%@75U=75U1W5U1W5U1TAU=4!]275(24E)24E)2DI*2G5*>H1Z@H*" +MO,$`O7Y^?GIZ>$EU=4AU=4=`1T='0D1`1T!(1T=`0D1$1T1$1T=(2$E)=WEZ +M?GY^O```O7Y]?7IX=WQ\BWQ\?'Q\BWR+BWQ\BWR+?(N+BWQ\BXN+BXN+BXN+ +M=WAY?7U^P```O8-#0GEV@WLZ88'QL; +M&B$F*#@Y/3X```````````````!=6E-/#5)78&!<4P@2%J2?HJ:QM[>VL[$7 +M'R(;&B4F*3D[/3X```````````````!A60L*"@L,4U13#`D2$Q45G*&FL;*M +MI;$8`P0#`P4>(RHZ.@I::RM[>XM:XD-BHA(28U.3L]N;D```````````````!?7U]>7U]D +M9&1D7UZGJ*^OK["XN+BXN*]-34U,3$U.3KJZOKL````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``#_______\``/_______P``________``#_______\``/_______P``____ +M____``#X`````!\``/@`````'P``^``````?``#X`````!\``/@`````'P`` +M^``````?``#X`````!\``/@`````'P``^``````?``#X`````!\``/@````` +M'P````````````"```````$``(```````0``@``````!``#```````,``,`` +M`````P``X``````'``#@``````<``/``````#P``\``````/``#P``````\` +M`/@`````'P``_``````_``#\`````#\``/P`````/P``_``````_``#\```` +M`#\``/P`````/P``_``````_``#\`````#\``/P`````/P``_``````_``#\ +M`````#\``/P`````/P``_``````_``#\`````#\``/P`````/P``________ +M``#_______\``/_______P``________```H````$````"`````!`"`````` +M```$```2"P``$@L````````````````````````````````````````````` +M```````````````````````````````````````````````````````````$ +M!1P"`0`$*@```$````!`````0````$````!`````0````$````!`````0``` +M`$`!``0J`P4<`@``````````1([U_T**\O\_AN[_/H7M_SN"ZO\Z@>K_)#2; +M_U>1Z/\Z@>K_.X+J_SR#Z_\_AN[_0HKR_T2.]?\``````````#^&[O\[@>K_ +M-WSD_S-XX?\S=-[_-'+<_R'_N_'__[WS__^]\___O?/__[WS +M__^]\___O?/__[WS__^]\___O?/__[WS__^[\?__4H7A_WZDV/]9*O_P=S__\)-:_^2'-_\W)\K_5CWE_WM9Z?^KB>/_```` +M!@````,````$````"%K<.O]*L3#_:;U$_U:Y*__K8BS_ZW0^_^N06/_KBSG_ +M.BG2_U0\X/]Y5^;_LX_M_P````@````$`````P````9;WSO_09`J_UNF._]7 +MO"S_[V,M_\1=-O_-?DW_[XXZ_SLIUO])-;K_:4S'_[:1\/\````&`````P`` +M``(````$7.([_R&RS?\Z\NG_6<`M__1E+O\VG=;_7N[J__20._\\*MK_(X;S +M_S[C]?^XD_/_````!`````(````!`````EWE.]U2O3;W:,5$\EW%,-;X92[> +M^7@_]_F15O+XDSS6/BO>WEE`Z_>#7_#RN93UU0````(````!```````````` +M```````````````````````````````````````````````````````````` +M`````````````/__``"``0``@`$``(`!``"``0``@`$````````````````` +M`````````````````````````````````/__```H````(````$`````!`"`` +M```````0```2"P``$@L````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````(//P<"##0M`@PT,P(--RD"#3>_?]8G_W_69_]_UN@_?];H/W_6Z']_UNA_?]; +MH?W_6Z']_UNA_?\N2:7_?+3]_UNA_?];H?W_6Z']_UNA_?];H?W_6Z#]_UN@ +M_?]9G_W_6)_]_U>>_?]7G___59[__P`````````````````````````````` +M`%>>_?]9GOW_6Z#\_UR?_/]=H/K_7:#Z_UV@^O]>H/K_7J#Z_UZ@^O]>H/K_ +M7J#Z_S5/J/]\L?K_7J#Z_UZ@^O]>H/K_7J#Z_UZ@^O]=H/K_7:#Z_UV@^O]< +MG_S_6Y[\_UF>_?]7GOW_````````````````````````````````6Y[\_UN? +M^O]=GOG_7I[X_UZ>]O]?G?7_7Y[U_V"=]?]@G?7_8)WU_V"=]?]@G?7_/%6K +M_WNM]?]@G?7_8)WU_V"=]?]@G?7_8)WU_U^>]?]?G?7_7I[V_UV>^/]=GOG_ +M6Y_Z_UF>_/\```````````````````````````````!E^S_7I?L_UZ7[/]"6J[_=J7L_UZ7 +M[/]>E^S_7I?L_UZ7[/]?F>S_7YCN_U^9[O]>F.__7IGQ_UZ;]/]K_]MFN+_78_B_UV/XO]= +MC^+_78_B_UV0XO]=D.+_6Y#D_UJ1Y?]:D^G_6I7L_UJ8[_];FO7_```````` +M````````````````````````69?Q_UF3Z_]7C./_6(K>_UF'VO]9A-?_6H37 +M_UJ#UO]9@M;_68+5_UF"U?]9@M7_1&&P_V.+U?]9@M7_68+5_UF"U?]9@M;_ +M6H/6_UF#UO]8@]?_6879_UB'W?]6BN+_5Y#I_UB5[_\````````````````` +M``````````````!5D>K_58OC_TUNRO],;,;_3&O#_TMKPO]+;,'_2VS`_TML +MP/]+;,#_2VS`_TMLP/]"8;#_5'+#_TMLP/]+;,#_2VS`_TMLP/]+;,#_2VS! +M_TMKP?]+:L/_2VO%_TMMR?]4B.'_5)#I_P```````````````*K)YLI]GM'_ +M<9/,_U&+Y?]0?]?_26C$_TAGO_]'9[W_1F>\_T5HN_]%:+K_16>Z_T5GNO]$ +M9[K_1&>Z_SY@L/]*;+S_1&>Z_T1GNO]$9[K_16>Z_T5GNO]%9[O_16>\_T9F +MO/](9K[_26?#_T]\UO]0B.+_<9/,_WV>T?^JR>;)GL3A7XJMUO]IB,/_4(7? +M_U)ZT_]CIO__8Z;__V.F__]CIO__8Z;__V.F__]CIO__8Z;__V.F__]CIO__ +M8Z;__V.F__]CIO__8Z;__V.F__]CIO__8Z;__V.F__]CIO__8Z;__V.F__]C +MIO__47?1_T^#W?]IB,/_BJW6_Y[$X5^3O-X)C;;;ZV.`O?]/@-O_7XO>_\CU +M___(]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7_ +M_\CU___(]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU__]>BM[_ +M37[8_V.`O?^-MMOKE<#>"0````!^I-B+9X;"_TQ[U_]\L/#_P_3__\/T___# +M]/__P_3__\/T___#]/__P_3__\/T___#]/__P_3__\/T___#]/__P_3__\/T +M___#]/__P_3__\/T___#]/__P_3__\/T___#]/__P_3__WRP\/],>=;_9X;" +M_WZDV(H``````````&Z/TR)IB,W]3WS7_Z?@_O^]\___O?/__[WS__^]\___ +MO?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^] +M\___O?/__[WS__^]\___O?/__[WS__^]\___I^#^_U!\U_]IB,W];H_3(@`` +M`````````````%][SK5=CN/_MO'__[?R__^W\O__M_+__[?R__^W\O__M_+_ +M_[?R__^W\O__M_+__[?R__^W\O__M_+__[?R__^W\O__M_+__[?R__^W\O__ +MM_+__[?R__^W\O__M_+__[?R__^V\?__78WC_U][SK0````````````````` +M```!4FK(2W6P\O^R\?__LO'__[+Q__^R\?__LO'__[+Q__^R\?__LO'__[+Q +M__^R\?__LO'__[+Q__^R\?__LO'__[+Q__^R\?__LO'__[+Q__^R\?__LO'_ +M_[+Q__^R\?__LO'__[+Q__]UL/+_4FK(2P````$```````````````$9(4,& +MO.C^_\KU___*]?__RO7__\KU___*]?__RO7__\KU___*]?__RO7__\KU___* +M]?__RO7__\KU___*]?__RO7__\KU___*]?__RO7__\KU___*]?__RO7__\KU +M___*]?__RO7__[WI_O\9(4,&`````0```````````````@````<````--7T. +M_S![#/\J;`S_+H$,_S:=#O]%M1+_,8L-_Q1+!?\_$0__52(<_V\M)O^(-B__ +MJ44[_[]:3O^E44/_?C_Y!TX/\````/ +M````"`````,```````````````,````'````#DBJ$_\XCP[_*W,,_R^$#/\X +MH`[_1[T3_S>>$/\980?_4A@4_V$F(?]S+B?_C#@O_ZQ&/?_'75'_NEM-_Z%& +M//\."%C_&@UL_QX/@?\I%:'_/"#(_U@NYO]P2.+_E'?F_P````X````'```` +M`P```````````````@````4````)2Z\4_SJ4#O\M=PS_,8D,_SJF#_]*Q13_ +M.J81_QIF!_]6&17_9"@B_W^W_````"0````4````"```````` +M```````!`````P````5-M13_/9D/_RY\#?\SC@W_/*T0_T_-%/\]K1'_'&L( +M_UL;%O]I*B/_?#(J_Y<\-/^[3$+_V&99_\UD5/^T34/_#PE?_QT.=?\B$(S_ +M+1>N_T`BV?]?,??_>$WS_YY_]?\````%`````P````$````````````````` +M```!`````4ZZ%?\^GA#_,($-_S63#?\^LA#_4]05_S^V$O\=<`C_7AL7_VXK +M)_^"-2S_G#XV_\%/1?_B:UO_U6A9_[M11/\0"63_'@]Z_R(1D?\N&+7_0R3@ +M_V,S_O]]3OK_HH+[_P````$````!```````````````````````````````` +M4;X5_S>"#?\I9@S_+6X*_S:%#/]'K!3_.)00_QUT"/]A'!C_523__$7D__P5)(_Q`):/\;#5O_'@]K_R@5D?\\'\W_6"S[_W-) +M\?^EA?__``````````````````````````````````````````!3P1;_(\'4 +M_QS#[/\@\O__(?___S7___\J\___'WD(_V$<&/\A797_(X#,_RNZ]_\PX/__ +M4/+__U+=__^\4D?_$`EH_Q$\N_\27-S_&J?V_R'5__\\_/__6.[__Z:&_?\` +M`````````````````````````````````````````%_&*/]-KQO_.I(3_SRE +M$/]&P!3_6^$:_TS#&_\PAAO_;BTJ_W8U,/^#-R[_F$`V_[E01O_6;U__SFQ= +M_[9:4?\Q*G[_+B&%_R<9DO\P&J[_2"?8_VP^]?^(8/7_KI;Z_P`````````` +M````````````````````````````````=<%4MF^T4]9HGE'N:[)0_7#+5/UY +MY53N;3K>)65>VC5];UI5C7NZD:67]O7%L_=.!>.[(>W/6M'!JMXZ+ +MO;:-A[W6BH3![H^&TOV:C>G]JY?][KBH_=;,P/^W```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````/__________X```#^````?@```' +MX```!^````?@```'X```!^````?@```'````````````````@````8````'` +M```#@````8````&````!@````8````&````!@````<````/P```/\```#_`` +M``_P```/________________*````#````!@`````0`@````````)```$@L` +M`!(+```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````!&%P!`A=<"@(770D" +M%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UX#`A=>`P(7 +M7@,"%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UX#`A=> +M`P(77@,"%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UX#`A=>`P(77@,"%UT) +M`A=<"@$87`$````````````````````````````````````````````````` +M`````P?__]9H/__6J#__UNA +M__]__\` +M````````````````````````````````````````````````````6:#__URB +M__]>H___8*3__V*E__]CIO__8Z;__V2F__]DIO__9*;__V2F__]DIO__9*;_ +M_V2F__]DIO__9*;__V2F__]DIO__-E*I_X2X__]DIO__9*;__V2F__]DIO__ +M9*;__V2F__]DIO__9*;__V2F__]DIO__9*;__V.F__]CIO__8J7__V"D__]> +MH___7*+__UF@__\````````````````````````````````````````````` +M````````7J/__V&E__]EI___9J?^_VBH_O]IJ?[_:ZG^_VNJ_O]KJO[_:JC^ +M_VJH_O]JJ/[_:JC^_VJH_O]JJ/[_:JC^_VJH_O]JJ/[_/EJN_XBY_O]JJ/[_ +M:JC^_VJH_O]JJ/[_:JC^_VJH_O]JJ/[_:JC^_VJH_O]JJ/[_:ZK^_VNI_O]I +MJ?[_:*C^_V:G_O]EI___8:7__UZC__\````````````````````````````` +M````````````````````````8J3]_V:G_O]KJ?[_;:K^_V^L_/]RK/S_*[Z_W>N^O]WKOG_=Z[Y_W>M^?]WK?G_=ZWY_W>M^?]WK?G_ +M=ZWY_W>M^?]WK?G_3FRU_X^Z^?]WK?G_=ZWY_W>M^?]WK?G_=ZWY_W>M^?]W +MK?G_=ZWY_W>N^?]WKOG_=Z[Z_WBN^O]VKOK_=:S[_W*L^_]NJOS_:Z?\_V6F +M_O\`````````````````````````````````````````````````````:*;\ +M_VVI^_]RJ_K_=:WY_WBM^/]YKOC_>J[W_WJN]O]ZK?;_>JWV_WFM]/]YK?3_ +M>:WT_WFK]/]YJ_3_>:OT_WFK]/]YJ_3_5'&X_XZX]/]YJ_3_>:OT_WFK]/]Y +MJ_3_>:OT_WFM]/]YK?3_>:WT_WFM]/]ZK?;_>JWV_WJM]_]YK??_>*WX_W6L +M^?]RJOK_;:G[_VBF_/\````````````````````````````````````````` +M````````````:J;[_V^I^/]SJO?_=JOU_WFK]/]ZJ_3_>ZSS_WNK\O]ZJO#_ +M>:GP_WFI\/]YJ>__>:GO_WFI[_]YJ>__>:GO_WFI[_]YJ>__5G2[_XRT[_]Y +MJ>__>:GO_WFI[_]YJ>__>:GO_WFI[_]YJ>__>:GO_WFI\/]ZJO#_>JKR_WJK +M\?]YJ_+_>*KS_W:J]?]SJ?;_;ZCX_VFF^?\````````````````````````` +M````````````````````````````:*7X_VZG]O]RJ/3_=:CR_W>H\/]YJ.[_ +M>:?M_WBF[/]WI>O_=Z3K_W:DZO]VH^K_=J/J_W6CZO]UH^K_=:/J_W6CZO]U +MH^K_5G:\_X:MZO]UH^K_=:/J_W6CZO]UH^K_=:/J_W:CZO]VH^K_=J/J_W:D +MZO]WI>O_>*7L_WBF[?]WI^W_=J?O_W2G\?]RI_/_;:;U_VBC]_\````````` +M````````````````````````````````````````````9Z+T_VRB\O]PI.__ +M;IWH_V^#_;I??_VZ6W_]MEM[_;9;>_VV5WO]M +ME=[_;97>_VV5WO]ME=[_57:\_WN?W_]ME=[_;97>_VV5WO]ME=[_;97>_VV5 +MWO]MEM[_;9;>_VZ7W_]OE^#_<)K@_W":XO]PF^/_;IOE_VV;Z/]OHN[_:J+Q +M_V>A]/\````````````````````````````````````````````````````` +M9)[R_VF?[_]KG>K_8(74_V*&T_]BA]+_8X;1_V&&T/]@A<__7X3._UZ#SO]> +M@\W_7H/-_UZ#S?]>@\W_7H/-_UZ#S?]>@\W_472Z_VR-T/]>@\W_7H/-_UZ# +MS?]>@\W_7H/-_UZ#S?]>@\W_7H/-_U^$SO]@A<[_88;/_V*&T?]AAM+_8(73 +M_U^$T_]IG.C_:)WL_V.>\/\``````````````````````````*O*YLM^G]+_ +M\C_5GO(_U9[R/]6>\C_3&^Y_V&# +MRO]6>\C_5GO(_U9[R/]6>\C_5GO(_U9[R/]6>\C_5WS(_U=\R?]8?LC_57K&_U-XQ?]0=L3_3W7#_T]TPO].<\+_3G/"_TYSPO].<\+_3G/"_TYS +MPO].<\+_1FJV_U=YQ/].<\+_3G/"_TYSPO].<\+_3G/"_TYSPO].<\+_3G3" +M_T]TP_]0=<3_4G?%_U1YQO]5>&V_]EDN+_R?7__\GU___)]?__R?7__\GU___)]?__R?7__\GU +M___)]?__R?7__\GU___)]?__R?7__\GU___)]?__R?7__\GU___)]?__R?7_ +M_\GU___)]?__R?7__\GU___)]?__R?7__\GU___)]?__R?7__\GU___)]?__ +MR?7__\GU__]DD>'_5H3:_U*'W_]A?KS_87Z\_W>;R_^2O=Z+``````````") +ML=LC@JG5_5MVMO];=K;_487?_U-\T_^'N_7_Q?3__\7T___%]/__Q?3__\7T +M___%]/__Q?3__\7T___%]/__Q?3__\7T___%]/__Q?3__\7T___%]/__Q?3_ +M_\7T___%]/__Q?3__\7T___%]/__Q?3__\7T___%]/__Q?3__\7T___%]/__ +MQ?3__\7T___%]/__Q?3__\7T__^'N_3_47K2_U"#W/];=K;_6W:V_X.IUOV) +ML=LB````````````````?J38M6!]N_]4;;#_4(+<_U9_U?^QY___P?3__\'T +M___!]/__P?3__\'T___!]/__P?3__\'T___!]/__P?3__\'T___!]/__P?3_ +M_\'T___!]/__P?3__\'T___!]/__P?3__\'T___!]/__P?3__\'T___!]/__ +MP?3__\'T___!]/__P?3__\'T___!]/__P?3__\'T__^QY___5GW4_TY_VO]4 +M;;#_8'V[_WZDV+4`````````````````````=);52FB(R/]-9*K_3G_:_V*2 +MX_^]\___O?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^]\___O?/_ +M_[WS__^]\___O?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^]\___ +MO?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^]\___O?/__[WS__^] +M\___89'C_TY]V/]-9*K_:(C(_W26U4H`````````````````````_Z?E__^U\O__M?+__[7R__^U\O__M?+_ +M_[7R__^U\O__M?+__[7R__^U\O__M?+__[7R__^U\O__M?+__[7R__^U\O__ +MM?+__[7R__^U\O__M?+__[7R__^U\O__M?+__[7R__^U\O__M?+__[7R__^U +M\O__M?+__[7R__^U\O__M?+__[7R__^U\O__I^7__U2$W?]2:[G_8'[/=``` +M`````````````````````````````%MTS116;\CV8I?I_['Q__^Q\?__L?'_ +M_['Q__^Q\?__L?'__['Q__^Q\?__L?'__['Q__^Q\?__L?'__['Q__^Q\?__ +ML?'__['Q__^Q\?__L?'__['Q__^Q\?__L?'__['Q__^Q\?__L?'__['Q__^Q +M\?__L?'__['Q__^Q\?__L?'__['Q__^Q\?__L?'__['Q__^Q\?__L?'__V*7 +MZ?]6;\CV6G3-%`````````````````````````````````````%0:,>@?KWW +M_Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P__^N\/__ +MKO#__Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P__^N +M\/__KO#__Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P__^N\/__KO#__Z[P +M__^N\/__KO#__WZ]]_]0:,>@`````0`````````````````````````````` +M``````)$5[8ZP>W__\CU___(]?__R/7__\CU___(]?__R/7__\CU___(]?__ +MR/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU___( +M]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU___(]?__R/7__\CU +M___(]?__R/7__\CU___(]?__R/7__\'M__]$5[8Z`````@`````````````` +M``````````````````````,````*````%#5[#O\L;0O_)F4*_R1>"O\D9PG_ +M*WP+_S&-#?\WG0__-Y`._S-]#O\D8`K_$#X%_T84$/]3(QW_9BLE_W0M)O^& +M,2G_F3LR_ZA`./^N3D/_HDY!_X]'//^#/37_>S,J_PT'5O\7#&;_&0UW_Q0* +M??\5"X;_'0V:_R,2J/\L%K+_,1BP_S0:JO\]'Z;_3R>F_P```!0````*```` +M`P````````````````````````````````````0````,````%CJ%#_\VA`W_ +M+7<,_R9E"_\E:@G_*WP+_S"-#?\XH0__/)L/_SJ0$/\J<`S_$4`%_TD5$?]@ +M*"+_=S(K_WTQ*?^),BK_FCHR_ZA!.?^T4$7_KU1%_Z921?^91SW_@C8L_PT' +M6?\;#G;_'0Z+_Q8+B/\6#(K_'0V;_R,2J/\N%K?_-AJ__SX>R/]+)C$_\YC0[_+WH-_RAJ"_\G;@G_+8(+_S.4#?\[J!#_/J$0_SR5$/\L +M=@S_%$D&_U48%/]F*R3_>C0L_X(S*_^/-2S_H3TT_[!$._^[5$C_ME=)_ZM5 +M2/^A2T#_E3TR_Q`):/\=#GW_'@^/_Q<+C?\7#)#_'PZB_R42L/\O%[__.!O& +M_S\?S?].*-?_:33=_P```!4````+````!``````````````````````````` +M``````````,````(````$$JJ%/\]E0__,H$-_RIQ#/\I=0K_+XD,_S6<#O\^ +MLA#_0JL1_T"?$O\O?PW_%5`&_UL9%?]M+B;_@CPO_,9`-_SBD#_]"NA'_1K42_T2J$_\SB`[_%U<&_V,<%_]V,BG_C#LS_Y,Y +M,?^@.S'_LD0Z_\-,0O_17E#_S6)2_\-A4O^Y5TK_K4<\_Q(*>?\A$9'_)!&C +M_QH,G_\:#J'_(@^S_RD4P_\T&M7_/Q[?_T@CZ/]8+/#_Q%/\UCP__&%P'_V@> +M&/]\-"S_D3XU_Y@[,?^E/3/_MT8\_\A.1/_78%+_U&95_\ME5?_#6TW_MDM` +M_Q,+@/\C$9G_)!*K_QP-IO\;#J?_(Q"Y_RH5R/\V&]S_02#H_TLD\_]<+OG_ +M=SOY_P````0````"`````0`````````````````````````````````````` +M```!`````5*[%O]$I1'_.)$/_R]]#?\M?@O_,Y4-_SJI#_]$P1+_2;X3_TFT +M%/\WDP__&5X'_VL?&?]_-BS_E#\V_YH\,_^F/3+_N$8\_\E.1/_97U'_UV=6 +M_\]G5__'74__O$U!_Q0+A?\D$I__)1.O_QP-K?\;#JK_(Q"[_RH5S?\W&^#_ +M0B#L_TTE^/]?,/[_>SW^_P````$````!```````````````````````````` +M`````````````````````````%*]%O]$IA'_.),/_R]_#?\M@`O_,Y4-_SJJ +M$/]%PA+_2;\3_TFV%/\WE0__&5\'_VP?&?^!-BS_ED`V_YH],_^G/3/_N48\ +M_\I/1/_:8%'_V&A6_]%G5__*7E#_O4Y"_Q0+BO\D$J'_)A.R_QP-L/\<#JO_ +M)!&^_RL5T/\W'.+_0R'O_TXF^_]@,/__?#W__P`````````````````````` +M`````````````````````````````````````````%.^%O]$IQ'_.9,/_R^` +M#?\M@0O_,Y8._SJK$/]%PA+_2L`3_TJV%/\WE@__&5\'_VP?&?^!-BS_ED`V +M_YL]-/^G/C/_N4<\_\M/1?_:8E+_V6A6_])G5__+7E#_ODY"_Q4+B/\E$J/_ +M)A.T_QP.L?\<#ZW_)!'`_RL6TO\X'.3_1"'Q_T\F__]A,?__?3[__P`````` +M`````````````````````````````````````````````````````````%._ +M%O\[C0[_,'0-_REA"O\F7@G_*VD+_S%W#?\\D`__/9C3_ +M_RC@_/\>V/[_&F`'_VT>&O\>9)K_)7O!_R2&W?\FI?__+\G__S/;__\SV___ +M.M'__S_,__\]R?__P$]#_Q4+C?\02^C_$E'__PY)__\/5___%(#__Q6C__\9 +MH/__'ZK__R?%__\RYO__@D#__P`````````````````````````````````` +M`````````````````````````````%7!%O\SRL#_*,'*_R+#U_\CT>G_*.W_ +M_ROZ__\O]/__-NW[_SKG[_\MU\[_&F('_V\?&O\W:HO_.X>T_S>9U?\YL?7_ +M0=G__T?H__]0X?__6=O__V?3_O]JQ/'_P$]$_Q8,D_\:2]__&&'__Q5=__\3 +M9?__&Z[__Q[*__\FM?__+L/__SO0__]+WO__B$+__P`````````````````` +M`````````````````````````````````````````````%C%%_])LA/_/9X/ +M_S.)#O\PC`W_-Z$/_S^X$?]+SQ/_4,H5_T_!%O\[GQ#_&V8'_V\@&O^%."__ +MF$,X_YT^-/^I/S;_NTD]_\Q51__=9U?_VFM:_])K6__,8%+_O$Y!_Q8,E?\H +M%;#_*A;"_Q\/O/\?$+__*1/2_S$8Y/]`'_C_3";__U4K__]J-?__B$/__P`` +M```````````````````````````````````````````````````````````` +M`&G+-/]9NBC_2JD>_SJ3%?\VEA'_/*D0_T2^%/]1TAG_5<\;_U;#(O]*IB3_ +M.'LH_X([./^+13[_ED@__YI`-_^C03;_M$D]_\552?_395?_TFU;_\UN7O_% +M9UO_NUY5_T$WM/\_+[[_-B7#_R86N/\D%;W_*1/._S,:X?]$)??_4RW__V$[ +M__]\3?__FF+__P`````````````````````````````````````````````` +M`````````````````'&^5(APMU*P:ZM1RV:>3^9EHT_N:;5/_6S)4?USVE+N +M=-52YF_&4\MEJE&P68].B)-95XB985VPH&5ARZ!E8.:J9F+NMFQF_<-S;/W0 +M>G+NS7USYL9Y<-KMO6NT9$E6W_?;$2_6YZ +M>GJ>P"!@A!@9S!(&M,:\UB"D&1!H>&B8:3'#C#RV+(-8,C(@$$NL91F!M#`& +M/@A+!DE+1H`LF8>!!=CR8%C`#`QBF.[J[NJNKJ[J[JJZCWR?S/OS.'1`1$1$1$1$1$1$1$1$1$1$1$1$1 +M$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1 +M$1$1$1$1$1$1$1$1$1%Q&I#3SL`J#5&Y_X +MOM/`/44`#__Z>QI&6#E)TF*%I!L,FMO./LYM]3'?2C^K=X4=O_XU_DQVG?/<] +M]MY&<_.^MS6W+K^UL7GI38V-"X\U6MN/-UJ;C]I&ZPECS!:B@$,U1]6!.L0T +M$&EA[`9B-A'30J3ICZ6!,0W$-#&VA9@FB,$8,!;$^"I`:ON`R^BF`Y[O[W.S +MM\_'>[M\K+OW[$?[>\]\]*5/_I?'*M_NQAL;EN1MQC3>:DC>9,0\!N9Q1!Y5 +MY(D,MC(@11FHHK77E2!8#`T$BV`%&AA,G0`\"83]Q*?BV+_P<)R`V"[P/+B; +MJ'X;7]AOM_>=NTN +MKMO']8;H,/5ID**##(89FN60.31SX%Q5$R*3"<`:Q-J#VR1!DD`&82L-GRCV +MFTU,JX%L-/WYU.WSZO`WW4O]G],7.C]_^V_^[)W#RG?_XW_[P:TK;_J:"_=_ +M^CNWKCSVAP]E3QT=-`A\GE>"KPYRA^8.5'TM&)""`(Q424"L`6/`6M\=L,9_ +M_.4VG#?6:PN]?Y'^Z\_?O?L>_>ZE> +MOOL?_Z=/7'KX<[[W\B.O^X:-BXV6L7O`+M!%70^7#WQR*>J&J$N]P*LODZI# +M50'U`E\(O22U;0)B,:;XFR]'=:T)QP6!>!7`GT\\003-P22;&+N!L5O8I`E` +MOTWWSO7\G[_RW&]^WW.___:1\KW0?,T3VV;[>XW=_(8.2>LVRBZ.@7IA]P+O +M2%$R')DJ>4U5*UK_0MBM%()/3?@-"1($WH3SAB0(O@UBK^%^H;:\8(@GA23\ +MMH5A4Q(N2Q/L%MA+8"]W,1O_*_GN]\M+_^0EUA!K20"?IC_UK8/N*S_2?_'Z +M9OK2*^1WVKA./[3N10I"G^?@=@ZGS17WVP50A]:?S'4"$!J!&""H(]I +M`B8002"`D>/B^H(HQ*![&7HW13LY#'/(M2V)^?#NW_NEGP)X^(V_^O[[7O.I +M/WSQ`=U,FG=`]G!Y&^=ZJ$LAJ/=>X'/02N4_0`"J->$.@E^0@&D`IB*`D>M, +MM9U``'X;FGX\B8J`,0DN[Y$.]LD&.Z2#NZ3]W79__\*W/?61#_\TP.\V'_M` +MTUSXQZG9V.R(81!4^@&.3!T.)4-Q*$[#%M_Z%Q2@:&CY*0D@830UPKF*`"H2 +ML($$?.YEA`!&":$Z+R(TMK:X<.DB5RY>YLJ%!V#S$;AEVMSN?D">_ZZ?.6W9 +MF!=K1P!OT9_YNO[^K7_=?>HIAC=>QK5[,$S10MBSS.]/(P#G6W^<^GVGA1Y9 +MM?@2A-\6&H$I2H#M] +M3=[R\%]J_H?ON7#ET8?_U:6'AS2W.@A=E#0(MA?X0O#5C0H_@0`J$CA(`(QI +M`$(E_,9XM;?4!"81`.,$4$#)TGUZN\\P[-TD&[;)TQYY-B`;[-'?OZE)Z])7 +M_?#5CUQR=NM?MLPVB30)%@LT"'G1TF:"@?N_$. +MN?9W?O&T960>)*>=@7F1]WK__>#9ZZ0OW48[`Z_2._6"[!0MWYJ&5#_FX#$< +MW$K][U+]ANJWJHJH?YX4USJM?NNJAZDZ].4!>C>#+.33*9KF,,Q`09V3X4>> +M^[Y-VTULXSK&:A`X-_),+.NOD_!*RH(6I5%%I+A.#ORJ+ORRV42%LDY5'4.7\7)O +MG\[-J[SV4S]3N'7Q>[C&6A&`.?DM5HM\O_UGL]TVVD^]D&GM-8\(!%.^A+'] +M\=_73^FDZ\?.C=^X))IJJ[LI#%Q)4B5!!"+PADA!>^GGJK[T5I$=;!*,D.6M +M:X+/Z&>J]6N.0OU>8X+NCP\6H:R3LG[J)`-9VB,;[(?C0A.I$10$S21_VRW< +M6P>(;Y&#!E%QLE;EJ9=MRNN8]$K'SXW7U?1:TMJ_VC6)[^J51*1:EL^_"TUT`*W\1$\]#:P?`12MYC1=#\:^VB.^BB7S +M@F8UK:(N[/5\UY40LI$\E\(_4HS5D=E1,J4NHU`;"A*HM(OQ,FC9WY_ER0N3 +MY^-"#G8+1CZ\&B,Z57#K1P!K9P,X@&GZWV&-9)',V#E#S2!8VP]^(MC09S;U +M^VA-'J=_LH5I8&J^I_UTQ"XQP_4S00Y-"DAI')A"-J%/[57^@QFN_M<)YT^6 +M\Z(7+T&+F)0FO<9)I3_\8:/ZCY:#A&/%U9&=M<(:$D!M(*CH2^?.M[19V,^U +M&N8N_4^OW*48L_-:H036(6>$-6.15O`!JGE=Y<3G.N6IH,JC+T\JF"CG!ZA^L +M__7CNN6_U!NT$D+_"K0V_@\-A42@@4^):A@=@$0-5AQ&O?.0")[1&:6I\)6@ +M*L&P*.5?BBZ.*0VC8Y_EFF']""!W,,B@DT$_>/@-<^_TDX=Q\=)7S*'BP#BP +MQ3:4.L$/\UF@$;Z81)"&^&,;A@(!40,A22[@BF/QR0&Y0N[)1I3*QZ"OT'5H +M)T?W<^CG:.J\&_(PAS2O/!)500?>T2?K@@IY/L#EP;O/N6#["((^3AY:M%&C +M[50YY!>\_;PG7SA7'Q84SWI^=%W*83]_;U\<5S*+SV^>#\C3OA_R2[MD:1N7 +M]>J%!2H*]*5QVY**DZLC#LY[0RP[G"2L]!!2W,S"B'_1H( +MS6!8+/:+H;YB2-`[_GCG'A.\_PHK1`[!R<@+=![L%+D&/P35TGXK*E@U6#4D +M:DG(2$@P(UX*ZX.U(X"\W25_I8-[N>=;>!Q8A9:$L7C0)(S7)\ZGAO--0R,< +M$RSR6G@"ELT;%!^&$R_D0NG,X\?XPYAXX2A?.T:W3E&]1C;L,^R!L8U2H(7@H6>3*K\UC&@G8>2\&-T66SC[ +M&$RH(U.XR-=\_*5P\L$&,@A;+*H^H5*SA#ORM$EF!"%'W0"3-U!,T$9R7#8D +M3_NX;(@ZQUV4"V0\H"G;V%*@&\'1)GA,^"D-HB-"7Y"`*[HIP?NO3%)X]@DJ +MIFJ]@]9C@@^`Q83K"Q((I*-*!N3B'9$R,61BR#'D8LG*=M^30Z8YXC*L&^(T +M!5V_*0)K1P":IDC+(E>:B/6J.>(YW/.X(.)0J;'Q`+0;'("RT#7(=@O@GY"4+#"YP97>OKE +MB$FP-N?BQ4[I"-3I;9>38RIOP#H1&"IQ+";/2)@3L('834RRA7$#5%.L>J$B40J#9`$)];?0:,1<.DP +M%S:1RRU$&ZCFB)/0YR_L`1I4\I`RY8K+>3,#WN(&/.Y2'M&,U[1R[KNH7+H@ +M7+HB7+I?N/*@12Y;N&1AJS`*&*I>84;1"]X="+M#87\H[*>&.T/A1M=RJV^X +MOI_PR9T63_;=WF@L<;E._=Q9_$BAFTQ;&+)41R.7()K1/W5XG#X-4R1)!6H+9 +M-/"JH;-EZ&]!>$,B#J$R]B4F +MY8O>_(=\\>-_Q.=<>H;7\HHOWWZM?$-!]@63&;*N8>^VH?.\G:E\QL+%1LK% +MYAY<$KB";_334+Z.(V_[\GW\N8?XG:=?S^\^_^G\R2M/D!==#RDZ+QK*Y=-& +M:*U+PZ)2JM6EO[]5'O^"/H]_3I^'GQAR:2,]6+Y$Z(C0ZQGL*P;;,=@;LY4/ +M"[8AV"U\^%Q-8^\#3O@1__ZC_$Y[JHOW_../VB?9OE>Y#Y]@;_XT&_QYL9K +M^/GGOHY*$=8#8V[%]-UI;D"FI;S]'^_PT*4![>N.6R\[KIYJ^8;T'NJ0?OZK +M-%ZZR5L^^CEL4`U'CNH7:S>U9@T)`#BLHK]B<)?/?:[#\Z\Z!EUE,)SPTUI' +M3T:^$ZFEVO&!9TYZ_L$;BPC#%'8Z<'?/(?T.K^GUPD"GYT*&] +ME'E1C*=WAWJFRY=F*7G6F[M\!3J#LUV^3IZSDPV.7;ZSAGN#`)B1BV5\=T:5 +M3:9=-ZEU&3\\ZK<++.B9*M\2%.(S5;Z:'>/09YQMK"D!K%CUFNK.-M&9?Z)K +M["GE?.7E&\5TH=`9SIS]\LU>WK.*]22`"9-_9JIZ'=_5R?>;>+*:^37=*5\/ +MWG-!_OMR8.^D@@$:VU'G5S +M?&U?)MRG[C>.O\^1LY5+R/331Y;CC)5O$7)RELMW#V"M"6#21(S]OI)N5\>9 +M@]VNTNXKW53II>55&*DV31)F2PM.C9U>+^GI/GIE$\4 +M\L/*ERMYKI#4\SS?O/]V'[*B?+K\\C5;XOVQ9BQ?EN-=SP^\O_7$6A/`)%QM +M;O*COY;2<(Y7]Y7=@=(UEH$1AF(8&B&U0F8ES.\17"+!/U[(K>`2XX?B@X.. +M*6($2IB`(L4'9,J99@9(P-XCK1.5[_K@M?S8 +MKSJL2WFUK>SU#0.WR="UR+1)3I.,)GGP)U#CPUJ+%8PQJ&GZXR*NH=C@=N!] +MYJW)L28OA\&LR3&2XSWB^^#Z:-;#93VR89=LL`LN0X!.S]#C!XM:VTNXH,#:1^GH7D@N1^=J,IYP(8?(Q6\3/^$*RI(@6;\`X-4D;Z +MEN#0HXF&N5W*T#@&QM$GIZN.CLO9U30XF,.@"V]/6]"[%>6$\"D&JC +MM6.`E^[;YJ<_ZPUPH\/^HX:>$:_"B7J*I]J6L^F"WWX9%KSTY0_..#9,]BF" +M@@9A*2<)B2D%R#OU2YA!"/0&PK$-;.;GMHH.7T,&+9#8EXR)-T\"Y:JAS'K'8WFUQ___W$-=UP%;? +ML)UZ+T$_DZ]PQO6O9F0-@&(^`-`,"X34PX,7\P42PDS`,"D(*.:-EL[>F8;) +M0*&QV&OE[#8SC#1XV%Q@PZRGV$S"O5.2&NX\>A&]V$(S[YN.:(@.'*;3%JD, +M"QX$WU1;/Q,VC`O7PH'[4."UT.!E"/!ZQ.#JO`Z4O.O(=C/T[A#3"3$*!K-/ +M'!GO_O=:GTYN'L>ZG.T0L;>("W`P-H".3>XI0H(G?@4M,:-_'U\?8#PD>#$) +M*)",RP?DZ>M(!W>1WFU,M@^N/T(`\^*ASB:;VB3%88V4LS'&@X5648$9(8&D +M3G%%5.`P$[!8#*182:@@R6)6=Y@^Y;?61WY68TG%,D@,MMEDR]X[8K.>)3G* +M^*M`T_J^6AZ$7FNMOPG&G6+&H-&126YE$V/"->(#B(BI?E_?JG&^I::(%.P0 +ME3!I!_]L*T@K\7$+#@C_]#9R8F`L!6,W4,FKV7:U>(,C\3X+3<"))S"$(K9! +MN6^*X]#BF[`MNCY%=*""*(LL2Q485"3!-C91'>)<_]BOM9AVU1*OSN?4PX'[ +M_PO=ICXWL4AEJ(=B7\&*8M'P>A6CSH<[+VE%#@S]:3$#,SP[04A,@IDF_&MJ +M!EA#`E`_;:P65$/3##(?%,2O_N/7!B@7`E'_&2$^^2G$ZO>MAB`@4';HK:"^ +MLU_U&"@"5(S%OG,&<:$%Q@`YU1IS!@:$@"`..@[MNQ`$Q*]2Y`DJE`LH@FVH +MYK@\]P$UQI;ZJJ\+X%Q](1!*Z:\;P$6TFO**UKY8!Z`V#P%% +M)"R>0EZ%3@A_T[Q/GG5#ZOE@(/D0EVO\9;6@(#XR +MD/.1@4)4H$KP_78D(IN?GUU +M?<&IJ2VP`J(&HSE6QR&>8!V^" +MH!OU6H`0F@@OU&(-:C6L`ZDCJP*5*P+7@X18XT-TF[H=P`3AES)"D.0F!!() +M^F28GJS#''HYVL[#^H0Y.AR+"I2ZH++?)L\,:=]/&_9Q]4/WI8SU#V63H_5V +MD6JQ#@G$);YU+@*"B)&0_*P_+^#4!%L.1`8JQ[W+.?M%9")'GF?D:=^'!D_W +MR8>[@0@*0ACX,N1^<9,VRH[FO.I2]D7*4&#%/QDA0B_TA;`7D83+B$!`0RH[ +M@,5'^Y%2L+WQ+ZSZ%TC"E!&"?-=*L'0%D=_=PM\/J.BC2,N@&82%/%]3QHK7/*=H-$4(@$.-; +MWH%"+I4QKIQ`0J5?EOLZ,I6TC(=A9=0NT`S;H$Z+&A^)J(@85,:?$\0%;475 +MAP0;9B&.X2?)!GMD`XMM;`&",8T0GFQLN%"IA:=6H(C%Y\JN"."[+L8A1H,V +M$!8(@5(K0GR]B>0A%4L#!_.;U&+S2".8X@@V@T)-RD!3($==BC#P=.&RH,GD +MO(QR27.&.#9):$GI5.O?5*FVU*/TCP[]NR)DEP@9542@8-:LX@.&;5YN:VL' +M0AD0)`0NQX8(1*4F(`8G%B>6/`3^\.V]#90!N3KZFH'S"[2N&]:.`"0QF$M- +M3-[TJGRAV@> +M.&RUE7S<4&AK^[Z+H2U!-O'33XO^I5.D6"`DJ4(4B[F";=Q'TMQ`:RU]*0*E +MH:]:#[!8#@PT+`)4>;Y57??)]H3PV&I;4_,EV#H$WV7R!.`"@80+-4&UB;H- +MU&VA.L"Z#'5%9*`L+$0J;`(7Q7)9$BX7$8'*Q4X4)]6:@.7Z@(RM"RB5UE-_ +M;540M#'"&#GV05)]RV_*.055I*%J=:%BW6`C%BL6E1#T8R3YZ$`-64^GVK4C +M`'OI`G+?)J)]'Q7'%7U]W^`K&JS[05@=7M@G]M$FN=<5ZK",-K@'W#_EX'[A +M^%(.!?KN0*F!E`N,*E@+B:*)0D-#1""#F->2-!^GL7$_MI'4A#P$/`U=`2D- +M?.'YY5"AH%*T:46#.J+C5]DN0W_72R+5<&C1':K8H-PONDAE=\((8J6,`J36 +M8I(&J@VL:_IEQL7Z)<'$<%$LVU@OM%+T^4>%O+:>%T5IZ]V=*L?5*YHTO:<> +M?4#&?B=(60TZ=I4692P['55L1E.,J$B"D81$FB"-)7SQR\7:T98TFWZY[:2( +MS2=AV&[6"0'EG68\-R,**9]VOY&OM):,!&TA"),\C#&;&)O4ENT.$76HD=(A +MTU:/S&?9Q$_Y\]P&+2G_+X-]%'WO$,"E*$.3:OS>2C6V/Q[C?RQ'1Q?I6/F> +MHVP2]J4B#D/-$2ETE]8-:T<`U(Q<(YA[!:"S9K8M,MB`>CCN$^#($IZT"HZ1 +MQ<-^HG/_XMC9F#^O,WU>ZS<6N'X$L&H<6TC&6EB=LK_JS,LA?YN_A%.>N9P" +MKI*R#[0OIY*+Y6.-"6!1;'N"^\B4?:`V/E<=S_+(0^\Y;_;DD/M,O[G.=MGH +MPLHCOYNE>S5?X6:Z>H:+=,;?3.?K:5VO]6O]8:T)8`[,*@"SF@5F^9;G;2@. +M^1!GN=7\:^TRS0QP3%FM^^H=7LQI>94C?CF-&Y?5)D]O]>\=$K@W"."P+T". +M\Z,3/&]919PT)W[VPAZO?#/?KM[V+]9V<=`H>$CQ3QUG,U>'X=X@`$ZSZF7R +MP^LC@\LHU")D_:C,3?G[LLV3XZW[41$4UH<@SA[6F`"6](KKDUWF>4S]2Y7J +M1B<6E@FC&Y,TSFG9E$545>&<-WYG&3L^SDU/B$5:WZMAS''-8[I)<%)NU@EK +M3``GQ1'CZ)-]A&:[Y0E4Z%44]41/GOL;/U[95B9*,V5/#__3&JL;YY@`6.Q7 +M-H,U^5`L\2-:C3`51D`]].]G+N?'>D3UHS67_W4D@!-6]R']]47CQ +M=\0#9['"SYN%HZS<.M%4-WGVP?2APCD\_HZ!X_RV/A'YZ+NL)Q6L(0$4.(:] +M>1%?T*01H5$IF9+=^03Y^!D\YK5'$>.D'\SPR.,-^1W,U.*I;>X:6O`/S@;6 +MF``BEHVCQN5GO_:L8HY<3R/Y]2QXB4@`LWKE+>L9)69O0DZNR,QF%3S2(W#, +MT?`P)Y_E8[J_GL[XF\/L_N.SI4=O<;1^-1T/2*FG8_/>1H77#O$\"X6]GD@Q5AVOS;&:X[SKV7 +M^+.C400O82&R<7J:13T/4\JXQEA#`CC]#V$NZ%%_/,(K;AFNS%/U_/EPU)M8 +MM=7^9-"Y3L]>"V<;:T@`XSC*^E[;GS8[;\+AU'-'XA`+^Z28!2=9:'*10^YE +M?J9D[<`]CWY(:3>3B7^9](>EDLJAA9WRU\E5L(R*/QW<`P2P("R,R"=8QP]S +M6C^S."JS:U68!93WWBLQG%<".&[+/MN\W$..YPU;MK+"S?;S6;*_@/*MKZ"M +M7\[O?0*8U,T^KOOG48XQ(S-O=&0SX>"X&5D`9`::.&I"PR'1AHXDBOGMYR<9 +M:)O7Z6C6.YX%P^1)<6\3P*'O5.:X]A2SN>*[C-SQQ+=<='2`TZJ)>Q?W``$< +M]W7/Z`Y[;!P6CFLA=S[67^?'`H8)9HW#M:CG+A+KW\@?BGN``(Z!E7Q;,X7P +MF8HCA?R,R,?$(HZ82R;U!V:;>'`FBJBSG5Q7GEAO`I@_QO3BGW74.']]B9IC +M%..P7RUJE/*PZV:[?(9"'AMSU,[29O",&H#/!#$M".M-`,=]$XMTR3URJNPI +ME7'!.):[PE(7)CC5('#W#-:;`.!L?T,+N/_Z$,BQ5*13+L#1HJRS7[J66'\" +M6&9(YA/?LF8(G+<)7?)R-T?.YSG6=(3QFQ\JSVGXF<4:T@`ZU;],WH0KGLQ +MU[)PZ]EJ+Q)K2`"+PG'6D3KF-3,];X$?XSQ%.[V`Q,Q/,]=5%7`LXO`B +MGWL//&M&'YFE/'?]0W&<#=Q#!'#,SV'AY#W#T1BU4<4;:%%/O(I<66 +M*Z(RY_GC%>V@:GA&?1:/A97I+K_TC5\F7_X3W^].N\`1$6<5O_S^_\%^Q4__ +MRDIE9'4:@,@7K;)@$1%K!Y&O6/4CD]653=Y'>GW5Y8N(6!N(R(>`_W.5SUR) +M!O#+[_G*2QCYVE46+")B[6#D*W_Y/5_Y^E4^_)7WOJ.YJFD\]QR#-&.8.,?(7?O7]7_W6DTG?;%BN!B#F+P$/=0<#`B+"[ +M.X`;+RZ[3!$1ZX4;+]+KYTC0E!40(]_X:Q]\Y]+[RTLC@%_[T+M>@\B7YT[I +M#5-$!$1I?^+9X#I]!E2OF&(Z[:30?>H:J@X1'W^HW1^`R`5$OOED4G@TED8` +M8N0]8L3N]P8@@HC0VK#N!VZ_2V>E@C)<1$=\-$".(D0\M +M^_%+(8!?__#7"B+O0X1V;U`6;&/3L+N3HB^^P*DS;TPQG8&D+UYGD"G&FE). +MTLS1'V8@\F=^_<-?^\4GE=)&H(86\J)"$$+,(@Q'SRQ0!Z")1&`-_ZUNP/JI3+6 +MTMJTW'FE"R_?6F:Y(B+./EZ^17NOC[468\R(K'3[0W)5Q,@[?^.__?I/6586 +M%CX,^!M_^Z]=!K[&J=+M#Q`CY=^,M;0V++L[&?KB=>31QY95KHB(,P]]\3J# +M%)J;%C$Z(BL`[6Z?*Y>VF\"3P#]81AX6K@&(D;\F1K8ZO8$?SI#*N&&LH;5A +M486=/[T&6_H%&DV#"1I`759$A/U.'T00(]_ZF]_^[J7X +M["R^"V#,^S"&=K=_H$#&6&PCH=FRW+W3AY=O+J-,$1%G'[=>8F\OI=%*0E]? +M#LA+[AR]P1",>0)CWK&,;"R457[K.[_ILX'/&Z89PV'FQ_YK,,9@C*6Y8=G; +MSW#/7\,\]MKE57)$Q!F%>^%Y!BEL&A-&`,P!>0'8[_39WMX$[QGX"XO.QV(U +M`"/OQ0CM3CF..99,V0T`X>[3UR%-.75U+*:85IG2E-UG;XRJ_Q/E1>@/AF2Y +M`R-?^EM_]YO?O!`YK6%A!/!_?]=?+R?^=":H_[X+X`F@N9%@$\/=NRG<,-U]D=R^GN9'XUM]4&L"DM-_I(49$C"Q\;L#""$#$?+6(>:C7'Z*JDPMC +MO!W`6$NS96EWL2%H`19$N'OU!@SZI_Y28HII)6G09_?: +M31I-BS%VJ@&PGE25;F\`1N['R->%5VDT@_'/ +MABZ`0.D&?`C:^UT>>.@*^"'!)Q>1I1-K`&+DB\7(FP:#U$_\F3*<,=+/*?T! +M?$7A3KL'QFQBS+><6'8Y(0'\]@]^\+*(?(TJ]*:,_8\7H.X38!-; +MJD-W7K@-^WNG_I)BBFDI:7^/G9=VL-:0A&_>SP`L/`!G:#Q%Z.QWB_T/_O8/ +M?E!.(K]P4@W`F'=CS&:OVP..9C`)_9Q""S#&VP&,,=S=U]@-B+AW<>,:NUWQ +MQK_"^:?L`G"D$;!(698S\/,#/@UCWG[2;)W(""C&Q_SO[/<.'<*H?@!"*+`Q +MP2$HP=B4_B"G]]33;'[ZGUW5*XF(6!GZ5Z\RR.#RQ<0[PY7>?^"U!&:3(:"] +MUV7#SP_X(/"K)\G7L36`W_FA#W^V&/G/LC0C#4$_C^X"%,)?.05Y`K"^&W!S +M%W;O<.KJ6DPQ+3+MWF'GY7;0>,_\T(A\QA_`NJ3E%04\X-L*$;8+FSK_#B?8Z1J21D*2 +MC,[])XP``#/+$7A;`&(2Q'SKL6688Q+`[_[(WPH3?Z#7[AXY?%&D$98SM?A]U.G$>\_0?@Q1$8)Q7BS:2S&&7C4D,>,(`$'=&9T#.[3Z77GD) +M'CZ1@3,BXG3QRDO\4,>:]8@S=_<[<*DLH)F47H*8!%(9`8PUW.XJ^\,S*WE-$Q#*@ +M+SSCU7_C_5W$V)%Y,1XU(^"<\B0B]/:[_K?&?//O_\1W7I@WCW,1@!CY$C'R +MQF%_@,ORN5664-Q*]2FZ`L$M.&EX)PGGA-VGKH)SG+H:%U-,QTG.L7?U69P* +M-O'3W^O3?ZG9Q6KR-;],J=)K]Q`C5\3(N^>19YBW"V#,DP"]W;IOM^R^![P;\Y#R_G5D#^.@_^Z[+(O(N565P5."/P[H`4OX7SM?"A(48 +MZ<88=CN*>^'IU;VPB(@%PKUPE;U>Y>U:COT7L_]*;:'"<61*1,@&*6E_B(C\ +MN8_^L^_Z@GGR.;,&($:^`=CL[W8]X^]0P/ +M?&X&C<8*7UU$Q`F1INQ>O88BH\-_IC;\)\'Z=T(C8('>;IO6]@9X+>`CL_YN +M=AM`6/&GO]LY5E^E/M&A,G^$OE`Q.]`:&F%VH+&6.SLIW+S&J??G8HIIGG3S +M&CO[#F,M23+N_FM*+7A_Y +M;#'RY[-A2CH84IN_.%\:QX%`(99&LPJ6N-M1\FN?G+4L$1%G`OFU3[+7E\J_ +MI9CY%R;_3&WICRM7X7ZA<=X0(^^=-:^S:0`B3R)"?[=]['[*@4(7GH%":1PI +MAP/#V@&(X<[5YV$XX-19/::89DG#`3O/74>D9M>RA?#7EO\JQ:&2BY/(EHC0 +MV]DO".';_O!GOG[-/_#FL"U`4N^P"U-V"FQ:; +MV+)+<'LW@QO1-3AB37#C&>[N*V(+C79L^`^9J@&<1+;$"'F6,^SV$6/>*,9\ +M^2S9/=((*$;^"O#`8+>#.G?BX;\#]Y?"#YIRS8!&*V$X-(BQ['53TF?_E,;K +M_\RR7UU$Q(F1/?<4[8'0:%F2IC=JBS&UX3_`K_-SX+>+D*W>W7TV+FV#-P;^ +MXE'7'ZTFA`4_^[OS>_X=V@6`2ONI.0098V@VBVZ`9\[;SUZ'?H=35^]BBNFP +MU.]PY]H-K_Z;2OTOEOXJ+YV"D\J7B#!L]\BS'(R\X^/_^S]XW9'B?=@?__AG +M?^"U(O)E+G,,CSGV/YD`QOH]C!H#"\-)$3KI]EX&+SYSZN\WII@.32\^P]VV +MEB[M=0<@:ET`IG4!%D``(D+_[CXB8D3D`QR!(S0`\QXPIK_3KKGM+L8&`%"H +M0;Y>*@W`)EY]*DB@W7,,KO[)&7C#,<4T/0VO_@G=@2#!B-UH)J5MJ^K_PV3Q +MY\3R50X)[K1!!3!/_O'/_L/FH1(^[0__Z=_^H(C(^T2$P<[^0IAI*D:&`ZNE +MP\3:8$&UO'KM)>CL$A%Q)M'9YK87P5^/_$QK^L>-%:0#J'`,_6_=A +M$?G:P[(]W0@H\A>!-Z2=GI_XLV#C7^TYH2Z$\7D!X]V`UUQ_&C[]SR_[549$ +MS(\7GN9.F^##8FFV&B.Q_PX.@S/B!0@L5,;Z=_?8N'(1O#'P9Z9=-Y4`1,S[ +M``KU?UD0_S!O%S4@+M@!FM7T8&,LG?Z0WD<_PN:?_,[2\A(1<5STAX[>$)H; +MMOI^#ZC_>D#HZUBDG&6]`?D@)=EH?>&?_/S_^-F?\5>^XX\F73>Q"_")7_A' +M5T3D7>J48?OXKK^'V@`.J#_4/`)-V8\>P/37OF%`U`W@UL#O?:X7!9ZO_!`^\9&,*$-1OT +M[:`TJKQPJ\?5:[NDPP'9<(C+,IS+<4Y!%>7@!(N((U"\@UAGDR'%QEOO"I=U +MFR0DC09)LT5S8X/FYB:MS6;I_%,:_VIK_P&'U_."Y6RPU^;"(P\AQGS3)W[A +M?_H[;_G+_]W^^#43"4!$G@3H[^XO3?;':]G7D92NP3+F%ERE:EDQ-0911<05 +M@56I=B(.0T&6R^S>W3/P_=010W4AX+Z;:H.MRE9A[FO1?ZLZ/IQE%_XJ5!GL +MM=F\[_(%X)N!_WG\D@,$\*?_QP^_%7A;/AB0#P8K^4!$@F]4,1P8'"F21N+= +M@H,=8)0(K%\=114#J#I4!20V93,A5)-(Z`7&>CL$U;=9"GKHIAY(84*;E$M_ +M!GT:6YN?^"9TD@U+V"C@>F%RDY\49H +MG@-@BV`K@1`B)J#H`M0,U$FC47Z/-DE"PU0;_AM9_JNXR5%=@.7(VV!GE\;6 +M%O@AP>D$(!(F_K3;L(2)/[/4LXYK`*T&UB:X),DS0:OJ57K5R'LQSG'*JN(H#(`$L-UJ0$$J9>Z\$\C@B7*W&!OC\T'[F\"3P(_ +M4)PO">#I7_S1)X`O=6E&VCW.HA\+JNW2(U!0:[%.:6XTR=(L"+IG4F,,N;6X +MI$X`E74[XG`,0A>@N;4-@*;]T\[2F44Y!%@&L/5=TJ21>`)H>DV@N=$,FL#\ +MZC\L=T1FL+O+U@,/@/#^IW_Q1W_PS5_Y-W,8T0#,>P`SV%NQ\:^JY5`)86L, +MHMY(U=IL,NBG%8$:\2\A\Z3@G&_]2R,@1QM"\HP_V]%8W]%Z4>K6LM*AO?RJM56AM-;#(H*\E8@[4)>9*'+H$K +M;0!1[F>#Z?H6O[7M%Y-Q]K1S='91[P)X^Y0MOT%3&@(;WA'(VI$Y`'Z`>\;G +M+%GN!KL[-"]>!#\D6!$`(E\"O"'K=G%9MOR<'%X-)1.*`8/_,EL;+0;]JA_F +M;(XMA-\%+\!2^B,-'`7;]+-$2P*0:`2_Z![Q3\YRL=I3.,:IY*J:$6L2N"8;`9U/]2 +M2P!&S?Y'R]4J9&^XO\?6@P^!F&]YYE=^\KL3D3#QI[V_LDP<61%0KAI4Y*G1 +M$FS#XG)!C8+:8/0KA#\*_CP0ZWM_29+;G1/4M0!J=@%#JQ7_OGH%)-!53UI<.*_[6;#48]K.:RV_= +MZ!<)8!Z(]7,`;!($/YEOG=CSB5%[0+%-&C:T_M5EHL>89KDB^1ON[="Z=`7@ +M@\D;OO3)E878T9_[]KFDM*CD8J)0L]4@'?H)0)5R%8?\CH-B$I!)O)%531P& +MF`GEN'ZUZQ?_E+%+YO\N/_>#_VCE3?`:T'XUAZK9M'0+S:#V]]/77-8/!;D: +MXXG`F=F7B8RH0:#12LJNP;KYH*P!`5`.CQ@K)`U#GDVKX36J^=-&.=0:-($5 +MNWZO'R;7CP@T$EN?-,`Z?8?K00`U7+JR>=I9N#?PM-](!!`1<8X1"2`BXAPC$D!$Q#E& +M)("(B'.,2``1$><8D0`B(LXQ(@%$1)QC1`*(B#C'B`00$7&.$0D@(N(<(Q)` +M1,0Y1B2`B(ASC$@`$1'G&)$`(B+.,2(!1$2<8T0"B(@XQX@$$!%QCA$)("+B +M'",20$3$.48D@(B((!!`1<8X1 +M"2`BXAPC$D!$Q#E&)("(B'.,4R(`!:5*]?.C)VKG(Y:#:74><3Q,^W[UX*%. +MNWYU2%;[.)U^K`HR]C?%GU/AM"OJ7H-JJ$\M3YQVENXA:*C/L3H=J6,]\)/3 +MP(H)@%K%E%]>)?SC?ROD7N9_3,01T%K]CVPC3HSB.]:Q5/^;/V`J6:P(JR6` +M>JM3KQBI;>L$4&H`IU(W]S1TY(,D:@`+A8XU9F."/D(,IYO3U7RNI@'4]T=E0$^)@$]!`R@JQ?BMB!=\ +M%5]!@!=^AV_^"_T_]@,6B9(`H@:P8(RI^EI\[Z[:9_SXO'0!1H1?QYAQ7,"% +M2`#+0T4`8]N($^(P`G"C&H'6_WX>".!`H:42?"!+[9JH!"P4F@6!+P0_:@"+@=9V +M#AC_"N'/)V@!YT(#&&_]F=#ZRVCK#X!$`E@P7)[YG:@!+!9U[[X#(P%U+2`_ +MJ`6<`DZ!`/+1D3Y'$/PZ`801`*D9`2,!+!0N"P10"+[+3CM+]P;&-0#&[5[C +M).!3-2R[6IP"`=3Z_0>$/PP+BJ%J]>,HP#+@TC$"R*,&L!C4/5R+K9M"`OFH +M/>`4L'H"*(4_N/^6@F]JPN\J]3^.`"P%>:D!%-OTM+-T;T$/ZP9H31L.=H%3 +MZH*ME@")OJM:_KOI+;/V7!9<&@2\U@-@%6!PF^`(MDX!:Q>`T#Q_8!BJ&]&U3]RP4*1IW$48"G0"0?3N@(C9'`> +M-(#2[73,T6>2X(^,`$0L&@>&`:,-8`FHC03`X41P/C2`HI!!X%6JB#\C7G]U +M]]](`LM`20`ZYA$8L2",1;LJSI7"/WY\+@A`:U.`&=4`%,J6O]B/6!JB(]"J +M4`^]-DD3\,=Z/@A@RAQ_+;H`3!;^R`4+AXY/!HIS`18'G7*B)($)T9BM#M])902LC@,>;5JI(*#7!K_?UR^,ZXFS`9:"<#5CT/4^I#WKO8E+0SPE> +M@E#:`E1)'F^:W")Z;9BOY*M?2=OZF9M6.CD&($S$)N!;5@K(BQ@DG`6$,1)VSI6`D!/-B`U`D.7*XXIPQS!*=D#NTY,%H- +M`TQU_XDL$+$.T.GGRPDP!E5!F#Z\1#`XY4GM6LG09"Y*6#2*YR72HY#/=.>RYSW6M2S +M5W7?6^ZDUZXZ: +M.Q`''`,B(NYIU,8#42V7QO*-HEFA&*SL25_W2#7'K_;L*/@1YQDC1%`_]Z]O +MK:93NU+!^_I'#CPO"GY$1*VKL"K!+W!J`CB!#"(BSB56+?01$1$1$1$1$1$1 +M$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1 +M$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$:>(_Q]#*AH3%39B$0````!) +M14Y$KD)@@@````````````$`!P`0$````0`(`&@%```!`"`@```!``@`J`@` +M``(`,#````$`"`"H#@```P`0$````0`@`&@$```$`"`@```!`"``J!````4` +M,#````$`(`"H)0``!@```````0`@`'$]```'`,`(RI``````"P`;`"\`6P'@ +M``````!7`&D`;@!2`$$`4@`@`',`90!L`&8`+0!E`'@`=`!R`&$`8P!T`&D` +M;@!G`"``80!R`&,`:`!I`'8`90````@`30!3`"``4P!H`&4`;`!L`"``1`!L +M`&<`(``R````#@@`4``````&``D`/0"Z`&P`__^"``````````"``E`````` +M2P"2``@!"`!E`/__@@`F`$0`90!S`'0`:0!N`&$`=`!I`&\`;@`@`&8`;P!L +M`&0`90!R``````!"`"%0`````$L`G`#$`!@`9@#__X4````````````!4``` +M```6`9L`/``.`&<`__^``$(`<@!O`"8`=P!S`&4`+@`N`"X`````````1`BA +M4`````!+``D`"`&#`&@`4@!I`&,`:`!%`&0`:0!T`#(`,`!7```````````` +M$```0`````!+`*4`"@$!`&D`__^"`````````````E``````2P"L`,0`"`!K +M`/__@@!)`&X`0!O`'4`(`!L`&D`:P!E`"``=`!O`"``<@!E`'``;`!A`&,`90`@ +M`'0`:`!E`"``90!X`&D``%T``````%(`90!N`&$`;0!E +M````"`!-`%,`(`!3`&@`90!L`&P`(`!$`&P`9P`@`#(```"``(%0``````8` +M,0"1``P`:`#__X$``````````0`!4``````6`$H`,@`.``$`__^``$\`2P`` +M``````````%0`````%,`2@`R``X``@#__X``0P!A`&X`8P!E`&P````````` +M```"4``````&``L`D0`(`&4`__^"`%(`90!N`&$`;0!E`"``9@!I`&P`90`` +M````@`B!4``````&`!8`D0`,`&8`__^!`````````````E``````!@`F`)$` +M"`!G`/__@@!T`&\`````````!P``4``````#``(`F0!#`/____^````````` +M`,`(R)``````!0`F`"X`MP!#``````!%`&X`=`!E`'(`(`!P`&$````````$P`:0!C`&4`;@!S`&4````( +M`$T`4P`@`%,`:`!E`&P`;``@`$0`;`!G`"``,@``````#@@`4``````&``D` +M/0"Z`&8`__^"`````````$0(`5``````2P`)``@!N@!E`/__@0`````````0 +M``!0````````R0!=`0$`_____X(``````````0`!4`````#3`,\`/``.``$` +M__^``$$`8P!C`&4`<`!T`````````````5``````%@'/`#P`#@`"`/__@`!$ +M`&4`8P!L`&D`;@!E````````````P`#(D``````'`#L`2P#"`(L``````$X` +M90!X`'0`(`!V`&\`;`!U`&T`90`@`&D`0`@`&$`9P!A`&D`;@`@`&\`<@`@`'``<@!E`',``!T`'(`80!C`'0` +M:0!O`&X``````````0`!4``````J`'<`,@`.``$`__^``$\`2P`````````` +M``%0`````&8`=P`R``X``@#__X``0P!A`&X`8P!E`&P`````````/#]X;6P@ +M=F5R7!E/2)W +M:6XS,B(O/@T*/&1E&UL;G,](G5R;CIS8VAE;6%S+6UI8W)O +M51O:V5N/2(V-3DU8C8T,30T8V-F,61F(@T*("`@("`@;&%N9W5A9V4](BHB +M+SX-"B`@/"]D97!E;F1E;G1!3X-"CPO9&5P96YD96YC>3X-"CQC +M;VUP871I8FEL:71Y('AM;&YS/2)UV4R,#$Q-#4W+3$U-#8M-#-C-2UA-69E+3`P.&1E964S9#-F,'TB+SX-"B`@ +M("`\(2TM5&AE($E$(&)E;&]W(&EN9&EC871E&UL;G,Z87-M=C,](G5R;CIS8VAE;6%S+6UI8W)O +M3X-"@T*`````````````````!D`4P!E`&P` +M90!C`'0`(`!D`&4``!T`'(`80!C`'0`:0!N`&<`(``E`',`"P!3`&L`:0!P`'``:0!N`&<` +M(``E`',`&0!5`&X`90!X`'``90!C`'0`90!D`"``90!N`&0`(`!O`&8`(`!A +M`'(`8P!H`&D`=@!E`!\`5`!H`&4`(`!F`&D`;`!E`"``(@`E`',`(@`@`&@` +M90!A`&0`90!R`"``:0!S`"``8P!O`'(`<@!U`'``=``7`$,`;P!R`'(`=0!P +M`'0`(`!H`&4`80!D`&4`<@`@`&D``$T`80!I`&X` +M(`!A`'(`8P!H`&D`=@!E`"``:`!E`&$`9`!E`'(`(`!I`',`(`!C`&\`<@!R +M`'4`<`!T`````````"4`5`!H`&4`(`!A`'(`8P!H`&D`=@!E`"``8P!O`&T` +M;0!E`&X`=``@`&@`90!A`&0`90!R`"``:0!S`"``8P!O`'(`<@!U`'``=``> +M`%0`:`!E`"``80!R`&,`:`!I`'8`90`@`&,`;P!M`&T`90!N`'0`(`!I`',` +M(`!C`&\`<@!R`'4`<`!T`````````!$`3@!O`'0`(`!E`&X`;P!U`&<`:``@ +M`&T`90!M`&\`<@!Y`!0`50!N`&L`;@!O`'<`;@`@`&T`90!T`&@`;P!D`"`` +M:0!N`"``)0!S``X`0P!A`&X`;@!O`'0`(`!O`'``90!N`"``)0!S```````` +M```````0`$,`80!N`&X`;P!T`"``8P!R`&4`80!T`&4`(``E`',`%P!#`&$` +M;@!N`&\`=``@`&,`<@!E`&$`=`!E`"``9@!O`&P`9`!E`'(`(``E`',`2`!# +M`&@`90!C`&L`0!P`'0`90!D`"``9@!I`&P`90`@`"4`0`@`&$`;@!D`"``<@!E`'0` +M<@!Y`"``=`!H`&4`(`!I`&X``!T`'(`80!C +M`'0`:0!O`&X`+@`\`"\`;`!I`#X`/`!B`'(`/@`\`&(`<@`^`#8`/`!L`&D` +M/@!5`',`90`@`#P`8@`^`$(`<@!O`'<``!I`',`=``L`"``:0!T`"``=P!I`&P` +M;``@`&(`90```#(`8P!R`&4`80!T`&4`9``@`&$`=0!T`&\`;0!A`'0`:0!C +M`&$`;`!L`'D`(`!B`&4`9@!O`'(`90`@`&4`>`!T`'(`80!C`'0`:0!O`&X` +M+@`\`"\`;`!I`#X`/``O`'4`;``^`````````!8`5`!H`&4`(`!A`'(`8P!H +M`&D`=@!E`"``:0!S`"``8P!O`'(`<@!U`'``=````````````!T`10!X`'0` +M<@!A`&,`=`!I`&X`9P`@`&8`:0!L`&4``!C`&4`90!D`"``)0!D`"``8P!H`&$`<@!A`&,`=`!E +M`'(`0!P`'0` +M:0!O`&X`(`!M`&4`=`!H`&\`9``@`&D`;@`@`"4`0`@`&X`90!E`&0`(`!T`&\`(`!R`'4`;@`@`'0`:`!I +M`',`(`!S`&4`;`!F`"T`90!X`'0`<@!A`&,`=`!I`&X`9P`@`&$`<@!C`&@` +M:0!V`&4`(`!A`',`(`!A`&0`;0!I`&X`:0!S`'0`<@!A`'0`;P!R```````` +M````!0!0`&$`=0!S`&4`"`!#`&\`;@!T`&D`;@!U`&4````````````````` +M```````````0`%,`90!C`'4`<@!I`'0`>0`@`'<`80!R`&X`:0!N`&<`2P!0 +M`&P`90!A`',`90`@`'(`90!M`&\`=@!E`"``)0!S`"``9@!R`&\`;0`@`&8` +M;P!L`&0`90!R`"``)0!S`"X`(`!)`'0`(`!I`',`(`!U`&X`C)[,W$TLS4!-A8Y2SK#.O`Z'CV4-YLWM3=8.)DZ6#M*/',^?SZS:#-I(VF#:C-JHVPS;N-@8W"S>9-\0WW#?[-RXXB3B=.5@\>3RP/-4\ +MW#S\/!$]&STJ/8\]SSX```"````H````$S`M,#@P5#+V,JLS#C5D-0HW4S?% +M-^LW>#G0.@$\]ST`D```9````-\Q4S.V,W@T<37A-0HV*3:M-C0W=#>^-_PW +M#CB-.*\X2#E].=0Y`#H8.DHZ:3J:.K`R#C,S,V$SFC/&,R,T5C1S-$8UBC4+-A(V339^-K0VZC:, +M-YTW'3A3.%\XASB3.&(Z"CLL//T\83WJ/@P_)#\I/R\_-C\\/P```+```#0` +M``#-,6XR'#-:-(\T738%-Z\XZSCY.!LY3#F?.=TZ0#MQ/'H\Y#S_/`X]*#T@ +M/@#````@````>C1@-F@V?C:_.10Z+#HM/5,](#_4/^,_`-```)````"8,*

    4-\0WRSA=.60Y:SER.<\Y-3H_.DPZ^3H7.QX[;SO@.P,\ +M,#TW/3X]6CUL/8X]SSW6/1P^*CY6/F(^`C\C/R\_4S]R/WH_A3^R/P```.`` +M`"`!```;,"0PK3#`,,DPZ3`&,0PQ'3$C,3`QF#'Q,?@Q_S$&,@TR%#(;,B(R +M*3)+,E(R63)@,H$-YDWH#>Y-\,WY#?K +M-_PW"3@>."4X,SA!.((XGSB].-`XW3CO.`$Y$#D@.34Y2CE9.68Y>CF'.9$Y +M"CL5.QP[*CO^.PT\'#PK/#H\M3S$/-,\XCQ?/7\]6#YH/F\^=#Y_/M,^W#[G +M/@P_%S\-2DU-#4_-4HU +M535@-6LU=C6!-8PUES6B-:TUN#7#-\U^C4%-A`V&S8F-C$V/#9' +M-E(V739H-G,V?C:)-K$VS3;?-OXV5C=L-Z\WQ#?M-RSF..=`YVCGJ.0$Z!CI".FPZACJ?.JLZMSHQ.ST[13M* +M.WT[BCN5.YH[ICNR.\0[T3OR._D[7SR3/-(\W#SQ//@\)3TY/9(]I#VU/<4] +MU3T//EX^!3\3/]\_`!`!`)@````#,!DP*#`V,$0P1#%+,6$Q9C%*,M4RL#._ +M,\,SQS/+,\\STS/7,]LSWS/C,^SZ//JX^ +M]S\````P`0`4````#S#*,#LQ0#&E,0```$`!`!@```!I,H0S)#6'-;PU$#9- +M-ETX`%`!`"`````E,4(Q6#%Q,9@VGS9_-X8W$SP:/%(]63T`8`$`#````-DZ +MJ#T`@`$`:````)LP^#:Z-^HWFCC<.%@Y.:\Q,3([ +M,D$R4#)O,I$RKS*Z,M,RYS+[,EDSC#.L,^HS!307-"LT/S13-&@T@32.-)LT +ML#34-.$T[C06-2(U+C4U-3PU2#5Q-7LUF#6H-;DUSS7A-?DU'#8B-CHV1S99 +M-FDVV382-R$W/3=*-U$W7S=K-W0WY#?T-_DW#CAK.+`XQ#C7./0X`3D).0\Y +M$SDS.4,Y5#HN.TL[6SMO.Y<[HCO..PH\.CQP/(@\DSRV/)`]RCW/_(_]S\`L`$`H`$```,P##`@,"@P +M-C`],$,P2S!2,%TP:#"),(\PM##F,`DQ&C$P,4$Q4C%E,7$QE3'_,0HR$3(9 +M,BDR-#)!,DXR6S)V,GXRE#*G,K4ROS+%,N(RZ#+T,OTR"3,6,R0S+C,_,T0S +M43-8,UXSV#,'-#$T2317-%TTG32Z-.PT_#0'-1,U3C5F-7,U>36,-9,UHC6N +M-;HUQC77-=TU\#7Z-1@V3C9B-G8VBS:4-K4VSC;T-@0W)C9-Y\WK#>U-[XWR3?=-^,WZ3<#.!$X%SAC.&PX..DX^3@$.0DY#CD5.24Y*SDV.4(Y63EL.7(Y@3F,.98YGSFM.;@Y +MQ#G-.=,YVSGF.?(Y_#D#.@DZ#SH>.BHZ-SI$.F#J%.K@ZS#K:.N8Z[#H( +M.Q([*#LP.S8[3#N8.P,\#CP6/#(\.3QS/)0\JCS`/-X\[CP*/28]0SUI/7`] +MNCW,G`RAS*D,KTRT3(-,QLS)C-',VHS>S.Y,\TS +M831L-(PTE32>-.$T7S5^-8XUG#7'-=(U^34$-C,V/#9"-DTV4S9X-GTVB#:4 +M-J(V!3<8-S0WFS>Z-]LW]S<#.`DX%C@D."\X0S@V.3TY0SE2.5LY93F+.9DY +MGSG@.?0Y"#I&/%8\#CT;/64]:3UM/7$]=3UY/7T]@3V%/8D]C3V1/94]F3TN +M/C0^1CY./EP^9SYL/G4^>SZ+/J4^Z3[W/@8_+3\R/SP_:3^=/ZH_LS_!/\<_ +MS3_6/^4_`-`!`#@"```3,#\P1#!;,'(PAC"O,+8POS"H,;(QSC'@,1,R*#(Y +M,D8R4C)C,G(RCC*<,J,RJ3*T,KTRS3+A,NDR0S-5,V(S:3-P,X,SC#.5,ZLS +MLS/.,],SWS/D,_$S`#09-!XT(S0H-"TT,C0Y-$`T1C1]-)HTJC2^-,@TW33Z +M-`4U,#4Y-58U7#62-9@UL37+-=PUYC7P-?LU(38G-BPV,C8X-DTV5C9>-F8V +M#=^-X0WDS>C +M-[`WQC=Q.'`YZSGQ.?/"@\,CP\/$8\4#Q: +M/&0\;CQX/((\C#R6/*`\JCRT/+X\R#S2/-P\YCSP//H\!#T./1@](CTL/38] +M0#U*/50]7CUH/74]@SV-/9<]H3VK/;4]OSW)/=,]X#WN/?@]!3X3/AT^)SXQ +M/CL^13Y//ED^8SYM/G<^@3Z+/I@^ICZP/KH^Q#[./M@^XC[L/OD^!S\1/QL_ +M)3\P/T`_1C]0/V(_?#^"/Y$_F#^A/Z<_K3^V/[T_Y#_Y/P#@`0#<`````#`& +M,!`P&3!-,&@PLS"Y,,DY]CD=.B4Z/CKH/!$]A3VS/<0]R3W. +M/>\]]#T!/F\^_#X@/S@_/C]5/W`_C3^B/[$_SC\`\`$`U````!`P'C`Y,$0P +MS##5,-TP)#$S,3HQ<#%Y,88QD3&:,:TQX3&,,JLRM3+&,NPR!#,*,U,S:#.# +M,X\SGC.G,[0SXS/K,P0T"C0Q-%$U)38X-K`VA#>7-[4WPS=Q.:@YKSFT.;@YO#G`.18Z6SI@.F0Z:#IL.LL\ +MZSPU/4T]4CV]/<`^T3X``````@`,````DC4````0`@!T````FC>>-Z(WIC>J +M-ZXWLC>V-[HWOC?"-\8WRC?.-](WUC?:-]XWXC?F-^HW[C?R-_8W^C?^-P(X +M!C@*.`XX$C@6.##U\/8`]UCT; +M/B`^)#XH/BP^`"`"`$P```!O,>C.`,YLSPS/7,_,S +M_3,'-!4T,#1!-*,T4#5H-6XUBS6P-6PWHSOY.YP]]3V$/M,^]S\````P`@"$ +M````=3*!,I@SP3/=,_TS"S02-!@T+31`-%0T8#2<-*PTPS3+-/4T$34@-2PU +M.C5<-6PU<35V-9TUIC6K-;`UU#7@->4UZC4.-AHV'S8D-DLV5S9<-F$VD3:9 +M-IXVKC:X-MTV[S;[-@4W%S<<-SPWH3>M-R4X/SA(.)-6(U9C5J +M-6XUC>!-XTWH#>E-[$WMC?'-S$X.#A* +M.%,XFSBM.+4XOSC(.-DXZS@&.48Y6#E>.7(YQCG0.=8YW#E'.E`ZB3J4.HD\ +MO#S!/.<]_STL/DP^7#YA/FL^<#Y[/H8^FC[K/H\_HC^Q/](_````@`(`Q``` +M`"LP-C"%,)TPYS!],90Q$C)6,F@RH3*F,L$RS3(!,Q0S43-@,V4S=C-\,X4U\C4#-@TV$S8G-C,VK#:U-N$VZC80.!8X*#AF.&PXF3@&.0PY +M?SF%.9LYB3J3.J`ZTSKE.A4[,CL].X\[ECO:._0[#CP^/'$\A#Q[/;$]SC[J +M/CH_BC^[/^L_`)`"`'@````V,#(Q1C'.,8#R0/)<\M3RA +M/KL^RC[8/N0^\#[^/@X_(S\Z/UT_@#^-/YL_J3^T/\H_WC_F/_$_`*`"`-`` +M```',$`P<#"+,,8P_3`/,44QZ-\HWX3?I-Q`X*3@X.$0X4CAT.(8XD3B6.)LX +MMCC`.-PXYSCL./$X##D6.3(Y/3E".4$Y[#GQ +M.?8Y%SHG.D,Z3CI3.E@ZBSJO.LLZUCK;.N`Z_CHA.RP[.3M..UD[;3MR.W<[ +MF3NG.[8[W3OO._L[6C[_/B8_D3^X/P"P`@"T````P3`[,4HQ7#%N,8HQJ#&R +M,<,QR#'=,1`R%S(>,B4R/S).,E@R93)O,G\RUS(/,RHS/#5I-8HUCS6B-;8U +MP378-0@V'38K-C0V:3:@-M8VZ39[-Z\WUC$Q\S$%,AI-^(W^#<9.)$X8#F4.P```-`"`!@```!J +M,]8SJ3NQ.^@[[SL9/P```.`"`&`````.,!8P33!4,%DSG3:D-JLVLC;]-AXW +M)3<[-U$W7C=C-W$W4SAR.'-4PZ_#H-.Q4[)3LV.YP[ISNR.[@[P3L#/"X\4SQ? +M/&L\?CR=/,@\X#PE/3$]/3U)/5P]@#T`/FL^>CZ9/N(^0S^>/P```!`#`%@` +M```,,"LP7#"Q,>LR!C,<,S(S.C.3-I8WIS>6.9PYH3FQ.<(Y;CIT.M8ZVSKM +M.@L['SLE.]D[H3R^/#(]3CWV/7@_@C^4/Z8_N#_*/]P_\3\````@`P!(```` +M23!3,&@P@S"@,,LP\#`%,24Q0C%4,6DQCS'C,?@Q6#)J,I\RL3+#,MTR^C(/ +M,R0S.3-4,V$S<3.!,Y$SH3.Q,P`P`P!0````8#)H,FPR<#)T,G@R?#*`,H0R +MB#*,,I`RG#*@,J0RJ#*L,K`RO#+`,L0RN#6\-<`UQ#7(-#1\-(`T:#9L-G`V=#8```!0`P`L`0```#4$ +M-40U2#50-5@U9#5H-6PU<#5T-7@U?#6`-80UH#6D-<@US#70-=0UZ#7L-?`U +M]#7X-OPV`#<$-P@W##<0-Q0W&#<<-R`W)##=\-X`WA#>(-XPWD#>4-Y@WG#>@-Z0W +MJ#>L-[`WM#>X-[PWP#?$-\@WS#?0-]0WV#?<-^`WY#?H-^PW\#?T-_@W_#<` +M.`0X"#@,.!`X%#@8.!PX(#@D."@X+#@P.#0X.#@\.$`X1#A(.$PX4#A4.%@X +M7#A@.&0X:#AL.'`X=#AX.'PX@#B$.)@_H#^H/ZP_L#^T/[@_O#_`/\0_S#_0 +M/]0_V#_`UY#7H->PU +M\#7T-?@U_#4`-@0V"#8,-A`V%#88-APV(#8D-B@V+#8P-C0V.#8\-D`V1#9( +M-DPV4#94-E@V7#9@-F0V:#9L-G`V=#9X-GPV@#:0/I0^F#ZP]]#W\/00^##X4/AP^)#XL/C0^/#Y$/DP^5#Y0Q[#'T +M,?PQ!#(,,A0R'#(D,BPR-#(\,D0R3#)4,EPR9#)L,G0R?#*$,HPRE#*<,J0R +MK#*T,KPRQ#+,,M0RW#+D,NPR]#+\,@0S##,4,QPS)#,L,S0S/#-$,TPS5#-< +M,V0S;#-T,WPSA#.,,Y0SG#.D,ZPSM#.\,\0SS#/4,]PSY#/L,_0S_#,$-`PT +M%#0<-"0T+#0T-#PT1#1,-%0T7#1D-&PT=#1\-(0TC#24-)PTI#2L-+0TO#3$ +M-,PTU#3<-.0T[#3T-/@^`#\(/Q`_&#\@/R@_,#\X/T`_2#]0/U@_8#]H/W`_ +M>#^`/X@_D#^8/Z`_J#^P/[@_P#_(/]`_V#_@/^@_\#_X/P"0`P"0`0```#`( +M,!`P&#`@,"@P,#`X,$`P2#!0,%@P8#!H,'`P>#"`,(@PD#"8,*`PJ#"P,+@P +MP##(,-`PV##@,.@P\##X,``Q"#$0,1@Q(#$H,3`Q.#%`,4@Q4#%8,6`Q:#%P +M,7@Q@#&(,9`QF#&@,:@QL#&X,<`QR#'0,=@QX#'H,?`Q^#$`,@@R$#(8,B`R +M*#(P,C@R0#)(,E`R6#)@,F@R<#)X,H`RB#*0,I@RH#*H,K`RN#+`,L@RT#+8 +M,N`RZ#+P,O@R`#,(,Q`S&#,@,R@S,#,X,T`S2#-0,U@S8#-H,W`S>#.`,X@S +MD#.8,Z`SJ#.P,[@SP#/(,]`SV#/@,^@S\#/X,P`T"#00-!@T(#0H-#`T.#1` +M-$@T4#18-&`T:#1P-'@T@#2(-)`TF#2@-*@TL#2X-,`TR#30--@TX#3H-/`T +M^#0`-0@U$#48-2`U*#4P-3@U0#5(-5`U6#5@-6@U<#5X-8`UB#60-9@UH#6H +M-;`UN#7`-<@UT#78->`UZ#7P-?@U`#8(-A`V````H`,`D`````HP#C`2,!8P +MG#FD.:PYM#F\.<0YS#G4.=PYY#GL.?0Y_#D$.@PZ%#H<.B0Z+#HT.CPZ1#I, +M.E0Z7#ID.FPZ=#I\.B`[)#LT.S@[0#M8.V@[;#M\.X`[B#N@.[`[M#O$.\@[ +MS#O4.^P[_#L`/!`\%#P8/!P\)#P\/$P\4#Q@/&0\:#QP/(@\````L`,`;`$` +M`&`Q;#&0,;`QN#'`,<@QT#'8,>`Q[#$,,A@R.#)$,F0R<#*0,IPRP#+@,N@R +M\#+X,@`S"#,0,Q@S)#-,,U0S7#-X,X`SB#.4,[0SO#/(,^@S]#,4-!PT*#1( +M-%`T7#1\-(0TD#2P-+PTW#3H-`@U$#4<-4`U8#5H-7`U>#6`-8@UE#6T-<`U +MX#7L-0PVX-D0V:#:(-I`VF#:@-J@VL#:X-L`VS#;L-@`W"#<0-Q@W'#$-Y`WF#>\-\0WS#?<-^PW]#<(.!`X*#@T.%0X8#B8.+@X +MU#C8./0X^#@4.1@Y(#DH.3`Y-#DX.4`Y5#EP.7@Y?#F8.:`YI#F\.<`YW#G@ +M.?`Y%#H@.B@Z5#I8.F`Z:#IP.G0Z?#J0.K`ZS#K0.O`Z^#K\.A@[.#M8.W@[ +MF#NX.]@[^#L8/#@\6#QX/)@\N#S8//@\!#T@Q]#$`,@PR&#(D,C`R +M/#)(,E0R8#)L,G@RA#*0,IPRJ#*T,L`RS#+8,N0R\#+\,@@S%#,@,RPS.#-$ +M,U`S7#-H,W0S@#.,,Y@SI#.P,[PSR#/4,^`S[#/X,P0T$#0<-"@T-#1`-$PT +M6#1D-'`T?#2(-)0TH#2L-+@TQ#30--PTZ#3T-``U##48-20U,#4\-4@U5#5@ +M-6PU>#6$-9`UG#6H-;0UP#7,-=@UY#7P-?@U##88-APV(#8D-B@V+#8P-C0V +M.#8\-D`V1#9(-DPV6#>(-Y@WJ#>X-\@WX#?L-_`W]#<0.!0X'#A`/5`]5#U8 +M/5P]8#UD/6@];#UP/70]@#V$/8@]C#V0/90]F#V#%\,8`QA#$````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!287(A&@4*`04&``4!`8"``/4["1PH`@,+@P`$@P`@TF-(B(````QT97-T+G1X +;="YT>'0*`P),FW]/_;C7`3$R,QUW5E$#!00` +` +end diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_solid.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_solid.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_solid.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_solid.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_stored.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_stored.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_stored.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_stored.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_stored_manyfiles.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_symlink.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_symlink.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_symlink.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_symlink.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_win32.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_win32.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar5_win32.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_win32.rar.uu diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu new file mode 100644 index 0000000..9e7d20f --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu @@ -0,0 +1,11 @@ +begin 644 test_read_format_rar5_window_buf_and_size_desync.rar +M4F%R(1H'`0`]/-[E`@$`_P$`1#[Z5P("`PL``BXB"?\`!(@B@0`)6.-AF?_1 +M^0DI&0GG(F%R(0<:)`!3@"KT`P+G(@O_X[\``#&``(?!!0$$[:L``$.M*E)A +MP0";/P1%``A*2DI*2DYQ<6TN9'%*2DI*2DI*``!DGNGIZ>8_^>GE/_``!. +` +end diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_binary_data.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_binary_data.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_binary_data.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_binary_data.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_compress_best.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_compress_best.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_compress_best.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_compress_best.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_compress_normal.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_compress_normal.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_compress_normal.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_compress_normal.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_data.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_data.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_data.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_data.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_data.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_data.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_data.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_data.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_header.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_header.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_header.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_header.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_header.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_header.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_header.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_header.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_partially.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_partially.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_partially.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_partially.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_partially.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_partially.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_encryption_partially.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_encryption_partially.rar.uu diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.c new file mode 100644 index 0000000..46c5747 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2003-2021 Wei-Cheng Pan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_read_format_rar_filter) +{ + const char *refname = "test_read_format_rar_filter.rar"; + struct archive *a; + struct archive_entry *ae; + char *buff[12]; + const char signature[12] = { + 0x4d, 0x5a, 0x90, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + }; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("bsdcat.exe", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertEqualInt(204288, archive_entry_size(ae)); + assertA(12 == archive_read_data(a, buff, 12)); + assertEqualMem(buff, signature, 12); + + assertA(1 == archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_file_count(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.rar.uu new file mode 100644 index 0000000..fe08c6d --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_filter.rar.uu @@ -0,0 +1,2099 @@ +begin 664 test_read_format_rar_filter.rar +M4F%R(1H'`,^0`P`"20.Q32)L250= +M,PH`(````&)S9&-A="YE>&44(945#(D9W!8B+N7`S2#`=A.D%X2[-NGU(*VLHG0+KG" +MV2*8G'[N``/\NP%@`$+_T&``$P!_EV`L``NK^@D``H@/\NP%@`%Y_T!@`$0! +M_EV`L``OK^@0``B`/\NP%@`%_?T+@`$P!1]UJDRA-<"D?]Z],JM,_I>F-Z%2 +M=^K_AM;?TWL7W;=)5IVMR9/,?&MR_?>)XGBMEOV_`6YMOX +MBW[EQ,WWWEOYN-]^!]8[[SC%LVA'\\]-V=G\K\Z<>_:\R8JS_&^V6^,^ +MV^YE\P01SFQM(R,N_\F435/L*/M\R_%3=*FE9*_]$FUXM4V3GD]5[0ZK.9%Y +MY$N^2YBE#R3_)-FE")5N80#3:6-1HW3F_.[=R;:_/#4L3BU"[P"JJ=N?"X*0 +MF5-`^3%TDHYL`S>7,'(K2*#E]33/,Y>!X7BB=$24B6GL+A.:G.,3?_N?C-U)ZS +MH5":OVIK,W'#FV:$NRDX)LZK9-J)W_3KK=558VQ(E)U\[VM!`[5"3Q13)U,; +M*O3CQL9[9.Y:6@O82?2"6*YL3])&?)%/.\+TI2%BSJ_"(%:_ +M$G[Z8Q%:;S(!W>%+2W7F3BU3YV='K8R%9,S5\%<;;KC6>85MA!0\"^+!L+0Z +M\Y-)-WZ"D]4VJ@`V0*2[+SR6*?SAJ'VEO`=WRA_C6J#69P6_8H1/#NK2LW.3 +MFEC5RQFIFY<MR7<906S%@N1#4;35-<^^A:%$90V(2('6PXK""6[N)4]F%% +M:G($3N6[WN[HEX@#*S2H@+23U9"/[Z%LS`=6@8_[%,#OFQ_\5!F5MVO=[6_$ +M:(*Z*DS[FHFIV"5\(H[UMV0M>Q4`9AM@]86(6'C]RL,18T22^$)OM=8G/Z*0 +MU3VZ1E7?H'_\`EJGZK%1">A(< +MR_XXWIO%/V8*5XTD:T!:,Q#W]'W$]W-N/;$4Q5SDJUL9TJ0[_B]PSL^"T72"Y]KP4*%6L!8NE.0?:01DP,>XA@21Q?$=AW0RT:;4!FZE^R'2+""4 +M0]X2-][9G(!"RY/"B=/U4/TPR;#N&!Q_()X5^JT9B)7\@KIDA]5QQH"[A` +M^TC&?OK?QU>KP#"2!DK]N?9O:PO15/6_3(U\ZQTE:/1;(4J2+ +MTVF+OH4KGH_+3O2.%0E^M>0CH;UWPQE9,RPU5.?3]BWRL&"K3I&X,JB#$9Y1O?03CQ1-WG/HB4`$MA:/.W"Y +M2W^HJBUN+/Z&TU2(S6.(T,5"U9SFA5(V/K7@04Q.F=A8$/-.KPS$4=[81'IJ +M?;\>#,QZ/MVXZZ[SRZ56Z5Z9.#:B#]7JT\_)-YX&O/9CO_:3E=3]J"]_HT.7 +M!+C0S:PSAF:9%`W#I``G?+K!LKA%[B($XV*P`^W_D\40H\FCJN-#8],3J`'K +M;IVB%\!!JL5DU%4W'L#XXY[907E"[5IR./)X#NM94%.J;=Z++-\D!5!3$Y63 +M+SGX:U_YA^8X'V$]LKHH(1`12Y,K-4K[PB1'JB:S!8%6&68=ZPRM>19W3`YD +M3!#&RSRR(FGUH@]4/GGK$+0\_J]HU>C><4!D`YG%#C28,[SY>2ZMSJQ'WQ_18D?+@".L%%R1G$[6]W7P +M)T6--F,8"PP!F46R91PV6C1"U.CVAA_2]F/&UQ#Y)X$J+%(VA@!P^.A)(U2: +MZ\(2Z@SV)K]R/=5<1M-H;:`VX2?D@W9F70&E>`OHC<.1K3R0]F8-(DZ\KAV: +M-RS\RUH4_7DH+NC\)#_:NB3UT,K(Y/$?\7G1FN_Z;08#^+[7E"O`?HKJO>`B +M3U85W)%+=2_1#T@HW/H].@?3)AWKUQ8UIC@(SGZ^3=27UFKA&SV)JW!L]Z:M +M>;`/9[K6X@]]47()MMPCB/(69'6\\SL*\L%]F]KZFAPR88*%'Q`#:,U9XV)P +M2LOF!Y$5^$*^I7ICE$`!)Y'DHW_98B&0/I<^+;..0];]*1W]=!!F,-_9-NH2 +MQH0K;B:%(M_J>3%5NL_A-&K$Y;<\9+UCW9P0TGT%Y*3)-7I8S+L6/_XH1`L_ +M7U?-!];\*$WET)JP1MI,>4[7SU8"7.2`!?Z`++T^J*G/:PJ?^NON^7AJZE^S +M+$KL/6^%,P`N%5N^GGKO*BMW%KPF\JB6!RU.-"I6MY>>K)"2/F64!\5^PHH. +MDEWQ'4)731$(D=JA86^)#\O3%!:T0MKBXL+/S`5,GKC84IC2,*3;#F3B95'K +M-JA23=&$JO00HR?8F&#KMN?=\,">J^$"R/):#^X/C"]Y@]W21G$/&?+#VOO` +MK+\H?.?S;*+R2B@$IOPM0,-+#+0B@08HV1$DCD?*HTU0QRDK*KWS-]2-1^EM +MNEK;`XM-4AJZ!2MP=9_L1E'(?AFRL(,X\,^?<1'1)^TL.P$^S9R133ZY[?J\ +M,O31\D&7KV>9L:6#VG\XPS45L.+3HD&E$K^88ED]A#<;&E:./[IV^X*KCW%. +M/<(PH80@)YMTT<`0\LI:YNY6/9CL/Y$LJ_E/(56_;_'/<:'/^54?+W4$'W1& +M5(65Z#;V7V,&I9EAB`:@(U98#X]@DXKYFX^(>M_RSIQ7(@T,IM1750SBIHCA +M9"UM3ZIH]K,94T,.)OQ@LWU)TC4K$(_=[!=FT,OTFGPPPN,WV$.7(3KO*KSC +MKJB-148Q]N+"^)B\<10']/%.EN\,])"MOWY^P7#L"6#"N92NICY2.W[C*,.X +M(WB>X@O1ZM61!.I:H?3";_`JG/?<_6^0Y3%TRE(U\%>F_>>QVW=^JP+JB?Z, +M#"E75?E?@!?CQC*Q20A/[2.=SXSZDG2*=+%:O=/%I\:&KIJ6=)M"3S"^?)S5 +M,[X:+%7_4,A@PME>*K96KAZG;X<'WL*0PA.=912<^`F1&R^X1_%IP\"*R>\) +MO@.:E0(:-^^\)6$1$^]"A^M`.(Z) +MXL'8I,[XD'\,;Y.8.7&J(".]YW=?=US`NDCW12OLE;(7/M\L-US9M[X:NA*Y->:U(9TIOIU!C_C5FU=8[@I$01O]F5I1:.O*YG!FL=%-= +MO;_]3<@"PA81A:&4AA,M4*ZW61#>18LWOHD\HKME8:3-IK^HCR:63BTRLPC) +M'6`!+_]\%DT$N,V,]O0I_N[KR0Z7Z>V2%:EY.:@B\ZQ$A6X=X7HQU75[:,&@MQKT0?O?)@=7=1Q_ZG6?\$A)HS +MY/8-?MIBC&5SIO#%?VE@F/@\Y?0$DQ14S5=L,W?2]M5L$Y2/WR*+CW4M),Z# +M'YJ#,27;*W&O.DXR5*T)I9QX5Y_IA'WT&=SG>K"Z/4M5&R:!;GPT&OH` +M-;+'?+MYG!/=PY_P#S7S^N*Z:!/U'#@,/NLEF",-6,P)FHT# +MYOW(EYE#4<`L*FJ*^^]V4/)M@7M<<^L.70K*4`L;/5FQ<$#P73'"-740,2HL +MP/_GSL2K=&IJ9HYE#VY1F2,]01G-I^.8+PT,4U=\^=\,C)PT(O]S\IYT5/'3 +MP45@8^U?D\L])M8#V&;X9TS6[_<9\4A\TW!3(E9(A`2'LD&)_8I$/8]F'`R) +MX1"G((X"*W'#Q*?AGGVDY94K@WS%*/!@OX^9!W6/"!_K9;F!SJ=B +MX(W9.B`6$IPCW-WE2C!XQT#;#O:^Z5H'PBDI1[K/P@U6ZC*QXY][+5]XP7N- +M_(WLCT'^I614ZQR>]PL%%LKJL&&2A+!]`DL8<:!>F;RP"W]GUIN^A*>>-,LB +MOK(Z9@X=IX!\(TM3*JWQ\<7X"SNI[?LZ#"5&1912PR\GS`4:&3P"IHZ5!7?9 +M^@=42==Y)'NYS$H6;$G,$I7Q79;8%7@[VD,537-%%Q.5.`2"31Q0X!-HM:3- +MWN#GX9^<1N=5X0K5)=!D`V>Z4G^X[0@V0'.#Y`Q*:5'P%Z8H]'.0RP"X3[3`M;_'L?_&G.- +MHP)E4\L^%9#TN9I\C<(HZB[%FQY%B7C"RQP`*]69]=`,M@*-18P[V#U]L-). +M71;DK$#][8BUQ>):,5^S--<;YEQ6]/>Q4;A,;OM3^KRG]8+NP=)N535$L&B# +M6RB2Q(`ZPL$'0%C#C'B#9=(:FCG!6-X+5#Q\C-GK`O76RRHX8L%5?P21+O.Q9Y>N(IZ'=ZNT +MM3VN]C:)DY==?M"!D,"^-K]%;?$L'M8C9ZE-/B,3?K&L5^T<8K3 +ME]$B^DZ1IE[%GF=S">HWL1/R/6DD94)[/(JR[R=B9,N8DPJ/?B]-^W/[/./T +M_CZ+Y30%[0GU\BQ2I[-&+)+OSYBS----(Y$GDQF<.L:]//0^T6Z84Q(9NA9K@TQ\5FK:\=FG\:*%.;&XN +M7#O'L3]8,2U2:FW2'G&X,J.Q?8_/OJVYI6Y;:-EJ*`X5'I-^-C&J)QH:$#S$ +MB7DUNL[DJ)JD5Z;W#YX_'$]T`=TTQVGJAV.'@+K4LF0GE*XUE85VK9G/<1@4 +M_+R<0**9HUP>M[)3='#?HU>0#-/8O=56'KEV0OLBT7;%LUTDFUG.*\W+.PV" +M)KVPM$X<,MTA;;=@STH;@0[]'B2!K`]=Q#3O:8($W82D=D9.V_MM)S^\)W$T +M%^C`2(5%LG(=7UQ;^4VH[NJKHH'/!+-?3][*K-_-HVZB(Y19@K(C*K<4]Y0P +M_U`4@]%CWY#04?2S"%5)07)NL"P<1:`H"4EU>^QXI^H=E%1PR1FN*WNV +MZ-!P5J5UKG28S_K^I_HQOFQA)S_D#MO58Y/30FPO9UO"4/9CZOT)TDLK?IP# +MW;GKO:.J26YV#6*-88/1$HW!!=BNL,[29`(E6E;P8K2'WRDZ-TT=B9A=V"HA +MCLUC1RQP`59#S#2P8IYDDQZ0\UIF`5GO<2`01RZ0R;0LI39$0K!38R%*1%N% +MVQ5/459KFW6%$LTIG:-0:9>A8-#3H/UFL]TAMRB=^P<%!U3H[SGU_1/TUWIF +M=X(S(/T&MI0T))0OGQ_SQWJ>E$GX*'<(F*I[!>I1Q!41!9QJGSJ3:?]BA"#: +M#(=G51_1/ET0KT:>VMV_(=\:%9!V)BQGR/HU@V2''9.L&._\QGLE<^^J$^"]IC.F("';W[)#^VJBF_/#V +MUQ9M5&AQ_;6'JC'%/Y6R^^DU^O5B[8:.30=DE?.+"99D[VK,[-/KRQA$05UV +MJ=[,>+Z2,+HQT.#-*DK>'`CEFL(2D:X:"%#/>V5`4^U8/?=8..3@U>I;BX\+ +MKN]],T==QU/-76P^Q;A&$9H'C98*>@F"#R-XVT.\;&M!KC-M6'MA$0T-`'BC +M>^B9ZXU/6_QO/R)>X[E=1C165F"`01W]%V%X``P:D9K(A+R3;VCF:(K''%#) +MR:*ZK7`*>V?&FZ<%G:(?W!!C^J,U(1N>;=:3ELVCVR0M2/+^W&J=P%2_?@H\ +MAY/:D-"R[EZ12,CZ3APE=RX."Z5@]L$G-(P..C/+[!%[KN#8<&HXD0_4G30?)L&`*T\V:10WY!_8"@`G +MEC]/.5@%V?X0)M9(PA2ZD[V`/Z?H-[O6-Z_5-[ZLWK]`WOL3>O$&]]8;UT)O +M?9FZ%#\D!`MMS;II(,I;3.,PF +MQA1(+OA.\^&@"%LA_B@.ILM\"B(LBL_.3^EJ58"/B=81!/D1S0E[2`D4UGA6 +M*P=]F9HPH[*`=]A!+9#"GQ85?%FWD\/?9&LK,S^R$3(3*,R'NC9`85G?>1IE +MF2&B=7?X5M?A.("A_V5NV8"/H5"5@>>?!EQ$.44!XR96KG;M!,(9Q8OG_4)Q +MA-^A.K$BLL"=ZIJEUAL7!>A/#NM473W]KT"0HS+-*!"!7O`'SB(4!/>%S2\^ +M2$!Q,.5AG0>>5MHSF?3\:^\`0"Y^>2AYG>ONXH_"14QERG4V\F9$GQ^$@,NL +MU>0LWNQ7>R5'S>\.)O-$214$`WJB-]+I0H=RV/21)Y!,:LHCUPO?/FIK5#[^ +MF>-7A?=?97NGWJT[[4]RE,=VE0:"Z?Q$]67HHQ$>AQR$^BY\)9F#JD3N]K@G +M\..S:3JWL8]5*8/+R`$&=K^L8![!@,SR4%UK"9N\S.0%,8R7YS?>F,I[9`'> +M@50$=KI11*9+OI#*3GQ3[]LY[=%T7OV%VMB##\',\>=0'-E*K3DIPI@X7BV_ +M^>T&YN".A,!\>(.4EHPY=&='L\\EX\G*F5_/`6BPBTD:#\5 +M\C:!QUYT-,.J-5%Y-3D4N$@*391%]&<]GXKC98<39%+VZDZOTDC0KZ:!J]_8 +M)$\!U!D>M)4$+PU-$8_0G-6(.ZW=Z=:FC`VTX?0I9R]WT,`C<<]Z7.7&T_J( +M3K9E'0DV:==I:/9C\WX8Z^R,8)/_'HG%2,R=NJ+A%76:1IASO-SRC9>;RGV^ +M]$S8D6]NT3O8)^;RT3LY\=^RY1J(\OVN6;;<&B%J$DU],YC!'%<5T>$*TV6Y +MH]%X"RBYBTWG)+44(2)N.CQ5!6LZ+JR'2PKCX#E;+XF +M;VN8S]#SS<+?ZNFTE^\X_!&:6HT`P$SZO:SE>24]3QX#A7JU3#4-4P7W5Z?3 +M;)OQ8?^;56$D0:@'QUC'4>/A*=C`$R61=?CW-0Z%S=0>,7;9SC,*[]7I#P36 +MJ^\<7>,2\OV7,6Q!RKUM?82^S@SVAUE],41S&ML[J/M%9.8R:A'RVK[]*E]X +M73FE.EA=Q"/M]F3?:]]9I4W"\QCKJ>E,CNVO#?ECNLK;/]J0SI7U-&7@9:[8 +M0>_#ZG48AW,9'S4]T@@C[W'8CU>_49/6)AD_4^'[29UHURLK]FMIYRNUKT1M +M*GJJYO@JL:VCIUUBWZ.Z*@08H1*+)+$)6)<6"FJK-)PW&APJ9LJ*/D_W\U]C +MPO5_T\P];#%P5'L%!7!WJTP(S$R4>4R;#MTC/0PVR?*WLE#(GO=(YRD)U^>^ +MA_=C<4/RV/DMPX<*P]LL5#!#>56R;T"'+AX:$J\===_4/QPHMLM!YFOJ$87B +MT.CKPLDKJO:.ID]%?/R0B6G7=:)6V3P-CUK?L;ESBUWZ&B`*?U]:0/YE;"/_4P6#?0.(#H##B?DF_5GOS\ +M@B:\`E'?#`;Q.NZ8J_,(&;6$^`OY???"'PCQA,VPJ]1F[]%W16C0_ +MO";N360K[J=O,\K]EC-?:2O9K:=@NV+>B8E)S138$9=Z_I#ZGGUA.(5A[1T3 +MRZQSG0)/[&EMA(*0MF0TNI9%@O_%]XY0:"G1&7J#+E?\FFW_Z,]P:\C`59$9-PC/U +M68?NL1\JTP_ON.<`+F]90.,U3X^$%Z[M&(VJ]-]1+3DJ2H(%GUBZQ@<.LY]Z +M-%R<_B8-1LM[WH,8%&QV?F2?/$=J8?[_Z`8?S(78\CS=X#JKF^ +M22T7A0:Y,Z:[]"`GWJTNZ0\Z9>;%5LCP@)*75)=9W:W6DH'2,Z7A^BWXS_\H5GWS-4/H/HNM#[&+JB4FNWD[3!SY(/,F%"QS^B:)X_D-L +MDD?-\,6)_WL9!E<]2875K=4PUYU<;G]:60,?.%AK?&]F.3Y1(=HO+G7S1,3` +MT97`O18!"QVW@!VLNCC7^7\/-9.[QHD\!26?5WV:.??H*.MT7`@/? +M1C4MBZUT4I;JP"L"&!O$-LC<2+AL.9PKZ3>E:>\:T$6HJ7,/^4-75FX[*14+ +MR.Q@87LTF0.;KZZ-AJYK$B+?-&9;-%=3"D!Q@Z9_"<6D=1)%D8/J("A,W"C- +MNSQJ4\S2)="OZOEFB=\5\KS4R.RM@)#E@&AIA-W%-5Y\:)LM3-5,_#3%[EY7 +M(1];N'7*'.1FD,EK>UE30R29O +MQPV`BQTR+1XP5)HSHK80=#-NJ%S#5=69OZ(MU"?T-U8N-6J(6"N,:GRU,V%>K)H*YBR,6=Q723OU>S1!6%,;V2-E=]9K$HGI5?J*%/$H+N +M#7>QZK8B"KB"7[VMHBN@+0,M<1H!?PVQ53GX4&TY7T?N2>*!:^C:M%GQ@0,L\;.0@UO-*@/I/E$Q9`!&B@1/O?1 +M[5K+RI,$QBAU^2HVI.HBK0#O#Z5V3Z&-:L\^_TVO[6W6RM-?0W6':.A\6R*^ +M(OGN)1@]5)GX^BC$$ORC)#OL*\5._Z!*4Q0X!VOEA[1&*,JKY&^DA%[B*%E] +MN4?,4;DE5Q*PZO3?Q.RU8U4A\$&909,U2^A2XRORO<'H$-D'E3R#/CV5=/#M +MA5_,9N+"2"X'8YU9L4W9V",>./EK26H5/8K[VL@W\-1M[3D=D6SCT*?_=N,. +M/CII-@@"=-YZ9&N6CKN!%W(C+K!4ET*W1&G:F&"$*$1B_],-UQ70OM'E`>=/ +M*\,!!T!ENFS.YZ[49%/3UKM40KZA.*PXK9(A"^!1OSB(BNXA'OE.*9,P@V[* +M8A)U#!/&GW`-;M(AKS';U0RM;,&O,H#8 +M&'%KX[?L"VG/#$:*-Y'-]B9(;!'(U">&?,O81RR7'NKXZ^_KX0N(SR^T9IX? +M97_7'?]BIOT-#7G%_$P5LN)#">:Z0=:$3X=S2B/AH?0&\)L$3=01\1'=$SQ9-J,Y* +M,W5#`H?AZU9UOSR1*3JZUSRI.4/0@':$,O;HI +M=R+3?TJC,!%@FEI!X$C0`H$0I@O9=-M=T,(R6<[K[2>+77D#U@H373M;1F!E +M*DC4YTF2ND5&IY2A'&XMI-OPZLCW$H(5LW?A,"5 +ME-)*HP0SIO4\A/(;4Y:H5L-9A#%3::')THQ(AS653R+[GL(ZP0;A:Q7[=B7K +M=2V1<5ME""WX,)MWV=O=%`%[I5'+_TM;Z9X[UV)ATA,I[KOJ39NS/NK4G1A! +M:HNI>DDK?*K-A!#5":O9C_EP=RF0:S"E&/L*#]/.(!>KJ$G^2Y-6O/U)NM[L +MJ/NF%79J4?2?8MO-712-@(I`__38WRN.;]=AY!O\O+\@W+:&@ODS0]W-6!K2 +MGR3P]QWD(X5Y2-@NF;"I_FCP*M>")5;U6F3)8)*?I-*0T5:+([94]]_Y+RNZ +MG!PY)>36-4-FR0LDJ35^EU=6Q8<=W6\C"H5U:[PRBR^Y7)MG^)M%;0ZQ^8.O(+W,(&KH%7W<(%QXBUVGZ.,]>EYG$Z\"@AT?]DH +M4C2\.L1:/WZ/=-@^Q/-\T$0.ONEMB:.FS,NO[95MV!ELL!^V6;?:??#601;3 +M!2Z<,YG\SZ)4V_V&3SI1V?I,\&8X9FL,;0SOAC\3Y=LVPT@/V')1?2:TM2:R +M.D6D=`Z/.\0@!@+I,D?:FO9,`][`S5SKO"XT+O.24EX9IJA9G\VI+AP#/9OH +M)[CFPY(:#*198M2C:_(.F%F9Z7W2(R4`7E\8!@[U[)%_WS]8)]J:[OU1^HR, +M#V8WE3&-SD7.BVD-QO8,S&5-.7=](/N,%TPU%!8P[;;5G.6;?X[T5=$*[8PZ +MN/9L4-G"SN/N6.'V3BU69[KFW4N':=MA2_5_&^+)T$DLM0 +M9/%X[-_;/NP?;X9WPQ^Y\T==HCO2%3H">J +M&B<;6P5FPDOJ5FH4X""?;)PDRXK(9BN&*?T=30NIA7[,GO0#*=RG8(5L5%AA +MZU75=D6K.*Z[(@=P>%D#.5[F;+:R_T5.A[Z(W?R9:I([[M[WO3YM`8E:*9N: +ME&]!QFY4J0HT-,FAK_K.>YVHL2QFJ;6W]+1-)U2,EANGTL_C.ZA&_"G%"S\E +MF#)TG+)<9J*FTZRIME2O3Z(>>ESZGK&'<_:;JH3<^JR7%F4=5TGV^(XM5 +M,.O]"5$VNR1@;]`QJ(?;C0K02]8E"!B*D%#RE/#_*(.\8><8MZ*\ZI`_OUMQ +MVV'*R[96/WRV_1E"62,GF$8%*'!BV2Q^_JMCI"O9>D"JN'5/Z8E6JMB6> +MO^DIE$O/L(^\9QCD=88^DSFXX@V-%WR>]15$[U20&CZV+/0XSSO1IW()#UZ, +MF.YFR;*OH7S^AIFTW=$D;3)!L5-1/G641#\MNI"[0LIBD>S%KH4=Q;_.?L&+ +MU"PO+X'/PGC9G=-Z['%-F1SAF_9$<$WG[HW[/8B\F]8`UF^!1-V;WZKHTN$A +MDE4+G-D'-4#A-DD;HOW<[F_;=:0QAW +M/LL%T4%VA9R9G845*>?.<.^.F:O +M9^9'WWE+[;C%GY@'^2.QW+85^N/9]#6..!PKO:]>"H4&TP]3/X9OT86:/QMY +MD%?27&K5K=7GIAXH&2ME6N<\OA%I0BZ=,.7!]K?3F(\ONQ.(%9O3]*0N# +M)X9DD$[O+#4!TT>C),4G$]D3 +M&KW,(+@/';I1D:#7C"]ZT_[VE"F;8`:J`Y[$]VQ%&A]5&N_JK<#BJ@`**'BUVO@)C0:.A5U7#.WB^41% +M8+^21*A"\LZ%,Y@&7KR2E@P&,-1*1=MC:=Z6C(=X!/;9#)-3W,L4*Q"R&RR? +MTF$)?X]I#7UHAH05AV"NBW#F7VXE,61?8=OH";P]]#/J],49<:Y>B:E +MD,42UIQ^*PADL7.APLY7>>PX]JAR*K=:/#Q\]&M5(Q?^]W$:M@]5NKJGND^4 +M2D6+0K;"B/=]Z@MJ7*&&\N!KI%>IY!#K!2H$&M01("BR8,*>N"\$,D$T1^W2PCBC5!: +M392G;/+[J$QCA,J)^1FI<+!V\5^SYF2RHH2-'SFW3BAKWE]. +M]N]WP'MBYHF<6NBI*-=]:OR+\?+D#U-HYSZH3@UHV+5`YE@,Z+(V.\P4A;\M +MNC4(498;_;?5(;/M8'.U:9>L>>W=F&'B5!R&C5[)10,M&;A,,L1 +M4`G.96%X$D:G9!1:)P4A=8.SWM*8S^?));G"B\Y$0')?#BPASPCL:O5R3-[! +M5BZ*%)42W=\"^C.#$0$.!(?(*X<3-3H00$/Z90V[&N*>^0[:_>?!M?]N[H(D'^CFL/_]IB++UV7#3=/<35( +M2_=6,`,G*GRHV(M71;9S+LA*,-+:HXC//,4&9MS5&XN[V;O(W.>\'H%3<[W/G&Q$NTQB6B3#$1\!OS[,SCH,?_]8@8 +M@U$1Y^\`8&(:>"-]14EI](1&WG$[!H\LDJV.^+(X:SF(/[MK(?EUP-B%70(L +M$8=QN.IAFNK+FS%RS);W'%5'?+U3[A;>Z5U19;E3I*4=OWSD8S@=3!/"\(5\ +M[RN42SK3[UK@H4%J+".=?:GMD[Q'LC-9QN?.PGR]]UA28:RE/GHE!MB^+"UA +M\>-O"8J8.LCY[O4^N46$Y$-FB,0!R7V(-.6980P28,KZMCC:5.09O+`0YOAI +MU*>,OIH;@MYV9#8$]GPD(MP?J?XB!3;+%NU[C%E'04*'YTA[%SAJ'?-[%A$K +M=RWKHUQ[J8\H>M,PZI%5TR1;DO2&&S,/MA&RA'DK'"\-$J3;QQI+D5Z?SCI7 +MLA3$5+'+"VR?QV:`,B3L=G=N!Z$E,/P1?4Q0L;J^VZ7M(T[$W[[YS)Y0#L]- +M\?<5Q*)OOE+=*?YUM&/XK\[@U>V9C#&2KP]F+3Q3J2;8," +MU)6U;Z +MIFNEW@,#;S""]4NDW9=U^JZ:]6==)60ZF/C$V**/L1Y9AU+\#A\PHI^6-,?= +M03*-KT'_0F23G9WQS8@(DK'/?G11>F)I=WFGPX_NO:P)0VF)-;[6EGVO;=TT +M)JL4IC23J;:4S:NY+]GGZE#;V^'!MO"-5^-WGHV#/&)4J][*T)O'F:RIKH[> +M(;$VTC@?*2DWV:,LWU+[RV_3,-9.BHV"20>K*&FPP)+I&LRQ5L;&-+7=O%CD1M' +MAM?8>&DN;OH7AK?\/#?;3/#>(U6`D,%ILQJM.<_:;%*?)GXAU+VV,BWA^)YG +M#NU1J6G0%#@>=IKT>9U5[%UHE%/JE\_ZGHG4P5)@>'I&A;^Z27[PB7&>F[L; +M8(V:B\WZG4>5^82^Q"AUWC$(7\FP.X7G3#ZG%K@%>GSB=+(]W?"<6TMG5B%< +MPK7YDH,F6QM&"MCO7= +M1)E63:5&H//$U#@^G8R]\YDE5TRF(,2D:(R3N"LM#!S*T$N.I[(W>H9PRG.+ +M![U_.,[F/M-KC-VK1SB;3[?>BO-X7!.._CJ1+S-(65YDN\2S6/UO)%<(C>WL +MP]!G&DG[ZWGF,/7]!H`L@58=XB6#+`\HD8_;7\@]R>^(\-GYQ1^H*.&H-Z2@ +M>(R.3MJ'@ +M*]/0#QQ'>:PEJ_0A#QC)5BKQH1&]I+,QF^LRSA\9?DNYDZ8+QY7VZ]*JWROC +MZ4?2;Y0'WAZ`TI9!VEI9\6,DHW8G-!K4E8%#[_HD6P[T[[RS4L3&'!J"-5MH +M1U7OLX^J7V9*8DGZRYFI,N[,U1EDC.&0VQ[]K;=43]C)#7/W"PVGC^^2;3EO +M%+;#OE3;H70;Z[)[B[DK%&>Z#CUKT1#)NK#H/,V]]8.EZV1N6%P.J_L:29O1 +M(WPCQ\T99_NFE(W^A])9QX9ZTK^PAIA`<6DLXML`KQM=',"%0V'RFE]-W"9] +MWGRFMYWR_[WP`3$P:],;V;;^IK8@WKB^3YM6W3I6WPQA/GL&25V%S#.(9(2M +M9[G!_E[.>$9:C+$&?54B%M[:*Q.T6,4.,P]S!'6'_J$G*7Z;B`X/CL$-Y(9P +M[?GF=`*2K=9L8#[K&[RT_MESSMH8@RV,:FE2A=X#0B=N,WU>GC=J8_90($A` +MVE@16Q?6G\P!RG%^'Z9RJ6`TI"^R'>J?7Q]*/I-\I-:(NAZT:KV;?5.N*TJ= +MOXQ3O`C]4@AK`%Y)=ZPV:M]?WTN^EC69B-5WU\1G+RB +M)/X-./D4_X9!'JG2EM@>'3V!\B=,DE@'*+ZR/0A9@\\P@`V:_JBR22#C-&[K +M+K;@:#:Z7!;NT`<63HAYE3[N:"@8HLGO"?IH61+^/XT +MF7RT-1Y2K-RVAF0E/]/E-RMGV"^0W'JS:U]>!>+__N-G.F&3[NGWBOM,^\]] +MS3;"V/G<:RK/DR?DII%JT]&FC0H!^`^CI]/7+LL#+C*+I]M*B?")!;1O*L76,OKOT+^# +M)9-WE<(=0]KY#/*C9E?Q98UMX78YSTV\Z=+/=Z;X^:AC[^,:??KYDM_O>$N+ +M[=D0B3"##,]8Y:]UD$TO?L(SH%3=94Y]5?AF_F=OTM\=W\9M=]HYQ$T.$,KBM*O[@I"[CJW! +M)ZF,_X:9%Q=,WNPYBV(]&;>6GKE-!J3NXH8KI30 +M%PQJN@W"Y?3%A$!**"6G[KJE59^$O_O2%.<5LS"[M+KD7I4D`.(!`*&C;JG0 +MS/E0WJ*9;^!S%@_VM\M9%C09G$0^*Y,>P:DPT&%AFZZKIW+U[1H?XN+[(2M +M^P]HE+-IK/M^!X/W/$ZK[??3W&UJ;DD1;?ML[$&'!6L`Z/P8T"@2CBXM3-V7 +M<0SZK9-H>UHG;3=R7UM.N+90WFFEX0 +MJ8<<&PSUV[J*MY,:Q.CZDYHCI9P]>3VR:+M^KJL*)D32;@AU:#C$Z&6K<7PO +M!UY)9\L3OEM)S[+=>4]4"@P^S1?_Y=8PT\%?6:NBW((1($#;XH_,F?;)+7 +MC5>6!$0.5J,&PTO8E.FZRG@'QU/B+6]\]HEQUYT@]V!J*2CH(B^/'I59SP.O +MQ3=A$H\>6A"['VI6CN8X!.?OP3Z2?*L94U&`4+6S$& +MM;?R3*+EOVJC=G2LG:QM_&N]\C\W*+B[:1WH_O.%.%DJ!^VW\QSG?Q>A`4GH +M8:&ZHP<1W6J$3W!O^?-46MD27('"=>^@7K3,'$8EH5O]>83J_*&P#(J:>_*Z +MKGBV$D1R;119VF*\4DN=<95X-O5'_8&HHI&CO()O:]YVB6'%IP_#C8J".=](V9_2_^2E;N=4G`A]USCA=G#^VCCD=4KT^WY1U)Y"( +M9.6+-=6J_+]H2`@0_VI'#B2%%N@3_T5$%/_,G;_'"J'\W]D`=!(U8WE,1WU# +M@\\HY@#5(4/NF*(:DGC3*TSX7"8DLN^R`]1`4&]S23]Q(5"E-)PU":Z3XZ-1 +M9-'ZDZA8,.F+'XWO@PGE-^;3(E92HZ$U\"?$5+WXF]\RF[3M040A+\K@`UL@ +MBZ#VW*1A#Z,TO7@<$BJGKX:L'\5UID9^6F3?Z/#^):VJXK]?`8.IG;]MUQ9A +M$Z95C:<2A/Y5/5@SI`JS`+>KOGUA13)Z6YSBU&%%O.N27.?V_";8+E_QSAP+ +MH7C'[-L99@Q_HY2-1LC)Q6ANU6[9;)1DH1]6HFL^T0HT=4;W6ICG9]JGPVL4 +MRO4Z>2/N@LOCI^F93WR0I9:)5QF#C23:D@)F@DC#D]:9?'+!:WLX9BF^0@[V +MXML[Y.>1BOC*2+W$TR>\T49!5#Z`..J0*BPD>*'C4)%@YSRRGU1;EOT:[Y5; +MJU!&QHK\ZZ*QTH1:;J#.PN+;!1KT=-=\B"<)/M-,HY&40OY%**QI.F5]192" +MR.HM\Y]+1QRPB_ENYZIT">_'^!E,1DAPXLW)/+^T>UK^;RH]0.U#`Y`"KRO4 +M?>(2JK9-Y4K:24*VG"*M@AD)LDD/?DC2`/Q)S6[\SMC*J]P>KM'2G.L\6=V' +M>62L=%LWC2/T5C/+7$=@=FFZ +M83MA4S^+@'H3`UM#?I,I\'2W:-K6GEYXZR:T/G)J&^[I]+HDW@>(WV@*1W[? +M8&XR-Q(Y;4B0]ND`@,V$.BG;.AKIS40T*[@0^V2$T+]8K%;RNR*E75Q/6 +M/VH-ET>(6C1.!G6NM"GD" +MZRM1,@NAU0=6"_'5!M8^ZE]E6=7'53:!DF;M80T50_15.B"H>Q>L,QD2]0=3 +MSQ(4_NH15"L.7?*+,"")J +M9:KO\9VGD$""5NG2!TLZC?LRU_R%$O?"<9[Y#I6)S()THT6V\-)&*KAD90(I +MSQZ^-T9!B(50DL`0ZBEF:[;-I6C+X[X>>,@C&(5EQ)61\G* +M)CXM-3XQSTEN^28R;2=;'^>F?J`5'H]RS23WG\%GCI!VB[EZ)DTG.6U4?V>8 +ML3>V,X]/DB.#73_,E3\X[--I`0CC*_*V`\B.E4F!I^ZF>>QM@'YC0%#X([([@F)EANC7 +MWIO)+CM;NIFC0L3\2:-5U>K\FHCHT"[$,EP_U:*Z*S,MH:V9HTN#D-UI%4R1 +M_,M1EY@5AUW"/"T,;PGDXS2O0S-?;FC-]A"I3G/`7LM,\U\"EC9JEV;2 +M2I5[NJ7D[S_?%P+>X9Z7AG^&%2??^7'BY&:+A2?Z`H\AS,(6)9MW@G4'=?-> +MBF2R_W[T>QM?3Y@FT'C//1LYR(*4'[IW,4%YUD!+"H]1-39>8^=!#4VJ+M=+ +M8H1*>@!CG]9JQ6/33L8,U^' +M^'XT]6T$+@P<<%8TUT$JWJ>D[7[?+::WVL9X_]?>\SW-Y"4QKIY[3RMB`:1` +ML4.K%].EJJ**ECY]HNK,WT/:.I8(=*YGQ^"SK?FZ#[E=4_@\Y-.6.9K>_>28 +MX03L`LH$Q2)`)J;$-+GO_%0`DR]RU%.N.A'6W&IGDEH6LH8%CF^B#)=@WXTX +M_`-DQG*QAF:R0`E*-6$P]<3*M!_/L>\G+?%-`L;84N?/ZH$6J`>=H3A?GXV(MGEZT^`1 +M@AE:U3!WO##D/U,2)_8,">/TU,7Y]X0,?2S]TB +M&YS^!`72FB@;\?[AWJ=+&WIO@X +M-=`SC%E2Y'PO/SO58P;_.D`\.9W0[5JA%LK;2IZ"E`<>7TMC._C?A<1:0Z9CK`&(:+]-^@@/P[JM$+ +M"-5$]NCT5HS*H7FS8)3\^-,Y@WP(*R?T2YN'M&(>08EB2]7 +M4@5ST<8;1$4%QMMFS+38U$;?!-CO#S7!/[#/BR+_(_JMC%T28#GAC+%XTY64 +M1V`TW::0/T<<>3@/V3:H5\;MO3EE$[KD<)/("@DT5XVS&&CHS+;,C7NN*RV: +M/#(I.']^8XD^2*Y/\S9(Q=%8)L6);J,@YK*(Z<_X1EXH[<66N>@',V:2IN;B +MU\-MC[DDRG/:?Z!$C$O\WZ#QMN/Y'[C[/ZZEN\/]7JMJ*.N9]&6[WY^/Y]:4L1GG0G/VV@\N;B-,]LJ=S+8XN48O(, +M]P=RB_E*F'FUYX6(2^(`1QWBQ-A-K\[!$\I7IA_``;BP4`$J`K^Y9_+.-KMP +M48<5=TH5[4-Z=18_D*6K]F5@A]@SKU.XMLJWRU/08^2;]S`>A4]FWE!X2C:A +M,\2W9#I*0@=E"?CU3IA^6!;7!YV_7+:,!2<'GN@'MOW8MU@Z2T(E]+[#@)EU +M)/'*E1X!Z(]U'XB1W\TS#D\&UI:1DA]1Z[[U]2PWH5*==6ML@S=8]3JAPHZK"8;J0F"Z/\.-I371^I+NI +MAMMT=MSX\]]%@J<;'DL@ZXNBCS/[9K]0;)BC]A7$KSSYUVHVZB:R!Z^_8+C( +M,[!Y4HL'J2`E>E]Y`,<`D3^!@_^$<&')@Z"(('S!]"3]_&?Z,>FW[-&,V%;R +M?@;/&"QGA450;I>,95UC%O.+/FOB.$5R=FNWN;6$=?B`<<1*6R=[4-0(_FZD +MV.V(4]NKU>"DKQ@E#('(,F:_M\HEOA'(:(.[;8'9VOHC<,]#BBFUJTYLJI[! +M.$B47Z@@>G6'>Y;O*^')?-,,"9/ZLCBJ9IK]LD'Q;@PT]I'Y/BI+C>AJZQ>4 +M\06U/N&\V+!^W%#TS81)FRM%`C\&+]8Y.S>V`<+^QZW=.F'X/3Y3:3J;;QV\ +MJC*60F5\N?VZQQ6;]Q:Y)7IY4F";SAZ=-?,KYA*.VITZ_F#11N'O!)S%1)]@ +MJ.&R[*GD?=;++D\(!3D>.VE&>7[RU')QZY0G?:#H/X]4..AB)$T7?`WDWZ^` +M9Z./OP^EK]FUL"^ZPJRU@EQ_C$X'TT:M_N&#[>'+Z\EQ[QZ8TLZ4ZL?/O9RS +M#P_>8NI.],D1%09)"3$"Z$G\&ZF*W:%QV!FK961?9KK25*Y7A +MB=<=/C'%#C$S?ZR&SU:$_*RF".H1*^S,Y9752:<^#3L_9D/D(B(9*L09Q8#1 +M"1&#PJ]S00\_)&)DK-B30C$@"PK&%3:^*VIZ%N-8D3U4E4:HU*#97Q\+MK;^/31KR$ +MC30<_JAS.H2'U;&W%6>,24K^1SS9,&=K?OAR3#_J_O&6%,>B^DA+II3_T_B= +M^Y(V2A2CUC2TF7[DI#.`XT$5@?3.>KNW/8!N$H1U6MF4>%^RL]%'[0_;=X7$M^ZK"!>DA$0 +M:"N\F08C2;18$_-U(0)UYZVUS]GXH/)=\?B45G8:4]5\UPQ6C^+TB&ZSUD1! +M;-EQ$D?Y^7ZQH$KMBN*KWY?6--^W^0=]6INW.3UNJLV>6K[LIXP9E$A0R4R- +MF4T!;,_V,=RWNK@0B9AT;9)8-"_[\?^`J9ETIY1P>D/MYJU,V-M842U.DNFZ +M20EO]FY@,!?7:)<)ZH!E'S:K55-1T8M,Z[M.W^O6C^*Q77:5L7BP[&0WY)LA +MXQ(N*6RJZQ+2['LF;K)7XE0Q).:BM?,*M'*.QQ^*OSJ8^[8IT5]M>CK07<'1 +M#V#*?.[YG0^@XOES8[$1*V44AUE!KD9JYSTZ?D"D<+@_Y.Z"BA+D[$-GC!`4 +M_VFH9Q/2]C'=F75V)#7MR^6'S\%5XX.GQS8%>1H@=71E"I*!*?<*P?ZQ76V` +MNP9V=`=)Q`%:81=0W._I_-Y>,,&3.1AT<)ZIH$N,ZL[02/$A7@EY7=8.-%B!@.!V^M?-LD!C+XD9O#\T)$ +MO!X"$3]$^7-!^&YW8$5YV(-?Z3HV]&%0X*OKOU=4E](_:@F\@07T:'"4<"XN +M+:.-20D^!/QF0Z`^Y.#%K:N@+M325/I-H/H*'5@4,IB-85J8:@-HM-J*>/I= +M\?D'_(Q%>S,^K$,ZACZL@_QTVCA*1G9"><_N#5G::=TFNBH:QO.1[1X`AW2W8 +M0>F'&J7-D>4+Z'`/T^'5_5%F6(>@EQ_5.W;F\F-^2*,&@&)S>HE^&(PF/K]7 +M7WC$=YHD+LR"_Z40/IND1^.2%3482WX=AUYM*#KS?]^_7F_K_/UQM_O=<;'Y +M:\W&3MJXUV1M.VKS>'8]<:W6=<;\3N("18?09>^AVDVXMH;4N'>``BPHCF.( +M8_$)2GP&F(,X4]#,IFS0^=>D84`.^5UDBQGW>%#FM90PV)2&J.-+7\)F? +M[:I]TZB4&ERQ=[7\)]`T90\E?W5)B8W(K&#A;K3@1[6L9_%*F_'A^="W8))C4/L!W/6)._ +M[3?$'CNNL,]K&J':JF2&QHZ!.VZXH_4A6EJN&Z'\;7E2327JB_B2&*3F3`=@ +M717M="?BMR(K5N6_\V#I>G9Y-`%%_=:M1=S2,R*MR)KTO\>E +M.O.$5\4F?&^?I'O+T/!G,;MY@_XK;J2+E-(X"0P6$/0CU2&@%Q07PIU92)YB +ME"NJ:@@S!P]3Z1B,7&H.(=WK_AS8[?4K1]/121P80%A3[>I*DY\R +MWR7M>IW[HZF/2*LUOE.SK:T>.L^HC9B2O::W#NM7\X["?5DD<7J/5`ZM)]6A +M&H_0U3<"D0CY=('>>>IV6J*%'QP#P6?S#T\XP$=(^H"Q4U>`93H\)]'Z[L_( +MF%B?XWW`'`,R^M0GR_4Z)]P"J>;'8L%=G6\QWK;""^81[N*',E3#&@Z[`Z8?Q5UWEBW[L>"=]82?V.+E(&`V-U+]?[:<27R&L&/G$ +MFEB3Y.(DO7>R>\4S4$_=ZHI^/?3K.J2-_HY%I(##]ENKG_"6RYLX>N1MP9M +M*0GN4J9FHTAGXP-?W\$TB.QO/*&K5&OCO]=9ELS\U=>A!\M"Z]W.W'G%[[0Q +MMQ=A1GC*,I?)5G7:6@329'$OI#E-#:D+EO9@>ZH]R +M>&C3-UI(.H*;9^-_E/D_0;4&@?*_(ZJ].'XH-",.THR$\P%*+-'CX%YWR,OL +MT5"#.S'?P#1#D#N=R7G&3O7^?&U_MJ-TCP;B;,;%)F]6H[*+"2%=4T//$^<( +M7\=\09QU1S2"&14ZI>%:?,`?A\P;G-H?FD&K4:A3@R5`AE\_2>&NE_&L\;(4 +M;WPMUOR1X&&FR(NF%`FES/+D6:CE'_DEY#>HC&('X#?O-_=FU$BX84"/R +M]YNL.8G(+"X^K!!OOA[_RR(%]B*S.(1/FQIEN!J&V"/\")7E\DL/>VY4[F`Z +M(P-WU6,,6AKHI'0E%8+!>K8,=FJO#9O>W!;Z1><"-#F4EHQ'F6UJA](XE')4 +MJY&FB%8$9>*%:WG8[GF;_0TG.7=OC&$?X3")5U/=B$]L(C=ED]#E6^#A7Y[3 +M;H_&&&:3H@.<)GC:AZ5O]L7U"I&`G,T99)/"0VP,:;%K)1FHLWF%JTZ7;@84 +M@_--791P2]KS@)O[B7\#D)_Q&)SX@_14^?>0I?8\O\C/Z'V(O4:JRI3W[/// +M)'Z[6[_B.I;\BT^4K$?PH[P2UR;FQ_"-;C03H/L\%'NGS&5?$U(HZKB0)D## +M2@HX+53(PP0[=4Z\C:A0^<6N&5Z?K3SMH(M('W71D$UO0/WUA:4+H/&50JJS +M&EY'9A0_M\&PL&2I>.W6E^BI(G9Z9$2R,RB&$-`J93SV'-X;-DA77-WC5BY\ +MR:JP3@7OY\N_T3%SZ\N60'$7]W/F'71=;2@QWSAJ!34^V3W/;1[P0-RP?P=9 +M&KBT\,,(8>/>[A0[9O=BXKU0]N;X7&KI)MW.EY6&0 +M`ZY$-SD[2%DAKAZIXBE@`$OB*[9#85KM56\%4HL:NJ68Q5Q^ +M"A6SE=N7:BN@LIS-9AEUB?CM.$::5T*H+++J3ZT*-S0E@\579&-:\P?J=BK< +MFMXBE#;.."K<5H^Q$RD1FCG8:#BV5YYA#)SV+./[Q6)^X;D/1Y)N97!],E#P%<5IY0 +MW853,KZGE(VBR-[`[C[!,$YX\RS!N;1#MYN+W6VBI#8$M_2HMSP$[F*:@RF0 +MQ+7W.3;#C,EBEMTB_4%P(N+SVH:S76HD=@;)( +M\"]_T6&=&8V3:8!K>PE)=9>F%QY+QBS*1]R"(5*`T/>_ORMQJD1Z +MI&*''7;ABKQOT%$*,Z1BY&'Z%JAVRRC'9/0?QF%A'V-S=I,OK)C.;)A.;FB= +M2U_&".!]DKQU<5,=10P(]94C+3/6TFQ7U,..#?-WQ)S?6F8.G?J$1X_>F-S4&-AN>($PXJ:6 +M@*`%$)?2([M;7FK!+I23$UQX9H_+IZ +M3IO6*\QD.-9NWJS]V8'M;2:1E['&;CERA_YMZ1!A%P=1B0-0(>+4SQ7=BZ;0+W:P'[,IP@?0VKO"ZM&+(E)=$9>V,5?))7ESO\49%@8 +M1&T]KZ&T2+X1ERVGU1%Y&O/_.#+^P5^SMN/9#)=76)\S2JJS<@H/Z1)._QCX +MB4Z;X0^IRE*(T)&?;=TNW"$$0NTXVM8+JX)7_%?0D^P81QG15=D=)".:U./",M@+*U#C@*PJ%.*Q2]KH&\VI1/HS^EMA#-$RO3G.$Y' +M1P!,F&3GVM,D92R/:]5'\ET)V<[\CXI%2Q8;R%2YOT'%KSV-'5'F +MKCJJ0'O[!.-*L4;H[A^+`'<:>#7FE2!,UBA,FC_8=9[9,73#GG>5]JW2/PI4 +M?P,^!CG\=6;X25[WC:LW)(F6MQO9HDWQIHZ(DS)#MZA@HV;"@='(/_! +M``:1FC_Q!]1PBTS#=\&*OLA='",\I_X0LJWYE0S>%>KA?!W`KC%+MIG +M:$B\4G)-\%?_"TS6PMUICR#<\][M.P<6JS.!H'V8E-WQ!UG-\!K(0"Y3349L +MV1JM,E^LD9>Z;]TXKI)=[^[OB1(=P`SPKX*2 +M_2AYV=SWR-03IO"V-400X"TAE*OKY.5JBS2(:+!E=\+N5#*H#!/GDE(![,@X +MA$?4B1L@^+()'[H9#UOOKO?VQ75JOR,"2#X9?VEY!T@--\MJ(10#OX_E1^F; +MD;G4^P;KCKV]"1]T9/E"!5$??HW7M$?$<_>,?I"`?[80C@21B7]"N.;O>#^B +M2*])>]7D#A^,,[9DB1NZPHS`3T5%@G&T](U6Q0M4JN +M_GZYN263Q&RIW'("7[Y92\*%=TI\LRFKV4S?CL-+R)(67S?C'RL@MD'RKADM +M,G.3D`%I=$=+11BB#*-*R&+$Z9ZJU-S0KH +MV+_'F,]9#3$/8`?>GQ4*-O$>`- +M`H?D-';@'R0T6ZA@U[_?8F,][`FN[XC"<^%@Y=%;V-8E@G/Y$@4*2"B+1TA0 +MPXKPZ.-?WZ:ULLD2NTI2:\YEE;_`W(6OAO9*2:&`%:489J4+OW9!`3T9U`'3 +M\?G"`I#9H\T)3GOQ68JH'9.RI+C\U&[,=SFJ=F8#W:(Y^C:-?+F#9WK>]Z_& +M-^!7K?O-_7VYJ24(=/QO_C7LB]S75N=R,X%;)E/YW#A, +M)P.A3).43S?WWJ.8OZH11)1]`.*9`QN?Q@]V=V1/KM0@O,CD`3X3!+C^,L8 +MZ#ZN(`'A36'B!8$%N@H$#` +M(8)2J;$`(!5XQ4A3A@F!52,PS`<O@K'`KSJ6; +M;1\A\5!'<$+"_29=%GL@2W++)L/=DK*T)CP@C%(]9/8.<$K9K46;A;8#\DV: +MSZ:M$DRBWHF0G/W%L0G.=>4P.;DV+:2Z0%]LXF()PX5#+N;:THX#Z+3= +M%Y[F<A<)J30DSK9G#'D=$3"Z!UL41[`NZ6GE$8^V$YTSO]OISK]N +M;@RV'BVEBBB;,"::@J-S+&!5X=>JBO#7.8UU5!TX1BX(?UG%(KXPNGXJMQCX +MZWP='CZ[1_R\H1V$@IE^SC]:0U\PEMR-`*O'!_MA*Q(\?]Q+@$=(#F'5PBL" +M"=U/H0EAB/+4Z,#^[3T82>BTD:V$;4%*X/40E^82W_K"/-U1+^1&W]4EW00D +M,_"/)$!N?75N#JY7=?VB+@:<=DW32H0SA72DL6A6:M&N&O#G[J=$OZ;"F@]6 +M>!S>$AU1,U6)VVPNW'9I!E`;&3L35&+E4Q3,=QL%'3MMB;/] +M]&73X2'QWQEG<0B2>R@+C"-OAN]H7,P+X(;#RPYQE"K>W>GWAUO6S/"2$3M^ +M/&`(4??#/X)61%D4NG"/'-!4_,Z]FO,01_"JG=0S40M/QM>_$%G+I$@LRB_2 +MAZ1VQGN#[,-SPN;D=">(MA@L-#B@X54'O)<4/=__2`QY"=JKUC>OR +MHP?9.HN?8\WX,-S45/W1T)I7`!-8?H.^\PK3C^'5@+TBX_867^A8TI='1`]Z +M$`(;NQKWFC;HT2$>9\T[T_AXH^,%4;SO/JIT"64']D10K$ +M#WT`=.\8:HF*.[VCBGD6`'U:U?GSJNSFXM3)1,[8A'%"^I-M[!DRP<90HC15 +MC$5$6`%IU6$E7_I^#;^VJ47<\Z3[;[GCYXS+Z)JQ;B(1D<1U?(Y^D>)+%2?>X4\"1TE!OJJ"YO8@GV$0+\;L_ +M!3T++YLR#[M>%**VGMY)7/:=&)GZ?#P,9$=APYSW`9<1AB>(UGO<-\K55+?/ +M?,:V'C00RU=S]EWEHF.;6=[A[58=E:U)@TU@^KDHZ$=E/++:\D>O,1_8_`'^ +M3#2D&:<>T-@3)_AP=29]FU>=9ZGE16:5/;Q+[3?V)F)^?2WU:M<P)9KEJZR;K=O<,=G +MI4%XC@AHJ,(_8O0!'0(,&>/H11_%/[X@5F+2@J?"->B\.T@R+Q$:Z,>]1(ZYQ+(AZ1%EIKBHA#U+?[E[NF&6K6"2V.59"&:R*=G[ +M/S[\+2#H.B62ATOVNGW_IZ;):K]>I[QMO[)O/>\VL8#=;R%[`F6V5KJ;=13+ +M6UFIQX?=RRCOE0A]#.W8``KTRI<+5%RDLI=E)=1>I=U+PI,*3*EY4O2C!`C* +MUB@2H52#"JQL&0(M`ALK6F)M;8(<4K@Y1'6!SMQ'WTA&6;0E>8]V&@KH0V3V +M8^2K:Y:MW@$89-__WY?M76Z$D,84N+Y=!&,@3"/PQ%;11;KK2MH4A:A[EBTF +M`F%/;@7G%-\[9A0"0>AIUYXN0:H[/OE*OUEZN"><_\B%_,G+>1BI.L@?ED-T +M_'G&*$V84V?5G$+WU/W3RY+I4]Z=9+3!I\TTUUHF_B_;<8ODQP[L*A>/UH^7 +MZ=6UNI'W$*6H8(T+\2]5&HQ&&SL03GKQ2'D=0CJ1T]3#23YYLEQ2 +MIA&">\)U6\()6:RG]2!?AW<.`;IQ(%W'^\6`MI%OM4C(6U/6BV2V$:+6N<&V +M3O0Q(V=XIC#"P7VSJ[+@Z*]%!6)5ZU%DY;U@!K5'U10-?FL`/AHOPH-7B.Z% +MS,I!@-ZLE8=[C,[M*(".EM4(3;1A1V+2-J=DPD:,WVMC"5C#U&\:\6YUA5[L +M:X2UIBZ^("RSU\Y!\K"IW`=#D(PJMD.D#>]6<_(B@7LCT`1B=:3/X#IHS5W17K^I*FP*^%WVTJY1$&KNO-T@U*.\-$G!>R!2 +MWYGVZ5/JPH03^Q`:N_-G!J>CM?B3W:`3LY0GQ"1YU(-'G=01/K.!)SRX8@B] +MQN\Z;]]8&'WA]2B$@;^0<-RH?=0DA=\_&6%5]__15D@5FU1A&%$"XTD/+*JK +M&R%JZP:ZSL/`'QE2K%P2H0!B#KSY0I\LN6G*DNT/[8=Y+:/V%AVPE8JND@R1 +M-ZX<6L)O,1!.YH41?G^)C0/;-Z86K6<.^_\#J;Z@%,ZJ]@ZF^C[V +M9U@^RYR8@?H('4LM=F>@-ND^>US5:%<>N6#TYLW%G$C:R(5H1,6CR)T@.,C* +M_B_:]*>V#06X]!/Z>U2VHNQ/8;7=+=M"J'VT2=KOS!2\.?[Q=L5!D)H=5M7$ +MP@L^QW5JG/!&#MQ1CP6W6^]0;2`NX^G[R9R=-LA,*@1.N.5D7=8*8KGH`7LP +MJ?F.+[>2)A1C@L%<`;C@V@[9]`SV6W8>!\HR*7"^VP7"29<,%W#N!,=*\POI +MR:'%(P:/HT7N`HV,T(=I^DAQ7*Y=WIJT/9ZQC1YZ\@SZ"P%NT%-7,_"K$@6: +M,DL3:_$MW9H`*]6=&!,#*(F9M8@DK0_P-#9>7T_L_(FOC1\/ZG+M*N^RJ/QI +M*K#SBO8#-?A[$R!XWN5.1AR'?[T&$!1FOJ>O.8)G#S&R)@7:[P34=\8C5Q*6 +M44E8>*;\BT=L:"L?M+0/(89!D]]C?1NMO`^YXA`%@@RL[ZR)T$EX4#;%T^EH +MJO4AFJ];K*5.E`C*1-SA[4]\+.SVD=/4047/T+R>6V<..T;J=QD3+EFDZTZT +M^>X\"+V(4L6%58U3'50FREZG[@<38TOU9D<4KB#KAJ%Z=06O'AT:CN^SB3KA +M,*?G@JSDD+>)YBEX2"O3Q"RU?(XUVLE8?US%.NDKJK1)E6U@-)[<<9"X6W%( +MT"BP&356CWU:Q"A>R`X,-NCM@-`8@!8 +MWERD8AQA5Q-K\8H#SP)N@[+!<(Y'+>!%696;#P.V.K(V4]8,M$B<;-7J2N;8 +MSMX("LH<]4T58UEB7UM*MV23+7,'7H([K%5%?64KQLL2JS&P:XB^5_]W6'A1 +M<+DUEO:?&2?>2GMB$;U6`:>G'NTL7;)Z,9K\W#W-Y2QC:1E\\2H7Y=)/;;)Z +M.Z(?@=.!,2('GD`+;_2OW0_TZ^E)-XM@0<97--DGG6\33^9^SCF_W-CNK5K$ +M>[;[C/+3AX1*'KQ3B$?L&3#AA-F]N(=<3DFT"^ +MTM?[A#EXMW@U&"UJ>G;LJ^G[I.^SC^L"8AOJT5`2&(T7%XD8&P@9`595\\4G +M16V%1L3)?`\E_+B1Y.E*][+HO+A`A1G)=1,7K^.3/6:;W/UZ*T">WCO\84T^ +M$>+M@@Z!/;N-`/D(S[CJ.]P8]/7AQ*?:) +M#&T\^?K.J;@AI[/#.F@Q(U5:Q5G`&U/JD)ZK,3,H:F@W_NNT=451;G>C5;S, +MZ;BG4*.LH'8++'YD?%=0PV1MYX#TP`&=YN0^UA"&\^/?#W5>*9P@R3/WT,!& +M12W!%C64#VOCF&CBNT.`V!QW@:MT:]],[@]<^[-E,=_"QQ9TJ_!Q":;@I2($D\N35;VZ5[<,@"G#%6)>&7+ +M3KOIER!;_!7JKL/\'(^\$X4%Q]]KAF`;.O\6F.,$-LX-FL'&!5N^+CK=RQ15 +MD2ZXR?D=2%V1/W3\%!Q2ZC5S$R8/:E%6QDM"9'0PPIH=0B%$J$">_*9 +M.)_$0.\6%E[6M3;'F"ZPO-6L)XJ,DRK7-YU&C,E._?W'^P+V80:DW!6\YX.S +M.`+\>"*N4RCY"[!&7>D(1J%JUFW=6B9H9;A\?G&=7G,'R.KR*'*KQROX8O(B +M9]WF,+RF4IEP$%=6BGERF?3X!M^:VS?YK;A&F?:^$='Z<@M^O*,_!^85Q;F% +MCG^$I['J%6H6H\.RX/)_!_F9/"SWN7Q%Z>XI*#WU;G;Q+R^S25CP6V2K66`T +M%(P;UH_MJ+TDI$_>%Z3AMY3^1R67I*L*2G:[VN2.UQZ#@'%AD17A6UZ94.%= +MRS1(^H[P8EMUYYPD]-H>C@P4(GXU;JO>&S,W#GP06MAOQ,7'8PP[":!W^9JY +M6/]GSI:GV)(4.T5*@%=+9`X,J'M&`9C84I!:S9_ZSG", +M-F)QS^FU4[`_1%*\,S/7(G9F>0E2B]G(N?-D,/"FER(C9Y7O)WR/`C*5<6U- +M+#N\JQ95[!T-@R+=/]1SZ1-I!7_X6IX__.,&+Q?=_>P](;(YV2Q>`AF`-7DA +M;&W:6`ZP8O6/'4V*C\AL7IM'F/*&BL`T4:C7POQ"V\`F-/T%26/#,H,\<#_BF4\=-IY6+VFJ!_>,[8D&.M:K."]S +M,K.C):(-GCSD?+GJ`ZV'K"!;D'&;23VD'8&7XY1&AV6T`/OL$2$;<;_2?K&4JB'_@E(3F=$(@DPX8(U(ILP +M1$LN2?YO9<9>LMD^AZ!;=]Q2SA152BLV,0^Z=:M<)LTF6SIZ<2(TJG`)A-XE +M4/]!D86Q'?)[L&2FB=%.&G$URT6GIW:L30-,,SG*>[`P+:-VB:9I5_BF7?&% +M2,'<(=E+LAWG#,C.\=-X2L@2OGK+FP!U;:'DW7G)_<,_UT;):6E#VU]CS=@( +MI:O.J>=`>P(>,IVP-YY:7$9X;),7&+&F:\=FCF:M8GI.--JP=3CT`WE8"9"' +MZV@TO@HF%Q3%WI+M*%JD?/#9&<<_J,WAX[1/5*K3MZ7O-T_1.LH;)UMJ76.*-HUL7R3KX%@)1E1-OKA%DUB. +M1X"?M9ZBZF2VL"'G]6"G]0M5-NT=X\4D=HYYTEBL!$0)5VC2)494NB!R0IYZ +MYYFQ.+%'=^BJ=.WY+]9J+W+,PGK1:0&8);8:5[06#+8`S)BF;_*!*'$GE2N/ +MY$OG%9=$/PU9-BQ_QW:$J\Z).)\%63?\0*2.L)CHYSK9H2/1(RD>?Y!7AX^: +MI#DH&E6Q;$UC.+57B2MTR15HL[`E-PBD3]NVFM8E6B++:%&T*H0U5FP3K1): +M.VK)B+9@Y,E]K\KKX6#WX424F'SO+"27OEQ7X$GXY;$A;%GG>P7?>S4F3!R0 +ME"'4%8@]E)D?'+XUDF7RQR>R10DTAAL&D<`B.I^XT-$'U<8Q8I*QJMT!(;"- +M%YA.U.%PE$%KY21K-VZ^)3XF,QO!?"HOD;!2`GP)"?JW6$T'9&14`L`4`&)` +M5R0;=/5T9EC&4_PH]6E;8E.V);-361=!"8,+NC&1%^D`]L13F_7SQ('BIF55 +M!^X$22"(`$F`)QG;K+I>8D'C_:=68=A4^XA1Z[=%.N,67=D".PRD^(JA7MC+ +MEZ6E78%Z,572U?UHR[Y!/QD_1M+0=8RXL6T]!Q/"_,/]Y<99:$W$J5SMU_UT +MR[YA,2N;\Z2!FO'%(*[!F>XF9#,P3JG9%R@UYF8G:`R,,/;-"53[UF@@0(]5 +M4,HZI!B=H3URRZZ*OCEW@(?V8`ERABY4$F@->R""Y)-]N0E%:WP0!.*>'W:U +M`)R*?=12PKXIBQ2%6R):HF(NPO2B@BNQ-I8Q_NJQ<*6Y +MQE:*%3+_%.WN='0%VIZPS5>V%'84;#HT@;*Z=$']FEM14TV0GKLE*PZ&"M"V +M*;1X=_J?GY.<1^:1`+-R442=5Z:8E/E.0)84I:DJ$IQI+#DU5FY:QFJ[9$DUXTYV)Z+05`UX=6ZZ#N6B>*G`KL92\2B+PL7] +M]3(V2O@ZXZSB\,F:SAFLHQ6,FP=S#6$SQ)>[HYR8L7<,6T&40=M7M2'HG%XU/"1<7(,&28[F%,;;5!]O'^1+R_ +M\G-1)C694ZYA@;A%^\P1>5E&%5,HMFZL9WDL8JWC#OR\<7`;:$2TZZX/4L-! +MI0>&M1AF&A3(-9P/**'U'.JJF*+AUS4=]+R*A<8G*[-G>5H3;K'*XQ%8(J\F +MKM!V`WS8\&'G9!4,(.''X#JU7$L>=`.IXDF!V)=&2K=-Q+E/7 +M>BQCKDOG[<1V8Z#[)'_S,5#]G.J8?J03OPRZ,"PWT=PG_Y\O*22RK1W:K.\[(63$_8*W#Z%C],6#M%PD20#OW+#?_/?_TC^_ELS!?S^:+'97"R_\:V\P'V9+^+ZK+S%4,D`>;^EK[\ +MQ_Y\?\X7=O.<+_NPT6H'KY:QQ?$ZU[9+@M3J9KIM94S1R"6#2M:#6(L,0Z1BAO19 +M,2ACX2)1R);]]S8M2U1ZJ!(2CC>*5MQ$;F.:+VEI8XFU?.K +M*7-(.BWM1?`N9O,FSRVLNV:O*$0R)/>/\7<$0_`E+`L[*:+VF!*U./,$-ZT0 +MNB`HW<__4;%WP#1V)[&FL+J>0C.&!E!M-1V&(`[N_?&1H'@CUQA0NFDA/-R2 +M1+II?_FE/L,DV022YZ=KD@0N@$V5CWR]I5Z7F^>[@YWC(N29;7ONHI(V0Q"W +M3/][\:+ND1V4C+;,-%BA)2XR91^*R/9;AHPZ_<836H$&&J^>?N2%^%"]5Z)< +M=GGXKU"GJUF=^0%$MR86:6>[!N\=>USTI:&U.`8Q$0FC,(FKQ7$7ZW7!7D7> +MIVCB^JYAGQF$,Y%U%;!<[VDJPU$S'+5?C8Z4WK)BUH1RJQ_Y>ZMS16"NBE=L +MK^7B'.ECI(Y98"W@188,;4[>A#ZB@NK.^,-"U_O!@P)9#YD@ET"G9W#XF^W! +MZ?+Q9`,L*K>#.^,R`V^2J51796L'WUK5;7`@R5S'F23FYC`,A1E8L-%]M%%X +MR\`.:1;L:0,U`U-PKB>?*9;OL;<*-^8OQ>U+$U8N:*GZ.$EM=T%C3@>-`&." +MA=&)X6V2UDAM0JO5?\I(:X@?JY.D(VP$^9,FI!WGDG*>!,R1WJD6>^EZYTBZ +MK6Y[J(V7MQ)O;@5_>`TFTDG70UW#*P:,.NVZ3+8A7R;T\==647[914TR;7*O +M3&:WRMBO"KY;K;`%L_QW)XU'R`5I7FZTDAO71/.B[BS+LG3S;UI5M:V6[3CV +MN?8,>_2.W)W1?%\WL>[FQ2T7)!R[S +MV9!G]FT-6-M,,%97W]Z5)[B+X;_'F9RBNI^TB,/),8C;*O3'6!I&.B$@J7Z) +M/2IHGH6V35;8(5HLL8^I*I5!=C4*I0Y,1PNI5R.-SB%2^GP5:4,7].CA1.$- +M&5?WV(;IS$:'O%\HX[2.DLN!:#-1879$&(%SNI3IYMI/"Z30N;88[7=H43:> +MR/$P^\?^!NY14Z@"UNR.5*H$*T7^ADF*FL+AQM/^R8;U">6*?E6[X7.T**4Q +M_AU!OO?]6UR0O*K"U.>EX->_YK=\8`#9Q/8STSH,_$L`PS80*'L-%1@13K[G +MW[KYI`<*U#_97"N&Z3Z='_O9>]=4@V'A?QW9FYZ]J\F3OL>4HHY_/PT[.7DR +M,UD\NO?6'(MAH?WF^=-21QM`<@4$[Y<7(.BA[&@9CTCO-6(?_F55T&Y#PRC1 +MY^/BP%P@K*!$4%>$P>980,?VN[1;P8%X/TG*ZD>8?LUNT-_G=W#@YSLC(K4L +MC%B!;42V%(;!B^5!7L@M)+581!G6IFC+G!3;A/2NC+0:Y6L,NLRT3,MK;)O( +M+&'OVC-TD%QH6J*`B[>+EKT^"@MV26IT153(QQ_)+:CW#6S3_L%O>F79C^W`^?+V#@Z00^U+-_\&\Y4M-AH?V?(8,W(M=!! +M9XL"/*#BM`=:+GD7^DWR0(RY`,[04]M&?T4UHKT>F!E3S1IH.(C`.F +MAK*P9#@06'@_\<15N&\5JCS[9Q?(OK\9'^[(Z@AF/BBJ:-?6A_]_MW[P45T> +MSEB$>JN*:8N0]31E6X*&C*&N8B-VT`!L#L9V0!T;0D>2TB`YBC\P`E\=`70\ +M6YK'M'G6\-)Z_E:0>&*J];9*P=5L,'59PQ(N83#UJQ)*](*4F/R([D.L)NRF +M$X3JRF$S^C']*JVCB=BX3*B=;(5#[S%P0^>;T5O"R>N16D_%25?CH=G^1_P' +M04%D#H>OEPJ73=TDYFHI8T50,=_`%[O).P,W6QC8[J^'#..]!UL-(*C-=#!%&WQE00.3`>_?[>* +MZFZ&OB)VTFDU!:*TF9/>X%ZYV$BD=DW6GRITJ[&Y*O^2<_WEW^P3Y\4]6[E +M0?7MCZ:#\%I#_K09P"!5LU*1/;(0`D(!EK/ZH1L`J-!GVDV^,3"G8-68Z`FW +M2;/;D]&!:)MW30,S1SB'IL6'A!\N@$NP:)7Z9-6_US"&^[]37$I@=`UQ4";6/]-J>'/>X@3I] +M[7);-.I1?G>&Y$>/:O"][?Z/$8`_XYV94BV7Q?H;&1 +MC&_^OA%0&$@L&I_9*H)M;K[;``_U`@-V0A#MI$]?$7$.BR4N"*4?5-2C63AC +MT8')INM>3-,+LUHF'J5/C'$F3$,+=):.B3T2'$5)\!BE466\2O +M%A`8)O;6PPLYE+"5DXPPEA5W@5+%%!5@-L,7_;'.^()"-\EEJ%7!W\7'W!%" +M2>P1@1H0MA96%26UW:3KXF"3WXF(`B9RC28WMM/?(>1Y.Y;&(6RCG\B;6+^/ +M[?6LB&**0D#BHIOJR)Z55M(S`5MO2Q`HD5%8^!C%3V<5OTYF\#%2T;5[Q&-1 +MN=XTO#^!>XJVK'<)%S.$>QRFF$?8BKP<0J>[3Q5#R'YVC)^PJAH\K(LME1WM +M]E$*38?4$-Q@E5WXR"`4-NM*Z1=#$L?I++:;(\"OBCO$8G8.Z,$^6$@.FL<@ +MPT5<#E,J)N.``_,1+.">!90'QTU<.GC)H)0O1*X5\_VX'%@\KAO:7C!X`F%$ +MS0;1&$X$]E& +MA`29G:CI`@]1C5_#C?JT/`G@9\#]"YT2@ZN[K(*KK2,MWG?:0-V(<9/M:0_< +M3F=!(F`>OUYS!VX^7'6VX]:>BB(_)%CL0]`\(K>OC,,Z]`0H-L2WW5DK*0;` +M"@/N5$V!,HPOB8?Q0E($U;P0A]R;()TO+,!'TRXO*S+"J_ +MMN;>\39ZZ+R^_HM^R8PI"5.5\&6GNB\NA)2I7Z;ZF]+]Y*EY5,2J;*WCWI[H +ME=W_&\O1DKX17G\DC<;KVZ@L2+)?)CZ4+RD7??ERMERO/W7?_ZS_^D?]26R4 +M+^;"%LJ)0O&-AT?E`$..C,NJ@9`O^H_4+#>^P>O@P=1_L?3T!%!M+:X9&9+M +MPJTP@VFW!ZZ&&0)"U0M9@R862]J9\IQI*A5>%6487)8 +MXIQQ)J4Y@ED":,+VPV;D'I'HW?DM$?B,-S.RAVH[4=J1+)GAX2W;OGV@Z!I1I62A10DLLS4IRR +M[6NT;87'5JQ_,GQ+SB/0?DNLW2GF$8&`2T9"SY"7J$,OE):HAD$NW50B@"7Y +M_"$=5O"7MD>AO27K_.I2_0I\1'K;XE\HM9G:PCPN`2F@$.5X<)<$C"A;M>V. +M_<2_(^O7\95A'4W^UR1_"4_ +M.U'V87*%!6,+W=N/8@+B3$38_H1B(L;O$4W&6.$&<]%NU]O8? +MQF:?=Q>&$%IX"YJRV6=^9J\ZY>;4%$B/TK-8EP^0\-8:5"O1>K$!$21K=6D( +MH2.*3_R;4GU&;818D(M;G(JE3VW6O+[ZXVA\SVVI9[9-N,K@WH?1+IXTP%\P'KQ9UWYFT6OP8Y%;F[NV9<)@Z\X_0S^Y%&^H[X):>MBCV1NYY^$S7PQD)7DO<:SVL^B':6\=5S$9.'CK;K_D'^XU?,B7 +MS.)?BZWC_!L!^[2$:^'/?MO//T*Q#Y]6X>='CK">S*/XAWV=I/%VMH8LW9*R +MN+]LF[+:9ZHC"UT;JL[_"-Y[?!%1\#D58-=,[::]-IU/#`%+H]09*6E)Y)6P +M3!3(_V&+KII2;4/<`8>JZMQU_OJM:A$1;IZYJPI'H^B.YFU?,#1-%@V&DS"= +M8A:!_T.OK+C])'<]+/S;>TD,G*VOIC:DC^V8$8Z-Q7Q4/M-9[^9L* +M`4094U<1*/+ZPB#K@/"]/OV^HA(SP(8!3'M@C6]#NYZV^HE/?UC5,C3%_<-\E6N9AJBVA53=%R_=Y-2B'&;(^V3CK4)_6?]-)\UJN@("QU +M7(S^\2J,ZOQP=9E#P[UF/8TTX&6"`89S8_06D>:#H*`:TSK@S;#0O55-AS/J@5B>BT/EH%GLH.Y&G=Y +MS-:)73YLYD*B%$4"HSG:2CCF-2,8\)UMPD[K&?:++DX&_*#:!VE"YC!Z*0NN +M5G!_Y-2@N>@,7;C``;TI(B/E/4'CEBW&Z5[-K=N3!!%*BY/<=2&`G4=]/S$0 +M&Q'][:GO*<13+@0/R\8\J^$EHZ_NPCY(1C5)19*\<7<=A;EJIA]A4A5MRB*: +M:N_!+@0E]ZA/(-;_A`(MH9C,H.@WS7#4[%QE6X(#")$,L+9@]PA`5\FS@8(] +M*08=I+U=Y&S9BC->8:I_V$&_?A]4E%&H!MPR0UBC%*']-*3:DZI/J4*@K(.O +M`"]J=,4;@NXJ+56*H3VJL(:\ES11FZ%!COEFSN\?>,`W7?(R]$47A`8-6+:# +M9`W9MM46=NP%_WC$2WK83[$22$KKNHYOQP7?BQ,E1RCNT8]V(,&J?JVWE%1D +M'0/HX11J4:E&I1LY&02UU;M?V:\1RXNR#)U<>N?R-JH5WI0L#+4MH/^;. +MZ=DU]W>)3$C(TH%W@I;ZNEW.YB@\)U_67B>^.S;+>$ +MW'W=WCW+8R_24"VD3QBYLZKN79I"UK1.I_,,8%'X[0\$8H25\)O-#BN*I&9\ +M<)+X3J?`&`1E7P'9=X`^2/A1@$!W6HZQ\ST`;T'=JY'],3K^^@MI/TKS'CZ- +MBPN$G1F=8C8Z?-`3P"R2A:-WDMJ/QC5;ALGLSUHOPUX""*>6^@I*V=WS.[,D +ME[92S9;6(91/;IWN)3[PV7U/.=SP]IL*0">O;X:]B@L?KO2I!TC'H]L+\!S+ +MR.^)ZFF@B&N;PVW^X#6**^&3;C+'A$/N611\^C5-M]B@ST#6.00GC)^+O>6Z +M)98H(7=>,L[WV`_`KM^>/=8__KP0N5J^WWKCJU!^.6*_N/67'>Q(JT@_0B%@ +MT`^>6KK[7Y-!7]#($^=."'VV(?[G*`UXS5V#%S9YPY`(=Z^.JCA)&QSU&733 +MSG?$1UGEACGCUEOQT1F:CI,NU8N)ALC7Q25X0USX[;W^)F +MAU=O+E$V1^Q]3[,R5+B3WY5K.H^$.=.HSJ_,'!VL^\5PCXJ57)7&]F)664]>S4@8!H[P +M0!K.%&(D3P8A0,0,TRN6UN0-$RDM8MA@7BWVB?R6HEGG._$>I^3^E3LT;)8F +MK+[S%Q+/NU$PD1?WY,SMX06$_P*(VYXYWF9G+O?<][;3+\3Z"PY7O,3+/]VB +M9OGB%J"$<1"=A+(ZH3XD*83E;M"BA-B!>TIJAEL*;58@(!S/O3\\)Y-P;9GY%$]G<%5D1UYI#]%\LRB&`5^R#Q33./7>*QU6@>*,T%:%`Y7"\T? +M+`!Z5&J,=,,+R^S63/*H6IO*'7,DXH\NB*;]P;*-^."0<6X]UB$.2H81C91S +M@CN9.;J=:Y8HX*K#9SW?W\$4O!:L!UNZ/&I\>MI)B4<*42>.3'C[TD'BUPTO +M':?2I,[`%QI%XI*^M1Y@73[7T=,C7RW%4S[62)56)ZC(9BSQ6GV"%.-H$6MY&8RG +MKKK=F\\6R;W'W\#-OO._8GN_J@!*CS`N1Z+_*2J-"C3!EYGEB."MTR&6J"+- +MD=B[Y%[*+Z;$#*V2L]@%$*025(LE@MXD'&39Y6@<-9(E+/_A,EZCRAZW[HHJ +MONLRRLN-NJ2W]_^G%@NV0+DTUQ)2;8;J&#KQK>D6%,5&$%N<]M]N\LBY-XG] +M,@A0Y3?6R?_\?,6*-9;$XPN&\YD7VU[>40S;(;+M,D+^)W\FK(L[<+0NCIF(T!,C+F=;>1E8O##1GO^[.Q/T51A^?M$FZ,+`G#AHO +MRL"@K=60M0*'2![9U/M5X5O'IS7[G_Y\6.GI@:@SA +M/DJ2QZ)A0'""T('P.K0D^0.H'!9#&JEU7_SZ3KBK3WS5\RU=('U*(\$20T/XF)2YK23 +M]OC$FN?]DS2MRT0+[;GHF;L#_-`!G^D/[>VK[3]RJPD7LK?<(EM?G/:6`GGS,<6^6E\,$4.G8O>S/G0]CD!I%QQ?V[) +MV?@I[L;>@5C`([="3X`Z+$>=`]'Z-B+05C='3&E5UFY6C(J#"!J-MM +MM=RB_ZF\QBA2NEVSQF*K<^H;.[K->PT':FU^-EF[B\XIXNO;8-`(^HK3$S#[ +M%`%PH"A*R)/+4Q&4`6=$I7T:%-\.`=-KAH:HVAIGG5U$`9O#VS,,Y$VP=C;" +M;-+4'[E#_S,*9Q][&]51Z=TB!\9$PG,/N$YM%J%R-C>A_C_]ROD"NJYF.AKA +M)C;=:`*]B45E0@6``(_QL>R)67@=2-V4`$F+Z7GWVDZU&8?'@F#T&70! +M`?ZRY3M6\^QD&:"_!WH*P[@TJ"F?(H5&99IU*N_SO7OFB`66P_AF&(R0B$]L/#J#HMOK-^;)R+"I1G58"`+SW`: +M_A#.WUJN;@E$V1]TI`G)^3;*;19AB/Z:4"4;VCM#@(%*[SEIN^FX$TXL2RR@VC87!^M>L/3:,8-<:DL3Q3VL2=RC+;4_2C+/@$P_E5M=(53-\JUUX&S&) +M7A2$=:R"Y]]^>SS4\Y[[NBQ$QD=G3\ZV>4T$,3]/<4\F5D88*(C6-5NS?>3^ +MD3G=F%>OL3>H%A/F^D`ZJG\')W#4;&G7&JWDG7W$,RKL/$K+J&=[ +M1M`C&T"@;&%1YUO=CC(4O2#^%?3\-P$%9L8M*3OPIX1FY9EZ6/P=\WLK!QU\ +M6;@RPN[(^#4?J:,5(RQ)-UF.ZD7Q0-.E7:9]T0^Z%23,4CO2'![CI#@Z!ZR& +M.P,_[)Q4EVN/[2N-@N^ON+B(./T6#'F(NJ>F1TT4=RU7JE'6B=K2:*$13^<= +MAO'YUG!V6I\(C.D[13XZJA#IXI%3QH\8BK*/*;$O+[I7/G8.OI%&DM#3PH]* +M?T?/1#/S1-[;L="?^>Q#OL9?CT`#VPKNE_2TM%Y,,:6#%JI*_YTH[+K+ +MA__.&DYA>=%+[K8,1/\_'E[$'BZV+KV/G`F(3`4]_Q3R^W@^\?VR&<#U)$!% +M)A[DG7D#WXJ'FH0Y;X^"7;VLN7,.>V+E:*E\X/_0C +M0).??VN_)N.F+K+7@NF9+K_13%S!=/7*XQ7O)6?RMZY3U6Y'A7JZH,YE@4PRUW)>']!5R3MSC&X17^]CR +MDP,17:>$_WW+'?L;V6S]A:'_-\Q=#[QHG%_XY;X/D4[6^%MVA;N]OI;:TMW5 +M7XMOEENQ=_+;ZQ;NDYDMOB%N631;>Y+=N%*3FBYMU2IE?+_4M*OA:\V6[]I; +M^8YPMV;+?_$N4@K*V"04_^0=CI'__.`Y)[2?!L<"6A_T$WRI3'Z;H<[]SY:$ +MU$%V-^@NMWUA:']5@K318EI;3A:'I:>[Z$M&J+30=$6CS"T_>Z,M&N+2RG2T +M>:H9]X-P82BRGZ%LRVX5M72$C/WO?B7O?C7C!P$Q,:Q/>"LZG`V[TN/QA0B- +MGE]:)U[#U/R9?+DGKZ88><]9;RGFD[,/B;TYW,=2+=]/"RV2V36O8'/SUGB' +MF%0HB9Z*4(ZB8>A')G,F?GGK`=N3=Z`X)D`5@2CRYU&$`9@`7&#`&VP#?_T` +M#[A?.]OHR^`D\\#F`F>.Z3]**2#=Y:B+9[C5Y2^H^[G^\-SM@M_Z8A.EV0(+ +M]A.'S5V*_+C^A$;X6D3>M,%20#1"FKKO@O]KNW9!1LU?36TF<$U9=IW\,?11 +M`=)()G$HUMP)FDTH1=M4>5,<3-#5[N5S4)N5>)4)1K+ZWI7BYO'QK5`K5`@5 +M`RA\RLN4CXH]$2_GJU$O*VD>9A9DTG<2`M<(#?W8NWT-F%)813XZ;;!/0.#& +MW>">R>A+I=E6\,[;NS2=<*7BW+UW)R+:=$7: +M)J0&$SB1-=B4!]_WYIY6YQ]_+H2^7^,OF>./(P5IT$-O\/+".OJP$O#^^2R#@ONI:I%KI%P^LGK9A1#1KLS+(,K- +M+O!6CY:+"M!@.RQI$]JE@MK1/)GFTENQN<@]7T!=H-U=?&[$A@I._>MI!HXK-W5!_9DM=&LR]&,)L_3?PE35Y4E4*(2"] +MOSR`8]0^$\240DR8BKPJ\+&@TD0?WL1#4M>P\#T!?8H[:]_Y8Z(P47HQ%B/8 +M5(`&+HQNK4^`J06(NJ# +M?+2*MY-SBS<\Z7?6`Y.US[UA]0F:RHC:X3Y24RNT(@C2Z$7C1J$7O91/1.'; +M*]01U[M*R?BKJKQ-1YT8_*%`32Y[5Q;#33FB^#15:Z[B=%$_%RG5]_Z"K:#H +M"=KXR(].4B`!C^@`VCOL?*'B\4P&`'Y\QZFUI,8H=1+J@D'IXR%$.`;'7XK1 +MY^+@W,4_2?33*,/4T4YVXO]2W0%6#KW5ES$G)0%H2J4/NYP_N_IYA]82'$FV +MJ/T(/[<6:K*"!/L"S3Y3E`+S!?4_/@"]GHE49D`-K)]#KBB%OY6=G#_42!ME-IE,H7C'!-S`2PYHOH<:7T5E- +M%]#ER^BL^9+Z&I+Z)B7Q)*U7"=H%JVZL[M3RSJLXL"6/#VC5[92]*\T4YD6O:&Z9S8X*N8=]Q?_JU'6D0E_X:EJW]^_]J/GA?,P2FHOI?+Z\OZTG6LK`` +M5(GN[4\5=3WI%P(AY3[\;AVH9_"LAUMDK'=6IU;CYWBH[['2!^WI@ZBQR +MDH?HFJU-K\,1/]#!]%%.U>P;Q8$/YMGWOG8083PB_T/7O)E#+"\1%:?%#!X8 +M^L'/H^-85418_TE%<9+?NEN3,M,[Y]CBCZ0NV/CJ\G(D*8JSR'B`K4"`@UUS +M!/S>8+_<8\6A>TQ6EID6AN!00NAXQ),%3UU%:+7QJ*%6W/R`=&IZ9J!M$TD9 +M[DCQ7_V`;<7LOJ`I5N5"#:L2_1@%4R/D[?C*/_@E54NA4&`$,(,'^6`X/38O +M_W*).JWAF#2/@?Y`08/N4"+WY-/8QJWK_`[_<1:7Z>]P6 +M_1$:W>"&8)@"<.N?UI/?A5V"^H\US$3!8?3++ON.UN->JTR9>C]?H^"O=:@ZYXNZ"VDS@T*L&ZU!Q$A2>*: +MK8'CGW^TE/I+41,WVY@C+%Z-@6WJ247+EP(>-;*W62#,!D/0\:0#4@%HA_*D +MJ\+E'^@+C#@ER_1EB\3+%T_;=O_C@70E[4+MRQ1*O\?[Y>K)]#I2B%OXVAY+?3R!_\K#` +M,@!,"7T7H+B^AHR_7T'+,#THB%_P]M]<)%-^;(A*OJ9P8^7HCX8AC]0\>8R7 +M:C*W]2NT*WM%>D*W\"!\)U(\)ZYPO.[6/_]`[FEA7#QK2QGRT+BQW!:)8L-B +MT78L=,0?S*M-%Z++)%H8%E]PM#$LN>+1>RRXJXNO,21J^ZNM +MY]+XI67!VZDK?\E>@*WY2OA"MWI7PI6[5\, +M5MZM4^VI[Q79%:N*^'*WFE?K"MXA7^X5L\5_NE;\!79E:F*Z16PQ7OI!X/*H +M(*,=U"=YH3GK@]+\1`MBI;^?;KRQS)/UBQ-$_.+'-$_U%CFR>D+'.$ZHL8`P +M7<0;;)SY7Y\G@2OT!.]%?!$^)Q2M.$_D(,MF2Z= +M"3]TN?1$ZTN?1D_VESG2>F+GTA-T</U?QW +M5XL&3[59;N'36\^#6X.W3E;J2OU!6YLALZ]6K6JVDEVSM6!'/-U4 +M%S?TDU9B1R2IA;]B?*-JTX@Y#M.F2!#.8[J03PK)9=B?7/Z4+1YS!VJ/^\0CS%/64V2FY4^A26Z8ES)'2*-%,>I +MW*GXU/#4\M2M4W"GQ*473AYPAPH\4_6I["FW4WJEXZ@E@B,.IV*G=*:%3R%- +M0IM%-XI>)\E.$?<4QRF94_.I^]2O4]]3YC[^V)<41OTZE_46BBSSG&*!3$J8 +M]3NU'2GBJ>8I["FU4^-3A*,,(`3A#$2OP<(:J=NHK]7U=6UU_<-D]ZDFUOO( +MK-UP%S#0^>C092:/,TSR1V+7J.K3&[NLY@(0>9:[IE*.:#45@FE?9SS!]IH? +M)%B&U:_S^R?<.-N^6SR"?Z,<*2]/=T=4TG+C+FP<(*&)`#XA>.!+$%K#(-JF +M12IBCU]1II!"G*,-([JQ]79 +M(@V:I*")"RBBTL-*L=AY*EYU$D +MO*X:A'QN8+W)BD-#'(PDCHLNV#\959^UFMR'$\.PB&SZM,0?[YY58=M<(!FR +MQ*?YEST!6_05?O4UQ%U`>S+$WR<&U)6\JI[99618K"Z +M>"5OUE7KJ;8MTIVQ59%TT96\LJK%-N64W:8E,D7/\I6_855JGO0MS,L3=ITT +MI6\TJ]E3^,++(EAF73\Q#9Y4=ODE?5_<0>2F1]FLD05_-`,2E>SX8,$KJ^41 +M_K-.IY"G^ZGEJ>:IYZGI*:=3U5*Q3V5+!3VE-FI[:FW4_BI9* +M?V4?*?(IO%/[J6:G#4E,F7"XK+U)E1BI?5)I3`*3:DXI.J8-2?4PJE"IAU&: +MC11JHW4IE,:ICE,@ID2H5JBK0%L([>W\^4_#QI&H'G[I1!@G+CRIZXS0_TM. +M^HATK[('6LD]*XN%Z@_V3Y;3A>I,J2DM;/>%PO4F2IJ\9L5:4':DP@[1L=., +M)_GI9.$'@=QJTP_#)EJ;9'D_/OE,2OY$Q5@"U;&X<&*K=Y>3L(VO_,7?77!79OHTTC2A";.N!%7JC33TGC;+/J3R#M +MY=8JUPVSEN3'"`FF(T?`LLWE16$R`@W)^XV90+156SIUDHV6["#N1F3 +MC]IJ\Q*P6",9;PK`\,_P#Y*=;XZX"QQ>JCO4I2*'G07KA-I`7Y.OHV:Q9^]9 +M$$=9$0.()<\J:F<41FKOV4#E=E(A?()] +M&C9SMC&L'&348C&)0+_%SE8TMZ-\'F8"']+J#9@.-JM452,8EK!M%'H*Q__F +M'J`^7$@S-(LB]2)#(S(V?V84U2OF.(X-9;/$9^B&]3A^+O-O]E;/@X'&==T+ +M"XGYY<(@.3Y4XS+M:_TBODOJHPG@XL/;L^E^(/NA7.*N$G(I=V)]OQ493Z-T +M]C2AIRP\SM?;A^*5E_#O%;GO=:LK'-WOD>N&5BP8],[\9W3Y)&8=E.;SB0KX +M?5]*/]9/@/$65*3F)\>_:S($`IS,7';'57:/P_Q1%4 +MV9%LK']IE/44]M1:"7_NPCD\Q/TVR]]ZGZN5RWS_V_43^DVQWK*2@WT=2VRR +M-.F;1'P&DONX\=&6.MV)P,>C+'*LX<$F)@KRY@P84#D0XY++&!H[G]8S9K&^ +M&S:]Q>&G(6+A=A-;`E?065;5)NGL(G6J.*BS;/NHX/U.V#0'7\-!4_O@BLC- +M3^6,*.2..W+C-?!KK@`UNLN5$OX\!N +M\SR;/IB^VV_#6W_'GR>S%'&A!FN\FNUALUZ5X^83S3DEE="BIL\ZU_:Z$^,V +M4U"_:+%XZ+I7T2[A*U%K,9[N,QPMFIK`R$H-)M`:XM5BQIX19MX2B$X,M3R\ +M:,^/2U7=L-KS(,G4I[7#.TN?2>9;A*[GU:$'X8R7X^%Q_H?*=\45X^(W2&DO +MYGJ:A[-5'`69H?/8/^@6(L;L]L*-Y@^:26Z\>KFAFA;>TN97$&.,,PU6;%@Z]%& +MKP;?J5O6O,!558>A[Q\D.4K;]2PH`/LZF#%VCBS-[I'E'+-!>-5YBFUM)//> +M/5T5!]+#8@7B$[[@M0;$,D2BT*YO^HFY&W50W7X(.N2H- +MG`\P-DOU;01(^FIR-[MTAUK@YAO;X=2TH7DPTGK+"7C$"9=6"Q6%%MJ6-*RV +M3#P*Q"[P`V1G;$;:1,VD[NS9,5?G=+C+RG9/'V-;?\"'6I8GRI=((1G9/08: +M2C[T,$@EYKRA?['LCHE3])0>^"%77%7,-!Y,C/]FE>8N5]@\R\Y[@2,^_^MX +MHKCYSAX=JY[@=O8+"5;.+<.L<]F`HM7>'5DM>V4U,5I^./+\"^U_#1O."K:2 +MIK'$NDMKN.P)9*>KE`T\K-5&Y6U&M:I5<59#?$%J()-?,K+57CCU$L#9;_'Z +MY=UKR9YEJRV+#P,Y)S^6`HIILG77`2:-WFW8I=BCD,BI(PCX]%2V*>ZCK;98 +M3&<7;Q+>(SX^>7[]$;H]SRQ\NHX-*'"X/+KU>+Q_TVBUBW>9)B*V"'D]!K6B>'T')--WFVUWM7WEK&%3S@BY/?Q";\;ERTG7Q2[5;]$/]BV6_ +MWBJXA<$/+LI9L!,-UNS'>MM^J546%Q=I'32I^\VVL`2TBJ/NAG&&'"+*=`-M +MOZX[S+1Q+RCR\>UX>#$,I:A_><_N1P;"S#U[9+J2I^5Q=A,+JX"X3":L? +M?L;$VQY-/!%T0;L#<;X+;QYZU+/V1^[G_@/V8OMDM5;]Z;S%;!L!WWEM@JVE +MF(M)N-8TJP50>@T56`T1TL24J4S1):4S<2[Z=JQ+SC\L=`.OZ0'<%K#0:M!? +M0N#]Y?KP-R6HK4%\2/\6SQN)C67(,BP\#,R*#K$D=!75%.X2J/QK(#GKSUP''^ +M7B1P9JT7%1TO%QKCV4,OJ8!G9:\HEX,Z+S+^K73Y>]?2J<1M6'X9?-X07P=` +M&X%YWPELLU^=#;`<>6XU#?)R?'#P-]+3_P);5Z*=1RGG26T,P'!(_:8;//\E +MU&#G]X%.1[.6>'WC"J-GZL'J;PM.GO#*S4S)2NO`/5(EHG':LATK20=FEXE9 +M`B;O)$+*O*-<4UL]7.GRZQ?1^*.K-\/[Y410ZC6[RUHC,Q&S%J9E42T-;,FM +MA*M!T:NE9/Z-#J?`[,H$B@S1(9$E==`GV)5*EL\/GBU?7SK^+NKWU;(U:8X) +M3KBA4DE9JEJD+B#48WU;6..9?Z`>>&7?N>^)F/6LP]8YS!\$55:J +M36LMB=94NB#N%>4UZ";NA@P?NRCU_?W6Y6;^+IZ=BPU.Z7O?@O\QLT]6"'(_#R5G +M)^DWU_\T@)]T0-";L7J#SWK\/P[?0FNCEG^?*,"1ZGZQX3X",/KFDCIJ`Y%X +M,T,HY^TFU71W(/6'>LF;Z4)BK6@V@L7.+UE'32B&;ZWWWVQ)N\Q$TKG(9Y0E +M7`EKB+?END6!V*R_A1R.;VFDN@V"(DTYR.S4O=',S=[3<'9'>/7\?IV*G>HV +MTGTRNQ;!%K'])&]T<6N]'"ST,B4Q(]#84T3O5J4=E(U-:$"[=39ASL!9W +M9L\OOW.11X6B>SI9[6..HT;#TQR].=@L;+=:#*0,M36+E.M'"FV/Z/_5CNXL +M0!Z@'>XDC3$Q7@JH%-0['W37/-N(3&X9`_$II_-BHANE//<,;@+I4FV=E"// +M\(N+THCSHY(]!I&4;G!K(KH2LC);Y0D]F$&O&W)G##T-(L+!C%19,=NC@V`- +MN6'X2:85@7!CYU.W5WF3/+]^7"AB3O?)>>L;:J1PS!Y/1C@>^VKC!"O.50CS +MX6":D8"=.V&GR:13.N%JR<_$*=D..H)FZP=8$/IIKF)I?NNY@9FSTOG +M'1.GG'`ZKC1>9F?CX[[,_\XJ)'-"W-'PRT@['[,VC@*)V1]OTD,!MW]& +MC^/MCPOF/&8LI:H:-5=I:0T!^\@JZ=E)XQ@X49`(%R"&X&X.1:8T,M`%S!R' +M,A=QA$2#<3QA@`^=XFS/3;YW+VEA>ZSJOFC#/6/\2`C1![_-'TS"F=(^DOH\ +M]Y5B>O1Q#&YY'-\JS/C>-@[8P!PLCE/>EXZ@.1P)D]UR>S/`1,T-URJ`%&WR +M'@0PYY'IN?:D4ZKJOC>+3H1GV+^/:^M)*WH*QNRU8OE9/8(!;N)!5=KYG8PX>N=U25( +MYP'4%3C.\?8AAB'&[$2&VY_M[%CRM564J:X-\`P7/H'4;YN;'IX"*=PEN;"F +MI./JRVJ?`H1F!R=#J@?MOX+1(F$MY1C4G_F>0+7%X=<&[.>8?Y`\AQTHS3M9 +M7#\'^^U.7-&G'\?H<>K)QWU:DTH#H[ULG8\>UQS:X]_*@"890DJYOG7-G +M,](T^(:6_@^V*U.V=[?E`_8>I17@$_9-E+3YS=I\`')I-9WL^4,*H:%YB0:X2`RP879`N'"F>NQ*?WV(EU.E0\(6(8P@;K<#FE57WUOZMU+B +MI'4J+SDZ*!ZKR5KG\+K[<6SN$\6Q=<%AF^S:"FD%%]:FE29;-S1(Y`,^#!&Y +M!UK:`H8ST<2BX;8VR"T)#K*LS?/[ZM6NC/\#4(I$FU2ZE3 +M9]=]*AWCCS0^=/^0&+D]'R#KYL]V(K?FE[[]+PS&>)!V]=(6X`]$_4(K%?**PDD1CEZ/T7S5<'.:*ILKSI5/E>A* +MF97%SKK,U=C;4:E*O\]@KPAD)MET@F]D]857CCR.N_7L&&A#9-0&.8ELHKQ, +M,;%-\^8A`/9+NGB)^^L00.L\O#C3C$/22KFJ&0WF7U['4HYT',;.9'RV;C"C +M5D+(G!XYQR*#:/O^.H1I`7_5!%&R?=4C1Z]A4GIE,&'T!S#=+#D#0Q;>^Z.Y +M>^(>FA`?;%7Z2@_27DL3-(T&C[<:*9N)S.&HKY\'/<\%CE\8LC<5-PSBA?1; +ML)7]?-HAP<-7\B'QI"/C9\DT3LH2<]@.$#%UK&+9E_3,V*(G:LO/,P$;ZL\X3C"HV.:@4EN)\1`X[D3RYO*'.JE9]99B@QF\>=`;LD5@VIXJN\D(^,5!E6 +MYJ['1)==-I:AC +M(5L,V&)>PKV8E,1-(0ZTGF+B5WW`5KO&9E-7'G/#Y+0=^VY`JD&:=ZPJO71P +MFL<*.;ORLPT)L,'^M;;S9M7#+2H?/7(M_U"^Z`.Y\D?2#H>&[I?F\P/]8YO\ +M(W=7\?^_-OMGTX;?-%08%618-=.K?'AS9;F/LRL,VE)?''\\O?>3+4J1R%3ZF=N6Q=]KDKX-K/NAP"U%W +M3^'E]&3UL'FCFQ;JZ8Q1[-)/K+;C[+_1/ +M$ARWZC@Z21IF&;LU98J:AAYB-F[#6O=3\A$Z1;!STNL8-'HNM\:=HQD)5$-Z +MA&F-:(=;,*37",SX8_-6^ZNWB/'GZ#(DGYB'[;PRYP4;VDY,A7I1%)Y(O"*K +ML@'?1,2`?*V1Q(O&6HL/<2J.$%/VL&;TV,6Q]6GTP3X>G1*HTVE4M5N?VSE> +MC18='$F"9;$^4<[OR:(-:X:C7L-!_RB-'6F5<&)+3%/EJ39+0DW1Z>$04"80 +M*)`G8`I\IJVJD^8-%]TX!.#6(TUP:@`]_MT::GSZL*(_`FI]H.#EI5UCIW8Y +MV#TU\1.N<3TL-`1?8Y@DJ0_2LJ^,/\`->T`L0-_;/)G!M(IE"?NSWMOO>JP@ +M2H[4Z]^C2KFWD_5:V4+E5:>44JCI,:E!6CS%3K[(?XBFR.U`TWV*#AJ";YZ. +MD^-5S2>?)?I\I'%8Y_!RH*M"X5O/F.E>A<,;@,MH'+:0^06I?>DK-RM2VKZ) +M]L"VKTT^W6N9H3K(%4ZU1_B[,UJMY'L5:3]WH*RVO)H4347DJ,9:U')T>,,\ +MB6QP_O2*MEX)+@D6?A6V+HW\]57&R/7+63^:U`U*1?+ZBV4Q"O(*C05AR^=K +M3P,B%+N\IKQ;J7I4?KM4>?(O(MN(2^$(H*0E.E)R>5%*^OG]^,I`\T#_?2IN +M')\A8$D'_O#^;33[UND0;E=5Q%%U]):P^&M)6]X]9U6M5TW1 +M.7$*/!+@:BCA2T*J&7TI%K;&H^&&DJ9+3E'3JZC+(85\53P+AJ,I$A>FVGMJ +M@BU@0!CYO<9X7P;C,=2SVP"2^V88F.JRK6&@T!BHGJTS%F@S1];Q<8ZL<'T` +M_Q04SE%-6S_#S["%#UL3Q!'6DKN1D:C562#0G,MY(+O,5G$^P7TJW5OE_T!E +M/&.\X7A`M?WY8B2XAU)BBURQ;V2DCBIS2FK9SR)+^Q0`-=A]H].&HZYI4\P< +MCAL^8Z,2QB/V%/WR$,B&8P"9AB4:1W>JF0BOA[.?XCW:9.F7C"HYU!DD,KN8 +M5/J[>G?T*-3#P]FJ]]U/SG<2`C1YWN83W@N]D#A<*ZH(;939/D^^)-<-]JG. +M\\^LDPE.R8#V`A6IK$6\@0/C,XU$"CC0AR75(IL2\C`!%W0=%R$Y33J]=YZ(&V+9W]]B^[??*Z +M;!X!$UP656H59T*J!/]:SBW"IE\`YNHIG/2==`/?-H3^MZOHC5T6G/DY:XQD3Y*135A7.I +M]L01AE#(`'I9B)&(B!\RCK[BS,R[#T_7.PSCE +MI/&EXON,/$K*MTCE%5C)/EP-K/^HME0)TI81,_<]+E.3WZ4^JKRC&[@?#](V +M]_^_(Y1JZ5/F;EP!_B7:>*CWLN`YEVYK3O,Q**G)T6E/<.<1)-Z +MC!YDA7SGJ\:>K1JNL=:#?=L<-&N:F;XMPVQ'&D0^;(C[S?_T2-`<(AXB`8R. +M(BAH`DAF.:J*CA:E`P#.="`2)!H*N4&TNM5M:X"6@!`DC)UZ1!2-!Q\PN*^. +M%'`N,$60$2:,RJ8-H+<"'Z"!Q`);0(!)`1$3"#^3XG\?/OSVOBX*@``20A#H +M?/U_CC"0U2#)9.Y[O7,Z=Z>]=[_/:$$+J885WB4?Y@-%SQ.N\@8RR?]G]',$ +M'YOX+@6Q'Y#)NTKN3URR^G*6ISD(%/N4/5W29XI90LW\"IWI2_3033.)>$=P +M50[-)L<$-$9IM5E_U0NDKY&$])3"Z7&W;K`4,E#DG?3(_&YC4 +MDLA66`>RJKGIM0\"%EU(M_![!6+WLM5+!Y[;520"DB[NK>E!#PO#-%Y2]2R& +M7W`:"QR362)!V734-QJ(_,3-=S-()U]]-\(;OA;0^N!KB:[&O +M9H3B8#'G\<]\,,<1AH<=%O"FN]5GA;T1I^"?.H<0=42O!?=/]S7)+S2][(@".7R:)V?;K`5?/@9?BW1'V33F"PV^`J##M=\`CCVLILF6C<"$BLJP!]"F1EA.5!'4B/!=`^-]`\^L2$I=:6 +M->:#$MK*GO?+A8RZ8+>/$JN6WQ;1L'-M69),HKLH9?P"`I&2IVU7PDPI"PC. +M[DX?V=%@7][R9"&584_]7.*E+`TS00JXP(F)Y1O +M$($(TD5'$D>P5/%YP64+ZT/9@GA=I<2\4S8`J3CZI:[*Q?E.\[6^?"9/*`T+ +M;F,_\Q]5H2YTEHO%H[K+F[65AP0IGP$\%2?Z;%H*K@AE&H^B +ML]G^!W$`)E%^HX#GHUS4BOF/+5P/JWSVB<\>27X"(R@>D/B^1@A5?WR,`UB% +MRK;TA>WR-)2H=D/#.H`R[J?E$"5#U*?S_G+(;NQ[5@96YVX^YBSYH$0>+JKT +M>8GX(?SS?^VPAP2+<0B7M5*D-?3E69(A@JK+AWSZ^@9T\PBJ7),YA"R^B1=8 +M2B$DXYP+*X?PT">)C=5,>CQ=)Q^`DQUV),FX.;M'DQ&_/LI*G@DRR\#!WMMV +M+>WM@`Q0>TL1?P3Q=I]T+G2,?QPX)).Q_/3BS7::(6@2<6$W?8YT`X<@)>@I +M495R9I^$$%MG%T[BTN,N=_879;%^MWEDC`\-Z +MYQG+S3"V*"]6.S1CW'0]5Y=@ZRE<#DI\Y2E1^WS8V<)WN:'9 +M>).7X^,3RA);V.9"/TN#>9#L,(?RT\\RDL\$Q+SIQOXJO!_BVK-MA5?!_"HK +M1]PE<[C[5)T!KN:RGHDYZ^S*XP9@G@^30.$>&E%JXA@X\J]`B7.)-V37>H3@ +M<#!4ATZ=L1CS[UK"X:1Y+=5;0X6E*76:5S]/SPT;UV/ER\,16+1+.Z#3<(!) +M,*/$

    @OI@CS+=1F3;+[+&!IF/B"6G6U$@0-B1JE*#-$V=@7V9.`TJ+&*6( +M5CQG\`X)`\_/)2FG$V&Y#W.B3KENTP!G!+-Y^P)T.@OEXA<3I +M=A?,8!8'A_\8X9A8^_XPFNBS$B^8SBS&"^99%G#7S*S+OT5Q +M$8RUIR<:9,FH$!C/N/$TY.[V&+@SG)0L[:OP=X0Y+](J`6P)3]30@Z!W) +MV3@"1-/-*[V\FOE;>9D-+TX+Q%"A1-).4TE_`+D-+TNW^?S)XWV08PXN^"4G +M*26,^HHD-K5^.I/OZHM;?]AZJGLHHY"^GU#4".[,7U^.IC6BH\G^@BD(Y,N7 +MXP/(-F!R+S5S3XY,6]4\Y?FIL8/51N<+`C +M;@$4=KNGN.@ORA;@.2WR%"\_ZF;6^U4'@F?RFY0IOU.)"OM_-!DH?Y@%>;YQ;ELS-<>BWNT4&J8=^)0MJR!$,%1W364H1"Z&GK1V6 +M8I/B.C%0"%X6F"I)U/SA#)3F%?N"PU"4T'>0>X)L3RX0\`?^"Q$8@3\#JTT6 +MJ7*/(TA&*.E]+X>[D +MM,I#`6Y=;24^J16_DAZM,D0O4(LPU=`QAYCBD<4RH1\4AB$+/&RG-!W"6[1S +M`\Q&"6K(&A4.LS+^&M>'%-X,ETFQ1]49J$)I;+(JF>^4Y31Z%()])AHG"%X1 +M"JYBG5261"=2.SBT'06^9GB1V$9`@,0F>"PYGJE3/3Q3/E)H$J$_Q"3`^CD! +M-DL>H36D05(D=P5H)H$0-`4/C[5,#?,RZ+WI.MJ0@0_MX;%T21" +M#K*2PNIEU;Y87@C-HY!Z&5^E;@+2WU0(IJ]-./Q!Z.-*1[A4>\C_ +M(17,$DGO$(M@!C*3!2,F/@8\-453!:6)@M0UO04T>I3X)+R9I@$TH3/IT$[\ +MMP@4\AM8A:6@!%(+:'K6IZ]+"RI%'HD[@$%S#XPQG93(DQ^8-)&U1P11;F(_ +M&[N-4+YG?TNQZ68)H(*!4'$EZHX:.2ZM\N`*0S$K +M_`S001U6YX^B\"C7M$IVM'>!2^),[OB4/`D_6^T2;^FQPE*',]DA#'U.P6)Z +M]`20/;%052:26[Y;'[0`75S+7.REZ!.N:]5Q0--,D+HE2\W\4\GP,*AV8UB] +MT?J47$<%H.U+:X!-J6/!3O'^'ZI8BV0)"M`3BN0H@H!,202!+]U9HDA0#)1*E.;3\1286MJ8@-(2@R5H%-\O$4R;X +MG$'@0@M\Q-BE8DY:Y6P[5T7HEP^@I-],I-!7$$A&A/G<5LM08I%/XG^",2W. +MY\DCTI-2DT6ILM-0FC8F_D$\(M1XOM\VAQ/9(5-N12" +MJ&.T$09R2_[XM:]P`4\DW+ILKA*4^Q\!BGB[!,*(*YM_`J"V("!3KX +M=UM5L"D)C^Y*;A#'`1KJ`\4)MX&`$QQ;,G,$HDY8&YE/O%I!594.W"MGL@0,YI"O5!=D=&CE)Y`EK-IEU` +MD%*@E,^":ZP5DR+I@$/"CS`"%LC=3-0A-!HWY;'P#:4YA*%\-BZ)7@!9AS6Z +M[JBJ)Y=;"@(%`KG!Y&*-0%$15&>K4):B2,6)52T)7(*5:W.J0I8C)264XA)Y +M26-HIL'SWP45%.),BZIAXBF[E7UI1!Y&_EQU/-@E;9,!<(+("0H,3YY\LOF@ +MCX1!HJLM0.HS"=);ZI#GY@\H_$2?=H\*%CC5E>FA:\`L*D_'T?X4\2DV0Y$V +ML%2TH+R1P))4*$ZA$HBK[B.N?O1+)@+`KOJ;A[)^%*GDKRM)-?%@%-RK_*WI +M1;*?&?%9Y3MX*LYD*,DNA;G)2B*5310E*WI+=`%A$`APL'F](\$.DIQ0GI!W +M1^N6ES%J:%T%3YPA^-\)!)TCMGSR'/+&IX6Q;L(HB5%/(%\$S]C:5OF*[ +M,(A9<$W`E?/7:\@MB$"74ZH*Y`$,S'EFQ"9<#S+8-%\TFF$;6"E2X%E*^U`B +MK@"ZR%F_(%6?P!BZ'M@33%-@!XI4$L-6^:-^&P\JHI=%30(:-$P!5K3J@=E; +M"WKS!YUW4]`)TE;G7')7254-+LITPM[,Z!$UU8*Q65*"#X,U!R+DV_@%/S+" +M.`HG7&H%&@)B^I>*BH\O%*DT"7!%PS,>H*F2\,Y-5*J7>KBI+OE`(T3HJ*G? +M.@CP+"51%1$$TMI+:F%HE!.)!8T!3.C1QSU9W"*+Y%O4R5+L\H8];%VY`L47#QJ5*M![ +M8"%0K5%;\6P29(>TM4;OREP?/5 +MU5`?J()IL@4S3RS:`4/F"H)"=-45.U6E2!/)*51$`+SJ+P1+F;%`E_*5\]9N +M!3<\B5BE\I-^LEG-H*QEH36`)X>`.@4XO32$+6PX5ZH6">I@5("A/9-*7&%" +MX8SUO"Z?N02_,2LJI@$7P6X27`C[0I?YJJMORZJMC]5?E-=8/0%Y9Z@X+/23 +MB_%(P5M!+%?!:G[&C42U.@GDQ@>0]`(\C@.5Z;[SZ1]6,.5KZR%&" +MW0-`6,M1<2U`#Z^@BD%J>#B?>$Q%0\IZ(S"24V0F((BY!]1@^1@)KD]J`SUQ +M^4F2U'+Z6*U/U0(T;Y6F1\Y@O([&J4[:@@++9/@5C.6T-@AH@A<1-.86%=\M +MS3DM2X?5PU[#GML$M2JKS$-J4($MW^JH6`Y,RS5ZRBXJ+(E1_WRLRA"M*6P% +MD2URR$%<9;'056\574F%@LJZ+14,UN;'J9$DMVDR6UB$J.5/:PGHG&IO9" +MVLH\\+8@6X695>E+F%74"S^%=2\%(5G!#L-V)55VTN5GT'1#!:W* +M3EF958:D+80?;#[E*N5*&\E^.,N:GR-EBT0?6,$V'=FIUI>`'E$QX'8OE"B3WV46?%G_[;D"#,IHY*')-//$$TW +MG=,3D;5$\2MD4AD\H+,_6@]F'/?"R>AP@^`9=JQN#NEWJG':S(3I2?5^&(X" +M^'XKY\KJNRWS%#M<4HX=$[ANE)=US?!DKV[1'"7X31!@C+#'WRJZ!)]M +M1A)TK#'86G*VD(D"%39OQX32I_WL"]/+D.:T@]%;Q.=+>W;BB92^QM-/'.=& +M5T!9_E^W7@PPD&\ZY,NEEQ*',^E6Z'PS+.I2^J_X$(+?$@84OX@TT7:8A^)+ +MB&BE<7&H>%))4I<,GQ*K`[YBA6[KT +M=;YUW4X1MA>`IZ$\?__&2;K'$0L(]HF4_ES>IU$]"Z39]8YY3=E7,A(:PQ@= +M&EAAQZ6GU]#\@Q2\SP+H*=>)D#8Q`-)3@)*_609T3`;.I+P:4#S[.DCUX>9O +M>Q\@D+A4@:*^B2D#83R5Y3IUY&^E)$ +MFGSYV)-(39])(B3SXI'7\F`HY74GP$:Y@@;<:P2&H:*1%YJ=:!`&GP,TN],'(_7;%)HJ*5""*P".JQEE%6":YF\_SCP+IU\6N +M!7Q&Y-3]U8@E,CML#CM418KT'#2/`'+2=DF2GDZ'Y3OX^S"S@)-04F(^MET< +M#EH-&Z9;2UZ"(*YA8"ZZ)C1;#75E29H(H28`GL[Y0)($N]G28807\ISTHP)/ +M`^A-'.I.H>>C#..;"BFDOH`;?R=BBJ"0%0\F,I3A +M.\IR$C(JQMU7IQ2NJGI-G/>=>`\^KN +M`\-'(=X&8P,I70P^ES9@Z9:]4P>9T1+;+'L3+M0WR<]X`]!QF\(FX/O3]:5_ +MCK34]"`O+)U,.H\D%`4M+,T(&J.7((JBF6X+-/W4H# +M#U*,K;@?PPKAA>C2G9+:LV1S)A#P09PW%@)Y-WX88'+'XGC++Q;:"#,S"J,D +MG!/U>C[@G>N_K#!Y=V$9D_*_Q=O9&\HNZ8FZFJ_"B2?@Q,NL0.4TN]2$]22- +MJ8]`00W@\ZXHO(]Z(WI$A/Z!S=II<1+54=Y1D[N&(.'A<1JG1$(FQ=!"&FP@ +M4:4O,([A,'S:DRJG2+RN:E"4S4;F:T+0A,[DG3!-+@3Q\:Q)-'QX/?>@)(;24/"]-=A7 +M^A2+(-D]MJ)/Y3'<7Z8/Z@75Q;K"OVS&MZ4_5Z*QY-)UO.(1"[B[0PG'B[3( +MF,%Q?Q"6:DTJUEMCZ^FFK5$P!7MO&?KK2'N[

    +?-O++?N5!J' +M+):@%)CS>>5'5^$<@O`/P/,K]7J$J5RF5LCK(>!.((7*&DJ^4)]TDHOEG9M$ +M&IJ7+4VEG.=F#MKH5*R"XGQVZZDUI[1AJ-DGV`R[?:T"OH)T +M\5YB]Q(0HR4YTA"@N>D<@D\*\4F6HGL.9*LF'(.-&OG]L)*;XX3F3R];`B5O +M#%2UW%5\$;)/@)0LG*[:HZ5+(91V@63=`P'E>DB;EOA9F[A^:PL@_;=B6B`SDSR#Z\ +M6^79=LY5U./",Z<$V#)>%C'F'CT_"!,5I=[SR(]GE,"QO%YEHVL2@=G1PUV( +MPF(EVKM]-OY)/?#^0T\GE6DSX",:P!YUX-ZT4^S.A7EZ#G).@!6)X!+5BS?0 +MD%]V^*O-D,AI5D*CCM$,(3JCUS-J%6-(V$:<-(&I)!5+*I\M6Z@\*3P6'_SE +M!:1Q`^0:$#7*`[J2%-MJ\?%;LRNE.Z&JOQZ=+P%>G6A'ADZ +M.X>M678+"`3.YN7V]-K^BWD7&S$A'IL@V<*#+RSI:]660B-;JSIZNK-35@$2 +MBBAN(S7!;3E1GMZ,E5(&C=Z\@O)GO5M[J3ZS"R6=MP?9`@%+0#1OJ8J`M*<, +M^N]1[/TSO%-4V#;A"0D?QH62E3>3\'M22!47-P@%\<:$4TWV"()%RJZU@YGV +M'N3P03_Y-@:4G8)+]3!:/E!0'=UWZP&;+\R@Q6`]791,G:O+"(C_;&5@PU.O +MZ-+B'CF>S/2TI^NN@JNEB8Q;O0NI6>*^E#U2I]`G)5(N'U8K40:GZ)+Y0!+ +MDL^4IG.`6*R6H+/DUE:B$05T4EARKN>O7SA.9GV46ZF!AY"-AZF9UX6.(;WT +MND>"S`-0M\Y*A-[/]Y-77P,OS3`EV)'Z]L1\6N-,KP("FLQ@FHP2KLMI-V3N +M75];3-KI>Q>H;L;,<2?P!;#(5'!!$TFA+:\;@^E:P2#:[0+M>D_^`A21:!=J +M_)[@BT]6'`0<5(4XV)KJQ +M@GN^P^M+'(/:@UDU+R"D:U>"^I66][T+Y5CV +MJ]X]>J+(^T7N,)NL2[L/11I9.@1R+2'D%?0MMK+]TM'!>QR[T8&FSE)\!$Z9 +M]=Y`,NV%UB+I/&^E?$.DJ[45Y\&6M9"K"/0N\(:JCME_C^V&.K"E*6"%Z4V: +M76)Y/'M.#(P`R3@[-=99/1G;\;P+-R2QRY^R]Q,`]V..D@VV2.C@'R(-(PU& +M&K'$7S4N"YU+3,7B8D,0I-W8!JF!@4._J#`G5.B[^8,7+S3"./<*>$9OS"%T +M6OE$!Q!I,7IG72\SL@SE%+3/7J>D&239(X0XJ/H<029EJ+V&B)-$S%L-9%*L +M$0F]+O9A+:L*%D4]3EA:RYN8-/=[T+5\->S;\;'L(GL"TD-V1O<'KO&^`WQ& +M^0WS'BJ^:X&RZ;OCE9`J]BPL?BK74_%A_M6+`6N.& +M/H_^T+`M7'(#@VP["A:(]=MQ`?2O+?P +MJQY#]Z,5;C7`W!FQ)N5-T)OTF]Q`0VIO$-Y9O6-\1JYY1;L@ZW&WPU[-QQL8 +M;S4(G_$W@(-^K0H1NFMD;]9N=-B37LV]&V8U:-[WH0+`[>F^9!_5?-#Y1QUP +MC=J;0&]4W3F_:;^AIW3/YZJWA*`6XWS';RPK-FZ$T[I[0`>*KN]6&_$%;LZT +MYK8@#N(Z$34$;ES=4=2YO&'=$W.JB'51N@WK(YG-M(Z>0B?[1S[5BQ]H[K'7 +MZ#MJAOR:$':C9<$=JCD?O-<-C0V>I@XF,*PR<'&QT/%Q16:8A(> +M)@XI_R,''-GI,:2]UC&]LNK8VH">`CH*!?X\2UIDK_ZL@X5/9X/>HZ/@H>*O +MAD,A!\?RZDH$;DN:8@V)A +MX!.12%#U&Z-6?9'E0=;B>_HP91.54S(-J;P&5N2I];FRY-CKN@BZ58X(R +MQ'H[YBQG;_X_(RRG@[-9SM^!"`>QSC81;U0HQ!WU2,6]Z.5?$)/GZ-@W^"?H +MJ#RD>_0P,8.-5/[W3PFR/D/4HX.*@FN+A&LB0S95H.'Z'U/U1]%P,08[A;$1 +ML4_Q*=T;&Q<;>$>#BT<)ZL!(UWQ6%4XR$5`EF.IRA8>."!'S]^L0(%0E'0?L +M'>$]3!^Q``7T:_J&7Y/0/L1#QC\0K$V\&HI4+C$_U/`(LP"DF(, +M]=_*P'[I"0/WP(,?O%-K4@7KP$C#A1*.[(?`FGR,'D:B*20,F[Q633AAX)'4 +M65%&4J-JA2!AX2'6#0J@W]-4R4+/'5G\AE:F)T#MJT#T9&Q>344J&T0%N_Q4DH-AXD$1XXB-@3-0,6"N]"D`*T<1U51LPT5 +M&@'X6*A\J$<(1_0"20;V":"3,4[OS]5'E4-7Y5"E%ZEU3K%R$+#(XZ)IF>21 +M[X@04:"0\6J,=[80@(>"+2/U>B!0TC!ZN-0[#QYVRRW1J@[VD8/#P_5AE#1C(^2`2JMYRZD9HZ +MFFO[F`J*9$QS?XJV1]3)L')^J"*?T9)U"V7``JIG5*`Z#>_A(T])HB1J.V6J +M.MGLW=\%L^(1RA"//GP'$]%L\;XB-AP--4N'KT!TV5&C]"*EV5_!RB4:M*^?$P#ZIK('UH(D +MR',@%!IBA6!,A@9Y,R#,?@=\3[#^6?C:8W&7(QO,N9ET,NIEV,<#+N8Y&7XQ +MS,=*A-1Z9@#'8QW,P)F",>#'DS!F/1CV9A#,+4+F/IF&,P]0>`ABC,6$0,B`)_D3(HR+,C#,D!,QQD>9(&R)F4,DC,J=H,ZE@_`:N*M)(O@J+$.1_Z6%$[L['"(V6%+0B7%+8B8%+ARB'M>$+0I?$6M:%M@$;Y` +M`PB/MLPMU@1OT'=C$<5"%LI!K2P&JHUJEI?5^D=?YIC1TJY?TJ6L_E37!5K5 +M5^EP>B9J>:.W3H`EXWU+3ZP4*<`8ZG^-/U&_K_HFJ5Q^M:H%QVVIM%1K]$E" +M&TN!VD;*TB)%1+0=V\\_2H\2P9?X=_2Q7+ZNF"'&.U+MUQ/!/Q0I@?X\B]08 +M7;^):TJK2]%SCNLH%WYLZ;HF#'?>>7FMAM]8PXE;A=:EL7/ +M=@8?-C`V9Y'TFFX-"XH@N7MWJW"$0?=32HJ6:-[X$@;/;P'2C72;/0K8K:TE +M9*B5+W4M^NESXJ+8)7GR.,8E>G)_2XWQ/>Q1-D:E.MV[F./7I>1;^#=)VUT$]9@068['2YA;DL[\E. +MN:ROY/N?D*#1Y$3INHH:2^%+P4H%B"[]<^>@I(=+F5NCV_"IO)Y[S+:6DS-, +M,DG0BVR,#A)WSE+2)TL27^DOE2_SYF'S>$)0IRI<[\`?3\"=^"K-5"M$FU2Z +M;(B#W7(IO8M^FI$-JL`F*,KM,WL/IX5>TWG2>";O/:38P3=B'CJE[O43WX5% +M2)*7KTB>G18O%3\']Z$NK`T_J]8E#2Q[WX?<4[4M3\`>IPTJ']T_R]L]$P0J +MC@J7P_F'=1I2W_8)I4+`'U=#NK[1$8KZ+VSSZ%PRE,Z1EL3[,H@_@4'`WIGT +MS+('!/J,&,\9:DPE*'[0NF=`RUF<\RQF,1=I`Q/2L(.)V=`-_7#ZPE@1(=_? +MJNL99?[+GRNBZI&(9\ITP*UI_ZUD1%?/[&^I4;=8[24P72>*'\`(2&`%D$P, +MQA"96@%?JD1'$'8^!D"P'!=B`N"'B;P;GB95NLR5.3K'PLQ8&M.R7_O+BIBJ +MI(;_S+DS_"71Y=V;JF(%XEIHB(^E("OY3I9$1B#E[AZ3?/52@!+%EJ03'_2; +M*LS6`.J!*M[]NULA)=?]WRE.J18:)5C;3QY:D,I%F$_^47'?[]+_E(KQ&"_> +M"R4LU(9_OOAIIHOC2ESP$ +MR57:?/="X[8^JL+?0LA__N+BK`2AW_["Y]R72R7:#'DBSL#*4"?I26F*BHD( +MW"X\#RA]V]$$GA#;-!]\:6B#C'/2=SIJQYXE;'T<4O&5)P_8A5-4:JV;%V(1 +M11JWHRDI21G5`E#:@%E=U8<@:FDIIQ/,$++*A*4:$+6CHP%OL77S]4MQ5!=Q +M_ITN?[])^M!21)F8%FTXB<^9^()UJ/-TP"].:17<55*EI&,143S`"N?"Y>N* +MA*,_HDJK-?2^@OWW(*1IZ$-JL`#6@,]W"*.@F?.`)-@#Q2E??>FY!+BJG_14 +M5471=$+DRD0_NEY_;/7<./+!4OFVMQ+&]*E0^ +M'L*17L]D\GLECY2)1>A6YT:N!T2MO[&"++B9_OO@O[__MFE5JK#OK/]]<50O +MI\)O#!?L_[ZF4/\^:+\@Z?R8+\^:::/[SW^]2TEHZWB;4M%1=='13]'0T;IM3>GZU426C3@]#8LO]%0-B+RTZ>9M\I(4VT/6:!91U43 +M#Q.?S4%%;*%>H:(@S\Q(KGZ1*C)L3=$"!Z41)R-<\T#Q19U[(E8$.$AV+22" +M^(\++L`4_]I<4BJ*AWF8O_4N0%WNRZI>S4EVE[*HO-Y?A8&.$F4BVB!@P%V4 +ME&N`UI*!C]V],)?IV$_B7"&O!QKR)?!T[#15=E@8"VR=:,"#*5/&EX[JE[R6 +MNA]!@'&,>4K,RNB?(5V3M=2A')I%021B4*Y-^!JHOKH^Y'L)#;RD=%'ZU2KZ +M*AI?4F,%'3^&/K!QO*V9[1U`K@Z72VB5*6Y1&?TV7[/T)$N8L/9L,-F:YW:= +M?GIA'T7@KWUK%U'-PBD,7:-<]*#%:"/P1VAP3],K+5$A_>Y!2%NJ_RL`JV>3'">1A_68 +MNT>6<0C%>P17QIIHOOL@'UJ6R_OV]B#^BF(ZPZ>$6M:%OJ"+8*ZHB90!?[$=@=V!&`0BOLB(4 +MCID$18ZLG +M1RRCCEF$84ZK0B-'5LZ.:X..:Z(PQU7A$@.KYT85&Y:/>QMR.,4.;QDD*SAQK4$&\Z,T:V=O/"-**SXCY +MQ6@$?0*^,1J16A$?@*^01KA6B$<(5^2$+(L%_-``F?T$;$=^HC:"M>(VP[]A +M&X%;`1PQ7"0=V!!SWYUQ!&\37%30WC".".Y0CDBN6=$A8>"S^O+A]'=$FB.Z +MV(KBX=M?&+PIC$6(4R"&="%UD0T$!QEA.B,[N(:@94@+.(%JF>>(G3KH".<.Z*$;C?Z'#>D(L`KIB+L*ZJ!JRKMQPWK( +M.Y`7KCDSV!%F'=D1?!7:$)!7;$3XKN"&L5W1#R*[R$T"17WT#@(S\"#NF?". +M&^(C6XUM'7,0WBN&(FC=V;Q!4X(=F("P<8&;-"N(FB`KLQBR_IC#F[TW>&\PV:-F4UP#> +M:(X0J7$<-!NF<"&B]N'V^&X(W`(,WA!WQ`CGF\XWA&]$=QQ'](-SGI"NF(M; +M,++4F&PU>L8L71%T-8#5]-5@0PBF,0Q"JR(9!5;$5H5>1%X%7L1>A3B(O@IR +M$7T4YB+\*,/ZR5M0A$,?Q2T(OR"_5;&0`I<0=V@0NBAJ\.;A"^*&L`B:07X8 +M1G9%5@0Z(#5B$00YC31RR#CFLCCEE''+,.M@BM"AM;'-8BN"AM=$5M$>K5KP +MRN"J^=$)NP#CEG$.J$+L(B#'6(Z;1%C%#;((:EH]5"RC+:*LPB_H2ELXB$'( +MQ&`0K*[0,A15I$.R`*T"(8S#VQQS?!#R@3=]$9$]G..0`)E^''./$/B`U?Q$<.@$'QN0$/J$5Q`B/'1*#N<')G.CB'%^(<0=R +M3HYY0XYY8XYY@XYYHXYG!QS.B.(=@(U8[HH.YS_0XYZ0X +MYZ8XYGAQSU!QSU1Q)=_V..>L@KK&]<<-[!T0:]D<QMZ30V]CAM\'#;Z.&N(C>"G) +M-#;\(3(USLX]C71-#74<'+S88N.?MWAC974N\N*#-5OOQB;6Y%_EOJUO`C_2 +M>J7-SZDC%U4!.JAV]4WW9@;#"LNZEY)&GQ5# +MJCJ_5CGJJ)`#@$O=Z@LX:';%$_2^4C^7MC(3;_0->.<#P>:OVG;$:?\WB]L] +M4AW8J`G4,%_5_Y>HB?_M[2;H3X'^3)REO_N)8J>5NW\S$!6$9LR0+6._H%WE +M:(R'*SVYCD?OHZ6EH:&CX-6IM=^K-^.;NT_MXNT5$3TSXN?\L/G\+=2DQL)> +M,[]:[[BX;.B7>5B/,985%>^HUKCH=??F+HUVM4O/ +M2^-6H#Z]"EI;BE[B6>.,A[3KYNZ:[Q>V>ML?U]O^"$L4Y$[;6EVD[;0J6:O> +M=KK&?]?P(<$))],6^H@QZRL6K+)9`^J95*>+3TO3&=(?T?^XY>[_WU?\+P/Z +M50TB_[/G^(?D/\K;&?_P)B_\)==CV/Q)T1"2=)MZ/"X0NPXITB,%0#P=@]H/ +M#"[3@!)V)_M=HG^J@Z51HK((HO$V=)`7'Q*5SZ76[%88F-DK+*S5JMURN5VO +M5\RP&,]A'BB:MUJD_1BMJL`AQ5X?7ZNX,*!)&>S^>R`#[__M? +M_;-WWWC#O5_UB%5?(6%3<1"8'Y9/)U4594X.\JH>WHA_3IUFPFJ8:J0/9`R$^?NI3++59C_5[!#I=A9'JMI5175J'Y`DZN??V4%/ +M1I0@WL?BS#ZR,_8F(J0(@N1*J>9-IBPNR`G>PKC^&_MR^&"]4^6DL +MH*(!`,SP^38#.GA!6(9[KY[4=#Z8>P+X1]N?UDG2GIX7A@8/8B'8JL>'_1^A +MA]LU_R&:65,:S#O60.J[X151T59+!N]R9'K3\V(SW1/NCZS=6$=A%T5@9^P1 +M485@MIV=/1"ZLZ3XK%HY`UZKK4$<_^<^B):6UQ=7O654F>M.:PA5.N`MM;8;<6T2&0WP\;P]\-AT +M,;M,JF14V*Q:##WL8L.N-,QS\+,>3BGQ/D!`U4>04&8/V0A>3PA^<,8+W8?( +M%Y,$'YQ)^[(U+C%189%QINHWV2,C`1$-DK)?7Q0ED")8\#*GYZZ'0_^:QF$L +MK9@_]Q&3UT.M*IL>G:TF)OOMJM9WFB'_[3!?SK0O?6QUR;3M.%UN1CKAG-K<\&8;@7L6\%A1:([#1HT:9@+\ +MW.#:WMHRY-[<"S-V=;]A77$#,6UTY-9[F[WYYN5V;SJ[&N`MI^#KF;=!;N[: +M*/`%+P9<[DVG3>:?!RR?'-V;A;0&Z@:Z';(#D^.[X]5$ZB2[M:8JK=O%S=!< +M7*K`&\?-7&+H+FZCYNQK@;=Q>%DKA]F\7-T%P.'X;QGQ55_J8.]_?6O`N[XLMWX6WQ!VPSX3ZUJZ`Q]!L\!B6MUPV%>GMR3^5-PB +M-.K"J8'=S3=G-UJK^A0M=WE[]D[OJ?SH/A1$!8\!A75U +MP2P`54'1])TNKPGZZ!`DV\"Y*<2TKCK!/2=Q!Z=THN>4V+$0?79R=UD@/M1G +M@G1?XHQ6W>X.+C(F#MD.IX=(.*R+_&A7DND@&7SN#@X^&@X +MV)I[@HXL-5.]^@XF%AY`E>PZQ4+$DA&&3^#+9Q\CW_U4O!U!\'$/Q-I8^,=I +M!30_A`TZCV*&6V'>GXD/0\"_)I4[QY#.)VDWR2PWJ\48%_C'\L\16!V8*+49 +M`#%W%RXA&R,'494Y(VJ_1<1D7J)MK\)?R#6J/[7@Y**IG'1%5?C'N+*>X-Q\ +M9TPC8^0A9`:>R?RV5MWF#RD/`Q8A2[!#4R&8MK[(1L0P"1Y&P09B%K(A&@!Q9L29)#\JH$ +M#WZX2,@W\[N/:B]_3PR[5@S,BLQO5`@>ZJ$Q4'(F(9 +ML'X.+A#"9HJ`DY"!E_6#_?;ZKS`7D0S`A5J/[\",D09Z^8(%;LK=R9 +MOT`WN)T]X5ZP&%!F[(3,<8,RIB!BBN.AHN0B1Y`59X.U/88_-_?#U3- +M\#,^#W&8:K9P@/:P&5AXPEC5JN9BY^\+]!WD?S1L6ZR&4_F7H*$AGPH=]RP`DIJ4U*:E-2FI34.^;2HJ +M$;4V8NV^XF1:H[V$SE3F]!4]`9LN::T`>6&V`JLAVU^/;YA_/WSRM_/VPH&P +M9[@ATS[$B?$?M46#/_00JR27_L0$'!&AGG0=^\CQ8,D`VU07L4 +MMZLV)%^C8(##W"CYRMS5;UB+YWH!^.CW_>Y!`3Q%5$$:#?11-5=]@/K(CX +MFT"!HDW2OX>URF5(3>1?SRE5GN,>`=E[W`!4I[+G]G'>W*$6FR0C%>=):QG+N=Z@SX\+,>(L7"MTC(L)W +MH")@U8#V-`<(-AHJ(4]R,54YQG_;JQ\IE?70[/&(>,4%86#42A3DBH4^!`0L +M20BR9UZK(.YX5S;[E5(@>[J25A8^J9VP,;8U!=/ +M&U=,>++26)O]DEB+JU"8CA[&5,E1C,/455E"W`9A%:-K9M<-#W?B)BBM?$6`_NHM81>[8A%C/YD +MYLI,4H0M\I.#4M!A^$B-"&$=VI#%)R<-?:C@EE<3-O0Q1#6,;$.+0.+44H5\JIV5\!BK +MN^]S8]H\X+C*QT?!*MY]E(]E9H%?EFJ'*X#]2'Q$A,NM+$\%I"?5G0GW9$)^ +MSE?33`FF%#?6$'MB%WKZ$+.65`;LR#FJ016T'>T&HT-]T'.1KF@W>T(7A3I\ +M36(0B?%($+$CLB@-8Q!$$:@6J\@`S"!=YE#?FD'^3-S:`GT:"+>H0;ZM`@?> +MA$-8;MD"1QD'^<-9U\\RN,#^OH?57S#&!?'080GS^, +M)/$Y#'$IRQX0P^(&$%$",((G,80"BQ@V.,+9CRU"&%)9<*-P@<.3JTE13%'W +M<_1OA9GZ?-_)V-#4F/3!JD-Z/3BWCQ7@^FJIP"_RHDJ9,"2T!!>GA +M;B4?X*)DOFOZUL8/?U?$S)PE\%.[RCD% +M7@MP%HS5T9+3:HX_&TE&*5:D";]@9C*ZP1QE;#JA)@)-N"JUAWIC,O@D_8,>'T)!L.J/GR8,PW*3!FAE^-ZQJ^;B +MS;$;\QKF;E3;P;RS:X;D#;<;^YI#@T`C`F^08NFX(R9MU-XAK +M*;"&VLW]#2'AG1%_-[@QA-QQ>SG##]8R!-RYM\-Z)MC+09'C8(W1M9-T)N#- +MHT)\8016@EB3'9(0W&RXI_$6@W[341N9-J*Q0BPF_**DA%W-Y(J'$6TW9 +M&D*&?$.YOB'8817J9L"TB'N0$70WA"H,1:C?R-(:&<$.HSM"L:(LIOTBO@$7 +MLWGBLB(:S?X-((2HAY-H1Q(+7!DP*CA#>;,BB'5:!GXE[#W@-.=CF([`KWB] +MIDF'3#O?$7DWFBH@1;S=J:00E!&"-\P[$"+`+O(B+L;QA4*(MANO-)$/B$8` +MWO#GXO6N3#J!WPB+Z;TA46(N)N[-3/R"'HVE_X4\2PN=6;U#=&;R#=B;X1?# +MP14;LS?&+X>&+G\S>V;]1O0-W)M$+X9H7.L-[)OSFSANV- +M\XOAXXN?V-[YNI-Z9N\-2I_KJ(RP>G15Q=K1EC]6S5I=4GV$>+E>77(RRFN- +M/]1>SCQ:KJ[:#+(:CK:ZHOL0\8*^NYE3>!='8M!`9DVPB6<6+XE>%C^)QXL7 +M!*V+&X2VBQD$L8LEA;,K1;<+4=)[J&5X+8+3HQ!:'&,.`)9#:R8B+;NX<+M9 +MC0NF2/0NEA'`^K#Q#-D$+O[6;P8#`4H:+@A;57^](TP@DYRW;R1V5P=`6PD2 +M_PL<3`E55D751?C8%0=#QRK$K]2($\2_40:I^B8.*A5)1;5 +M^5>(7![FC#Q"V4+QX +M`:VLA>'\-&7Q/-*2ZR#^G"TNTQN-7BI4_JBO*GGV<'+%P_6=UZSN0R4(_QJ, +M_Q*?5,Z"6PQ5.ZLNZJ*53S4_-,VK\C<'^L][^,(P_18=]D5_Y/)D(RZ?A`S_ +MW:6"U%RSW0K/W[?HR5FG^9/9[G\;5A_G+;'+K[7M^SH[+O-%!,VVLOB +M1[#(.V2W'CZ3EN\W\'+Y]B[?6_K(X3:ZV(@LKZ("D[G! +M@]`]8Q%7>=$KT#`WMEH?*R,$KP$<5><L!RUS!4 +MF<9.3$;2L?A0ZW:72)T^ROW-X.YZ#CZ-U^G]Q,[CBKWR/S_1 +MMYUKO!G2PF8PDYP*^_S>\VGD_>T-&^V>'^C2_QQV7\/YV^HVZTU,&>77[9)@M&BQ +MD#V/)A(B(@'^)LDZVP>/+9NONZK;N>6Y? +MAT\#.:6=40[[D??1>3F\K(3\.YT?.BKG?\]"_K-[?'\^.:UQTZ]E6V]^>*Q^ +M7!RS)_5ZR2Z]_DY+5L9F9BW>=1L?!M6TAL1L\Y%HV'EPFXU/6?^-6?1TL=I^ +M#SK;:=/-[#]];.35@O>SQ699/W;+SC/YVWZQ/\;U')[?N[79[SZ6/J[5;^GD +M[&/N^`YG:_:1Y/V5ZU]!;O,%\U\R&19-;B\AE6+CUGK?8E8 +M=);->96-CJ%_X'32,O@Y/W,'Q0WB16:EEUZ'QN(@//PX6#S&2NL38>RO1$5D +M['RZ6>M_*S^+RO/9N)@?ZA8OI[CT>CO[O0N>[VU@YFAV&/2?=S>;E])R-7OI +M>=<,+XNF]>&%W/(A<1NOQ_I>VE]P5UV3MS[>R3KQ8ZQ^WFP*W=?XW[4Q?SLOEQ?[V];VDIJ.=<++K^E[VPEX+ZK7 +MXH'N?7]V0D*QI,BM:Y>8?KOMUK/;SD*OQME\/'V6`GTNT;;)XOY_G02_\<)MTFS?/Q^[]VE=NLW_ +M&D7ISBVW$=)]WD+SFALRL)L]O@7_?+5CAL;\UOB[==MVQ?OJ]"QS%CZ:[BY7 +MOK1/&HUR;K'8'FM,Y/3!H.=P'?MI^CSE]?M-"UR>HX]DT_Q82MR^!9FCG/G*C/)E/EQM+M.;33V339N37<5I['FF?7&?5T*%KV'T\.ZZ[&XV1[%DB8E+T[ZYRW_/_+7IX]O4 +MW]T:N)$1_`G_B:WJ7F;(^]!%H*]\SCN:S*R:1H_&7YSAO&3?ZIP +M>/)N;1\FLTU8XVFE:XPF<3&.S=..LI`4,5PGSJ2+[C=S_%>B=5]W-OLKGOGK +M.FT;WIYSI5K7<2:Y-#U.YI.'0^7&3D!&V7L241TMH^N.IS;UBL36ZS7["T5Y +MEY\8X-/U.31>]9$4D'V,7V,M:F'AXB"<)O!_=K]&BZNIT#/:.)K&_'TFZMW[ +M=1I_7O3=]_=KDZWJ8G9,.=_-I=N#VJ\^3=MO^7HH:1@^KYI*^W';.S3=8^QL +M-ENENK:YXMT^8+9RKMA8SI0]5P^)0W702> +MY7]'].4?=UL;O!ZS6X+3R=YK&NT]IX-#M&'/^_5F)\E_XM]YV1^. +MLR\>YUO%^-::'+M2T9$RV8]N<7 +M#:=)(N?.YT3B[,]-=>?LO=6/ZVNQVS^K(9?*V9I]P^-TGJM%`:^4Y#YM/EK^ +M_\G]8CR=_??-K)?O\S3<[S3^Z7]?K96R;:(Z3=]=N[]NSG=DHCA?H[1G*B[' +MC:!LMU_ZG4NO2A-4O[_X8%]2/MI@_&\]?Q[):^^7UUCA='FVVUZK4VW;Z_?] +M;T:GI4EXXGCYOOTB3C[J(UV8I,7LOHOC#J=E\+AF_SV#39+AX:\OW2Y7^W6: +M.D6Y?_?J1CMY9N(PEUD[_E9'98V!PP-;TW[,31 +M*[7@1FJ^S/N6YS=_QK0MK\2X6+?7VO-VT,EALSPX!X +ML^_<,SCO(T:?[-96=GT=-7ORL9C[U\6W/5']$!`3DZ^27&L#UU'?#Y>A>]*U +MSGO\NR<2`KF@E6O"[G37/1I-S9YOG:I>[GCR^._67@\!%:-VB;CJGR0276MW +MC7+["T9!]:6"WP=]K76DM9IOP=MU\D)8]']]LMV@_F>W7#\6KE9OMP%1EO6C +MO]CG?SU-U7:.;UC)?9/06O+[+1WW<-,W&4%>X;_V+]404GO;2(@^CY,7E +M]_=F%\[V3<';S['7L.W\&IK>K;^)?=!&TC3I"=(MY"7117+S:WBMW?UKHZUA +M7^W+\->V66E5S.5]Z7=OA*Y6?DO/(9>;G/G9.IW\,QP7HL2@G23K!6&O45B] +MX#&,49]UKLF`X/6LMFD?ML]MLN/LWZ,5QL?U/_=L4OT_S9_+M(>P\#Q72MI= +M/YZY^-KV-:T;Q',U=Q=ZKS0VTM=RNAV]?>>ME;!/7]Y<)RX?)=]#\O!O.XH& +M*\7KO.E]8LWG;YA;QO;U!O:U>\38,==8OX/KNUUF.?=$6N9[GF]YB&[9\S2M +MO:B.5=\'9WS!24AH\#1P/2>N&PV3!_+ML6\?A_6G>=/].^O_[>!>P'FP;BZRS3F +MG1TN7%%]A5IOPU\W4AB&'F[;#_'O:!\W/Y7C"] +M6NY9[YF7W>$27?JXOIOB/WL[W83%;'XOOQ-ST?;QJW16W&8MUB\=D;C^K]F+ +M'=.IMLEYY[ONQ$MU;BDY6>[L_H+K^?;_G&0_:\&WKE)-HB?GI=^R]NY\R[N+/ +M-<3#XB7HKUI9C[ONG$<\CG>+8N +M5O>.U[A:XSCIOVTTT]<79'Z,#N6[ZO@Y'C^EMNF?E5]^P7QX[J, +MFAAY3C_)W/LS&@Z'GOTIFG=)I, +MW`_CA,Y>&>P?$R1O,SNJF^KKOG_A'K>,N0GY>B*^_\\ME.WK\%6[;^U;_2+_ +M6U3/Z_HSYGPZRX]MO_')X:0^]RONV_#?6V@U7C<[QJ_RI,M]WV?/N_MFX[?; +M3LV%>_?=ZQQVN?XN:VS'T.+LKSL679P#*[['#09\V[= +M]>CW'[Z#I;J3GK)_//QV+WG=N>GW9S!PNZV\IP&'\N]^VTK>(^>`^2Y>#I7; +MHOT1:MPX3GV=]J_??Z!Z8/@@I[^8M%\2*^_T_UUDU"N;!&R%KB^-Q8SX?UTM>9ZTUT6V^^ +M^ZB;9_BMB3CV*_?)'?;^B.9V'!P&58+Y^URU7O<#0L^TA;S6)LSXME#N#W<6 +M-^[GS]7P8K.?%\_7O?(^+.P?[SUX_K%O7R<>^M2C7.LW6[7]R.)PK).]UQAM +MYA*#5T%O\&^U/SNUN;;2G%B-1U?-%N_PZ1@\LU\&L<>8S[VCR.#F]3=+?MFB +M5W[/IM3JOAMULL.`I/XRR-R6OE^3R,WG2.VMO>)KOU8F^ZUHVNBLK=RO/J\_ +MD./DZZRZWA?IU%_X=WF\?,+W)C-5CMM8+)V,5M]=Y+UTZ\\9SLR_(GLQEX>L +MW'A^_$.TC,?:RLG#FH;8QUMFEQ_>-5M^=Y=/%NFB2\JCR[W"=ZQW;GX=YMFX +MK+4XKNUF>_L/O^[/,=DL6PZ&9^&B:D^58(:ZRT:RZ"2X=VQO6U[WU,8XI7W!VK3I +M/-'9Z4U]?[]VK]`XYI<^RV7S=--GG[0Y93#?1^TY/2G"V&,;[SM<5W<=R.OA +MM@IPP',L/<2Q-HO,`PW_XN?V9^Y<#-:'0QG+U'=:MCZ,)HG[#];-7ANQ-XDV +M'Y-9V(IOL[!+9UDR/XWC:??U''^:94:[<;:[V#`X/R_MX\G:;EIJUJ-!E-W; +M]/9>=\Z/!<'R91LU[MO=ZBI.3^$(Y9"R8[3>>2N]N>OGTVIQOB\+1UUVPQ#S +MC\O.>70\B`[/;VO2?L+H6&7NT_M,KSK^9#;JT;J;[3=T\]\F'@6U_]'-M*YJ +M,A]/\_C_*_.RR+>76*_?]7QA8*]].#C;*EMO&_"M9WW]M']2:9>+SF;Y=;N_ +MTMU_K5A<&C)_AF)"$F9UF197'TNOX\;]7!CN%:?#]^(P&F9^_KKO^M)Q,=6G +M5>[SSDX'/^'C2MK=.BD[PGU7KH76V9NZ?1\NF>Z5L;/HW#[:Z/I)-16\EC?CD:_U+GQFR +MZZ[\W?0*&.Q?5M'F9/;C;7,16SS^3RW-[W"WT7S;+BJQL=7U.M9J[X\S):W!3D/PZYL +MJS(_GC-7+[B[S.719BEUWU]?Z*\TL5UU5UBL)9-#K*_"9V7R7/_^0$C5%5P= +MG8&0E5GQP<.P3@@=H4>$%6/#\L5WF[7@!OA<>"AV!'>#,(\?S7H!.0281_`(+A9)!:=8!+1=#;6R\WLW5Z<-)5?CIH0T(,R=-&NF +M]7*W1^0Q\Z#"ZQ)*WFG=[/;KBT)B;4>BAZM$E]EIB#DY:]L17^T/M/R9^2\- +M&EL[W-DU:<_9$!>BK/(J:^S3]MW+O4ZPK!?_,6`UA,7@AGSNL1.UZ'"@_G\[ +M207R2R"2UE+9]LS+$V-IT"[.,D`V2B8X?`=TX&5;,:5<_UG]1(L^A8W^7167 +M4>F6:S["%J+#AHY8?B4.,=JQ-G&%$G?P*)81T +ME76"56-)$[=<'J&L82T[<=$^B0/0;`B +M1QR"RX:/"Y^(UA"1&GIE#[$* +M:#LMBE]GD-I>6`-F9D[F'6=<78!@,,WD70)+9PB.WQP#G'9]"N:WYQ&Z5&"F +MSKP4K=U-]=I7?+MKX-W7=(>U!?/+4:&R'?E[,E)8$JH7%4YJT[X35D!-^38F +M&NCZDX?'>;'9DWC731D9?-V(#)NLOF:<[MHV*#0\];KL5!!BUN,P4>^/O#$G +MU:0>[WZ:#MAT3@A][[0-$A*_#B"!5&.K)2!J@*FO8T,OH=657G]D0Q`V,"_#W!@%2$[P$RM/Q +M",8@P05-8X^!\C&R!%QW_1=5%E[8&+!&VH9K;1`6Z:(RLO+FMR8QHQY-\VXNDS4Y$_&L6+CG;)48CRK" +M-)%J#5(S0\KSZ4,'$DU!4?H/@9U6]1;X;F?8M12,6F(X4-DM'3!7*F&LF%^\ +MA*U8\NGL>N:X0>TJ+,-*"NJ5XM8J64&N,SPGJ +MO%Q#$LSI7U^G3I!Z37[BF^:]R$S@RS4H"-$8&2@6$4&\(&IXVA+%``X$J"L= +M:H[[KUSJ+.U.5T@=6#AO%X\1)_'*M`]WT>&M#=#4(8'(Q\GCR=<_8]*IZ?+G +MOS2^6@QA]%>3>EJIG+6&JU$8B9[!GARYD)35YZ!3#Z/O;[.A0K&N+%&Z^'#+N(MH?78X\*NF5'7$Z)@/NKKR@W"86P6@HCMY +M&B\*!PXA8GLZ1[C]:F^=<&\O=AY#8\R2&1\][!6'C_@L80$%H688HK3UKOK< +MM90P+"Q65&:EV<7@X<\RXJ/$)#3S)%-O<*@$_GK=>/S]>#&-J[F+#,Z;0\>J +M-7IJR8_RPP("BJ(BY&-DANUYYV1GTFP=S-/.X#D`BI@A9*EXINO@<5230U"R +MVN9SV$0E5EW+=&2:U+5'F+P2PH_%L"%U#/?HI)0XJ@+_+L>4,IUV!R8R\\=. +M@U)$6M'@L<;P84*C1(4++D3T6'J71@TVM;>>$QV]KE[^_NN+7*Q8IWPL&7.W +MZ%->OVQ038T]DHN<_/,!QYWZ12"*1H`P+J^N_$J3!@_5PK*8A\S.(-&<>8;? +M<"$-RJXH@?(^(P2W9VNWS7(^>Y`US$2(+=H(G`*KN[(2N5@(@2HY?B.4%Q-F#_%,13+2Y-LW=)7=VG+=67RX1SB;G<[/=` +MS64E4*_=42P7Z*%_-WHL'22F-`D7XQ\J0S(),7)N16O6JDYFQ>=U0WXU7EFH +M*(]9#D8;[I=KOG^Q/H0%(UE#\ANS_OH7/+HH +M$!"`8DR1/WE1H`52=.NV25W!?'PWN_+(D?,M5(A/>[WB\?H_%1`ASM3#%7S% +MU=DO@Z*&:C:R8,IO6\J;MF%LH!TP8@!`53JX1QO/[`^0@,L.4N'6"_)U+X5FQB@&2I: +M&!JPB'8Z3336/;-^B>69>_BX@Y#>FO/$'@.O +M1`OX:=6QRGG8(FL!JM#*J;2CPU&F?3%OIOR-=2DDBER=V(-J2(B$DY1 +M@,;"UL'>8LJ7&Y+N>^]I>;3-&U^V'MFQ5V_HW#ZM2-NB9R3E&$HZXIR85MXS +MQMKAE2:$\PFBYO216)CP'A0P[XBZ0NCVWS;F?C\8Z@TO@.UY@=S/9%U,T/*# +M!-1OUZ;3UQ.ZS5<"SLKE\_2QF*>",G*;FB[2O04O-`N>+A70L*WNVZ*<'1,TU[M2QT+P4E7K8M*D=*<0 +M[KVR*($<5*A'J7T(+Z26Y]AF2">B*JW'Z-M%2!ZX8>4>-C35(S!&)4<++T*= +M;EA:ATVT,GG/OL4UW%M=.M'G*5]T:QH./>K]&RMUZ?$X-ANG,[:.JE8V^_.9OC7,1ELNH>#\),CF_!LD +M`C\YF54]];YES<+]?9W=^#R-ZA-87Y,BQ9]PK7<7;C8][WR#/*^"D$4'7Y!( +ML[,UU'.J5NC_I6*1PY0+=1>2X?GKB?SLFXT-4$^8+/HWGP2N:^D/'=?0F>&' +MG.:RMYM@;*F?VP@AH>C8.--LY[+4J9;UZ7.0X^B;)'QS&8.S')X19NUKO$KJ4C2>\SRIYO1H]1KA44\*YCCKLM\ +MA]F;83W([!2J6?P/9=RU]?NUY?AHGQX2"$M^'`M"!B6V1Y/@"5Y;%4L>>Q+1 +MVN465GY=&;I0-Q\[Z)207U&ACB+Y?(+"0]["#? +M"AFVGJI-YS=Z4I%$BC:J(4HJ.\)9[C?!J=,]XOFW!2<9RM/#Z7Z2FZF#E`Y9 +MIW[O?,VDA[JNZ;L6J"!O;K#V>M*U]PX2HP]`.J1&G\].C"*[3>M@4K',(F.P +M%T7U5RAT!%?%2AC9:<+568[JOUJKK6?:2/FW_[:KK)B8/>%WWK%*NEX/8NR" +MH;:?$9$K-ZM'W9AO7W=44<+P%)D*U6>JOY@#D`B/EVM=R,N;I:NHY&:JO"2F +MFC:I+;DX8=?6)2PL?T72V:CM;7S%>SU&X-H4@8?P:B:.HWIK+1,:%SR;K>R" +M&L65\F)N$\RW>P_IKP@H@IU1+^7,J7T#41?>D,\[%5U$$!8I>FF[)(?/U!T` +MK<6N=_&0@F"!@L;2.=6JQ/8F*_VQ*#SY;(E`IZJY;![OYH?TIUJQ\17TS"+( +M2UTKD1@5:\JJ)CTC-71>\X5&91[//#1VVPT:2V*EPY'6E*IB/1-9"3'TR!9QQ&6BP)\1M'H)U@BY6W +M]:EVO'VAT9K>:@KE9)%]0ZQKC;@&1Y>]5VP2\0N7)%9L$/$?X.IV.]7`:]*< +MZNETE!:I'G[!A37E3SS8<$*\G2JP'/2B;IN&\'0Z#FGS0IO(<,68]%> +M.YQ48T^7F\Y-]`5^]L2PQ1>>093&*N_5(*VHAW2$F(^E3^I.\>)8=\7J?-#+ +MJZ$49,98OF3M8(V<2+8WZ27Z>AU/9@O(6VI,QY+RF0_7O5;FK&,ND*(MNRLF +MV"L:R;2):CX'O1N2)+2>N#;A@VX1@&?3WILO03^XAW?*222DYGWKU<^:_2+9%I"['[@.V93YAG/I'K0ZF%1PZ+,M'R'Q(^/D2F8;!^? +M,>5O;7<:(]6G6;UP%Q">ZU>Z;,8$AYV*`Y`)!ZAC\OXH4_819?4N>UEE08)_ +MM5J!V^;1U32:BX4%J`\VI?MG/@4^%:[0(F(WNLWQ8EG89516D^;C8FAO;>,+@MNH&)-N)2=^`W7\FJ3?&1<(U'HG=1G%`A":UA.*5P!'PXX1>T4$FAU +M_I/MSJ+W1./HP?\R@34^?O>W+M:GJO-T-0IB&&^(079A)9`DZDTZT?RCXW:;DF67=QA*FZP.#+5A[ +M+:M:8IPSE%A_92)]T?!7!9,RA2^(#[_H;$#J< +MTP+",3WHSVRX+&K3+(W(KT8+!GSBIZ[:CIH/1G8H<@_U#"S@&PK_$;+!`@-36Z-K( +MQ,?V,,3@X-"TR,#$V($K[T,Q`?+[.`L($"@0,!`X$$`02!!0$%@08!!H$'@0 +MB!"8$*@0R!#@%Y0(C`BL",P+S@2`!*`$O??T"?@*:`KD"V/QTG"`;4S_CP)_ +ML"GU%?J+?47^O[I2OQTEA]B?R0X!CPAX`+&P(A`C$"/@)<`GP"M_]>!OG^+[ +M6`H&#`80!A0&'`8D!C0&0`9@`/_6_ZC/Z&_Z$/$3C`#P,_4:^HW]?)]1SZCO +MU'OJ>_5,2/YN4H(2-L,:XUM;`TL"^&.3'_W$#HU.!`Y?;/]Z.'B +MR'YN:@`'\MSI^-!`_ZA@_>GZ'7V;`$L&>*WK5]@OOX6?@#_.@8/X&_?OZ('X +M%?B78`E?\L`2SA_V_ZR?=UG=/&.B?^%UYP;?'!#Q%'\U[^Y&!Q`$NX?<H@`&<9"X`3GB%A@"_QP:?O5_U +M7CD5?SDA`,R#[;`+J@$D_>S_RY;!_(@N-WV#;?'+/AC+]C6_\IK`"MJ^SWW6 +M_U9;XLJ'\(#^]_N.S@"(`#1C^Z#!^2U\:89^1=`:'D-Q?XZ'S-Q9^#[`$OUQ +M>``Y1]U?&\?]"P+[.Z%/X45`:%U?N9N#`%1XOD2`4>-OZ+7\:)+`#G$;]7Q^ +M"%86H!'=(`5W.?\X!7GZ9]<`L1^-]XYN%QB7/^D6!G\O@C]R`#7?N=]D_&K_ +M^/AAI(/N0W_N=G_#C*^(`M<7'Q9^@`-RK^5^?SGD_T[@.E@`6*ON"]_`?XNX +M7@-Y^C6@$,K[)XYVH!4P,(/M2U`+W_P*O]M#U_*_UH7'0`''$`5WQ$69T_YO +ML`0^`45S\[8M_!G_^U^D;^0`!/2^`?"SQWIN:@`.(S[_L0`ZP!8XT_RBT_1DQ0;OQ>(#("6@%EO$!^#.?B]3"R`/8`?8G +M]U,'Y6\\2#XASQCM/-).W__1X_D]C``XD/%(W]3]-__&7.`'GXR:/Y'"-_$? +MXR67%@_1?F=D9F#\8U_L8V_K#];__,D0`'_^_QXO1``:>_^+'_[&1?8/'(-_ +MR&[^44^,<>6IA_VK-XX>ORKOXWQ]VP&�`:4SQ5/^(E_G,(`$9^[6?QN#_Q +MSD?O;[)-S>R,7BYZ&__>12!$#L8.9*8&[G]M?Y]7CQU0B!`0`2?X`"35W]\@ +M$[(">@-QS^6I'._S7Q9^%:/MM_39`(^9S`N-OT!])*O_O5C`?!5*VAO_@<"; +M6\K;6?\_"B"?\>?SQZ3U[:OY^'&)_/JFM?[,A_)1U6_^:?%_<$G#]G^=)4TW +M]S^UK;S_9@_[&*Y?_>_"/V.)U_:`3^@+M^T`K]K=_V@%_L&#Q^T`7]6E[_9Z +MKU^?7\T___K4A^OU^OU^OU^OU^OU^OU^OU_;\Z8I6SM;4+9UQ7671+:=>^=K +M]FK?2_.>^P2T2"HMTAK,&Q=$@^8&J9'$S$!R.YO\5W3W43TKEH86N-()KZ^R +M&JMF5H]K.O=$'D3]\])S\Q6X[D&@*?(EV7X8M(MOMYHQ*;R\_$T$?L32J,G3 +M`9?G42G#-0:Y'8*<744/MSK@Q?;V]4$3':ONX'8Y*DN0-U"'WF;Y7BMZ0A./+@E+&7S9 +MWIU;;"!,?5"]L(T95Y57J;(Q@*0TS(I(B4/+"=[=1G&8*Q.[1U.8K/^1\H,5 +M?F,W.=A2W#U`%%5D(R]%JP7W=,HO2Y1M7.W(XDUGX.(*F[MM-P/0RF0?CE74 +MO0:R1F'8GO+Q,QRH5N@*F<*&/Z\%6%&"FC+F33;G]]RF8!%L=SJ&OUM[_MU! +M>150+!*,,*#KG@0Z&2%.^A]9[P%4.R/?-C'Z+(SGU/L?GPU +MO(Q9&&\C;W%&Y1#+$$`GK#,2)PC&EQ!A^;6WWE#;+,['XKY`DBW/[0W38Z&M +M`783+V,SN.LN(0QHTYY628&,9B4V0SQ:W^D)9;IM8OW=2(GQ7X(GS:KN@I8&R=N9RD" +MM(&!ES!ZK$G)7!S@98A?XFV5.82IN.%9]*6[EI"+T-P7W6:W<,FQL*(7/NJ%JPA&FLKSR/F@*\H'OB_ +M]+$A7**EDO>JQ8.D[EBP-AO;W9K![DX&ZE[DE#5P50O:QHLGB-FWM7E7%'2I +M47S:KT91L]B#G-[1^&FQJDG+HE>=1?7?AT`WJTRHDWVD%0<6T=-F0$$U_]ZR +MF^9%WW11<#L%YC*'*HT1]W1569;J9+WW3C?>I4,+=*]97:VN'+3%96R:UP,.X#A4%#.).XA2IE5Y!-DU;@6;T(3 +M1;7>7M$X2Z9[Y#4'H@F,R^+".YM?1Y%R-WP@1#N4@(U<5"O:Y\:(-*#R>F"\ +M-[O49H@328VG>?G9FA*NVEKW!@RL4-?G3O8K>OHHPEU!@K))L2=G:A&!7#@? +M;%"WI8?CZU1IMDCQQANV@"G<8%-P(\$DUIQI^EFTY=[7-S<+;-=I,+7Z' +M.K+.=G#%41O\X&NF*AB3^X<\*$=46_C=23CO4V;H'G9)RLB@'!ANQ-^E4*`P +MIN:2EZY9@&<#VN=0-WE2.LR>:5]<(=_T"H@.3]#'O>V@0SY6=?)"ZR/Y9!!D +MD!8^6]F9Z8;^L3]L+I:IXK/A7%%8O1^;I1F&&ODEV*1P2IH)D?S4BL,WN5Q' +MF"O#1G[E.I#I"YGA;B$E*8(S=E3A51/G1Z>N>!F +MND.(:O3^.LM45-/>9>RSF>JW#R(-7]-YML"B^2&U/59#YB94Q+;*!VT +MG0[)QBB]C9MA:P6ED\75_O!.[XKEAAZKOY1^RK:=G*#$6M6_KS1:F'WB]^>5 +MD5;FH.+"22/P4R&`9H!X2[OZ;M\MDE6"UU,.1OES;+[@?IF#-R9R>/FS#Y\`F.C:1<'N/\:;)43U>@ +MY;I4(=]67O&1N7D0L3[E#8,_1B9SDQZ*^B#,H*N+=;0;H[&TVDP!'V/H2CL?%&86&1X@2-14ET69_=G8 +MJ8)UC6;`>UB&0%-%"!*,Z#MML02\Q*;U4/[@F)X=5GVMJ0+'D9W>0F5ATA0G +MV$I]0=U/>AQ=OAV=*6/<[IFV:XYVW4SEP%[MB:94PLH>XT=T]:Y6N45IJEX[ +MZ!2%Q%W.)+/H]3XT^^-.%JEA)2'Y3\R\&*ZD"SSB)_*M'?MI1B:(QY.5/S^? +M4YJ.CVL'&(R])ZGCS%'72,>P^CB",$]\-:4)80WI+&3%B8U6RH +MMCDK/@WADAGK1T=(,=DWU*T^WGYWZM"!7%@*S_?R.J66*E`*;8V-Q8O98'PT +MQ2N5U6M9@B,$?2"Q'O@_4A`W7@W,P4R`4WR=OU8R+[C)Z.0O^)-U2>OO2FKM +MZ&!U`R./4OY5!KE.E(G+2'N\FX8BI(FSD/D>[FDN?-?9S!8=#S+B'<%_>C;UC8 +MG^"EA59:2W/WV6<$;G.$^<7I_:I!80=JKM/,2U]MCB:G!T9.Z:#3>AI-\U>P['>L5#I_C7_>38ERU1=U57XCIK'38Y16M.C@ +M&H.&\N^NFK\;D;+5L.#*G(--IJYF,(![H$_T2*)\'_/LN7O,(S&-BIVU7XA# +MD,/\M"_5XMHDI((>86B0=`J*W=RB,%UYF`E>E'JBKE.Q2;P_;F"5YOMD/H@Y +MZ<9C;M8L\\%>*Q_.6T/*C@EO]':LP'O2-^8G&H;P3;03^-=[)S@Q"E) +ME8+4Z8[B=&#V#2+C/[5P>JPOBO>I[6'<:%4LKB7(/)R?(8@T/67"[0[(3RM7 +M%WU^M\%9W4KLNS[[4O-YWR:=*CIOJL2&EB!ZRJV$L"OLK"P+W6)AEZ[?=I8H +MIS1SVK3R=.-]PP;Q:HPNQ*CG,,Y!IEZ?!#DFK<5F$('W&J$5J*O2;D^CPF:: +MZMI37)%X18F^BCK&4=HSY8A<#_I:Y00]C;3D4*)GYNCK(EQYL7EOT!Q>/ILU +M-_VQ@NH[3L2:N^'/H7[D%OLX\SQR"&T-B-@J)"\E>&O=)4.Y,9S\:,P4UL4\ +MNF.!`+(()`PBU\JT[4O<)U+,@?M%6X,WZO@$@=_5 +MQQM(LDERMM;+ID^[O,CM:,>'>7ZY8>PCR-9669B'WTC$!S]TC8IYN64Q+*T_ +MOPZ4'F+`+^>-R>"KGP"M=VS0QMF#Y/AX<]F&I'?@4>7LD4HN\*DSBBP=9HV5^U3)X;U:Y9V=3T:BM]@G:^TD2462,>A^GT!JQ4B-JJ75`8LB +M\SP"Z+8`TY]O91-WK61F=EP6:H\R<]%;]Q86R13(&?>'Z4T)(IQ;&-:W)2(3 +M>->XF&%UL&\>K=6+/;_)/`:]A`5UF7KDNH^E+*'?E[G/G'+ROM!B%W'$5ZW* +M@D$>I8`^8Q+R+H9KL"-($J@-G3%HWQ2H&/6UQR#`(6Q&TNC#1ING-#?IH`=_ +M/C[S&".:@)(M`%*@7OPG@))3_8"?9$=8@COZ^(:J+!!;5>#87=AE6.?'(*QQ +M,\M\.VT4ICK*LI@O2JF,+@\F9"D*+T0H09Q68V+O5F(G3*9K*^B^-?-R8QYQ +M]*8>>GS41ODV!D;O+C*E2U2@15S+VP6NV^\%N,0KY(+%?626FV-D9BR01')S +MBFNN/5?+NB:%;`H6-6P=3E1,YT\&3/'T^,S#9XF,U3R[#I&%3PZ'&U*O-8Q@ +M3R.S8VY9U)!.3%##@-A08D8"4=R]E5$_#8)9@@,;62W#ZU +M>90%]7"O9?(I0IJ:*^^VK3`_[<)D]FF2&NX]$AWP^F'R)$XQ]OK&_<>XI;K@ +MV^,3=US,(78I/#.%F4<)A/"XRX/)P\V"JD:KG.?7>9V.:DNFLUUCI_1OF3K,D:C4Q1DZ/L6SXKSE)E)5Y8:2L>8%&27FH-`Z[F?&F>Z\'C[K1HS4Z]CU +M-VYQ267/AV\GOA%J +ML\OK1]23"CJ4@;(G5`_C$S0%V>(6(@"Q-C-XC=9%?WMLGR'YJM!@F6KX$B$J +M%R[&:C!"XF*3:(0BNM;WX]PX&Z/U")EEO(4).[R'.>/4?_#L/G]2-IE^SZ\Z?FMPSX#SJ"#`14M//H^)G#[5:1!ZVS +M,M/7H#BS#*,=K-4KIO?'*MZ2*279 +MG_DVVDP7N9!,0%5/58]QJU;@D<=T)+MS=H]<-X +M")GCN"#ESCMGW2>[03^->R'\^?V$_TN>37[EGD13&TY[VU(.=H;I[+Z,LXRU +MCR9^-D1J#C.BJLYMDGW.:,2I!J20E::AGHBF&*@\-AU]^U8!JB<>!*>OH(R&94R7?V17/3A$[FGA9;M)\UK`ZD6-4FI0,T.N(\$/KC6X"XV&Z#X +M-D7![3FJ/KFY]R7)O3;;`[UFAU`T=.4;-">-Y++I2".RN7I4%ZH3L->&O<7+ +M\@*TR^=ZBX2XK]X$KJF#I%SV[Z1>H/DROVA(.5F&#M%EJA.98+PF3Z#1-1_1 +M+2E`<"0H;'%AIEQ@]9-,890TH&RO'X9MQ*Z.+,WADBUN9FPJEV=`*[+93>0A +M=B[R>NMPQX&.%`>I.?P$8@L7!$DU7T*H6D="@.9!P.ZGY,#:5]S"-;Y;00D$ +MW_]-:BOU[P&N'0'_Q4?JI_KY_Z\P-_8"/Z=TE#^6$Z_OK];_^]_\T_R4#UK_ +M]]?LD/['_.W_0`&_]@?Q?'_78(_:(3]0KZA?U_1P%']L_F!;D"_OGQN3_3HW +M5]D/\`5]1+ZD'U/?J`[2&97_WU?58MH+98"D8K%MY6DZ.>=,G'I/$$Z&8P>3 +MH>ZW$<*8#B1J+-TM][^WH^C04RQG +MP?4XIZ=Z)%HO#&?OB<%IKUZ5K7E#=6\1(J>RDY>P`AB*2D6@`RM)SKLJ;S5(<.G"/[\U+3,"4]/*U%S'P/OL +M;VI>G',6<[Y_"@2]ANOPM(G>9TV;^DUU6G(YMEY^CM-7JG@6T22ZI],N>SZH +M:O_-YO#;H=UU]Z(9K7L\'^YQ798`RCM.?9WWS'WXBID*`H=!;(8YLS4%,PK +MU'@@?XT_GMO.YK@\XT*_Z-#!1F$S3C>8DW@F.(U/@=^K^`I>-W4U2'EA'B2R +M>O&T#$Y=3>RI+)=2`@78ARC!"Y@JR&1[0C>4<3D2[WT@ZD-:Q\7YY;2&),

    _AAI:TCX=^9]9E0<\U6KS?'-`AT#W8E7O,UN:RZ7<>'29?J+5[" +M5UK2XIOSEW**=-M[);HB;4Z2+TN^DSW!"&Y3[8FS"`CL=U*1%:&>\PN'[EQA +M(+%G?YF&A[U+E1=BB@:KGY.+HI7TT>PP7]/ERBAMX5*H59B2"+?!%M9T]+J5'VSV8Z-\Q'P*".XVJP-F +MQA/A("$W:*>GQ^>-8A%NN6[GM(,UAE>XG;>Y:_*W'_TQ<4K=]A6D:J6:3DE3 +M$%<[V`5UB_\,U?W&]BD&>* +M;1:*_=`ZR&]/7WITFH;6>B\)5O?/I"US1#,9/K[J,O&J<$$I)^ZRC?;&,7+= +M'-J59=GD\S`G[R(U7NY)G//N=1'N^FENQ1`$E9`';;VU9[2"[12[FMQ6')"E +MHW!6BI7I-X"^^I/J84G+*@W]$?&1,K>]IZ5/35LH^R2F4)>; +MY88]F8O9-*7TL:RIX"!C.9\=JP^9$-`05.P?V-/M]Y-<7;3$<.G_S)Q##Y +M=-E=\J,)>.V5+-44TXC-PWMA`;@21,66FS7(FR5"F0K)B<=I;0\0W>D\+8MZ +M8[%0>WZTRQ%V[X%^R:`L=.HAC?)FBZ'FL4-+4DKIH)IY>`Y!,(PS,TGL3+CE +M/;(6DWM2)3*MAP^T<,-6IVNBW*3\1@LR.5&>_+4T@R2L +M4W-O.Z%)H3XBHQRCK(.@6[KT@[8SR"S7G#K[1Q[9,AX-HRO>Z3;8IH`)"A[K +MY#MSXC5P^6-RHF/6JQ4E8Z4&]H,M>LE@2"H@3^?]8.5L!,5(CT^G(?Y16] +M]4E.8Y)I57\$]'6X$Z]T\';<`\7#0KZ@V-&KFGL\WP90KW]BSH*SD)>:[F^O +M-V_/Z(+C](\W"!]&VTJ#6#73!]@W>`WA:&29KE=$H;-FLKTF!LW7PS<_`_Q2 +M<':*VL[1L'PPD1`)$WBI[F:&MDGX+*6:Y#;!88)O#0VZ:Z;]E?"CC_L0:"=> +MIWSZ.&S-@\UC#F'ZXH!HT*1UI6S'*:D*P(:_EBY>#M +MQ];-#0D01;)26,9E=R\5`>97N5/L=E?Y,W=;;E:I;NG&^1F`\/PI*?!LV.U? +M,8>K&7*.LWI"2INF+V!^*H>CA]44LI]J-7`E7'-44"_ +MJHTSRG`8O^?YX2>R1;2KZI/-!_PBL48^$;(_;/9?*1&$Z&!B7.UM$D[4RLRZRF>D= +M0M[ATUJ&1Z".4UYTD:+A)6431(`C7W&Y$)X@S+.)6J/%9A4&0JR*\^IS$>T' +M)J!VET+_?\=%G#7>5,(Q8G4U?(S@S+1*#V$W1TY&Z92*;/'YTDW4F#AE:E1$ +MP'QK,T3&WGS.74>IJ!_0F2*,7*!0RKFY)_1=>)-HMGO$]N@$SP)+$^$22!2+ +M&JW;,6'OOR@K'C$OMTQ1_J!%(?QXJQ%NFZH^37F*\DY<>@&15L^-9"^?NI\] +M*T5U&>+>R*_<]\1A&QU";_-@0["E8YV_.CC)N4,ZVZ&.&>`[(A+Y*Z$D.Z#@ +MH/:DP/AQ5_%7;/(JUHWOJ;9FX,,W^K&]+V%2`^'UD`DQCHVS\%#N9\NT! +M<<]Z^6?!4*R_1=D$@N9WL;DL$HV_)JX6/Z8./A,Y!5\!EXWK2>H=AY;0R.-9 +MM=ZRE+$C%JV!JO4?VV^\BLCAQ-)_PEG#D2;EV4T1'...S".NN''DG'VZ3UEO[;]5]AH^@>U`$`=*4 +MJFM5WT@SV*6H$$*HA<%H%*^FW*`RON^NR)[$0>*FS+7`]-<><5%[JI0`99^S(J]+UJ_G>OT7>*=%Y8)-8.;Z6'X-;Z%_-G3^EX;%^&PE +MOU!=&6]'.2^9%\FC?'KT/WZ%O!T;CA'T]VP1&%&$7=/,<&1J\<;9*O/U6T4+ +M$1JO!7,8GR+3)D*L5:AN,,+3\#773)N +M/Z]2`%HQB/LXU4K3=E8^ +M*@)LL5+/4YC>AE<YJ@K[ +MA.:%7\_H'*G'0'W'F+BROQ_AJH.V%7G!H(IEU@`RNT5UQKCK045_3\]Y(8ZG +M8A0EYBYDZ_/']`AK085TW*`]1$;X9@HB9-:`$.+W0'=#4[D#TM/.3$MCC)?O +MM*"J6$^`5J_$203+9'-11?*)1-*]EG(^$92@L]X)>#7RN&6+EZ#N+S[$KQ<,67M+68E,"BH'R>:K:T)L;S")$45XJI@HF=W:^T3Q_$ +M3B52Y!EPR4E;*@C-]O+'4^GYS;"833\^:VEY/2APY"S^M:\.-[[HZ!8R<8G) +M#@V5[3HRU5]OE\QXDY-T''66%!$B,OI@8D^:KAC2S+Y-YJ"ULME-DBN[=-@N +M]U?A\\NHY>`V=D3TIS_"JH4*77"?\[5P/I2<:]22F;OV6S0@NHV&3YO`IR-Z +M[]3.3YJ!UJ1KJF&P5'I4&1CX1^HLZ(4#;>W)$G.>_+UB?NK#0PR0K=6W,"M0 +MTI!QJF)(N\UWB:QH8>0P>;/J0@6#[)=TH7KS,MFUWH<=RJN.[IXO9+67G^CU +MU#`9:TQJ$4LX_MRGLD(OIGIEU-`V6;(@.R[V_I4*6F1*WH%PV06CKNFTW[A;\T8J;A,.CR.MS1=!R*6YN4F*(EB"`GE$DL%/M9MH5P;<&_YCK +M1KL2\]%/.H1I\XB;D):4L4ZV?E)$N1"XKHV-0S4FKD5^9)*MVG4J,64[/'G/ +M0._D+`,R]@9Y6?UW:D2RCMUYX'WSY0T4,ZBN8SVSRJ4SU)W&W%[Z#J[#I_TY +MNSL(,?A1#XJU,D*I^-.0<'C#ZONV%5(YB.-U43K6'-,`6RICVV%]5*!&?YX]?VU2N)CP6OF=ZC*FKAJ70CEP]QE/&SD4(QD/; +MFD)A3<3XX;V"FY00Z_:3:.7N$C050TUN(.P6?QT)A^-(8B"L"#?-*(C`-H[=VGXP[R(M8S4O +MBM4=A5#;+20-19'%:OR9=Q^4288'#OUMK>HBM:@^42-:WT)];HJ6<&1'RBN/552C/QW/<&JI,\]";?! +M=(T8_P'9F6!S`'DY-I?,",BZG+$P],<2)>L'2*@0AR;VTW2AH&GC56PK46K" +MZ^XMD'EB=]V,JKD5NBZZV-`3D'(PSCZ248'Y?O)&BL[#DC^:B>GUB&?)Z>2V +M@%Z(;D_;?3T7N3&XD7BOINUD$D+EX1`\=O89BSTT.K^3DCUSEH?OX.$I$C(( +M\AO(!#Q+!+^.:8H3-D7T**(DLV(2P'Q)9GKUN;-@Q;G[V.1'H8NTK^]LO3Z: +M8C+/LP7$51L^8\8WF1GX0;./A7$09C+:4YT0F'&!>#+C@LVZ;,J>^:+J7358 +MMHY=\U6JWNP,X>2E^XK&*GL+I+W4%#0UM_`W-D1OFP%IIL_,_6?U +MQ\X+0RQ2/K!IY'Z&211UP,O*S66E3J$8Z?%E;0(15`%_;MY]SDK:^27-@SO# +M%:HAN^M@&,]'/.F=GI-:R2/4Y!,HP/&U6:(,,I)%#"!'R8HD6>[S8D)>!DRO +MCO>9<4B"?CSGWRO%Y;>:H&(=($"VU[7IBH?DXA`4K/G=)25+BL8`H>]+SX/-E3!U +M:.T#?F=,;%%;;.^<,':T7;#]V"(/SWQHYFEBQ;+6YR3JVHM84;WI!,EE-"RS +MR`]I!)7:WKHG?2[O:&^B?ICL8B>+VMZ-8@G'I.WHS#F\-SFF$Z7W:&&$L012 +MCI_TXR'1,UW#A0WGNFDRX[MW6N[=#`37?*M6M?L2*<(5F-X[[![T6>^(I3G@ +M"RC)O)/RQ\G[=LD^O7>4=HL''D-SM94RQL')&@SU/OD::3!T[^,EZ*N,?2VQ=1LJC3C! +MB%>KOH4,JB8O6QF8+S[0G1;0),HPMOEW&FV0G'FW&U')WE_<++ZTV/291/4\ +MI+@EDAZ+D=\R%7`4@BM=R,JW5@]9%K0G0GWEAV&@R[IJX[-D?ZH$UIV5!+"# +M6--V+<0?;2O7-S3<\'.O8_1WI'"&;"G+]V_LQL$EMZV1K7GK9,1M0]&Q&Q3B +M3#X!RT:?^`G/U"KF0HX)F55RQEAJPOIR+7"/,'WJN-BAHYS3MM +M?R9B!$E`)/+J@B@ZP+KP+;PARC*N*NX*/=BD2;>:)LD-3U1?FP$]F'C3(&XC5,/3/,6N:F"APN=B3%/I5[B,5 +MX[HRL%45ILV4I)KBKQKV4'NKU('\I69+O%D729WD`>>(;0Y1.D=)/,5A.UGG +M1LW"K##'[HF(Z-FANUD&=(?.,!9JJW\X=9-DO%,N.=9U,*/,8E"5#`8*OFLD +MR/&RMIA:`,XR6\"FW!76*3JH;==.;X#&,PA'RPR,'=K'Z)(;>#JKA@Z#&%&> +MLQDNU96=?XR[KS#F1EC5KZA3A"E0PQ&[JM[K1`=?1\\Q:C-Y$\J3WRM!!&H9 +M!`Z%*+OR6)/#V4N:/%C7*!2]3]?F,8.O5296TH`PEDRC>V5;2UGGT]M<7/4* +M[R0T&Y^\#^;`D/:VS3B0M_T9B[IE[CHM?:!VM0?7]_KEEJ'-"[E092?97N)W +M[3K54]N&;')=\,C"V?ZY&ZVC3X28PC(FWUMX/T.^:'A'&D73EP]2QO#6P(^2 +M`8Q@,%=%/HO/H7Y2(^Z2MTY'?KX&F=RV0[)Q:3;RD=&6%IU[#H@>1R+E=BB( +M%RK<>D1H$HK6AL)J-(C2Y:$QV7-262EC:SV:+#X5D-!_1!IPYI[6C[`FE,.2 +M(7@TSAWZ38%H!58H\TS8EA*!<\&L81.%>7N47F>8]2IYF8&36K[#P@W#T="] +MQ*?(PV7@)%(R#>!'A]#7)/_B;F@R0WP)))CV"XNS/GNNLHRQ[:+ZH1D#]$5` +MDD]01%WIM83`A/##WL3IC%^CY:RZ"= +M8)]9K=5+#<*X^O&T]#OO>]3MS#*V9IL/?B/BM +M_.,8Z5-ZCR7'M&QX[?9A1XR?':U05WJOK&O9>;LOYH_:5D&A?C%YZBSZ;K5GH26[3[R",/AC64/(Y*\PV?P$%BZ2-7K4STRJ[;/;BH(856Z +M-.T1G*^L^$BP9Q-A#4!R2L;%[\PVBU<]2U'3#.%/,2P_?-V=9TU+;.#R`QVI +M[;-'+%IMQC03HOKIDZ4EV#72LZB$E3#$6X)-YXO[+)"F(?SBO288Q>87N>-7 +MK0Q13\-=0-`SH9V"B>-"-?F!OSV9ZT.@8=88%PW_4;><^Q3>\,GFM7\F/M3WU,9-7>^65?GZFV?ZS[^!=UN;!TMA3"./E>B3P)G:/DIT2MS&>-.P1T=BHN;\'88OL1A&I)2F"QN>6!S"^)S!- +M>L26;3_>.NX65-2$K1Q]@5LE3,*%DPL]I!77!)>]V3N!WB)"\*9A@R_^NMG% +MD:'@?T?;L,I1.B3>E8H(N#(8N>B65P/*MK<.41`2U=/PE+#Y6>)UO_6=;]CW)!RP<8+3!Z!T_%#WS]V6REDI9[:>&CBSN70X%EZG +M?=4KL4(J9[V%8?C)98C@9@AL1Z#89]Z#Y$:ZSC9FU^A2KR$]C"NEEF2DW&K] +M`P=P[Q_`'+D5IN*9[?\R;2,\7=M_@0^#WXQ43>E-YS&$PV;?-3E?=F.\490V +M+8N(^'/NJBNB`MT7]^6&?/JIAP.UY"W?(PA3M_=G_UQ\Z,P6$2U"\`]7("L@ +MV0MI>=?UW!AUY4S)FN"J(-S*;!RHB:5]Y--*++?76]A71VQ)(LP7O![:V$3M +M408!/C3V_A.J5&,Z7-]O(JI1TI)2'09+_\Q)R%<)$OXF$S)*$=OA(I)1V6.9 +MQD$`48$1I&C4*S7,S3/@S?'NM$+[JP]^&&"3)3.Y2R#WIIW<>^Z_HO`[.:X-GN>&SUJ%IUOAS&; +MQUG\),0#%/5UGFY#^X7LQ4*`G)E5Y,YPN9W;]E"M\,7406<3IW]@"O"YNET'9/1Z9P@B\G75N\[RT%6ST\7N)L0'28 +M]7\J;DBLVMU0-'6E^Y(8OC[0;#\-#MG'%7/B]R6K[WCY$:_*:7B/'.G>R!K0 +M)MYY7E2(VD=!;];G;3^=`%X:4P5"E$GGY?>#SG/>X!-]0)(W5C61L@9'O5#2 +M8CD+\JDOQ;6EL/P-:=MXEPD-36@.7G:>!D,>NC98H5'Y$/?QJ92J@RL%`0Z+ +M4I3431IXF[DN?C9N_A\A6_ZT;1"3A1S.4=FCV9%9.DWRMF[%HXF+7S#] +MJ#&FBL`>Y:QA,S*=0.PRSM'L)?/ARF]N`NYA^U$Z#)!\,E<^TXR)N0T@J]!3 +M-VYZC?<>MYTH@=G/Y4K-E)HX+Q[]*Q3F)>D4!.`;U]-CX +MNXBD#K-%D@;M5UPE5IF%%-<9%B;D8SPF*]%Y7$1:TYH!B;C9NPWMJ("&DY]?Z#U\/ +MS^&PE1Z((A>T?IY?L_[]\\YYHX>>[C&?">'Z];A[W +M26^$G&//H;KJU&FNVX\QSS(.5)YIX']LK=KWA,WK5'+N?"M_ZM]Y +MKZE^_L+@O&V?!,3D; +M\<)1YSK=;GY:DR'1F="I\M]T4Y/2UZ=OS02W?Z6?UUJX$1=&7DN?R9G^-3N7 +M?Q<3^,'Z.=>NJIZ?ZQMG?/JQ<@SN>S]]N/<#?Q-1U,72:_ZM?N]C>/B_KH]_@&.>],7BWZ/19#`6:$[=[\[9Z-IU-?\&PZJ\:WWG3_%GM +MMC<%O3TAII_YTEH][P;_[.!@=?H])`^+$.4)O.RU:I32==_M8CZK:1?8UO!M>-BWN$_3.\C!S?A1XC+]+NP?@RNQQ<5N;7J$?2 +MLYW:MC3,77(^ASY"F,YG*X?(O3=BG_Q?8^.KK=+_^FDDMQ]&(\NQ^Z5J'C,8 +MO6Z#N)G.5?XM]Z_,[;U<_TA,EO#[1_&P]Z]:-P=;KI;)UW7^?5BGS,?7XSMZ +M^+0_'>F,9SY=W[.M?E%1(62/H]VT?'9=_%Q6FYOCI'37S'/F:.:T7[Z?@;J' +MM-RX^#Z65L[U?TCW,)CK=]+JW[[E:-LU;%%SKBHDL-:/%"):;6\7:Z7L8 +MC08_>]Y38T&+CG:T-^P\'+\3_]MYO?%16U2@S6`R-OJ6OI42>(T6>25/)IIR +M8C^YQ,[KW6S:7<!PW[X=IL?KP5BPK%KVC<;2T1LI:JGQ\;D^B +MU?<\6S$^'ORVLC/_\'.YOEM2B1ZI_#=OI\-Z^JFQO[-'(S=QH?II+CPGC +M;1T[+S,E=O +M)B^%!9I5)F,-=H*(V+Y"_;;]5L&//SG3Q.FD-[D/+D.1[L%T.SO8F$HOZXM- +M4=[^=-Y>XEO]ET+]8_6G++=[;/]K@9#N9>`X7P\[8:?`82+_/E7W3;^YR;EM +M;QJZ)%JH[X%._^7RGHFHQS9;,-TY_]^;\F&EY'D]U':W +MBZ9)0XE/\;/YTLN^P/F=]&W\#(VSA-.4@OY8HWY_%=CGC9[50977/O<1O%4) +MIO,\#T]+W+G*9O2V_#Y1(I/926SW&V\+K.[MUB>`]0UZZ/\7#0;#\N6V_UI9'[--]$OSG!S;;1T\8S5-\ +M>OSI>1=_#J,E)'/VHO%A);Y:C47#RN%K8XW[HCHXGBQMQD9Z@OC](9;(SMR^ +M0^DT/$1]U=IW86%E=V?\>#B7B<9=A0G8VJ:T,$S/F>9$<0;)A +M];MEP^].%^9`MUAR\CE./5\._TF`MU0(!NZ1O&,/,AG=84/KMNZ^^:D@OAN[ +MJM?`Y?,$F.`,^1#V_/[KCGMZ)A%[`L0R$)L+X;=1D[OI;W&$W)B-)N]D,<18 +MN"1Y&Z$C&N)L60E(W?R,2Y-B<31"A9`1D49WNOA+@(D6&ZYR)ADD/!$(EV1Q +MVM'_)5$%ELP*%=8Z1,4D@74R1LDL`OXBXC>$[/YA"8G,*@OS*93 +M8U;,QV(B-4G2U%&B_>(C7$->G!W-V+:8!E*[&95_JTB)M*3(?`WJ_&-Q#ELV +M7W*>&>96(WS)YAYDW$19RS<4OD077,'L`!,L6T$'V$+A8AG!(TJQ_:!W=G'? +MFU395%D36MCK'V."66G!%,($E#=>K]K)2;!-V]@D4+F[6_$C]T*OX>=8UEA(5B@B!C?QX^ZK=_%=@4F7!%8,!(8<8<8<8BYAR/ +MD+*.NGLSL2N*V[BD7YN(#W$=Q'<79N4'+LN+NR18;(_'34K/B,B,LX?SY"RD +M8,1Q889:`Q(,?.PKFOAG'U>F^@^'\`>4G4:LM8H(")L8\;:*O\<&:`3P4#H# +MRO'/5NI*R58R8=?>'&=D&9W9E4,:,\B8D)*T%#0[KFVAV/HV5$R(3A]FX".&P+.-BX-L?UV[8!Z;'9J4-"-G1'&^ +MK[>$XF\=O=P;OUF4MBAK1N%M(+,[MQ)N&M2!:3V),9*4GP#@LA.F$Q(UY()5 +MY(T)&O9%C6`-PM82$*T)UE!\=V(DY?CPU^=P6X_,_LJB1$82$#IA1[\#-2PA*^&:2FB' +MH#XYA23V!:Z=H(6H:SP5DJM_L8\595-D46-.TIEV[@YKOVEWM!0OD&9$9DF3 +M1"<9E[;,_,:@M1A<0SAE,H-@@8Y=HK5A%G&E;-I?F92).[6ZUE[J"V-_0"3) +MT*3$@X3::\>27P&(>T3F@(0)##C#C$7)EF(3X[*1+<0-P*";AVYV;%+6H:DP +ME&.'N"'MI#9B#<$4%)6.'+F!G(;$.S$4I;E%F3MB:O +MN;.0V(BSH4.B2QB-3!7$3*A9$!:`=VRJ_,%!3;5MMBK(C:T5C-J-,Q$BH$?B +M-+#=(\D^$&:#MFSQ7PR8I%WZ#ZB1&K2Z2"H,H""Q3IE+0WLNXQ@L8"0PXJ6U +M=AK`&(_@E'*!F\ +M$>.2XMR"AEG+46>+4"P.XUVB"06,*L+&.*J@X=. +M#%V7"YA56\\0DT9+@?Y)FOAN%M6SLARSK[U)]0R)S+'8E62Y&IUN7/\Q+#]F"%-?#.-M8.VY:R*;&H:4[.F9D +M9E+Z-6JZ:^@0/'0L-:EA%C6`,X6@58><;PJ9`E3>.W@JNNJ.B@RI(T$<[A=V +MD9S@ERKF_NE5N[F.<;[`]UMU/[*6FB*W$&A!CS0FPE@# +M"ZJ`F,.,1Z#D,^T%H&>IV +MTA6$M0Q^"PN8U@#.%GA(""Y3!< +M+._5UR@NTI%!>0PK.-A:2LWO\ZN?O+^O7NP66B[%ZB-4G\UQ*`)G,\44YIZL`9M70/(^QY!A6E> +MQ:C$AM0H2_((AKU9-'H23Z="0^`B:^&98$:B%I':"#[+(H<+96;M85"@NM2A +MC35UZ(E(AL75MB1N"8+.,AT9!=/F'FC82PAA642#^R19@P>X($*?V(LUNFD( +M/@TAD@+G&#F,.,1Q&L`9E!3*.;4[FM,0=@&/_A-J->T+&L`=>ME5N%&,#F@! +MFN80+V!:V;&/EF%BW-3)_:1D4<0-'T#\I@\]D67@]LA#8R"=:AL$`_]@8I-- +M+"&*TT*EM:L8A]J!JVOAER!_/UZXK"E34$%FU(Z*BKKE@@[8#(:B*DJPIJ&5 +M$6![%2E7@SC2L]IBJY1U:W(H#V?^"L8$D"B1,!%&#.4:]U\,M6858-H'-M!. +M"N.ZVT%K"C0`P_XC'EA#,K^5\699L;"&R#KOW+[":&7WC40M(X8<(HG(8;EM +M#!,MK\YJ;2HM"=P3%]"XA.-#&,T2)>%^IRYU71>_=`I,N"1L"`7/GW\>:^XH +M;?O5B7Q&S,!W&'&'&(NU.SBI;U#<;T/2STVO6K5`Q +M/W5S"MD87'440BZ"J*84BC:X@3&V87.V$`HH*!9GA +MD%*##W(5R7;S%?-EX3%[[2[!T)C:QE#O^E5G-XN[$YEGM6BQE&P@K_6?QPWI +MT$ZC:4Z7U7BCRUPMN\Y`^'`*[T]A4_>)7HJ>AL&1R/1!B&`U]B"\L# +MF%B8A<,;'\-C&#J_ADK\(BP5U$,A6FA,1E8<#\#9T\_+HH(1?A9VEYX=D+)8 +M'N'D,'!YD16@D,*#V]D1@HQ9SW$K\D)>54L']I3[%K5P:,;J"=<6D@F$9_)[ +M%KE8J!A!197R78Y@8M'#0H95/QI?7Q;=:\QO7CQ6=A-2VU]&K-8>!1YX+*2N(>)SB\SX"8%DM?KX6ZPXLKEG*91[RAFS +MKZ@S\Y<*P,T2XC`D\6VM:YT"D1$D$+5G.E[.[JSD +MAFS_5`$@2^PXLF#OX:MPPMFJ+P[C80D$6_69O+F2X,_C97++M5YEQ!]$D%%K +MR[*.MT$7^5!UO*Q4%DW.,PD-U@1=5B5,0@2$*4"2Y6TS$76.Y2(RH(,9U;"*S +M&<#+>7RE;E>ML')=[G(7U\07M$LN!AU&E?^TO[P9`@-^AQ2(P;K1C6T$B%,9 +M?S#EES$4/`=2^S*",H$],=<"!D;@.T9-MM!J8_M^(&&SS7K$!9K@+1]%+\ML +M"EZ%**W:`>GV$IF%LU,-QAE1$&OZ+,L<,CN6IY$:G>P(!;\N&P=EW@.=]KT< +M-<3=H`V-:@BZ"RC#+C9@84O*X@`ALJCA;I#YNZ9VKMT`JNA:UFZ0UWNE4F+O +MWL.\4N1#LX7_\"H%/M6&B8G,Q:,W-B>P2R0[<>>T3&-A5Q$6O)QD0$-@]Y_ +M;]CJR8O]@L$PJ#/PEKWRR\^*L=?Y.VO8W]@FE;7"^AB?RO= +M')T:FJ=&XF*BM$>M_1JJTJ>$Y_?3JJD?U>B#=*A509+^N]XFFDJ6E43)^N;9 +M?F-\YS7=*%H63#.ZHYQDOO]YM9)K"G#FZQ%3Z*6=>>$I:YZA4A_@_,='BJFJ +M$F!!>O&4*#*JXUDCS0U1/5O>9^]/;3B_E*_-@>&\S.-=N?MIM1>LK\4_%1'4E]RFYE_IYZW +M./!PL!!H^XE2U?$W,VLV!Q:+8[9/LX[J8U\O%T1;2YYZSY-'\_NSO&3VET[O69]'U +MV3?(,IJ;=?>*,JJ3JH[4,53ZQ49=5%TW;$J5'#E15YB#6:(-*9@.57U:=%\U +M_SBR:L+5@.5H-@$U*PQ.!($%A0;"R]U`0<.%%2!>6`L\(J`N`^E8'XK1/&(@ +M,ND@=%KUVP0W$_)TO9;?PB`,P7=;X+O@'8%%^$5`=2RJ@QK_ON"/Z]09W1`- +MY90KK)W,UF!E3-9L:\8O5E&!`/>`WQ)+%$N<)0]H/#"NQYQ!W](\2K9T'-^)>`/!#_D.+V2SI@9NBG,E*@'E +MQ*>\(Z`/_::SHAS^@?-&Q/D@1H2D/O"YMP;X(S6IMH) +M=B.I+T3NAOJ.F$_>)=J4B]D_6Y6TP_B'^TE_,&?2/MBG?DNX!WV(\>2BOGWM +MDL<4B>G,4I%(IM"'E#&1G$!GWE(>UOAN$4VDS:RW9S-:Z]N;"7$'.^&9LZ/!+QQ/%;^)+. +M$N-#GDQ],9FT%?#I*`O.BC"7:C_..+?>F#(`S7/FU#GY`'^4>]C],S75N\%* +M4EU)F;-3Z0LI+T%:H%"S--"WO +MX,MH!L9PO7"`:ZU>XK>:.*98DTUITRAM.K>R.&N8<&9K;4+V!_[ZMX0J;DS6 +M]I$4RAIBM1IASR%O*>$/Q-5]^MF<'<:?^6-KOT&Z73: +M;<-HBH?)3(T/P?A]R#O2T-M.-^"JS4WCG;EHGU]UM1FM[M,/,7J+J-7Q\/Z^ +M8(IJH?Z,>2S$/NMW+9 +MEB^N`Q'Q^KG(N]%/'U<7K7TIWN:;<9C +M_H8X>8V^,G+C"L>JZF*]^?U&#@`PT@LW +M-5"LS`65<5FX8@L\`6&&^+%8@=P]V=5)TRT+!9O0LVCO<[;;-,]JJ(&H<6=` +MV]T`:K0@WQ@"TYKF+GJ#1^Q-(X"O*)BME*A\/8M/SVGJ^%/2VX`:KF@;S@"T +M!KF+GF31^3-(R2O*;N6QM0,_8J)*HZK/--MN`&JTX-]:`M":YBYX4T?DS2-" +MKRE8NW2I_#:K2]VEQ\(W_P\7\BWP/5^L'^OCT27JO,O=_>[_?!_Z(2H]XWF[ +M/2N;N3GW@@6"!GOE9O`1+!E-Y*SY!R=6XT@G5M>K#Q;"XKUW^[QIAA2$97]J +MG]5/Z:>HIZ8]1GO.>I3U$>8CW;/,9ZAIV>G\=.TT_6#G8AYX![(/R@(;!Y\' +MEJ'WAH;>/K#2A\?6&P2X#S9L4>!XD!?@!SN`$NZ!.YJWS*UX5M2K;F.XAS;R +M5N`>T`0='/@\:B,B#GB%BZGY,=WX\HVW&X\MCD+TVSGX;V6D/5GJ;7^6+]G4 +MR$/OW+='OQ_;IZ*A[O)S5_YD!LJ/(9G:^>!C\[EH3X;WKM@U<:'T_3F([\+A +ML=7-%\3GN];9^//8_D/D]R'OC).%R-+!]?0]!]R?-WW5_:<\?[YE^[3CV_IB +M-+F]?'?1I>YO.QS]5X>7^F9I+KPNKYI+GI8;I1VL>N;-1G.2J.EUZ"9TW,PL +MWS7Z7_>_(#IQGG])_F^:CHYM32Q%-]?I7*DX-!\_J_6T<5-U;QY_C<[)&V>^=3:>?+=*!\'H +M]',Z/$\/,Z'(\*EK?>-\J/R]BB\N=BMIYM:I]"GA:>@Q7-U7)^SI^#">?G_; +MONMLW:0GOIX2C]OVQ2X?@ZI4_3>+=/'WM'X^U(\WD77PP/VZG8<6;BLQUJRG +MO8O@1\I]O$G[)2UN>57\.#3<[[ +MKO:+:D8O]F-U(>A>T$=-]5@*J@:H]<+`?!#*DS:%K%[01A56@`/J*W:+_ZDG +M54U`U;M!?Q<%E1L7XH?PVSQJ\5-;M#?!.(BE08+J_Z57I+?\86%YQD=C(LDR +M)H*"".HS:(15WC(Z!Z6QJ2S,>H-5;% +ME4P].1[<]OY.%L]]R>)OMION#R>#L^!P.757]!$SQQ4-_ON/_^=GEKV_BE-< +MQ8=LYE0TPWA]7E\^98_+0^1GV_^/6D*Z^1Z[NLKO>C%X^]7YCQ4Q*3G?X]T8 +M^IU.YY;S(K48[746@&JX4/[>T3JZ,;\9O#38V&0KC+A-ZF^WV;:%QSOREFPQ?X +MN1,SPM4Z&;$(0N4\Z3M"MQ5MYHEYC6[S:^2/>9-_HE"B-'IKZN#FXZ;HL#LZ +M*GGDT,T3UF7.J>LNPN"1:!\2T@=>BL#I@DT#]!(5[JW=8"BA%B`"''66L;Z$#Z:YJ>N;0[K=P6L +M6,NXR.I/T4:CCQH("Q^,)OT%!0KWL#D7A4M-3*P1E +MEQ=`E&/))\4CSU?NPZ;8-J/I?4'\Z<#IQP.GF16Q#HPNGM%V+@\+8CD!]"Z +M=8$YAA#C$74G*=C%MPMCQ>$L`5UJ6(OL?+U,9(<+_*<\;%7J/%B/4R>E:59I +MTRV+%QQD5">Q<,8"V4+FJRH9?02!)BN+#[(C-_1?.Q+O/.6&<%Z +M5H0QKLL%HI*I$1YZY#0"@/JD:0ZG8HS/8Q@:SU867(RK&E935YB8::8#*,;% +MA49FIR+&-Y2-%"FR>0G5666F!V;*5?8V>,P2N0\;8-2TU7K+XB&RJB(6B\57 +M;*4^(J*U_:[C>[/B;[D[[B3`6UO?;45M,,_Y2_.U]GVZ\__WW7SI/I7]G6W> +MLR%+9)^Q^K)>GR4M+#4;%Y?'O",<^Z?[ZVND>WP_OW%]VC'PNIT<9C\?DF/; +MOL&JU$QSWKR._X*N==E=E*-,Z30R5.GTU#W=G'H$\'LDT:CW88U$:)!&O,?& +MH$V-CJ2)FD':V?YO.CUM5WDZV-4*9JJ>2EAN.L9YJ_&]%+_"[-1Z].AFA?DT0HB!9* +MY2/7*U8:TPA:X!,,Z59>4I)^X8U._'ND:-'HDP]'U>)N4NW?-/&^*24>+B^- +M=8O'7Z<'=_(BG^IV5Q"A/&SH8U/`HX,]C]&1CPM<^/1(U,:E:T"BL82^8EX< +M>-_,UL%#C]U8ZG[4+Y]U0=U`C76]QGI?$F\A6.KU^9H)]K4KLXUT7MK;(JPA +M-WW[>EA\GZKA;-$GEK=K=;Z_HH--U>I +MDAJ3<]9T=O=&46'5/_J1O9QKA4,16G&([K#%/S#&C$Q7\)N-`(ZY[V)Z_^TX5#*_:?SPUEH^;:LA4=^F_JCT +M/;\C3XIP0VZ\X8GKY/7R/>S@OJ_8,C?9'G"%`1RLQXO5)_!]79H?[*)J^W^, +MAX8W+D_7ZWW>ZH+>Z0<07N>TJ\+4K=6`&?=_@LK#+00:PL]!YNWW_X&FQ7T, +ML/F'#*N^"#Z(S:R(N*B+WFX&$6&272'A0RP_(G+A\\_X>]K`A[KG+NN&63$0 +MN76^28VOQ="#;HZ7U)%1:QP_3WAL';81\OO6PMX#]+Q(%:N%29XT,!+#=(.( +M5CYR%AH/,5H$/G=M +M8F7K/%TZP+M716NW^<5UEV`U5>K9/!(\79@C``&_X.$YP7P.B"2>))YDGR20 +MR2*2C)*-DD$F\R-L^;9#MA>]^4)*UI6]+ +M<$J!*\53(O,BED9>1/R37)8X([HPC(Z2CY)+)2\DGE)^402KQ*ODJAE4LK+R +MN\E4U6=GCMG<-L*"/(0T'P(R7['((FU[)OV3ILKALD&R>-D\[)\V0T>8;'@) +M"?)/'2:*3A).,DXZ3UTG+R>\DYZ3GY.ADZ:3/RC?*7"4>)1YE'P/!(+IS((C +MEXR7/S#I,7"8FIB>F$\Q/S"B8%[Z<%_&3NE7^N@'MY2H4J)*C2QJ6/2U1-)4 +MR5.E4)5*4:0:Y!TD$$@\R"&012".0C9"/D$LA-2":03R"B04R`TBUR+I(H`E +MB&112*.1C9&/!!4U(II%/(J)%3(C`@TZ22`)@0EH)&EH.S4DFDD\DHDE,D-) +MM342:F3&E&N4=)1`$FD,HBE$E9^5H96FE3\LWRUPEGB6?);'2T +M)+1DM'2VNEI>6WDM/2T_+4,M32Q^7;Y>X2[Q+H9?'2Z*7A)<2)QLO'2\?+ZZ +:72R]434OO)=-+STN,1U\CTC_TL0]>P!`!P`` +` +end diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_invalid1.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_invalid1.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_invalid1.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_invalid1.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_invalid1.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_invalid1.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_invalid1.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_invalid1.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_noeof.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_noeof.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_noeof.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_noeof.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_use_after_free2.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_use_after_free2.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_ppmd_use_after_free2.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_ppmd_use_after_free2.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_sfx.exe.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_sfx.exe.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_sfx.exe.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_sfx.exe.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_subblock.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_subblock.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_subblock.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_subblock.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_unicode.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_unicode.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_unicode.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_unicode.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_windows.rar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_windows.rar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_rar_windows.rar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_rar_windows.rar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.bufr.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.bufr.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.bufr.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.bufr.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.gz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.gz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_raw.data.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_raw.data.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_concatenated.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_concatenated.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_concatenated.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_concatenated.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_concatenated.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_concatenated.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_concatenated.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_concatenated.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_filename.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_filename.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_filename.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_filename.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_pax.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_pax.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_pax.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_pax.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.c new file mode 100644 index 0000000..0a03cb6 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.c @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2020 Ben Wagner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +/* + * The pax size attribute can be used to override the size. + * It should be validated the same way the normal size is validated. + * The test data is fuzzer output from + * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=48467 . + */ +DEFINE_TEST(test_read_format_tar_invalid_pax_size) +{ + /* + * An archive that contains a PAX 'size' record with a large negative value. + */ + struct archive_entry *ae; + struct archive *a; + const char *refname = "test_read_format_tar_invalid_pax_size.tar"; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); + /* This assert will pass a normal debug build without the pax size check. */ + /* Run this test with `-fsanitize=undefined` to verify. */ + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu new file mode 100644 index 0000000..71309ea --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu @@ -0,0 +1,38 @@ +begin 644 test_read_format_tar_invalid_pax_size.tar.uu +M+B]087A(96%D97)S+C$T-#8S+V%A80`````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,S$R +M`#$R-3,Q,30U,S``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U='-A<@`P,``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````S,"`@("`@(#T@("`@("`@("`@("`@("`@("`@ +M(`HS,"`@("`@(#T@("`@("`@("`@("`@("`@("`@(`HS,"`@("`@("`]("`@ +M("`@("`@("`@("`@("`@(`HS,"!S:7IE/2TQ.3I.97\6@M?/P$SA1R6+RFRUD<*@L-#!$.$A`-#!,!;_I.?CH\]WK(I'HJ +MC1"P;([X:RD\"4NZL[X9?H=*YI9Q^9SUG`U"%GS.%'JF0M<\[PV?3#MR">63 +MU+);7<0EM,_'U]+()+7>.MS@IFGS.GUF +M'S5\-@V=Y=MW6",,P^\(`,FALG&E(V`ZX;1&#G$;^?8[^=%R^:Q[GB1^JPZA +M-SI]3O>XY5O/>)70LG3/QWO;L^DZJQ/Q)"5'6^UGS\CUT,:'[<)XDMY"B%WV +MPK$('N2MJ]2M61L`\D@@2E$0?$HA-^YDM0T959VUCN4BS.J<-=[ +M6P)HFD)TO47V[FWT;?<:9=HN25KX&K(SA?9*P8'"=&]T1G?9G8^[AR>)P11R +MY'H86B0%XTKA&U$O;*N]M,>LJ)E`K77)I'N2E`(B(!!&C.+TY**V^BU(V9R8 +M!ZLXW)6;"!YPP'E,4_F\OB!T"4Z:6/#"Z823+@5V#BNHGHC-+4@`)>?""C,) +M2+G'/1,#D-1'B&&R288:'(KD,I>"_/85-]>-'@L``"L:```+````+!_^R$5-5D[3>O4AU,N^VP>S3+^79Y-P+W?;_&!3.]_D3K-7OY*9 +MR]UN$D)9?2_/*/9(FB13Q!*YTT"H42F^;(9P^_V^L)?+=AI^5S^^6_'%I]C. +M9Z)^65,*(B*9*!+I`,KD;LHM>DSQNK>@Y,P6C^]6?!12PCM-YG)LFS/\JU3JFDR`5XNOHZ0N^P8+&#R!1]OO +MVOBBS4MIQG>:9>T9Q:[)S%W4/VZGC-8[OR,X![]8K^OG=J7OBK4\VOC@YV9W +MFHWR5[_MCQ4?:Y^R7Y3899^7>IAUK^2;'[3VLMQI&JC1>GRGD9AHN)X7\Y;: +M^7ZOWM5WNA/:>0C?=J=I`+@#PY2O0,.QX&@L(&@\@0,*@`$E-!B.,QP-R!>< +M!,"=IK&FC!A*V5%BT;9MB\5"UGU]@=_7TNR+R88[31-545)1L>].?^1Z*L:? +MLOK"5SW*USHUZU514E^883K="9+:RYTFHYC6C\_OLCR*\G4F;]#*=Y#!]VJW +MEJ6P^EZ<)N[5?Y^;47@$2V0Z@!QU6F17TJ,I0O;UK)^Z6:84_%S$)!55+`'Q +M84Z/04]X!7I"PI,`>2!?`)UZ<<\[-?BTBO+P*787=[K31`@)!V\)`U,VM1,# +M;ELI":%NY97\:E`QW[3R^)R&'\@5#-#:Y4[S($`4&@>WW*T##RHV96P(0GL( +MO0'Z!:+0Z&RIBGU\3D-!Z6Q+PNF/)1T^Y9R4A[76YELJD8?):1J$!V.!8!$Y +M/.!@+*)H,1V<)^A17D)7Z.IX@5FW<)H(4PCTX(RZJ;5.=YI;4<+K,7U`CL?= +MK=TS[-9#J%-D6DSYB"4R+2*6R)OG8[C3-`E?`)TK%%O$ASD-:X_A2IYP +M!0.93:UU;H9M7_:M^+J7OYC7&N"DI5W?%+BLEY#!KH'Y2X'Y2Z6#/5,,>7VQ(C%-+[J49OQ!=/B$7K*[.!. +M\V2F,B^U\2WC^=T`(N(1;]+%MP`C+XOI!.'6[L+@&'%61I@BTUO&@T?#P="M +M#X$>=U&S($RF`G8GPY^#*SB-@@/R>#@D.,/0]%U,4KJ#&DP%@DN`306CS/TQQ3?05=,[X`:49NP+`&$@#>Z77!V +MZ^)VQ4Y_Y#11J=;KZD=R:\8GH#,NH9:5^C[J75Q^:P7<:1@^K:Z&NE<&QH@_ +MHJ#VHMYQX>/?:2+NN%B4\V'B7L(0F:8H%PM-Y'8^7G>GB=Q&K?JSXIO-E]AM +MQ\469MA[!CY`=_%Q$(RJ2AZ+4^LSKF#NM?V9D$!.DY#@N`(!/I&N0(`W/M>" +MBCUJW?7\G&;C@Q;PYD;"BQICRGXTR +M3K6T"S9?]>4)A@`4&I^`GD"A<4D%O6&_T%#3:B<*8<4']Z+PO*]Z3C[<,CT0 +MQU"OWT20_.F'/?@J(DA_EHH[MZH>PN221WHF7]#4SBFI.!$Q(>/8E426\BW5*!/N4UZ$\&3:17\LPP\G\B?6I0!EVV8I[6 +M`*4UB!OLE#"H9,P[LXK]5*A9.\][4:W8M]4MXEX;Q0!*Y;R69GSP*1]&K[UD +MJN<>*NAI@#YE)7OJ]LDD,'@FZM2FK*IGLXSECRP)H=OJ30UO@'[W +M_F0N+FKSGVP7\I^YF.4G(4Z91#P\3@A5)1=1'E257'A1?FY!^1TB!UPNYC$_ +M;&[V9Z&2WRBCSH6RV0*Q>%@X/!#/L_"B&(GM_`/A8J9B?QYM_<)FF?Y.IT@D +M8'F!P:@Q,5/(S(B(B$B2)!D.<02$&,6>IE2R*7%*T&;?1.FK+IYT!&_5B-5DP39XE!D% +MU4I&#GB2.ZRXY2=4I)"45?,9GE*1:>%CGS]Y$T?]!<.L!XW0S]DV[J]^RZUO +MU-$)H:Y^.=7_&D-=/U?:N2=I9478#((F??EK=-I1S/+>G(J&!8#8Z!:SN/"0W!8-Q[JFX +MM_*65-,=T<$H_5R>$A*!B@?!QDT)A2&MH8F637:F%R6%";@](C+4@\6'16DZ +MU_HU?%3PJE\R1U+@1W,+`-#RU%+^+.>.!"M\UT,*C&33WQRGB1G26U$9^L)A +M)I%").6%$Y@_%NBBIU(1:BFRY39*=(')Z1KA$&)]OJ(+#I`/%M!VE>6H1^\D +M,#X7\>\,NQ2.]95_3M#!#:N(IC^E6(GHYRO+<3#5PU)A=@0# +M%[=9[_H%";U],PMX`<<#,:#K?!05",0@;1R(1:[N>SE]`N+W-AW20?"87U?W +MK[3+[+`]MO)(%2XN0H\@:S$OM_]EM=8!3:[TE;@FRJNCP6'V]PP'1<*B?KO! +MU0BW]X&T&QIBOH<8K/(#;Z@8%W[DDI%8F[B.+3D$C,J"\(`6XIX"'LOA0+`7 +MB)&X$P@K>MMV>X/MQ8*7P8-UY,(L_Q?%H5JB#>I4V^NXD34"X,<3K.RIA,_` +M?(#'XE!-6,8R!_)8X4;0H%5C7*"G;B"^H.GQJA^21KE)P!?PA)KD#RQ&%K(I +MX\:E'!D\^5@D'RPX,&RVW'G!BHTTI-]S4 +MD8845O$($J+3Q-60RN",_F/"AL>>K)JT2M]0$E`:/I!9&4\N/KB'Y^@,IEH' +M24"9!VN@A)H:Q?\A`.0A848 +M(`]O]_OU)'H%IJ@(?-M*9'K)&RCLM@T%=-)*31^"9Z1TS:;@S5]#J4..*-FE +M,/B;48CTK8-ZC76,F34<-E(M:`YL4:7L>QH0(`<:3R#$LW-\-LR\E^AG; +MI)[_`WT'-5!+`P04````70"(.)%-,9OE>IH!``!4`P``!P```'1S+F-O;F8H +MM2_]`%B-#`#6G$T?4$W3!D_TVC/9!E7:MTFZHMQL#\'FCNWU"^^36;A/#48` +M00!&`.H\A"5RGEETHH(5QQ%1V?#T(&R.*[7D]R#N_$0E[^.<6>(Y2SZSOC[& +M-:,6X0J5Q0$*P+/1^N-MYBU7C&((R=%@NK,V;$'M>)X8I2EYSU^EO7):4J]6LF)7DU;\IOL>*,<7S5>#A4! +MW:L#`DX$ID628(-DP6F6,+#@0UNE-8G\PZSD?UZ3A'UL]2XVSW:@7X5C(LE=*@ +M!P0),F$$.4@0"6:1X42K292OO'F(,_2?/@ZHC*Z015*;CIS?-8,)D!W9=FT'5M;6,=/5CUA)1X +M;1VP`U!+`P04````70`],9%-JCN.NAL"``"0`P``!0```'9I;7)C*+4O_0!8 +ME1``)BAL(R!OVP;,O[!>_2;=8,G_;[\MQ(&0),2W`I@S1AQ.5@F0@D!A90!? +M`%X`D5WYN&K*O.'RM]&3E$R[/8?P[:^%R]/I1X^K7-Q;OFKX`7;=U@C#,/O"`#)H;)QI2-@.N&T1@YQ&_GV._G1YXD +M?JL.H3)+> +M0HA=]L*W-DU=-H/GA"![DK:O4K5D;`/)(($I1$'Q*(3?N9+4-&56=M8[E(LS +MJG#7>UL":)I"=+U%]NYM]&WW&F7:+DE:^!JR,X7V2L&!PG1O=$9WV9V/NX-*X1M1+VRKO;3'K*B90*UUR:1[DI0"(B`01HSB].2BMOHM +M2-FK.-R5FP@><,!Y3%/YO+X@=`E.FECPPNF$DRX%=@XKJ)Z(S2U(`"7G +MP@HS"4BYQST3`Y#41XAALDF&&AR*Y#*7@OSV%7.AC5\0]IEE%P502P$"/P,4 +M````70"1.)%-GC?7C1X+```K&@``"P``````````````I($`````IH!``!4`P``!P`````````````` +MI(%'"P``=',N8V]N9E!+`0(_`Q0```!=`#TQD4VJ.XZZ&P(``)`#```%```` +I``````````"D@08-``!V:6UR8U!+!08``````P`#`*$```!$#P`````` +` +end diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large.c index 6966ccb..8dbf48d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large.c @@ -37,7 +37,6 @@ static unsigned char buff[11 * 1024 * 1024]; /* Check correct behavior on large reads. */ DEFINE_TEST(test_read_large) { - unsigned int i; int tmpfilefd; char tmpfilename[] = "test-read_large.XXXXXX"; size_t used; @@ -45,8 +44,7 @@ DEFINE_TEST(test_read_large) struct archive_entry *entry; FILE *f; - for (i = 0; i < sizeof(testdata); i++) - testdata[i] = (unsigned char)(rand()); + fill_with_pseudorandom_data(testdata, sizeof(testdata)); assert(NULL != (a = archive_write_new())); assertA(0 == archive_write_set_format_ustar(a)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_aa.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_aa.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_aa.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_aa.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ab.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ab.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ab.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ab.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ac.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ac.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ac.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ac.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ad.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ad.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ad.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ad.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ae.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ae.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_large_splitted_rar_ae.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_large_splitted_rar_ae.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_truncated.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_truncated.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_truncated.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_truncated.c index 1f6e78a..6a0bb9b 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_truncated.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_truncated.c @@ -48,8 +48,8 @@ DEFINE_TEST(test_read_pax_truncated) assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, "file"); archive_entry_set_mode(ae, S_IFREG | 0755); - for (i = 0; i < filedata_size; i++) - filedata[i] = (unsigned char)rand(); + fill_with_pseudorandom_data(filedata, filedata_size); + archive_entry_set_atime(ae, 1, 2); archive_entry_set_ctime(ae, 3, 4); archive_entry_set_mtime(ae, 5, 6); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_schily.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_schily.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_schily.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_schily.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_schily.tar.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_schily.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_pax_xattr_schily.tar.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_pax_xattr_schily.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_position.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_position.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_position.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_position.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_set_format.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_set_format.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_set_format.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_set_format.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_aa.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_aa.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_aa.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_aa.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ab.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ab.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ab.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ab.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ac.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ac.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ac.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ac.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ad.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ad.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_splitted_rar_ad.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_splitted_rar_ad.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_too_many_filters.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_too_many_filters.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_too_many_filters.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_too_many_filters.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_too_many_filters.gz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_too_many_filters.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_too_many_filters.gz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_too_many_filters.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated.c index 3991ab2..1e760d7 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated.c @@ -47,8 +47,7 @@ DEFINE_TEST(test_read_truncated) assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, "file"); archive_entry_set_mode(ae, S_IFREG | 0755); - for (i = 0; i < sizeof(buff2); i++) - buff2[i] = (unsigned char)rand(); + fill_with_pseudorandom_data(buff2, sizeof(buff2)); archive_entry_set_size(ae, sizeof(buff2)); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); archive_entry_free(ae); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated_filter.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated_filter.c similarity index 89% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated_filter.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated_filter.c index 632638d..f85ccaa 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_read_truncated_filter.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_read_truncated_filter.c @@ -41,7 +41,7 @@ test_truncation(const char *compression, char path[16]; char *buff, *data; size_t buffsize, datasize, used1; - int i, j, r, use_prog; + int i, r, use_prog; buffsize = 2000000; assert(NULL != (buff = (char *)malloc(buffsize))); @@ -81,7 +81,7 @@ test_truncation(const char *compression, archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "%s%d", compression, i); + snprintf(path, sizeof(path), "%s%d", compression, i); archive_entry_copy_pathname(ae, path); failure("%s", path); if (!assertEqualIntA(a, ARCHIVE_OK, @@ -91,9 +91,7 @@ test_truncation(const char *compression, free(buff); return; } - for (j = 0; j < (int)datasize; ++j) { - data[j] = (char)(rand() % 256); - } + fill_with_pseudorandom_data(data, datasize); failure("%s", path); if (!assertEqualIntA(a, datasize, archive_write_data(a, data, datasize))) { @@ -111,8 +109,13 @@ test_truncation(const char *compression, assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); - assertEqualIntA(a, ARCHIVE_OK, - archive_read_open_memory(a, buff, used1 - used1/64)); + r = archive_read_open_memory(a, buff, used1 - used1/64); + if (r != ARCHIVE_OK) { + assertEqualStringA(a, "truncated bzip2 input", + archive_error_string(a)); + goto out; + } + for (i = 0; i < 100; i++) { if (ARCHIVE_OK != archive_read_next_header(a, &ae)) { failure("Should have non-NULL error message for %s", @@ -120,7 +123,7 @@ test_truncation(const char *compression, assert(NULL != archive_error_string(a)); break; } - sprintf(path, "%s%d", compression, i); + snprintf(path, sizeof(path), "%s%d", compression, i); assertEqualString(path, archive_entry_pathname(ae)); if (datasize != (size_t)archive_read_data(a, data, datasize)) { failure("Should have non-NULL error message for %s", @@ -133,6 +136,7 @@ test_truncation(const char *compression, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +out: free(data); free(buff); } @@ -154,12 +158,12 @@ DEFINE_TEST(test_read_truncated_filter_gzip) DEFINE_TEST(test_read_truncated_filter_lzip) { - test_truncation("lzip", archive_write_add_filter_lzip, 0); + test_truncation("lzip", archive_write_add_filter_lzip, canLzip()); } DEFINE_TEST(test_read_truncated_filter_lzma) { - test_truncation("lzma", archive_write_add_filter_lzma, 0); + test_truncation("lzma", archive_write_add_filter_lzma, canLzma()); } DEFINE_TEST(test_read_truncated_filter_lzop) @@ -169,5 +173,5 @@ DEFINE_TEST(test_read_truncated_filter_lzop) DEFINE_TEST(test_read_truncated_filter_xz) { - test_truncation("xz", archive_write_add_filter_xz, 0); + test_truncation("xz", archive_write_add_filter_xz, canXz()); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_short_writes.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_short_writes.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_short_writes.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_short_writes.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_sparse_basic.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_sparse_basic.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_sparse_basic.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_sparse_basic.c index 43e87df..484c286 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_sparse_basic.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_sparse_basic.c @@ -253,8 +253,10 @@ is_sparse_supported(const char *path) #if defined(HAVE_LINUX_FIEMAP_H) if (r < 0) return (is_sparse_supported_fiemap(path)); -#endif + return (1); +#else return (r >= 0); +#endif } #elif !defined(HAVE_LINUX_FIEMAP_H) @@ -364,9 +366,10 @@ verify_sparse_file(struct archive *a, const char *path, #if DEBUG fprintf(stderr, " overlapping hole expected_offset=%d, size=%d\n", (int)expected_offset, (int)sparse->size); #endif - /* Must be a hole, overlap must be filled with '\0' */ - if (assert(sparse->type == HOLE)) { + if (sparse->type == HOLE) { assertMemoryFilledWith(start, end - start, '\0'); + } else if (assert(sparse->type == DATA)) { + assertMemoryFilledWith(start, end - start, ' '); } start = end; expected_offset += sparse->size; @@ -410,9 +413,10 @@ verify_sparse_file(struct archive *a, const char *path, #if DEBUG fprintf(stderr, " trailing overlap expected_offset=%d, size=%d\n", (int)expected_offset, (int)sparse->size); #endif - /* Must be a hole, overlap must be filled with '\0' */ - if (assert(sparse->type == HOLE)) { + if (sparse->type == HOLE) { assertMemoryFilledWith(start, end - start, '\0'); + } else if (assert(sparse->type == DATA)) { + assertMemoryFilledWith(start, end - start, ' '); } } last_offset = offset + bytes_read; @@ -614,6 +618,33 @@ DEFINE_TEST(test_sparse_basic) verify_sparse_file2(a, "file0", sparse_file0, 5, 0); verify_sparse_file2(a, "file0", sparse_file0, 5, 1); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + + /* + * Test that setting ARCHIVE_READDISK_NO_SPARSE + * creates no sparse entries. + */ + assert((a = archive_read_disk_new()) != NULL); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_behavior(a, + ARCHIVE_READDISK_NO_SPARSE)); + + verify_sparse_file(a, "file0", sparse_file0, 0); + verify_sparse_file(a, "file1", sparse_file1, 0); + verify_sparse_file(a, "file2", sparse_file2, 0); + verify_sparse_file(a, "file3", sparse_file3, 0); + verify_sparse_file(a, "file4", sparse_file4, 0); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + + assert((a = archive_read_disk_new()) != NULL); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_behavior(a, + ARCHIVE_READDISK_NO_SPARSE)); + + verify_sparse_file2(a, "file0", sparse_file0, 0, 0); + verify_sparse_file2(a, "file0", sparse_file0, 0, 1); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); free(cwd); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_aa.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_aa.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_aa.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_aa.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_ab.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_ab.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_ab.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_ab.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_ac.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_ac.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_splitted_rar_seek_support_ac.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_splitted_rar_seek_support_ac.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_tar_filenames.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_tar_filenames.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_tar_filenames.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_tar_filenames.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_tar_large.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_tar_large.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_tar_large.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_tar_large.c index 626f9f0..0da58aa 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_tar_large.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_tar_large.c @@ -224,7 +224,7 @@ DEFINE_TEST(test_tar_large) */ for (i = 0; tests[i] != 0; i++) { assert((ae = archive_entry_new()) != NULL); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); archive_entry_copy_pathname(ae, namebuff); archive_entry_set_mode(ae, S_IFREG | 0755); filesize = tests[i]; @@ -271,7 +271,7 @@ DEFINE_TEST(test_tar_large) */ for (i = 0; tests[i] > 0; i++) { assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); assertEqualString(namebuff, archive_entry_pathname(ae)); assert(tests[i] == archive_entry_size(ae)); } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_ustar_filename_encoding.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_ustar_filename_encoding.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_ustar_filename_encoding.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_ustar_filename_encoding.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_ustar_filenames.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_ustar_filenames.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_ustar_filenames.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_ustar_filenames.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_warn_missing_hardlink_target.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_warn_missing_hardlink_target.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_warn_missing_hardlink_target.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_warn_missing_hardlink_target.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_appledouble.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_appledouble.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_appledouble.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_appledouble.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_appledouble.cpio.gz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_appledouble.cpio.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_appledouble.cpio.gz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_appledouble.cpio.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_failures.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_failures.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_failures.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_failures.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_fixup.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_fixup.c similarity index 66% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_fixup.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_fixup.c index c399c98..b83b730 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_fixup.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_fixup.c @@ -47,26 +47,50 @@ DEFINE_TEST(test_write_disk_fixup) /* * Create a file */ - assertMakeFile("victim", 0600, "a"); + assertMakeFile("file", 0600, "a"); + + /* + * Create a directory + */ + assertMakeDir("dir", 0700); /* * Create a directory and a symlink with the same name */ - /* Directory: dir */ + /* Directory: dir1 */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "dir"); - archive_entry_set_mode(ae, AE_IFDIR | 0606); + archive_entry_copy_pathname(ae, "dir1/"); + archive_entry_set_mode(ae, AE_IFDIR | 0555); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); archive_entry_free(ae); - /* Symbolic Link: dir -> foo */ + /* Directory: dir2 */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir2/"); + archive_entry_set_mode(ae, AE_IFDIR | 0555); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Symbolic Link: dir1 -> dir */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "dir"); + archive_entry_copy_pathname(ae, "dir1"); archive_entry_set_mode(ae, AE_IFLNK | 0777); archive_entry_set_size(ae, 0); - archive_entry_copy_symlink(ae, "victim"); + archive_entry_copy_symlink(ae, "dir"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r >= ARCHIVE_WARN) + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Symbolic Link: dir2 -> file */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir2"); + archive_entry_set_mode(ae, AE_IFLNK | 0777); + archive_entry_set_size(ae, 0); + archive_entry_copy_symlink(ae, "file"); assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); if (r >= ARCHIVE_WARN) assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); @@ -75,7 +99,9 @@ DEFINE_TEST(test_write_disk_fixup) assertEqualInt(ARCHIVE_OK, archive_write_free(ad)); /* Test the entries on disk. */ - assertIsSymlink("dir", "victim", 0); - assertFileMode("victim", 0600); + assertIsSymlink("dir1", "dir", 0); + assertIsSymlink("dir2", "file", 0); + assertFileMode("dir", 0700); + assertFileMode("file", 0600); #endif } diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hardlink.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hardlink.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hardlink.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hardlink.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hfs_compression.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hfs_compression.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hfs_compression.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hfs_compression.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hfs_compression.tgz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hfs_compression.tgz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_hfs_compression.tgz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_hfs_compression.tgz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_lookup.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_lookup.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_lookup.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_lookup.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_mac_metadata.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_mac_metadata.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_mac_metadata.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_mac_metadata.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_mac_metadata.tar.gz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_mac_metadata.tar.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_mac_metadata.tar.gz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_mac_metadata.tar.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_no_hfs_compression.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_no_hfs_compression.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_no_hfs_compression.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_no_hfs_compression.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_no_hfs_compression.tgz.uu b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_no_hfs_compression.tgz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_no_hfs_compression.tgz.uu rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_no_hfs_compression.tgz.uu diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_perms.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_perms.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_perms.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_perms.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure744.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure744.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure744.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure744.c index 08c725e..9b12d4c 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure744.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure744.c @@ -75,7 +75,7 @@ DEFINE_TEST(test_write_disk_secure744) archive_entry_free(ae); *p++ = '/'; - sprintf(p, "target%d", n); + snprintf(p, buff_size - (p - buff), "target%d", n); /* Try to create a file through the symlink, should fail. */ assert((ae = archive_entry_new()) != NULL); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure745.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure745.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure745.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure745.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure746.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure746.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure746.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure746.c index 5ce1fd9..99cb882 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_secure746.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_secure746.c @@ -39,9 +39,6 @@ __FBSDID("$FreeBSD$"); */ DEFINE_TEST(test_write_disk_secure746a) { -#if defined(_WIN32) && !defined(__CYGWIN__) - skipping("archive_write_disk security checks not supported on Windows"); -#else struct archive *a; struct archive_entry *ae; @@ -75,7 +72,6 @@ DEFINE_TEST(test_write_disk_secure746a) assertEqualIntA(a, ARCHIVE_FATAL, archive_write_close(a)); archive_write_free(a); -#endif } /* diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_sparse.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_sparse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_sparse.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_sparse.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_symlink.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_symlink.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_symlink.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_symlink.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_times.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_times.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_disk_times.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_disk_times.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_b64encode.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_b64encode.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_b64encode.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_b64encode.c index 665087b..5b917e9 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_b64encode.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_b64encode.c @@ -64,7 +64,7 @@ DEFINE_TEST(test_write_filter_b64encode) assert((ae = archive_entry_new()) != NULL); archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -79,7 +79,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -111,7 +111,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -128,7 +128,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_bzip2.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_bzip2.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_bzip2.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_bzip2.c index 4f32d28..9e089c0 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_bzip2.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_bzip2.c @@ -83,7 +83,7 @@ DEFINE_TEST(test_write_filter_bzip2) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -99,7 +99,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -133,7 +133,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -160,7 +160,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -187,7 +187,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -212,7 +212,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_compress.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_compress.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_compress.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_compress.c index 1b8910e..5cc0fc8 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_compress.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_compress.c @@ -59,7 +59,7 @@ DEFINE_TEST(test_write_filter_compress) archive_write_open_memory(a, buff, buffsize, &used)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -83,7 +83,7 @@ DEFINE_TEST(test_write_filter_compress) for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_gzip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_gzip.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_gzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_gzip.c index 935fb51..2b76162 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_gzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_gzip.c @@ -85,7 +85,7 @@ DEFINE_TEST(test_write_filter_gzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -113,7 +113,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -148,7 +148,7 @@ DEFINE_TEST(test_write_filter_gzip) archive_write_set_options(a, "gzip:compression-level=9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -187,7 +187,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -212,7 +212,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -249,7 +249,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_gzip_timestamp.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_gzip_timestamp.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_gzip_timestamp.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_gzip_timestamp.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lrzip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lrzip.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lrzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lrzip.c index f28c835..2efc2ec 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lrzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lrzip.c @@ -68,7 +68,7 @@ DEFINE_TEST(test_write_filter_lrzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -84,7 +84,7 @@ DEFINE_TEST(test_write_filter_lrzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lz4.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lz4.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lz4.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lz4.c index 4f2135a..071fee4 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lz4.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lz4.c @@ -84,7 +84,7 @@ DEFINE_TEST(test_write_filter_lz4) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -107,7 +107,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -142,7 +142,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -170,7 +170,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -195,7 +195,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -225,7 +225,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -330,7 +330,7 @@ test_options(const char *options) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -350,7 +350,7 @@ test_options(const char *options) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzip.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzip.c index 145a308..ce70a5d 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzip.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzip.c @@ -81,7 +81,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -103,7 +103,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -133,7 +133,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -157,7 +157,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -181,7 +181,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -210,7 +210,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzma.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzma.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzma.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzma.c index 68e4898..d055333 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzma.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzma.c @@ -80,7 +80,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -102,7 +102,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -132,7 +132,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -156,7 +156,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -180,7 +180,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -214,7 +214,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzop.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzop.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzop.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzop.c index 92db7bf..18fc332 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_lzop.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_lzop.c @@ -79,7 +79,7 @@ DEFINE_TEST(test_write_filter_lzop) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -99,7 +99,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -135,7 +135,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -163,7 +163,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -188,7 +188,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -218,7 +218,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_program.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_program.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_program.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_program.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_uuencode.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_uuencode.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_uuencode.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_uuencode.c index 57a4b49..2ce5b89 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_uuencode.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_uuencode.c @@ -64,7 +64,7 @@ DEFINE_TEST(test_write_filter_uuencode) assert((ae = archive_entry_new()) != NULL); archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -79,7 +79,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -111,7 +111,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -128,7 +128,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_xz.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_xz.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_xz.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_xz.c index bf1265c..e2f1ec8 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_xz.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_xz.c @@ -80,7 +80,7 @@ DEFINE_TEST(test_write_filter_xz) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -102,7 +102,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -132,7 +132,7 @@ DEFINE_TEST(test_write_filter_xz) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -163,7 +163,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -187,7 +187,7 @@ DEFINE_TEST(test_write_filter_xz) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -220,7 +220,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_zstd.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_zstd.c similarity index 95% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_zstd.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_zstd.c index b5f061a..263cea5 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_filter_zstd.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_filter_zstd.c @@ -74,7 +74,7 @@ DEFINE_TEST(test_write_filter_zstd) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -96,7 +96,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -129,9 +129,13 @@ DEFINE_TEST(test_write_filter_zstd) archive_write_set_filter_option(a, NULL, "compression-level", "-1")); */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_filter_option(a, NULL, "compression-level", "7")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "threads", "-1")); /* negative */ + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "threads", "4")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -154,7 +158,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -181,7 +185,7 @@ DEFINE_TEST(test_write_filter_zstd) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize == (size_t)archive_write_data(a, data, datasize)); @@ -201,7 +205,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used3)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip_large.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip_large.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip_large.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip_large.c index 5c49f59..b7a90d1 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_7zip_large.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_7zip_large.c @@ -27,7 +27,7 @@ #include "test.h" __FBSDID("$FreeBSD$"); -#define LARGE_SIZE (16*1024*1024) +#define LARGE_SIZE (1*1024*1024) static void test_large(const char *compression_type) { @@ -37,7 +37,6 @@ test_large(const char *compression_type) size_t buffsize = LARGE_SIZE + 1024 * 256; size_t datasize = LARGE_SIZE; char *buff, *filedata, *filedata2; - unsigned i; assert((buff = malloc(buffsize)) != NULL); assert((filedata = malloc(datasize)) != NULL); @@ -87,8 +86,7 @@ test_large(const char *compression_type) /* NOTE: PPMd cannot handle random data correctly.*/ memset(filedata, 'a', datasize); } else { - for (i = 0; i < datasize; i++) - filedata[i] = (char)rand(); + fill_with_pseudorandom_data(filedata, datasize); } assertEqualInt(datasize, archive_write_data(a, filedata, datasize)); diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_ar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_ar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_ar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_ar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_newc.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_newc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_newc.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_newc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_odc.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_odc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_cpio_odc.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_cpio_odc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_gnutar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_gnutar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_gnutar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_gnutar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_gnutar_filenames.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_gnutar_filenames.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_gnutar_filenames.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_gnutar_filenames.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_boot.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_boot.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_boot.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_boot.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_zisofs.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_zisofs.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_iso9660_zisofs.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_iso9660_zisofs.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_absolute_path.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_absolute_path.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_absolute_path.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_absolute_path.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_classic.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_classic.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_classic.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_classic.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_classic_indent.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_classic_indent.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_classic_indent.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_classic_indent.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_fflags.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_fflags.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_fflags.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_fflags.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_no_separator.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_no_separator.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_no_separator.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_no_separator.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_quoted_filename.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_quoted_filename.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_mtree_quoted_filename.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_mtree_quoted_filename.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_pax.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_pax.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_pax.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_pax.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_raw.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_raw.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_raw.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_raw.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_raw_b64.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_raw_b64.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_raw_b64.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_raw_b64.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_shar_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_shar_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_shar_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_shar_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_sparse.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_sparse.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_sparse.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_sparse.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_ustar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_ustar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_ustar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_ustar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_v7tar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_v7tar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_tar_v7tar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_tar_v7tar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_warc.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_warc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_warc.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_warc.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_warc_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_warc_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_warc_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_warc_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_xar.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_xar.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_xar.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_xar.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_xar_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_xar_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_xar_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_xar_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_compression_store.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_compression_store.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_compression_store.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_compression_store.c index c969a41..ed09087 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_compression_store.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_compression_store.c @@ -128,12 +128,31 @@ static void verify_uncompressed_contents(const char *buff, size_t used) /* Misc variables */ unsigned long crc; - struct tm *tm = localtime(&now); - + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S) + struct tm tmbuf; +#endif +#if defined(HAVE__LOCALTIME64_S) + errno_t terr; + __time64_t tmptime; +#endif /* p is the pointer to walk over the central directory, * q walks over the local headers, the data and the data descriptors. */ const char *p, *q, *local_header, *extra_start; +#if defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &tmbuf); +#elif defined(HAVE__LOCALTIME64_S) + tmptime = now; + terr = _localtime64_s(&tmbuf, &tmptime); + if (terr) + tm = NULL; + else + tm = &tmbuf; +#else + tm = localtime(&now); +#endif + /* Remember the end of the archive in memory. */ buffend = buff + used; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_empty.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_empty.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_empty.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_empty.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_empty_zip64.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_empty_zip64.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_empty_zip64.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_empty_zip64.c diff --git a/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_entry_size_unset.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_entry_size_unset.c new file mode 100644 index 0000000..13b5f1b --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_entry_size_unset.c @@ -0,0 +1,321 @@ +/*- + * Copyright (c) 2021 Jia Cheong Tan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" +__FBSDID("$FreeBSD$"); + +/* File data */ +static const char file_name[] = "file"; +static const char file_data1[] = {'a', 'b', 'c', 'd', 'e'}; +static const char file_data2[] = {'f', 'g', 'h', 'i', 'j'}; +static const int file_perm = 00644; +static const short file_uid = 10; +static const short file_gid = 20; + +/* Folder data */ +static const char folder_name[] = "folder/"; +static const int folder_perm = 00755; +static const short folder_uid = 30; +static const short folder_gid = 40; + +#define ZIP_ENTRY_FLAG_LENGTH_AT_END (1 << 3) + +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ +static unsigned i2(const char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static unsigned i4(const char *p) { return (i2(p) | (i2(p + 2) << 16)); } + +static unsigned long +bitcrc32(unsigned long c, const void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly generate + * uncompressed zip archives (including correct CRCs) even + * when zlib is unavailable, and this function helps us verify + * that. Yes, this is very, very slow and unsuitable for + * production use, but it's correct, compact, and works well + * enough for this particular usage. Libarchive internally + * uses a much more efficient implementation. */ + const unsigned char *p = _p; + int bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) + { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) + { + if (c & 1) + c = (c >> 1); + else + c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +static void write_archive(struct archive *a) +{ + struct archive_entry *entry = archive_entry_new(); + assert(entry != NULL); + + /* Does not set size for file entry */ + archive_entry_set_pathname(entry, file_name); + archive_entry_set_mode(entry, S_IFREG | 0644); + archive_entry_set_uid(entry, file_uid); + archive_entry_set_gid(entry, file_gid); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1))); + assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2))); + archive_entry_free(entry); + + /* Folder */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, folder_name); + archive_entry_set_mode(entry, S_IFDIR | folder_perm); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, folder_uid); + archive_entry_set_gid(entry, folder_gid); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); +} + +static void verify_contents(const char *zip_buff, size_t size) +{ + unsigned long crc = bitcrc32(0, file_data1, sizeof(file_data1)); + crc = bitcrc32(crc, file_data2, sizeof(file_data2)); + + const char *zip_end = zip_buff + size; + /* Since there are no comments, the end of central directory + * is 22 bytes from the end of content */ + const char *end_of_central_dir = zip_end - 22; + /* Check for end of central directory signature */ + assertEqualMem(end_of_central_dir, "PK\x5\x6", 4); + /* Check for number of disk */ + assertEqualInt(i2(end_of_central_dir + 4), 0); + /* Check for disk where central directory starts */ + assertEqualInt(i2(end_of_central_dir + 6), 0); + /* Check for number of central directory records on disk */ + assertEqualInt(i2(end_of_central_dir + 8), 2); + /* Check for total number of central directory records */ + assertEqualInt(i2(end_of_central_dir + 10), 2); + /* Check for size of central directory and offset + * The size + offset must equal the end of the central directory */ + assertEqualInt(i4(end_of_central_dir + 12) + i4(end_of_central_dir + 16), end_of_central_dir - zip_buff); + /* Check for empty comment length */ + assertEqualInt(i2(end_of_central_dir + 20), 0); + + /* Get address of central directory */ + const char *central_directory = zip_buff + i4(end_of_central_dir + 16); + + /* Check for entry in central directory signature */ + assertEqualMem(central_directory, "PK\x1\x2", 4); + /* Check for version used to write entry */ + assertEqualInt(i2(central_directory + 4), 3 * 256 + 10); + /* Check for version needed to extract entry */ + assertEqualInt(i2(central_directory + 6), 10); + /* Check flags */ + assertEqualInt(i2(central_directory + 8), ZIP_ENTRY_FLAG_LENGTH_AT_END); + /* Check compression method */ + assertEqualInt(i2(central_directory + 10), 0); + /* Check crc value */ + assertEqualInt(i4(central_directory + 16), crc); + /* Check compressed size*/ + assertEqualInt(i4(central_directory + 20), sizeof(file_data1) + sizeof(file_data2)); + /* Check uncompressed size */ + assertEqualInt(i4(central_directory + 24), sizeof(file_data1) + sizeof(file_data2)); + /* Check file name length */ + assertEqualInt(i2(central_directory + 28), strlen(file_name)); + /* Check extra field length */ + assertEqualInt(i2(central_directory + 30), 20); + /* Check file comment length */ + assertEqualInt(i2(central_directory + 32), 0); + /* Check disk number where file starts */ + assertEqualInt(i2(central_directory + 34), 0); + /* Check internal file attrs */ + assertEqualInt(i2(central_directory + 36), 0); + /* Check external file attrs */ + assertEqualInt(i4(central_directory + 38) >> 16 & 01777, file_perm); + /* Check offset of local header */ + assertEqualInt(i4(central_directory + 42), 0); + /* Check for file name contents */ + assertEqualMem(central_directory + 46, file_name, strlen(file_name)); + + /* Get address of local file entry */ + const char *local_file_header = zip_buff; + + /* Check local file header signature */ + assertEqualMem(local_file_header, "PK\x3\x4", 4); + /* Check version needed to extract */ + assertEqualInt(i2(local_file_header + 4), 10); + /* Check flags */ + assertEqualInt(i2(local_file_header + 6), 8); + /* Check compression method */ + assertEqualInt(i2(local_file_header + 8), 0); + /* Check crc */ + assertEqualInt(i4(local_file_header + 14), 0); + /* Check compressed size + * 0 because it was unknown at time of writing */ + assertEqualInt(i4(local_file_header + 18), 0); + /* Check uncompressed size + * 0 because it was unknown at time of writing */ + assertEqualInt(i4(local_file_header + 22), 0); + /* Check pathname length */ + assertEqualInt(i2(local_file_header + 26), strlen(file_name)); + /* Check extra field length */ + assertEqualInt(i2(local_file_header + 28), 20); + /* Check path name match */ + assertEqualMem(local_file_header + 30, file_name, strlen(file_name)); + + /* Start of data */ + const char *data = local_file_header + i2(local_file_header + 28) + strlen(file_name) + 30; + /* Check for file data match */ + assertEqualMem(data, file_data1, sizeof(file_data1)); + assertEqualMem(data + sizeof(file_data1), file_data2, sizeof(file_data2)); + + /* Start of data descriptor */ + const char *data_descriptor = data + sizeof(file_data1) + sizeof(file_data2); + /* Check data descriptor signature */ + assertEqualMem(data_descriptor, "PK\x7\x8", 4); + /* Check crc value */ + assertEqualInt(i4(data_descriptor + 4), crc); + /* Check compressed size */ + assertEqualInt(i4(data_descriptor + 8), sizeof(file_data1) + sizeof(file_data2)); + /* Chcek uncompresed size */ + assertEqualInt(i4(data_descriptor + 12), sizeof(file_data1) + sizeof(file_data2)); + + /* Get folder entry in central directory */ + const char *central_directory_folder_entry = central_directory + 46 + 20 + strlen(file_name); + + /* Get start of folder entry */ + const char *local_folder_header = data_descriptor + 16; + + /* Check for entry in central directory signature */ + assertEqualMem(central_directory_folder_entry, "PK\x1\x2", 4); + /* Check version made by */ + assertEqualInt(i2(central_directory_folder_entry + 4), 3 * 256 + 20); + /* Check version needed to extract */ + assertEqualInt(i2(central_directory_folder_entry + 6), 20); + /* Check flags */ + assertEqualInt(i2(central_directory_folder_entry + 8), 0); + /* Check compression method */ + assertEqualInt(i2(central_directory_folder_entry + 10), 0); + /* Check crc */ + assertEqualInt(i2(central_directory_folder_entry + 16), 0); + /* Check compressed size */ + assertEqualInt(i4(central_directory_folder_entry + 20), 0); + /* Check uncompressed size */ + assertEqualInt(i4(central_directory_folder_entry + 24), 0); + /* Check path name length */ + assertEqualInt(i2(central_directory_folder_entry + 28), strlen(folder_name)); + /* Check extra field length */ + assertEqualInt(i2(central_directory_folder_entry + 30), 20); + /* Check file comment length */ + assertEqualInt(i2(central_directory_folder_entry + 32), 0); + /* Check disk number start */ + assertEqualInt(i2(central_directory_folder_entry + 34), 0); + /* Check internal file attrs */ + assertEqualInt(i2(central_directory_folder_entry + 36), 0); + /* Check external file attrs */ + assertEqualInt(i4(central_directory_folder_entry + 38) >> 16 & 01777, folder_perm); + /* Check offset of local header*/ + assertEqualInt(i4(central_directory_folder_entry + 42), local_folder_header - zip_buff); + /* Check path name */ + assertEqualMem(central_directory_folder_entry + 46, folder_name, strlen(folder_name)); + + /* Check local header */ + assertEqualMem(local_folder_header, "PK\x3\x4", 4); + /* Check version to extract */ + assertEqualInt(i2(local_folder_header + 4), 20); + /* Check flags */ + assertEqualInt(i2(local_folder_header + 6), 0); + /* Check compression method */ + assertEqualInt(i2(local_folder_header + 8), 0); + /* Check crc */ + assertEqualInt(i4(local_folder_header + 14), 0); + /* Check compressed size */ + assertEqualInt(i2(local_folder_header + 18), 0); + /* Check uncompressed size */ + assertEqualInt(i4(local_folder_header + 22), 0); + /* Check path name length */ + assertEqualInt(i2(local_folder_header + 26), strlen(folder_name)); + /* Check extra field length */ + assertEqualInt(i2(local_folder_header + 28), 20); + /* Check path name */ + assertEqualMem(local_folder_header + 30, folder_name, strlen(folder_name)); + + const char *post_local_folder = local_folder_header + 30 + strlen(folder_name) + 20; + assertEqualMem(post_local_folder, central_directory, 4); +} + +DEFINE_TEST(test_write_format_zip_size_unset) +{ + struct archive *a; + char zip_buffer[100000]; + size_t size; + + /* Use compression=store to disable compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:compression=store")); + /* Disable zip64 explicitly since it is automatically enabled if no size is set */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64=")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, zip_buffer, sizeof(zip_buffer), &size)); + + write_archive(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed_size_unset.zip", zip_buffer, size); + + verify_contents(zip_buffer, size); + + /* Use compression-level=0 to disable compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:compression-level=0")); + /* Disable zip64 explicitly since it is automatically enabled if no size is set */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64=")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, zip_buffer, sizeof(zip_buffer), &size)); + + write_archive(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed_size_unset.zip", zip_buffer, size); + + verify_contents(zip_buffer, size); +} diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file.c index 2868123..7796a48 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file.c @@ -73,7 +73,14 @@ DEFINE_TEST(test_write_format_zip_file) struct archive *a; struct archive_entry *ae; time_t t = 1234567890; - struct tm *tm = localtime(&t); + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S) + struct tm tmbuf; +#endif +#if defined(HAVE__LOCALTIME64_S) + errno_t terr; + __time64_t tmptime; +#endif size_t used, buffsize = 1000000; unsigned long crc; int file_perm = 00644; @@ -91,6 +98,18 @@ DEFINE_TEST(test_write_format_zip_file) zip_compression = 0; #endif +#if defined(HAVE_LOCALTIME_R) + tm = localtime_r(&t, &tmbuf); +#elif defined(HAVE__LOCALTIME64_S) + tmptime = t; + terr = _localtime64_s(&tmbuf, &tmptime); + if (terr) + tm = NULL; + else + tm = &tmbuf; +#else + tm = localtime(&t); +#endif buff = malloc(buffsize); /* Create a new archive in memory. */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file_zip64.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file_zip64.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file_zip64.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file_zip64.c index 71da986..c4161bc 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_file_zip64.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_file_zip64.c @@ -75,7 +75,14 @@ DEFINE_TEST(test_write_format_zip_file_zip64) struct archive *a; struct archive_entry *ae; time_t t = 1234567890; - struct tm *tm = localtime(&t); + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S) + struct tm tmbuf; +#endif +#if defined(HAVE__LOCALTIME64_S) + errno_t terr; + __time64_t tmptime; +#endif size_t used, buffsize = 1000000; unsigned long crc; int file_perm = 00644; @@ -92,6 +99,18 @@ DEFINE_TEST(test_write_format_zip_file_zip64) zip_compression = 0; #endif +#if defined(HAVE_LOCALTIME_R) + tm = localtime_r(&t, &tmbuf); +#elif defined(HAVE__LOCALTIME64_S) + tmptime = t; + terr = _localtime64_s(&tmbuf, &tmptime); + if (terr) + tm = NULL; + else + tm = &tmbuf; +#else + tm = localtime(&t); +#endif buff = malloc(buffsize); /* Create a new archive in memory. */ diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_large.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_large.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_large.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_large.c index 2f98c6d..e3594c9 100644 --- a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_large.c +++ b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_large.c @@ -309,7 +309,7 @@ verify_large_zip(struct archive *a, struct fileblocks *fileblocks) for (i = 0; test_sizes[i] > 0; i++) { assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); assertEqualString(namebuff, archive_entry_pathname(ae)); assertEqualInt(test_sizes[i], archive_entry_size(ae)); } @@ -359,7 +359,7 @@ DEFINE_TEST(test_write_format_zip_large) */ for (i = 0; test_sizes[i] != 0; i++) { assert((ae = archive_entry_new()) != NULL); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); archive_entry_copy_pathname(ae, namebuff); archive_entry_set_mode(ae, S_IFREG | 0755); filesize = test_sizes[i]; diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_zip64.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_zip64.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_format_zip_zip64.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_format_zip_zip64.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_open_memory.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_open_memory.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_open_memory.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_open_memory.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_write_read_format_zip.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_write_read_format_zip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_write_read_format_zip.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_write_read_format_zip.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_xattr_platform.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_xattr_platform.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_xattr_platform.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_xattr_platform.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/test/test_zip_filename_encoding.c b/src/dependencies/libarchive-3.6.2/libarchive/test/test_zip_filename_encoding.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/test/test_zip_filename_encoding.c rename to src/dependencies/libarchive-3.6.2/libarchive/test/test_zip_filename_encoding.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive/xxhash.c b/src/dependencies/libarchive-3.6.2/libarchive/xxhash.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive/xxhash.c rename to src/dependencies/libarchive-3.6.2/libarchive/xxhash.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/err.c b/src/dependencies/libarchive-3.6.2/libarchive_fe/err.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/err.c rename to src/dependencies/libarchive-3.6.2/libarchive_fe/err.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/err.h b/src/dependencies/libarchive-3.6.2/libarchive_fe/err.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/err.h rename to src/dependencies/libarchive-3.6.2/libarchive_fe/err.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/lafe_platform.h b/src/dependencies/libarchive-3.6.2/libarchive_fe/lafe_platform.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/lafe_platform.h rename to src/dependencies/libarchive-3.6.2/libarchive_fe/lafe_platform.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/line_reader.c b/src/dependencies/libarchive-3.6.2/libarchive_fe/line_reader.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/line_reader.c rename to src/dependencies/libarchive-3.6.2/libarchive_fe/line_reader.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/line_reader.h b/src/dependencies/libarchive-3.6.2/libarchive_fe/line_reader.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/line_reader.h rename to src/dependencies/libarchive-3.6.2/libarchive_fe/line_reader.h diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/passphrase.c b/src/dependencies/libarchive-3.6.2/libarchive_fe/passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/passphrase.c rename to src/dependencies/libarchive-3.6.2/libarchive_fe/passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/libarchive_fe/passphrase.h b/src/dependencies/libarchive-3.6.2/libarchive_fe/passphrase.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/libarchive_fe/passphrase.h rename to src/dependencies/libarchive-3.6.2/libarchive_fe/passphrase.h diff --git a/src/dependencies/libarchive-3.5.2/tar/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/tar/CMakeLists.txt similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/tar/CMakeLists.txt diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar.1 b/src/dependencies/libarchive-3.6.2/tar/bsdtar.1 similarity index 98% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar.1 rename to src/dependencies/libarchive-3.6.2/tar/bsdtar.1 index 86a06bb..b57835a 100644 --- a/src/dependencies/libarchive-3.5.2/tar/bsdtar.1 +++ b/src/dependencies/libarchive-3.6.2/tar/bsdtar.1 @@ -470,6 +470,11 @@ This is the reverse of and the default behavior if .Nm is run as non-root in x mode. +.It Fl Fl no-read-sparse +(c, r, u modes only) +Do not read sparse file information from disk. +This is the reverse of +.Fl Fl read-sparse . .It Fl Fl no-safe-writes (x mode only) Do not create temporary files and use @@ -633,10 +638,20 @@ a compression dictionary to improve compression ratio. .It Cm zstd:compression-level A decimal integer specifying the zstd compression level. Supported values depend on the library version, common values are from 1 to 22. +.It Cm zstd:threads +Specify the number of worker threads to use. +Setting threads to a special value 0 makes +.Xr zstd 1 +use as many threads as there are CPU cores on the system. .It Cm lzop:compression-level A decimal integer from 1 to 9 specifying the lzop compression level. .It Cm xz:compression-level A decimal integer from 0 to 9 specifying the xz compression level. +.It Cm xz:threads +Specify the number of worker threads to use. +Setting threads to a special value 0 makes +.Xr xz 1 +use as many threads as there are CPU cores on the system. .It Cm mtree: Ns Ar keyword The mtree writer module allows you to specify which mtree keywords will be included in the output. @@ -730,6 +745,12 @@ By default, the archive is always read to the very end, since there can be multiple entries with the same name and, by convention, later entries overwrite earlier entries. This option is provided as a performance optimization. +.It Fl Fl read-sparse +(c, r, u modes only) +Read sparse file information from disk. +This is the reverse of +.Fl Fl no-read-sparse +and the default behavior. .It Fl S (x mode only) Extract files as sparse files. @@ -932,7 +953,7 @@ archives. .Sh ENVIRONMENT The following environment variables affect the execution of .Nm : -.Bl -tag -width ".Ev BLOCKSIZE" +.Bl -tag -width indent .It Ev TAR_READER_OPTIONS The default options for format readers and compression readers. The diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar.c b/src/dependencies/libarchive-3.6.2/tar/bsdtar.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar.c rename to src/dependencies/libarchive-3.6.2/tar/bsdtar.c index af41be5..75249d1 100644 --- a/src/dependencies/libarchive-3.5.2/tar/bsdtar.c +++ b/src/dependencies/libarchive-3.6.2/tar/bsdtar.c @@ -70,24 +70,20 @@ __FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.93 2008/11/08 04:43:24 kientzle #include "bsdtar.h" #include "err.h" -/* - * Per POSIX.1-1988, tar defaults to reading/writing archives to/from - * the default tape device for the system. Pick something reasonable here. - */ -#ifdef __linux -#define _PATH_DEFTAPE "/dev/st0" +#if ARCHIVE_VERSION_NUMBER < 4000000 && !defined(_PATH_DEFTAPE) +// Libarchive 4.0 and later will NOT define _PATH_DEFTAPE +// but will honor it if it's set in the build. +// Until then, we'll continue to set it by default on certain platforms: +#if defined(__linux) +#define _PATH_DEFTAPE "/dev/st0" +#elif defined(_WIN32) && !defined(__CYGWIN__) +#define _PATH_DEFTAPE "\\\\.\\tape0" +#elif !defined(__APPLE__) +#define _PATH_DEFTAPE "/dev/tape" #endif -#if defined(_WIN32) && !defined(__CYGWIN__) -#define _PATH_DEFTAPE "\\\\.\\tape0" -#endif -#if defined(__APPLE__) -#undef _PATH_DEFTAPE -#define _PATH_DEFTAPE "-" /* Mac OS has no tape support, default to stdio. */ #endif -#ifndef _PATH_DEFTAPE -#define _PATH_DEFTAPE "/dev/tape" -#endif +#define _PATH_STDIO "-" #ifdef __MINGW32__ int _CRT_glob = 0; /* Disable broken CRT globbing. */ @@ -217,8 +213,21 @@ main(int argc, char **argv) /* Default: open tape drive. */ bsdtar->filename = getenv("TAPE"); - if (bsdtar->filename == NULL) - bsdtar->filename = _PATH_DEFTAPE; +#if defined(_PATH_DEFTAPE) + if (bsdtar->filename == NULL) { +#if defined(_WIN32) && !defined(__CYGWIN__) + int tapeExists = !_access(_PATH_DEFTAPE, 0); +#else + int tapeExists = !access(_PATH_DEFTAPE, F_OK); +#endif + if (tapeExists) { + bsdtar->filename = _PATH_DEFTAPE; + } + } +#endif + if (bsdtar->filename == NULL) { + bsdtar->filename = _PATH_STDIO; + } /* Default block size settings. */ bsdtar->bytes_per_block = DEFAULT_BYTES_PER_BLOCK; @@ -542,6 +551,10 @@ main(int argc, char **argv) bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA; bsdtar->flags |= OPTFLAG_NO_MAC_METADATA; break; + case OPTION_NO_READ_SPARSE: + bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_SPARSE; + bsdtar->flags |= OPTFLAG_NO_READ_SPARSE; + break; case OPTION_NO_SAFE_WRITES: bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_SAFE_WRITES; break; @@ -649,6 +662,10 @@ main(int argc, char **argv) case 'r': /* SUSv2 */ set_mode(bsdtar, opt); break; + case OPTION_READ_SPARSE: + bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_SPARSE; + bsdtar->flags |= OPTFLAG_READ_SPARSE; + break; case 'S': /* NetBSD pax-as-tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; break; @@ -796,8 +813,14 @@ main(int argc, char **argv) "Must specify one of -c, -r, -t, -u, -x"); /* Check boolean options only permitted in certain modes. */ - if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS) - only_mode(bsdtar, "-a", "c"); + if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS) { + only_mode(bsdtar, "-a", "cx"); + if (bsdtar->mode == 'x') { + bsdtar->flags &= ~OPTFLAG_AUTO_COMPRESS; + lafe_warnc(0, + "Ignoring option -a in mode -x"); + } + } if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS) only_mode(bsdtar, "--one-file-system", "cru"); if (bsdtar->flags & OPTFLAG_FAST_READ) diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar.h b/src/dependencies/libarchive-3.6.2/tar/bsdtar.h similarity index 97% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar.h rename to src/dependencies/libarchive-3.6.2/tar/bsdtar.h index 89aa3aa..8f9f79a 100644 --- a/src/dependencies/libarchive-3.5.2/tar/bsdtar.h +++ b/src/dependencies/libarchive-3.6.2/tar/bsdtar.h @@ -129,6 +129,8 @@ struct bsdtar { #define OPTFLAG_FFLAGS (0x00100000) /* --fflags */ #define OPTFLAG_NO_MAC_METADATA (0x00200000) /* --no-mac-metadata */ #define OPTFLAG_MAC_METADATA (0x00400000) /* --mac-metadata */ +#define OPTFLAG_NO_READ_SPARSE (0x00800000) /* --no-read-sparse */ +#define OPTFLAG_READ_SPARSE (0x01000000) /* --read-sparse */ /* Fake short equivalents for long options that otherwise lack them. */ enum { @@ -164,6 +166,7 @@ enum { OPTION_NO_ACLS, OPTION_NO_FFLAGS, OPTION_NO_MAC_METADATA, + OPTION_NO_READ_SPARSE, OPTION_NO_SAFE_WRITES, OPTION_NO_SAME_OWNER, OPTION_NO_SAME_PERMISSIONS, @@ -178,6 +181,7 @@ enum { OPTION_OPTIONS, OPTION_PASSPHRASE, OPTION_POSIX, + OPTION_READ_SPARSE, OPTION_SAFE_WRITES, OPTION_SAME_OWNER, OPTION_STRIP_COMPONENTS, diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar_platform.h b/src/dependencies/libarchive-3.6.2/tar/bsdtar_platform.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar_platform.h rename to src/dependencies/libarchive-3.6.2/tar/bsdtar_platform.h diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar_windows.c b/src/dependencies/libarchive-3.6.2/tar/bsdtar_windows.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar_windows.c rename to src/dependencies/libarchive-3.6.2/tar/bsdtar_windows.c diff --git a/src/dependencies/libarchive-3.5.2/tar/bsdtar_windows.h b/src/dependencies/libarchive-3.6.2/tar/bsdtar_windows.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/bsdtar_windows.h rename to src/dependencies/libarchive-3.6.2/tar/bsdtar_windows.h diff --git a/src/dependencies/libarchive-3.5.2/tar/cmdline.c b/src/dependencies/libarchive-3.6.2/tar/cmdline.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/tar/cmdline.c rename to src/dependencies/libarchive-3.6.2/tar/cmdline.c index b80937f..d49e5b0 100644 --- a/src/dependencies/libarchive-3.5.2/tar/cmdline.c +++ b/src/dependencies/libarchive-3.6.2/tar/cmdline.c @@ -122,6 +122,7 @@ static const struct bsdtar_option { { "no-acls", 0, OPTION_NO_ACLS }, { "no-fflags", 0, OPTION_NO_FFLAGS }, { "no-mac-metadata", 0, OPTION_NO_MAC_METADATA }, + { "no-read-sparse", 0, OPTION_NO_READ_SPARSE }, { "no-recursion", 0, 'n' }, { "no-safe-writes", 0, OPTION_NO_SAFE_WRITES }, { "no-same-owner", 0, OPTION_NO_SAME_OWNER }, @@ -145,6 +146,7 @@ static const struct bsdtar_option { { "posix", 0, OPTION_POSIX }, { "preserve-permissions", 0, 'p' }, { "read-full-blocks", 0, 'B' }, + { "read-sparse", 0, OPTION_READ_SPARSE }, { "safe-writes", 0, OPTION_SAFE_WRITES }, { "same-owner", 0, OPTION_SAME_OWNER }, { "same-permissions", 0, 'p' }, diff --git a/src/dependencies/libarchive-3.5.2/tar/config_freebsd.h b/src/dependencies/libarchive-3.6.2/tar/config_freebsd.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/config_freebsd.h rename to src/dependencies/libarchive-3.6.2/tar/config_freebsd.h diff --git a/src/dependencies/libarchive-3.5.2/tar/creation_set.c b/src/dependencies/libarchive-3.6.2/tar/creation_set.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/tar/creation_set.c rename to src/dependencies/libarchive-3.6.2/tar/creation_set.c index bdc607d..cfc5a64 100644 --- a/src/dependencies/libarchive-3.5.2/tar/creation_set.c +++ b/src/dependencies/libarchive-3.6.2/tar/creation_set.c @@ -95,7 +95,7 @@ get_format_code(const char *suffix) { ".7z", "7zip" }, { ".ar", "arbsd" }, { ".cpio", "cpio" }, - { ".iso", "iso9960" }, + { ".iso", "iso9660" }, { ".mtree", "mtree" }, { ".shar", "shar" }, { ".tar", "paxr" }, diff --git a/src/dependencies/libarchive-3.5.2/tar/read.c b/src/dependencies/libarchive-3.6.2/tar/read.c similarity index 98% rename from src/dependencies/libarchive-3.5.2/tar/read.c rename to src/dependencies/libarchive-3.6.2/tar/read.c index 658c810..b959966 100644 --- a/src/dependencies/libarchive-3.5.2/tar/read.c +++ b/src/dependencies/libarchive-3.6.2/tar/read.c @@ -371,10 +371,9 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer) r = archive_read_extract2(a, entry, writer); if (r != ARCHIVE_OK) { if (!bsdtar->verbose) - safe_fprintf(stderr, "%s", - archive_entry_pathname(entry)); - safe_fprintf(stderr, ": %s", - archive_error_string(a)); + safe_fprintf(stderr, "%s", archive_entry_pathname(entry)); + fprintf(stderr, ": %s: ", archive_error_string(a)); + fprintf(stderr, "%s", strerror(errno)); if (!bsdtar->verbose) fprintf(stderr, "\n"); bsdtar->return_value = 1; diff --git a/src/dependencies/libarchive-3.5.2/tar/subst.c b/src/dependencies/libarchive-3.6.2/tar/subst.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/tar/subst.c rename to src/dependencies/libarchive-3.6.2/tar/subst.c index 39c54ac..55ad63d 100644 --- a/src/dependencies/libarchive-3.5.2/tar/subst.c +++ b/src/dependencies/libarchive-3.6.2/tar/subst.c @@ -320,6 +320,7 @@ cleanup_substitution(struct bsdtar *bsdtar) while ((rule = subst->first_rule) != NULL) { subst->first_rule = rule->next; free(rule->result); + regfree(&rule->re); free(rule); } free(subst); diff --git a/src/dependencies/libarchive-3.5.2/tar/test/CMakeLists.txt b/src/dependencies/libarchive-3.6.2/tar/test/CMakeLists.txt similarity index 99% rename from src/dependencies/libarchive-3.5.2/tar/test/CMakeLists.txt rename to src/dependencies/libarchive-3.6.2/tar/test/CMakeLists.txt index 2cd573a..3b66753 100644 --- a/src/dependencies/libarchive-3.5.2/tar/test/CMakeLists.txt +++ b/src/dependencies/libarchive-3.6.2/tar/test/CMakeLists.txt @@ -44,6 +44,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_fflags.c test_option_gid_gname.c test_option_grzip.c + test_option_ignore_zeros.c test_option_j.c test_option_k.c test_option_keep_newer_files.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/list.h b/src/dependencies/libarchive-3.6.2/tar/test/list.h similarity index 89% rename from src/dependencies/libarchive-3.5.2/tar/test/list.h rename to src/dependencies/libarchive-3.6.2/tar/test/list.h index 379b8a3..0b7c020 100644 --- a/src/dependencies/libarchive-3.5.2/tar/test/list.h +++ b/src/dependencies/libarchive-3.6.2/tar/test/list.h @@ -2,38 +2,47 @@ DEFINE_TEST(test_0) DEFINE_TEST(test_basic) DEFINE_TEST(test_copy) DEFINE_TEST(test_empty_mtree) +DEFINE_TEST(test_extract_tar_Z) DEFINE_TEST(test_extract_tar_bz2) DEFINE_TEST(test_extract_tar_grz) DEFINE_TEST(test_extract_tar_gz) DEFINE_TEST(test_extract_tar_lrz) -DEFINE_TEST(test_extract_tar_lz4) DEFINE_TEST(test_extract_tar_lz) +DEFINE_TEST(test_extract_tar_lz4) DEFINE_TEST(test_extract_tar_lzma) DEFINE_TEST(test_extract_tar_lzo) DEFINE_TEST(test_extract_tar_xz) -DEFINE_TEST(test_extract_tar_Z) DEFINE_TEST(test_extract_tar_zstd) DEFINE_TEST(test_format_newc) DEFINE_TEST(test_help) DEFINE_TEST(test_leading_slash) DEFINE_TEST(test_missing_file) -DEFINE_TEST(test_option_a) -DEFINE_TEST(test_option_acls) -DEFINE_TEST(test_option_b64encode) -DEFINE_TEST(test_option_b) DEFINE_TEST(test_option_C_mtree) DEFINE_TEST(test_option_C_upper) +DEFINE_TEST(test_option_H_upper) +DEFINE_TEST(test_option_L_upper) +DEFINE_TEST(test_option_O_upper) +DEFINE_TEST(test_option_T_upper) +DEFINE_TEST(test_option_U_upper) +DEFINE_TEST(test_option_X_upper) +DEFINE_TEST(test_option_a) +DEFINE_TEST(test_option_acls) +DEFINE_TEST(test_option_b) +DEFINE_TEST(test_option_b64encode) DEFINE_TEST(test_option_exclude) DEFINE_TEST(test_option_exclude_vcs) DEFINE_TEST(test_option_fflags) DEFINE_TEST(test_option_gid_gname) DEFINE_TEST(test_option_grzip) -DEFINE_TEST(test_option_H_upper) +DEFINE_TEST(test_option_ignore_zeros_mode_t) +DEFINE_TEST(test_option_ignore_zeros_mode_x) +DEFINE_TEST(test_option_ignore_zeros_mode_c) +DEFINE_TEST(test_option_ignore_zeros_mode_r) +DEFINE_TEST(test_option_ignore_zeros_mode_u) DEFINE_TEST(test_option_j) DEFINE_TEST(test_option_k) DEFINE_TEST(test_option_keep_newer_files) DEFINE_TEST(test_option_lrzip) -DEFINE_TEST(test_option_L_upper) DEFINE_TEST(test_option_lz4) DEFINE_TEST(test_option_lzma) DEFINE_TEST(test_option_lzop) @@ -41,18 +50,14 @@ DEFINE_TEST(test_option_n) DEFINE_TEST(test_option_newer_than) DEFINE_TEST(test_option_nodump) DEFINE_TEST(test_option_older_than) -DEFINE_TEST(test_option_O_upper) DEFINE_TEST(test_option_passphrase) DEFINE_TEST(test_option_q) DEFINE_TEST(test_option_r) -DEFINE_TEST(test_option_safe_writes) DEFINE_TEST(test_option_s) -DEFINE_TEST(test_option_T_upper) +DEFINE_TEST(test_option_safe_writes) DEFINE_TEST(test_option_uid_uname) DEFINE_TEST(test_option_uuencode) -DEFINE_TEST(test_option_U_upper) DEFINE_TEST(test_option_xattrs) -DEFINE_TEST(test_option_X_upper) DEFINE_TEST(test_option_xz) DEFINE_TEST(test_option_z) DEFINE_TEST(test_option_zstd) diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test.h b/src/dependencies/libarchive-3.6.2/tar/test/test.h similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test.h rename to src/dependencies/libarchive-3.6.2/tar/test/test.h diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_0.c b/src/dependencies/libarchive-3.6.2/tar/test/test_0.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_0.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_0.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_basic.c b/src/dependencies/libarchive-3.6.2/tar/test/test_basic.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_basic.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_basic.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_copy.c b/src/dependencies/libarchive-3.6.2/tar/test/test_copy.c similarity index 94% rename from src/dependencies/libarchive-3.5.2/tar/test/test_copy.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_copy.c index d618e45..b8175c3 100644 --- a/src/dependencies/libarchive-3.5.2/tar/test/test_copy.c +++ b/src/dependencies/libarchive-3.6.2/tar/test/test_copy.c @@ -160,21 +160,21 @@ create_tree(void) failure("Internal sanity check failed: i = %d", i); assert(filenames[i] != NULL); - sprintf(buff, "f/%s", filenames[i]); + snprintf(buff, sizeof(buff), "f/%s", filenames[i]); assertMakeFile(buff, 0777, buff); /* Create a link named "l/abcdef..." to the above. */ - sprintf(buff2, "l/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "l/%s", filenames[i]); assertMakeHardlink(buff2, buff); /* Create a link named "m/abcdef..." to the above. */ - sprintf(buff2, "m/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "m/%s", filenames[i]); assertMakeHardlink(buff2, buff); if (canSymlink()) { /* Create a symlink named "s/abcdef..." to the above. */ - sprintf(buff, "s/%s", filenames[i]); - sprintf(buff2, "../f/%s", filenames[i]); + snprintf(buff, sizeof(buff), "s/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "../f/%s", filenames[i]); failure("buff=\"%s\" buff2=\"%s\"", buff, buff2); assertMakeSymlink(buff, buff2, 0); } @@ -202,13 +202,13 @@ verify_tree(size_t limit) /* Generate the names we know should be there and verify them. */ for (i = 1; i < LOOP_MAX; i++) { /* Verify a file named "f/abcdef..." */ - sprintf(name1, "f/%s", filenames[i]); + snprintf(name1, sizeof(name1), "f/%s", filenames[i]); if (i <= limit) { assertFileExists(name1); assertFileContents(name1, (int)strlen(name1), name1); } - sprintf(name2, "l/%s", filenames[i]); + snprintf(name2, sizeof(name2), "l/%s", filenames[i]); if (i + 2 <= limit) { /* Verify hardlink "l/abcdef..." */ assertIsHardlink(name1, name2); @@ -219,14 +219,14 @@ verify_tree(size_t limit) if (canSymlink()) { /* Verify symlink "s/abcdef..." */ - sprintf(name1, "s/%s", filenames[i]); - sprintf(name2, "../f/%s", filenames[i]); + snprintf(name1, sizeof(name1), "s/%s", filenames[i]); + snprintf(name2, sizeof(name2), "../f/%s", filenames[i]); if (strlen(name2) <= limit) assertIsSymlink(name1, name2, 0); } /* Verify dir "d/abcdef...". */ - sprintf(name1, "d/%s", filenames[i]); + snprintf(name1, sizeof(name1), "d/%s", filenames[i]); if (i + 1 <= limit) { /* +1 for trailing slash */ if (assertIsDir(name1, -1)) { /* TODO: opendir/readdir this diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_empty_mtree.c b/src/dependencies/libarchive-3.6.2/tar/test/test_empty_mtree.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_empty_mtree.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_empty_mtree.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.Z.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.bz2.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.bz2.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.bz2.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.bz2.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.grz.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.grz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.grz.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.grz.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.gz.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.gz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.gz.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.gz.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lrz.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lrz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lrz.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lrz.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lz.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lz.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lz.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lz4.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lz4.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lz4.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lz4.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lzma.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lzma.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lzma.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lzma.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lzo.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lzo.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.lzo.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.lzo.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.xz.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.xz.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.xz.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.xz.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.zst.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.zst.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract.tar.zst.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract.tar.zst.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_Z.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_Z.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_Z.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_Z.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_bz2.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_bz2.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_bz2.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_bz2.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_grz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_grz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_grz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_grz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_gz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_gz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_gz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_gz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lrz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lrz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lrz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lrz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lz4.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lz4.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lzma.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lzma.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lzma.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lzma.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lzo.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lzo.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_lzo.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_lzo.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_xz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_xz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_xz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_zstd.c b/src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_extract_tar_zstd.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_extract_tar_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_format_newc.c b/src/dependencies/libarchive-3.6.2/tar/test/test_format_newc.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_format_newc.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_format_newc.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_help.c b/src/dependencies/libarchive-3.6.2/tar/test/test_help.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_help.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_help.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_leading_slash.c b/src/dependencies/libarchive-3.6.2/tar/test/test_leading_slash.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_leading_slash.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_leading_slash.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_leading_slash.tar.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_leading_slash.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_leading_slash.tar.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_leading_slash.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_missing_file.c b/src/dependencies/libarchive-3.6.2/tar/test/test_missing_file.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_missing_file.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_missing_file.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_C_mtree.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_C_mtree.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_C_mtree.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_C_mtree.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_C_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_C_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_C_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_C_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_H_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_H_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_H_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_H_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_L_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_L_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_L_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_L_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_O_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_O_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_O_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_O_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_T_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_T_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_T_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_T_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_U_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_U_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_U_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_U_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_X_upper.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_X_upper.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_X_upper.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_X_upper.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_a.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_a.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_a.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_a.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_acls.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_acls.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_acls.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_acls.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_b.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_b.c similarity index 92% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_b.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_b.c index 0eee80d..d1b75e3 100644 --- a/src/dependencies/libarchive-3.5.2/tar/test/test_option_b.c +++ b/src/dependencies/libarchive-3.6.2/tar/test/test_option_b.c @@ -30,15 +30,17 @@ __FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_b) { char *testprog_ustar; + size_t testprog_ustar_len; assertMakeFile("file1", 0644, "file1"); if (systemf("cat file1 > test_cat.out 2> test_cat.err") != 0) { skipping("This test requires a `cat` program"); return; } - testprog_ustar = malloc(strlen(testprog) + sizeof(USTAR_OPT) + 1); - strcpy(testprog_ustar, testprog); - strcat(testprog_ustar, USTAR_OPT); + testprog_ustar_len = strlen(testprog) + sizeof(USTAR_OPT) + 1; + testprog_ustar = malloc(testprog_ustar_len); + strncpy(testprog_ustar, testprog, testprog_ustar_len); + strncat(testprog_ustar, USTAR_OPT, testprog_ustar_len); /* * Bsdtar does not pad if the output is going directly to a disk file. diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_b64encode.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_b64encode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_b64encode.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_b64encode.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_exclude.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_exclude.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_exclude.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_exclude.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_exclude_vcs.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_exclude_vcs.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_exclude_vcs.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_exclude_vcs.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_fflags.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_fflags.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_fflags.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_fflags.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_gid_gname.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_gid_gname.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_gid_gname.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_gid_gname.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_grzip.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_grzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_grzip.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_grzip.c diff --git a/src/dependencies/libarchive-3.6.2/tar/test/test_option_ignore_zeros.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_ignore_zeros.c new file mode 100644 index 0000000..26c9320 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/tar/test/test_option_ignore_zeros.c @@ -0,0 +1,147 @@ +/*- + * Copyright (c) 2021 Ryan Libby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +static int +make_files(void) +{ + int ret; + + assertMakeDir("in", 0755); + assertMakeDir("out", 0755); + assertMakeFile("in/a", 0644, "a"); + assertMakeFile("in/b", 0644, "b"); + assertMakeFile("in/c", 0644, "c"); + assertEqualInt(0, systemf("%s cf a.tar -C in a", testprog)); + assertEqualInt(0, systemf("%s cf b.tar -C in b", testprog)); + /* An archive formed with cat, and readable with --ignore-zeros. */ + ret = systemf("cat a.tar b.tar > ab-cat.tar"); + if (ret != 0) { + skipping("This test requires a `cat` program"); + return (ret); + } + + return (0); +} + +DEFINE_TEST(test_option_ignore_zeros_mode_t) +{ + if (make_files()) + return; + + /* Generate expected t-mode output. */ + assertEqualInt(0, systemf( + "%s cf ab-norm.tar -C in a b > norm-c.out 2> norm-c.err", + testprog)); + assertEmptyFile("norm-c.err"); + assertEmptyFile("norm-c.out"); + assertEqualInt(0, systemf( + "%s tf ab-norm.tar > norm-t.out 2> norm-t.err", + testprog)); + assertEmptyFile("norm-t.err"); + + /* Test output. */ + assertEqualInt(0, systemf( + "%s tf ab-cat.tar --ignore-zeros > test.out 2> test.err", + testprog)); + assertEmptyFile("test.err"); + + assertEqualFile("test.out", "norm-t.out"); +} + +DEFINE_TEST(test_option_ignore_zeros_mode_x) +{ + if (make_files()) + return; + + assertEqualInt(0, systemf( + "%s xf ab-cat.tar --ignore-zeros -C out > test.out 2> test.err", + testprog)); + assertEmptyFile("test.err"); + assertEmptyFile("test.out"); + + assertEqualFile("out/a", "in/a"); + assertEqualFile("out/b", "in/b"); +} + +DEFINE_TEST(test_option_ignore_zeros_mode_c) +{ + if (make_files()) + return; + + assertEqualInt(0, systemf( + "%s cf abc.tar --ignore-zeros @ab-cat.tar -C in c " + "> test-c.out 2> test-c.err", + testprog)); + assertEmptyFile("test-c.err"); + assertEmptyFile("test-c.out"); + + assertEqualInt(0, systemf( + "%s xf abc.tar -C out > test-x.out 2> test-x.err", + testprog)); + assertEmptyFile("test-x.err"); + assertEmptyFile("test-x.out"); + + assertEqualFile("out/a", "in/a"); + assertEqualFile("out/b", "in/b"); + assertEqualFile("out/c", "in/c"); +} + +static void +test_option_ignore_zeros_mode_ru(const char *mode) +{ + if (make_files()) + return; + + assertEqualInt(0, systemf( + "%s %sf ab-cat.tar --ignore-zeros -C in c " + "> test-ru.out 2> test-ru.err", + testprog, mode)); + assertEmptyFile("test-ru.err"); + assertEmptyFile("test-ru.out"); + + assertEqualInt(0, systemf( + "%s xf ab-cat.tar --ignore-zeros -C out " + "> test-x.out 2> test-x.err", + testprog)); + assertEmptyFile("test-x.err"); + assertEmptyFile("test-x.out"); + + assertEqualFile("out/a", "in/a"); + assertEqualFile("out/b", "in/b"); + assertEqualFile("out/c", "in/c"); +} + +DEFINE_TEST(test_option_ignore_zeros_mode_r) +{ + test_option_ignore_zeros_mode_ru("r"); +} + +DEFINE_TEST(test_option_ignore_zeros_mode_u) +{ + test_option_ignore_zeros_mode_ru("u"); +} diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_j.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_j.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_j.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_j.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_k.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_k.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_k.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_k.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_keep_newer_files.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_keep_newer_files.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_keep_newer_files.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_keep_newer_files.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_keep_newer_files.tar.Z.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_option_keep_newer_files.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_keep_newer_files.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_keep_newer_files.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_lrzip.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_lrzip.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_lrzip.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_lrzip.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_lz4.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_lz4.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_lz4.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_lz4.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_lzma.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_lzma.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_lzma.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_lzma.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_lzop.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_lzop.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_lzop.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_lzop.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_n.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_n.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_n.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_n.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_newer_than.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_newer_than.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_newer_than.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_newer_than.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_nodump.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_nodump.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_nodump.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_nodump.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_older_than.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_older_than.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_older_than.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_older_than.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_passphrase.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_passphrase.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_passphrase.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_passphrase.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_passphrase.zip.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_option_passphrase.zip.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_passphrase.zip.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_passphrase.zip.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_q.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_q.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_q.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_q.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_r.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_r.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_r.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_r.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_s.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_s.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_s.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_s.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_s.tar.Z.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_option_s.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_s.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_s.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_safe_writes.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_safe_writes.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_safe_writes.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_safe_writes.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_uid_uname.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_uid_uname.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_uid_uname.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_uid_uname.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_uuencode.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_uuencode.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_uuencode.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_uuencode.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_xattrs.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_xattrs.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_xattrs.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_xattrs.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_xz.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_xz.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_xz.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_xz.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_z.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_z.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_z.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_z.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_option_zstd.c b/src/dependencies/libarchive-3.6.2/tar/test/test_option_zstd.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_option_zstd.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_option_zstd.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_patterns.c b/src/dependencies/libarchive-3.6.2/tar/test/test_patterns.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_patterns.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_patterns.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_patterns_2.tar.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_patterns_2.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_patterns_2.tar.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_patterns_2.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_patterns_3.tar.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_patterns_3.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_patterns_3.tar.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_patterns_3.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_patterns_4.tar.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_patterns_4.tar.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_patterns_4.tar.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_patterns_4.tar.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_print_longpath.c b/src/dependencies/libarchive-3.6.2/tar/test/test_print_longpath.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_print_longpath.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_print_longpath.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_print_longpath.tar.Z.uu b/src/dependencies/libarchive-3.6.2/tar/test/test_print_longpath.tar.Z.uu similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_print_longpath.tar.Z.uu rename to src/dependencies/libarchive-3.6.2/tar/test/test_print_longpath.tar.Z.uu diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_stdio.c b/src/dependencies/libarchive-3.6.2/tar/test/test_stdio.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_stdio.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_stdio.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_strip_components.c b/src/dependencies/libarchive-3.6.2/tar/test/test_strip_components.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_strip_components.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_strip_components.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_symlink_dir.c b/src/dependencies/libarchive-3.6.2/tar/test/test_symlink_dir.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_symlink_dir.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_symlink_dir.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_version.c b/src/dependencies/libarchive-3.6.2/tar/test/test_version.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_version.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_version.c diff --git a/src/dependencies/libarchive-3.5.2/tar/test/test_windows.c b/src/dependencies/libarchive-3.6.2/tar/test/test_windows.c similarity index 100% rename from src/dependencies/libarchive-3.5.2/tar/test/test_windows.c rename to src/dependencies/libarchive-3.6.2/tar/test/test_windows.c diff --git a/src/dependencies/libarchive-3.5.2/tar/util.c b/src/dependencies/libarchive-3.6.2/tar/util.c similarity index 97% rename from src/dependencies/libarchive-3.5.2/tar/util.c rename to src/dependencies/libarchive-3.6.2/tar/util.c index 8ebec64..5a4ab0b 100644 --- a/src/dependencies/libarchive-3.5.2/tar/util.c +++ b/src/dependencies/libarchive-3.6.2/tar/util.c @@ -63,7 +63,7 @@ __FBSDID("$FreeBSD: src/usr.bin/tar/util.c,v 1.23 2008/12/15 06:00:25 kientzle E #include "err.h" #include "passphrase.h" -static size_t bsdtar_expand_char(char *, size_t, char); +static size_t bsdtar_expand_char(char *, size_t, size_t, char); static const char *strip_components(const char *path, int elements); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -173,12 +173,12 @@ safe_fprintf(FILE *f, const char *fmt, ...) /* Not printable, format the bytes. */ while (n-- > 0) i += (unsigned)bsdtar_expand_char( - outbuff, i, *p++); + outbuff, sizeof(outbuff), i, *p++); } } else { /* After any conversion failure, don't bother * trying to convert the rest. */ - i += (unsigned)bsdtar_expand_char(outbuff, i, *p++); + i += (unsigned)bsdtar_expand_char(outbuff, sizeof(outbuff), i, *p++); try_wc = 0; } @@ -200,7 +200,7 @@ safe_fprintf(FILE *f, const char *fmt, ...) * Render an arbitrary sequence of bytes into printable ASCII characters. */ static size_t -bsdtar_expand_char(char *buff, size_t offset, char c) +bsdtar_expand_char(char *buff, size_t buffsize, size_t offset, char c) { size_t i = offset; @@ -221,7 +221,7 @@ bsdtar_expand_char(char *buff, size_t offset, char c) case '\v': buff[i++] = 'v'; break; case '\\': buff[i++] = '\\'; break; default: - sprintf(buff + i, "%03o", 0xFF & (int)c); + snprintf(buff + i, buffsize - i, "%03o", 0xFF & (int)c); i += 3; } } @@ -309,11 +309,12 @@ set_chdir(struct bsdtar *bsdtar, const char *newdir) /* The -C /foo -C bar case; concatenate */ char *old_pending = bsdtar->pending_chdir; size_t old_len = strlen(old_pending); - bsdtar->pending_chdir = malloc(old_len + strlen(newdir) + 2); + size_t new_len = old_len + strlen(newdir) + 2; + bsdtar->pending_chdir = malloc(new_len); if (old_pending[old_len - 1] == '/') old_pending[old_len - 1] = '\0'; if (bsdtar->pending_chdir != NULL) - sprintf(bsdtar->pending_chdir, "%s/%s", + snprintf(bsdtar->pending_chdir, new_len, "%s/%s", old_pending, newdir); free(old_pending); } @@ -695,7 +696,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) /* Use uname if it's present, else uid. */ p = archive_entry_uname(entry); if ((p == NULL) || (*p == '\0')) { - sprintf(tmp, "%lu ", + snprintf(tmp, sizeof(tmp), "%lu ", (unsigned long)archive_entry_uid(entry)); p = tmp; } @@ -710,7 +711,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) fprintf(out, "%s", p); w = strlen(p); } else { - sprintf(tmp, "%lu", + snprintf(tmp, sizeof(tmp), "%lu", (unsigned long)archive_entry_gid(entry)); w = strlen(tmp); fprintf(out, "%s", tmp); @@ -723,7 +724,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) */ if (archive_entry_filetype(entry) == AE_IFCHR || archive_entry_filetype(entry) == AE_IFBLK) { - sprintf(tmp, "%lu,%lu", + snprintf(tmp, sizeof(tmp), "%lu,%lu", (unsigned long)archive_entry_rdevmajor(entry), (unsigned long)archive_entry_rdevminor(entry)); } else { diff --git a/src/dependencies/libarchive-3.5.2/tar/write.c b/src/dependencies/libarchive-3.6.2/tar/write.c similarity index 99% rename from src/dependencies/libarchive-3.5.2/tar/write.c rename to src/dependencies/libarchive-3.6.2/tar/write.c index 09c44a3..f2fb1c3 100644 --- a/src/dependencies/libarchive-3.5.2/tar/write.c +++ b/src/dependencies/libarchive-3.6.2/tar/write.c @@ -196,6 +196,10 @@ set_reader_options(struct bsdtar *bsdtar, struct archive *a) else archive_clear_error(a); } + if (bsdtar->flags & OPTFLAG_IGNORE_ZEROS) + if (archive_read_set_options(a, + "read_concatenated_archives") != ARCHIVE_OK) + lafe_errc(1, 0, "%s", archive_error_string(a)); } void diff --git a/src/dependencies/libarchive-3.5.2/test_utils/test_common.h b/src/dependencies/libarchive-3.6.2/test_utils/test_common.h similarity index 99% rename from src/dependencies/libarchive-3.5.2/test_utils/test_common.h rename to src/dependencies/libarchive-3.6.2/test_utils/test_common.h index 42119c0..6250235 100644 --- a/src/dependencies/libarchive-3.5.2/test_utils/test_common.h +++ b/src/dependencies/libarchive-3.6.2/test_utils/test_common.h @@ -471,4 +471,6 @@ void assertVersion(const char *prog, const char *base); #include #endif +#include "test_utils.h" + #endif /* TEST_COMMON_H */ diff --git a/src/dependencies/libarchive-3.5.2/test_utils/test_main.c b/src/dependencies/libarchive-3.6.2/test_utils/test_main.c similarity index 96% rename from src/dependencies/libarchive-3.5.2/test_utils/test_main.c rename to src/dependencies/libarchive-3.6.2/test_utils/test_main.c index c1c03cd..74250ad 100644 --- a/src/dependencies/libarchive-3.5.2/test_utils/test_main.c +++ b/src/dependencies/libarchive-3.6.2/test_utils/test_main.c @@ -426,7 +426,7 @@ failure(const char *fmt, ...) nextmsg = NULL; } else { va_start(ap, fmt); - vsprintf(msgbuff, fmt, ap); + vsnprintf(msgbuff, sizeof(msgbuff), fmt, ap); va_end(ap); nextmsg = msgbuff; } @@ -551,7 +551,7 @@ test_skipping(const char *fmt, ...) va_list ap; va_start(ap, fmt); - vsprintf(buff, fmt, ap); + vsnprintf(buff, sizeof(buff), fmt, ap); va_end(ap); /* Use failure() message if set. */ msg = nextmsg; @@ -1970,7 +1970,12 @@ assertion_make_file(const char *file, int line, failure_finish(NULL); return (0); } - if (0 != chmod(path, mode)) { +#ifdef HAVE_FCHMOD + if (0 != fchmod(fd, mode)) +#else + if (0 != chmod(path, mode)) +#endif + { failure_start(file, line, "Could not chmod %s", path); failure_finish(NULL); close(fd); @@ -2610,7 +2615,7 @@ canLzma(void) static int tested = 0, value = 0; if (!tested) { tested = 1; - if (systemf("lzma %s", redirectArgs) == 0) + if (systemf("lzma --help %s", redirectArgs) == 0) value = 1; } return (value); @@ -3065,7 +3070,7 @@ systemf(const char *fmt, ...) int r; va_start(ap, fmt); - vsprintf(buff, fmt, ap); + vsnprintf(buff, sizeof(buff), fmt, ap); if (verbosity > VERBOSITY_FULL) logprintf("Cmd: %s\n", buff); r = system(buff); @@ -3090,7 +3095,7 @@ slurpfile(size_t * sizep, const char *fmt, ...) int r; va_start(ap, fmt); - vsprintf(filename, fmt, ap); + vsnprintf(filename, sizeof(filename), fmt, ap); va_end(ap); f = fopen(filename, "rb"); @@ -3157,7 +3162,7 @@ extract_reference_file(const char *name) char buff[1024]; FILE *in, *out; - sprintf(buff, "%s/%s.uu", refdir, name); + snprintf(buff, sizeof(buff), "%s/%s.uu", refdir, name); in = fopen(buff, "r"); failure("Couldn't open reference file %s", buff); assert(in != NULL); @@ -3185,14 +3190,12 @@ extract_reference_file(const char *name) while (bytes > 0) { int n = 0; /* Write out 1-3 bytes from that. */ - if (bytes > 0) { - assert(VALID_UUDECODE(p[0])); - assert(VALID_UUDECODE(p[1])); - n = UUDECODE(*p++) << 18; - n |= UUDECODE(*p++) << 12; - fputc(n >> 16, out); - --bytes; - } + assert(VALID_UUDECODE(p[0])); + assert(VALID_UUDECODE(p[1])); + n = UUDECODE(*p++) << 18; + n |= UUDECODE(*p++) << 12; + fputc(n >> 16, out); + --bytes; if (bytes > 0) { assert(VALID_UUDECODE(p[0])); n |= UUDECODE(*p++) << 6; @@ -3218,7 +3221,7 @@ copy_reference_file(const char *name) FILE *in, *out; size_t rbytes; - sprintf(buff, "%s/%s", refdir, name); + snprintf(buff, sizeof(buff), "%s/%s", refdir, name); in = fopen(buff, "rb"); failure("Couldn't open reference file %s", buff); assert(in != NULL); @@ -3462,6 +3465,12 @@ assertion_entry_compare_acls(const char *file, int line, * DEFINE_TEST(test_function) * for each test. */ +struct test_list_t +{ + void (*func)(void); + const char *name; + int failures; +}; /* Use "list.h" to declare all of the test functions. */ #undef DEFINE_TEST @@ -3539,7 +3548,7 @@ test_run(int i, const char *tmpdir) exit(1); } /* Create a log file for this test. */ - sprintf(logfilename, "%s.log", tests[i].name); + snprintf(logfilename, sizeof(logfilename), "%s.log", tests[i].name); logfile = fopen(logfilename, "w"); fprintf(logfile, "%s\n\n", tests[i].name); /* Chdir() to a work dir for this specific test. */ @@ -3753,13 +3762,119 @@ success: return p; } +/* Filter tests against a glob pattern. Returns non-zero if test matches + * pattern, zero otherwise. A '^' at the beginning of the pattern negates + * the return values (i.e. returns zero for a match, non-zero otherwise. + */ +static int +test_filter(const char *pattern, const char *test) +{ + int retval = 0; + int negate = 0; + const char *p = pattern; + const char *t = test; + + if (p[0] == '^') + { + negate = 1; + p++; + } + + while (1) + { + if (p[0] == '\\') + p++; + else if (p[0] == '*') + { + while (p[0] == '*') + p++; + if (p[0] == '\\') + p++; + if ((t = strchr(t, p[0])) == 0) + break; + } + if (p[0] != t[0]) + break; + if (p[0] == '\0') { + retval = 1; + break; + } + p++; + t++; + } + + return (negate) ? !retval : retval; +} + +static int +get_test_set(int *test_set, int limit, const char *test) +{ + int start, end; + int idx = 0; + + if (test == NULL) { + /* Default: Run all tests. */ + for (;idx < limit; idx++) + test_set[idx] = idx; + return (limit); + } + if (*test >= '0' && *test <= '9') { + const char *vp = test; + start = 0; + while (*vp >= '0' && *vp <= '9') { + start *= 10; + start += *vp - '0'; + ++vp; + } + if (*vp == '\0') { + end = start; + } else if (*vp == '-') { + ++vp; + if (*vp == '\0') { + end = limit - 1; + } else { + end = 0; + while (*vp >= '0' && *vp <= '9') { + end *= 10; + end += *vp - '0'; + ++vp; + } + } + } else + return (-1); + if (start < 0 || end >= limit || start > end) + return (-1); + while (start <= end) + test_set[idx++] = start++; + } else { + for (start = 0; start < limit; ++start) { + const char *name = tests[start].name; + if (test_filter(test, name)) + test_set[idx++] = start; + } + } + return ((idx == 0)?-1:idx); +} + int main(int argc, char **argv) { static const int limit = sizeof(tests) / sizeof(tests[0]); int test_set[sizeof(tests) / sizeof(tests[0])]; int i = 0, j = 0, tests_run = 0, tests_failed = 0, option; + int testprogdir_len; +#ifdef PROGRAM + int tmp2_len; +#endif time_t now; + struct tm *tmptr; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S) + struct tm tmbuf; +#endif +#if defined(HAVE__LOCALTIME64_S) + errno_t terr; + __time64_t tmptime; +#endif char *refdir_alloc = NULL; const char *progname; char **saved_argv; @@ -3795,12 +3910,13 @@ main(int argc, char **argv) * tree. */ progname = p = argv[0]; - if ((testprogdir = (char *)malloc(strlen(progname) + 1)) == NULL) + testprogdir_len = strlen(progname) + 1; + if ((testprogdir = (char *)malloc(testprogdir_len)) == NULL) { fprintf(stderr, "ERROR: Out of memory."); exit(1); } - strcpy(testprogdir, progname); + strncpy(testprogdir, progname, testprogdir_len); while (*p != '\0') { /* Support \ or / dir separators for Windows compat. */ if (*p == '/' || *p == '\\') @@ -3942,20 +4058,21 @@ main(int argc, char **argv) #ifdef PROGRAM if (testprogfile == NULL) { - if ((tmp2 = (char *)malloc(strlen(testprogdir) + 1 + - strlen(PROGRAM) + 1)) == NULL) + tmp2_len = strlen(testprogdir) + 1 + strlen(PROGRAM) + 1; + if ((tmp2 = (char *)malloc(tmp2_len)) == NULL) { fprintf(stderr, "ERROR: Out of memory."); exit(1); } - strcpy(tmp2, testprogdir); - strcat(tmp2, "/"); - strcat(tmp2, PROGRAM); + strncpy(tmp2, testprogdir, tmp2_len); + strncat(tmp2, "/", tmp2_len); + strncat(tmp2, PROGRAM, tmp2_len); testprogfile = tmp2; } { char *testprg; + int testprg_len; #if defined(_WIN32) && !defined(__CYGWIN__) /* Command.com sometimes rejects '/' separators. */ testprg = strdup(testprogfile); @@ -3966,10 +4083,11 @@ main(int argc, char **argv) testprogfile = testprg; #endif /* Quote the name that gets put into shell command lines. */ - testprg = malloc(strlen(testprogfile) + 3); - strcpy(testprg, "\""); - strcat(testprg, testprogfile); - strcat(testprg, "\""); + testprg_len = strlen(testprogfile) + 3; + testprg = malloc(testprg_len); + strncpy(testprg, "\"", testprg_len); + strncat(testprg, testprogfile, testprg_len); + strncat(testprg, "\"", testprg_len); testprog = testprg; } #endif @@ -3991,9 +4109,20 @@ main(int argc, char **argv) */ now = time(NULL); for (i = 0; ; i++) { +#if defined(HAVE_LOCALTIME_R) + tmptr = localtime_r(&now, &tmbuf); +#elif defined(HAVE__LOCALTIME64_S) + tmptime = now; + terr = _localtime64_s(&tmbuf, &tmptime); + if (terr) + tmptr = NULL; + else + tmptr = &tmbuf; +#else + tmptr = localtime(&now); +#endif strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp), - "%Y-%m-%dT%H.%M.%S", - localtime(&now)); + "%Y-%m-%dT%H.%M.%S", tmptr); if ((strlen(tmp) + 1 + strlen(progname) + 1 + strlen(tmpdir_timestamp) + 1 + 3) > (sizeof(tmpdir) / sizeof(char))) { @@ -4049,7 +4178,7 @@ main(int argc, char **argv) do { int test_num; - test_num = get_test_set(test_set, limit, *argv, tests); + test_num = get_test_set(test_set, limit, *argv); if (test_num < 0) { printf("*** INVALID Test %s\n", *argv); free(refdir_alloc); diff --git a/src/dependencies/libarchive-3.6.2/test_utils/test_utils.c b/src/dependencies/libarchive-3.6.2/test_utils/test_utils.c new file mode 100644 index 0000000..b796676 --- /dev/null +++ b/src/dependencies/libarchive-3.6.2/test_utils/test_utils.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2003-2012 Tim Kientzle + * Copyright (c) 2012 Andres Mejia + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_utils.h" + +#include +#include +#include +#include +#include + +static inline uint64_t +xorshift64(uint64_t *state) +{ + uint64_t x = *state; + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + *state = x; + return (x); +} + +/* + * Fill a buffer with reproducible pseudo-random data using a simple xorshift + * algorithm. Originally, most tests filled buffers with a loop that calls + * rand() once for each byte. However, this initialization can be extremely + * slow when running on emulated platforms such as QEMU where 16M calls to + * rand() take a long time: Before the test_write_format_7zip_large_copy test + * took ~22 seconds, whereas using a xorshift random number generator (that can + * be inlined) reduces it to ~17 seconds on QEMU RISC-V. + */ +static void +fill_with_pseudorandom_data_seed(uint64_t seed, void *buffer, size_t size) +{ + uint64_t *aligned_buffer; + size_t num_values; + size_t i; + size_t unaligned_suffix; + size_t unaligned_prefix = 0; + /* + * To avoid unaligned stores we only fill the aligned part of the buffer + * with pseudo-random data and fill the unaligned prefix with 0xab and + * the suffix with 0xcd. + */ + if ((uintptr_t)buffer % sizeof(uint64_t)) { + unaligned_prefix = + sizeof(uint64_t) - (uintptr_t)buffer % sizeof(uint64_t); + aligned_buffer = + (uint64_t *)((char *)buffer + unaligned_prefix); + memset(buffer, 0xab, unaligned_prefix); + } else { + aligned_buffer = (uint64_t *)buffer; + } + assert((uintptr_t)aligned_buffer % sizeof(uint64_t) == 0); + num_values = (size - unaligned_prefix) / sizeof(uint64_t); + unaligned_suffix = + size - unaligned_prefix - num_values * sizeof(uint64_t); + for (i = 0; i < num_values; i++) { + aligned_buffer[i] = xorshift64(&seed); + } + if (unaligned_suffix) { + memset((char *)buffer + size - unaligned_suffix, 0xcd, + unaligned_suffix); + } +} + +void +fill_with_pseudorandom_data(void *buffer, size_t size) +{ + uint64_t seed; + const char* seed_str; + /* + * Check if a seed has been specified in the environment, otherwise fall + * back to using rand() as a seed. + */ + if ((seed_str = getenv("TEST_RANDOM_SEED")) != NULL) { + errno = 0; + seed = strtoull(seed_str, NULL, 10); + if (errno != 0) { + fprintf(stderr, "strtoull(%s) failed: %s", seed_str, + strerror(errno)); + seed = rand(); + } + } else { + seed = rand(); + } + fill_with_pseudorandom_data_seed(seed, buffer, size); +} diff --git a/src/dependencies/libarchive-3.5.2/test_utils/test_utils.h b/src/dependencies/libarchive-3.6.2/test_utils/test_utils.h similarity index 90% rename from src/dependencies/libarchive-3.5.2/test_utils/test_utils.h rename to src/dependencies/libarchive-3.6.2/test_utils/test_utils.h index 164c528..4145789 100644 --- a/src/dependencies/libarchive-3.5.2/test_utils/test_utils.h +++ b/src/dependencies/libarchive-3.6.2/test_utils/test_utils.h @@ -27,13 +27,10 @@ #ifndef TEST_UTILS_H #define TEST_UTILS_H -struct test_list_t -{ - void (*func)(void); - const char *name; - int failures; -}; +#include +#include -int get_test_set(int *, int, const char *, struct test_list_t *); +/* Fill a buffer with pseudorandom data */ +void fill_with_pseudorandom_data(void* buffer, size_t size); #endif /* TEST_UTILS_H */ diff --git a/src/dependencies/zlib-1.2.11/contrib/amd64/amd64-match.S b/src/dependencies/zlib-1.2.11/contrib/amd64/amd64-match.S deleted file mode 100644 index 81d4a1c..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/amd64/amd64-match.S +++ /dev/null @@ -1,452 +0,0 @@ -/* - * match.S -- optimized version of longest_match() - * based on the similar work by Gilles Vollant, and Brian Raiter, written 1998 - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the BSD License. Use by owners of Che Guevarra - * parafernalia is prohibited, where possible, and highly discouraged - * elsewhere. - */ - -#ifndef NO_UNDERLINE -# define match_init _match_init -# define longest_match _longest_match -#endif - -#define scanend ebx -#define scanendw bx -#define chainlenwmask edx /* high word: current chain len low word: s->wmask */ -#define curmatch rsi -#define curmatchd esi -#define windowbestlen r8 -#define scanalign r9 -#define scanalignd r9d -#define window r10 -#define bestlen r11 -#define bestlend r11d -#define scanstart r12d -#define scanstartw r12w -#define scan r13 -#define nicematch r14d -#define limit r15 -#define limitd r15d -#define prev rcx - -/* - * The 258 is a "magic number, not a parameter -- changing it - * breaks the hell loose - */ -#define MAX_MATCH (258) -#define MIN_MATCH (3) -#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) -#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) - -/* stack frame offsets */ -#define LocalVarsSize (112) -#define _chainlenwmask ( 8-LocalVarsSize)(%rsp) -#define _windowbestlen (16-LocalVarsSize)(%rsp) -#define save_r14 (24-LocalVarsSize)(%rsp) -#define save_rsi (32-LocalVarsSize)(%rsp) -#define save_rbx (40-LocalVarsSize)(%rsp) -#define save_r12 (56-LocalVarsSize)(%rsp) -#define save_r13 (64-LocalVarsSize)(%rsp) -#define save_r15 (80-LocalVarsSize)(%rsp) - - -.globl match_init, longest_match - -/* - * On AMD64 the first argument of a function (in our case -- the pointer to - * deflate_state structure) is passed in %rdi, hence our offsets below are - * all off of that. - */ - -/* you can check the structure offset by running - -#include -#include -#include "deflate.h" - -void print_depl() -{ -deflate_state ds; -deflate_state *s=&ds; -printf("size pointer=%u\n",(int)sizeof(void*)); - -printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s))); -printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s))); -printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s))); -printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s))); -printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s))); -printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s))); -printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s))); -printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s))); -printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s))); -printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s))); -printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); -printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s))); -printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s))); -} - -*/ - - -/* - to compile for XCode 3.2 on MacOSX x86_64 - - run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S" - */ - - -#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE -#define dsWSize ( 68)(%rdi) -#define dsWMask ( 76)(%rdi) -#define dsWindow ( 80)(%rdi) -#define dsPrev ( 96)(%rdi) -#define dsMatchLen (144)(%rdi) -#define dsPrevMatch (148)(%rdi) -#define dsStrStart (156)(%rdi) -#define dsMatchStart (160)(%rdi) -#define dsLookahead (164)(%rdi) -#define dsPrevLen (168)(%rdi) -#define dsMaxChainLen (172)(%rdi) -#define dsGoodMatch (188)(%rdi) -#define dsNiceMatch (192)(%rdi) - -#else - -#ifndef STRUCT_OFFSET -# define STRUCT_OFFSET (0) -#endif - - -#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi) -#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi) -#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi) -#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi) -#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi) -#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi) -#define dsStrStart (148 + STRUCT_OFFSET)(%rdi) -#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi) -#define dsLookahead (156 + STRUCT_OFFSET)(%rdi) -#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi) -#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi) -#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi) -#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi) - -#endif - - - - -.text - -/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ - -longest_match: -/* - * Retrieve the function arguments. %curmatch will hold cur_match - * throughout the entire function (passed via rsi on amd64). - * rdi will hold the pointer to the deflate_state (first arg on amd64) - */ - mov %rsi, save_rsi - mov %rbx, save_rbx - mov %r12, save_r12 - mov %r13, save_r13 - mov %r14, save_r14 - mov %r15, save_r15 - -/* uInt wmask = s->w_mask; */ -/* unsigned chain_length = s->max_chain_length; */ -/* if (s->prev_length >= s->good_match) { */ -/* chain_length >>= 2; */ -/* } */ - - movl dsPrevLen, %eax - movl dsGoodMatch, %ebx - cmpl %ebx, %eax - movl dsWMask, %eax - movl dsMaxChainLen, %chainlenwmask - jl LastMatchGood - shrl $2, %chainlenwmask -LastMatchGood: - -/* chainlen is decremented once beforehand so that the function can */ -/* use the sign flag instead of the zero flag for the exit test. */ -/* It is then shifted into the high word, to make room for the wmask */ -/* value, which it will always accompany. */ - - decl %chainlenwmask - shll $16, %chainlenwmask - orl %eax, %chainlenwmask - -/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ - - movl dsNiceMatch, %eax - movl dsLookahead, %ebx - cmpl %eax, %ebx - jl LookaheadLess - movl %eax, %ebx -LookaheadLess: movl %ebx, %nicematch - -/* register Bytef *scan = s->window + s->strstart; */ - - mov dsWindow, %window - movl dsStrStart, %limitd - lea (%limit, %window), %scan - -/* Determine how many bytes the scan ptr is off from being */ -/* dword-aligned. */ - - mov %scan, %scanalign - negl %scanalignd - andl $3, %scanalignd - -/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ -/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ - - movl dsWSize, %eax - subl $MIN_LOOKAHEAD, %eax - xorl %ecx, %ecx - subl %eax, %limitd - cmovng %ecx, %limitd - -/* int best_len = s->prev_length; */ - - movl dsPrevLen, %bestlend - -/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */ - - lea (%window, %bestlen), %windowbestlen - mov %windowbestlen, _windowbestlen - -/* register ush scan_start = *(ushf*)scan; */ -/* register ush scan_end = *(ushf*)(scan+best_len-1); */ -/* Posf *prev = s->prev; */ - - movzwl (%scan), %scanstart - movzwl -1(%scan, %bestlen), %scanend - mov dsPrev, %prev - -/* Jump into the main loop. */ - - movl %chainlenwmask, _chainlenwmask - jmp LoopEntry - -.balign 16 - -/* do { - * match = s->window + cur_match; - * if (*(ushf*)(match+best_len-1) != scan_end || - * *(ushf*)match != scan_start) continue; - * [...] - * } while ((cur_match = prev[cur_match & wmask]) > limit - * && --chain_length != 0); - * - * Here is the inner loop of the function. The function will spend the - * majority of its time in this loop, and majority of that time will - * be spent in the first ten instructions. - */ -LookupLoop: - andl %chainlenwmask, %curmatchd - movzwl (%prev, %curmatch, 2), %curmatchd - cmpl %limitd, %curmatchd - jbe LeaveNow - subl $0x00010000, %chainlenwmask - js LeaveNow -LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw - jne LookupLoop - cmpw %scanstartw, (%window, %curmatch) - jne LookupLoop - -/* Store the current value of chainlen. */ - movl %chainlenwmask, _chainlenwmask - -/* %scan is the string under scrutiny, and %prev to the string we */ -/* are hoping to match it up with. In actuality, %esi and %edi are */ -/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ -/* initialized to -(MAX_MATCH_8 - scanalign). */ - - mov $(-MAX_MATCH_8), %rdx - lea (%curmatch, %window), %windowbestlen - lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen - lea MAX_MATCH_8(%scan, %scanalign), %prev - -/* the prefetching below makes very little difference... */ - prefetcht1 (%windowbestlen, %rdx) - prefetcht1 (%prev, %rdx) - -/* - * Test the strings for equality, 8 bytes at a time. At the end, - * adjust %rdx so that it is offset to the exact byte that mismatched. - * - * It should be confessed that this loop usually does not represent - * much of the total running time. Replacing it with a more - * straightforward "rep cmpsb" would not drastically degrade - * performance -- unrolling it, for example, makes no difference. - */ - -#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */ - -LoopCmps: -#ifdef USE_SSE - /* Preload the SSE registers */ - movdqu (%windowbestlen, %rdx), %xmm1 - movdqu (%prev, %rdx), %xmm2 - pcmpeqb %xmm2, %xmm1 - movdqu 16(%windowbestlen, %rdx), %xmm3 - movdqu 16(%prev, %rdx), %xmm4 - pcmpeqb %xmm4, %xmm3 - movdqu 32(%windowbestlen, %rdx), %xmm5 - movdqu 32(%prev, %rdx), %xmm6 - pcmpeqb %xmm6, %xmm5 - movdqu 48(%windowbestlen, %rdx), %xmm7 - movdqu 48(%prev, %rdx), %xmm8 - pcmpeqb %xmm8, %xmm7 - - /* Check the comparisions' results */ - pmovmskb %xmm1, %rax - notw %ax - bsfw %ax, %ax - jnz LeaveLoopCmps - - /* this is the only iteration of the loop with a possibility of having - incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40 - and (0x40*4)+8=0x108 */ - add $8, %rdx - jz LenMaximum - add $8, %rdx - - - pmovmskb %xmm3, %rax - notw %ax - bsfw %ax, %ax - jnz LeaveLoopCmps - - - add $16, %rdx - - - pmovmskb %xmm5, %rax - notw %ax - bsfw %ax, %ax - jnz LeaveLoopCmps - - add $16, %rdx - - - pmovmskb %xmm7, %rax - notw %ax - bsfw %ax, %ax - jnz LeaveLoopCmps - - add $16, %rdx - - jmp LoopCmps -LeaveLoopCmps: add %rax, %rdx -#else - mov (%windowbestlen, %rdx), %rax - xor (%prev, %rdx), %rax - jnz LeaveLoopCmps - - mov 8(%windowbestlen, %rdx), %rax - xor 8(%prev, %rdx), %rax - jnz LeaveLoopCmps8 - - mov 16(%windowbestlen, %rdx), %rax - xor 16(%prev, %rdx), %rax - jnz LeaveLoopCmps16 - - add $24, %rdx - jnz LoopCmps - jmp LenMaximum -# if 0 -/* - * This three-liner is tantalizingly simple, but bsf is a slow instruction, - * and the complicated alternative down below is quite a bit faster. Sad... - */ - -LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */ - shrl $3, %eax /* divide by 8 to get the byte */ - add %rax, %rdx -# else -LeaveLoopCmps16: - add $8, %rdx -LeaveLoopCmps8: - add $8, %rdx -LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */ - jnz Check16 - add $4, %rdx - shr $32, %rax -Check16: testw $0xFFFF, %ax - jnz LenLower - add $2, %rdx - shrl $16, %eax -LenLower: subb $1, %al - adc $0, %rdx -# endif -#endif - -/* Calculate the length of the match. If it is longer than MAX_MATCH, */ -/* then automatically accept it as the best possible match and leave. */ - - lea (%prev, %rdx), %rax - sub %scan, %rax - cmpl $MAX_MATCH, %eax - jge LenMaximum - -/* If the length of the match is not longer than the best match we */ -/* have so far, then forget it and return to the lookup loop. */ - - cmpl %bestlend, %eax - jg LongerMatch - mov _windowbestlen, %windowbestlen - mov dsPrev, %prev - movl _chainlenwmask, %edx - jmp LookupLoop - -/* s->match_start = cur_match; */ -/* best_len = len; */ -/* if (len >= nice_match) break; */ -/* scan_end = *(ushf*)(scan+best_len-1); */ - -LongerMatch: - movl %eax, %bestlend - movl %curmatchd, dsMatchStart - cmpl %nicematch, %eax - jge LeaveNow - - lea (%window, %bestlen), %windowbestlen - mov %windowbestlen, _windowbestlen - - movzwl -1(%scan, %rax), %scanend - mov dsPrev, %prev - movl _chainlenwmask, %chainlenwmask - jmp LookupLoop - -/* Accept the current string, with the maximum possible length. */ - -LenMaximum: - movl $MAX_MATCH, %bestlend - movl %curmatchd, dsMatchStart - -/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ -/* return s->lookahead; */ - -LeaveNow: - movl dsLookahead, %eax - cmpl %eax, %bestlend - cmovngl %bestlend, %eax -LookaheadRet: - -/* Restore the registers and return from whence we came. */ - - mov save_rsi, %rsi - mov save_rbx, %rbx - mov save_r12, %r12 - mov save_r13, %r13 - mov save_r14, %r14 - mov save_r15, %r15 - - ret - -match_init: ret diff --git a/src/dependencies/zlib-1.2.11/contrib/asm686/README.686 b/src/dependencies/zlib-1.2.11/contrib/asm686/README.686 deleted file mode 100644 index a0bf3be..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/asm686/README.686 +++ /dev/null @@ -1,51 +0,0 @@ -This is a patched version of zlib, modified to use -Pentium-Pro-optimized assembly code in the deflation algorithm. The -files changed/added by this patch are: - -README.686 -match.S - -The speedup that this patch provides varies, depending on whether the -compiler used to build the original version of zlib falls afoul of the -PPro's speed traps. My own tests show a speedup of around 10-20% at -the default compression level, and 20-30% using -9, against a version -compiled using gcc 2.7.2.3. Your mileage may vary. - -Note that this code has been tailored for the PPro/PII in particular, -and will not perform particuarly well on a Pentium. - -If you are using an assembler other than GNU as, you will have to -translate match.S to use your assembler's syntax. (Have fun.) - -Brian Raiter -breadbox@muppetlabs.com -April, 1998 - - -Added for zlib 1.1.3: - -The patches come from -http://www.muppetlabs.com/~breadbox/software/assembly.html - -To compile zlib with this asm file, copy match.S to the zlib directory -then do: - -CFLAGS="-O3 -DASMV" ./configure -make OBJA=match.o - - -Update: - -I've been ignoring these assembly routines for years, believing that -gcc's generated code had caught up with it sometime around gcc 2.95 -and the major rearchitecting of the Pentium 4. However, I recently -learned that, despite what I believed, this code still has some life -in it. On the Pentium 4 and AMD64 chips, it continues to run about 8% -faster than the code produced by gcc 4.1. - -In acknowledgement of its continuing usefulness, I've altered the -license to match that of the rest of zlib. Share and Enjoy! - -Brian Raiter -breadbox@muppetlabs.com -April, 2007 diff --git a/src/dependencies/zlib-1.2.11/contrib/asm686/match.S b/src/dependencies/zlib-1.2.11/contrib/asm686/match.S deleted file mode 100644 index fa42109..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/asm686/match.S +++ /dev/null @@ -1,357 +0,0 @@ -/* match.S -- x86 assembly version of the zlib longest_match() function. - * Optimized for the Intel 686 chips (PPro and later). - * - * Copyright (C) 1998, 2007 Brian Raiter - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the author be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - -#ifndef NO_UNDERLINE -#define match_init _match_init -#define longest_match _longest_match -#endif - -#define MAX_MATCH (258) -#define MIN_MATCH (3) -#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) -#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) - -/* stack frame offsets */ - -#define chainlenwmask 0 /* high word: current chain len */ - /* low word: s->wmask */ -#define window 4 /* local copy of s->window */ -#define windowbestlen 8 /* s->window + bestlen */ -#define scanstart 16 /* first two bytes of string */ -#define scanend 12 /* last two bytes of string */ -#define scanalign 20 /* dword-misalignment of string */ -#define nicematch 24 /* a good enough match size */ -#define bestlen 28 /* size of best match so far */ -#define scan 32 /* ptr to string wanting match */ - -#define LocalVarsSize (36) -/* saved ebx 36 */ -/* saved edi 40 */ -/* saved esi 44 */ -/* saved ebp 48 */ -/* return address 52 */ -#define deflatestate 56 /* the function arguments */ -#define curmatch 60 - -/* All the +zlib1222add offsets are due to the addition of fields - * in zlib in the deflate_state structure since the asm code was first written - * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). - * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). - * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). - */ - -#define zlib1222add (8) - -#define dsWSize (36+zlib1222add) -#define dsWMask (44+zlib1222add) -#define dsWindow (48+zlib1222add) -#define dsPrev (56+zlib1222add) -#define dsMatchLen (88+zlib1222add) -#define dsPrevMatch (92+zlib1222add) -#define dsStrStart (100+zlib1222add) -#define dsMatchStart (104+zlib1222add) -#define dsLookahead (108+zlib1222add) -#define dsPrevLen (112+zlib1222add) -#define dsMaxChainLen (116+zlib1222add) -#define dsGoodMatch (132+zlib1222add) -#define dsNiceMatch (136+zlib1222add) - - -.file "match.S" - -.globl match_init, longest_match - -.text - -/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ -.cfi_sections .debug_frame - -longest_match: - -.cfi_startproc -/* Save registers that the compiler may be using, and adjust %esp to */ -/* make room for our stack frame. */ - - pushl %ebp - .cfi_def_cfa_offset 8 - .cfi_offset ebp, -8 - pushl %edi - .cfi_def_cfa_offset 12 - pushl %esi - .cfi_def_cfa_offset 16 - pushl %ebx - .cfi_def_cfa_offset 20 - subl $LocalVarsSize, %esp - .cfi_def_cfa_offset LocalVarsSize+20 - -/* Retrieve the function arguments. %ecx will hold cur_match */ -/* throughout the entire function. %edx will hold the pointer to the */ -/* deflate_state structure during the function's setup (before */ -/* entering the main loop). */ - - movl deflatestate(%esp), %edx - movl curmatch(%esp), %ecx - -/* uInt wmask = s->w_mask; */ -/* unsigned chain_length = s->max_chain_length; */ -/* if (s->prev_length >= s->good_match) { */ -/* chain_length >>= 2; */ -/* } */ - - movl dsPrevLen(%edx), %eax - movl dsGoodMatch(%edx), %ebx - cmpl %ebx, %eax - movl dsWMask(%edx), %eax - movl dsMaxChainLen(%edx), %ebx - jl LastMatchGood - shrl $2, %ebx -LastMatchGood: - -/* chainlen is decremented once beforehand so that the function can */ -/* use the sign flag instead of the zero flag for the exit test. */ -/* It is then shifted into the high word, to make room for the wmask */ -/* value, which it will always accompany. */ - - decl %ebx - shll $16, %ebx - orl %eax, %ebx - movl %ebx, chainlenwmask(%esp) - -/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ - - movl dsNiceMatch(%edx), %eax - movl dsLookahead(%edx), %ebx - cmpl %eax, %ebx - jl LookaheadLess - movl %eax, %ebx -LookaheadLess: movl %ebx, nicematch(%esp) - -/* register Bytef *scan = s->window + s->strstart; */ - - movl dsWindow(%edx), %esi - movl %esi, window(%esp) - movl dsStrStart(%edx), %ebp - lea (%esi,%ebp), %edi - movl %edi, scan(%esp) - -/* Determine how many bytes the scan ptr is off from being */ -/* dword-aligned. */ - - movl %edi, %eax - negl %eax - andl $3, %eax - movl %eax, scanalign(%esp) - -/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ -/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ - - movl dsWSize(%edx), %eax - subl $MIN_LOOKAHEAD, %eax - subl %eax, %ebp - jg LimitPositive - xorl %ebp, %ebp -LimitPositive: - -/* int best_len = s->prev_length; */ - - movl dsPrevLen(%edx), %eax - movl %eax, bestlen(%esp) - -/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ - - addl %eax, %esi - movl %esi, windowbestlen(%esp) - -/* register ush scan_start = *(ushf*)scan; */ -/* register ush scan_end = *(ushf*)(scan+best_len-1); */ -/* Posf *prev = s->prev; */ - - movzwl (%edi), %ebx - movl %ebx, scanstart(%esp) - movzwl -1(%edi,%eax), %ebx - movl %ebx, scanend(%esp) - movl dsPrev(%edx), %edi - -/* Jump into the main loop. */ - - movl chainlenwmask(%esp), %edx - jmp LoopEntry - -.balign 16 - -/* do { - * match = s->window + cur_match; - * if (*(ushf*)(match+best_len-1) != scan_end || - * *(ushf*)match != scan_start) continue; - * [...] - * } while ((cur_match = prev[cur_match & wmask]) > limit - * && --chain_length != 0); - * - * Here is the inner loop of the function. The function will spend the - * majority of its time in this loop, and majority of that time will - * be spent in the first ten instructions. - * - * Within this loop: - * %ebx = scanend - * %ecx = curmatch - * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) - * %esi = windowbestlen - i.e., (window + bestlen) - * %edi = prev - * %ebp = limit - */ -LookupLoop: - andl %edx, %ecx - movzwl (%edi,%ecx,2), %ecx - cmpl %ebp, %ecx - jbe LeaveNow - subl $0x00010000, %edx - js LeaveNow -LoopEntry: movzwl -1(%esi,%ecx), %eax - cmpl %ebx, %eax - jnz LookupLoop - movl window(%esp), %eax - movzwl (%eax,%ecx), %eax - cmpl scanstart(%esp), %eax - jnz LookupLoop - -/* Store the current value of chainlen. */ - - movl %edx, chainlenwmask(%esp) - -/* Point %edi to the string under scrutiny, and %esi to the string we */ -/* are hoping to match it up with. In actuality, %esi and %edi are */ -/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ -/* initialized to -(MAX_MATCH_8 - scanalign). */ - - movl window(%esp), %esi - movl scan(%esp), %edi - addl %ecx, %esi - movl scanalign(%esp), %eax - movl $(-MAX_MATCH_8), %edx - lea MAX_MATCH_8(%edi,%eax), %edi - lea MAX_MATCH_8(%esi,%eax), %esi - -/* Test the strings for equality, 8 bytes at a time. At the end, - * adjust %edx so that it is offset to the exact byte that mismatched. - * - * We already know at this point that the first three bytes of the - * strings match each other, and they can be safely passed over before - * starting the compare loop. So what this code does is skip over 0-3 - * bytes, as much as necessary in order to dword-align the %edi - * pointer. (%esi will still be misaligned three times out of four.) - * - * It should be confessed that this loop usually does not represent - * much of the total running time. Replacing it with a more - * straightforward "rep cmpsb" would not drastically degrade - * performance. - */ -LoopCmps: - movl (%esi,%edx), %eax - xorl (%edi,%edx), %eax - jnz LeaveLoopCmps - movl 4(%esi,%edx), %eax - xorl 4(%edi,%edx), %eax - jnz LeaveLoopCmps4 - addl $8, %edx - jnz LoopCmps - jmp LenMaximum -LeaveLoopCmps4: addl $4, %edx -LeaveLoopCmps: testl $0x0000FFFF, %eax - jnz LenLower - addl $2, %edx - shrl $16, %eax -LenLower: subb $1, %al - adcl $0, %edx - -/* Calculate the length of the match. If it is longer than MAX_MATCH, */ -/* then automatically accept it as the best possible match and leave. */ - - lea (%edi,%edx), %eax - movl scan(%esp), %edi - subl %edi, %eax - cmpl $MAX_MATCH, %eax - jge LenMaximum - -/* If the length of the match is not longer than the best match we */ -/* have so far, then forget it and return to the lookup loop. */ - - movl deflatestate(%esp), %edx - movl bestlen(%esp), %ebx - cmpl %ebx, %eax - jg LongerMatch - movl windowbestlen(%esp), %esi - movl dsPrev(%edx), %edi - movl scanend(%esp), %ebx - movl chainlenwmask(%esp), %edx - jmp LookupLoop - -/* s->match_start = cur_match; */ -/* best_len = len; */ -/* if (len >= nice_match) break; */ -/* scan_end = *(ushf*)(scan+best_len-1); */ - -LongerMatch: movl nicematch(%esp), %ebx - movl %eax, bestlen(%esp) - movl %ecx, dsMatchStart(%edx) - cmpl %ebx, %eax - jge LeaveNow - movl window(%esp), %esi - addl %eax, %esi - movl %esi, windowbestlen(%esp) - movzwl -1(%edi,%eax), %ebx - movl dsPrev(%edx), %edi - movl %ebx, scanend(%esp) - movl chainlenwmask(%esp), %edx - jmp LookupLoop - -/* Accept the current string, with the maximum possible length. */ - -LenMaximum: movl deflatestate(%esp), %edx - movl $MAX_MATCH, bestlen(%esp) - movl %ecx, dsMatchStart(%edx) - -/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ -/* return s->lookahead; */ - -LeaveNow: - movl deflatestate(%esp), %edx - movl bestlen(%esp), %ebx - movl dsLookahead(%edx), %eax - cmpl %eax, %ebx - jg LookaheadRet - movl %ebx, %eax -LookaheadRet: - -/* Restore the stack and return from whence we came. */ - - addl $LocalVarsSize, %esp - .cfi_def_cfa_offset 20 - popl %ebx - .cfi_def_cfa_offset 16 - popl %esi - .cfi_def_cfa_offset 12 - popl %edi - .cfi_def_cfa_offset 8 - popl %ebp - .cfi_def_cfa_offset 4 -.cfi_endproc -match_init: ret diff --git a/src/dependencies/zlib-1.2.11/contrib/inflate86/inffas86.c b/src/dependencies/zlib-1.2.11/contrib/inflate86/inffas86.c deleted file mode 100644 index 7292f67..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/inflate86/inffas86.c +++ /dev/null @@ -1,1157 +0,0 @@ -/* inffas86.c is a hand tuned assembler version of - * - * inffast.c -- fast decoding - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Copyright (C) 2003 Chris Anderson - * Please use the copyright conditions above. - * - * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also - * slightly quicker on x86 systems because, instead of using rep movsb to copy - * data, it uses rep movsw, which moves data in 2-byte chunks instead of single - * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates - * from http://fedora.linux.duke.edu/fc1_x86_64 - * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with - * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, - * when decompressing mozilla-source-1.3.tar.gz. - * - * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from - * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at - * the moment. I have successfully compiled and tested this code with gcc2.96, - * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S - * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX - * enabled. I will attempt to merge the MMX code into this version. Newer - * versions of this and inffast.S can be found at - * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* Mark Adler's comments from inffast.c: */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - struct inffast_ar { -/* 64 32 x86 x86_64 */ -/* ar offset register */ -/* 0 0 */ void *esp; /* esp save */ -/* 8 4 */ void *ebp; /* ebp save */ -/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ -/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ -/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ -/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ -/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ -/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ -/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ -/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ -/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ -/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ -/* 92 48 */ unsigned wsize; /* window size */ -/* 96 52 */ unsigned write; /* window write index */ -/*100 56 */ unsigned lmask; /* r12 mask for lcode */ -/*104 60 */ unsigned dmask; /* r13 mask for dcode */ -/*108 64 */ unsigned len; /* r14 match length */ -/*112 68 */ unsigned dist; /* r15 match distance */ -/*116 72 */ unsigned status; /* set when state chng*/ - } ar; - -#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) -#define PAD_AVAIL_IN 6 -#define PAD_AVAIL_OUT 258 -#else -#define PAD_AVAIL_IN 5 -#define PAD_AVAIL_OUT 257 -#endif - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - ar.in = strm->next_in; - ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); - ar.out = strm->next_out; - ar.beg = ar.out - (start - strm->avail_out); - ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); - ar.wsize = state->wsize; - ar.write = state->wnext; - ar.window = state->window; - ar.hold = state->hold; - ar.bits = state->bits; - ar.lcode = state->lencode; - ar.dcode = state->distcode; - ar.lmask = (1U << state->lenbits) - 1; - ar.dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - /* align in on 1/2 hold size boundary */ - while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { - ar.hold += (unsigned long)*ar.in++ << ar.bits; - ar.bits += 8; - } - -#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) - __asm__ __volatile__ ( -" leaq %0, %%rax\n" -" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ -" movq %%rsp, (%%rax)\n" -" movq %%rax, %%rsp\n" /* make rsp point to &ar */ -" movq 16(%%rsp), %%rsi\n" /* rsi = in */ -" movq 32(%%rsp), %%rdi\n" /* rdi = out */ -" movq 24(%%rsp), %%r9\n" /* r9 = last */ -" movq 48(%%rsp), %%r10\n" /* r10 = end */ -" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ -" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ -" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ -" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ -" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ -" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ - /* r14d = len */ - /* r15d = dist */ -" cld\n" -" cmpq %%rdi, %%r10\n" -" je .L_one_time\n" /* if only one decode left */ -" cmpq %%rsi, %%r9\n" -" je .L_one_time\n" -" jmp .L_do_loop\n" - -".L_one_time:\n" -" movq %%r12, %%r8\n" /* r8 = lmask */ -" cmpb $32, %%bl\n" -" ja .L_get_length_code_one_time\n" - -" lodsl\n" /* eax = *(uint *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $32, %%bl\n" /* bits += 32 */ -" shlq %%cl, %%rax\n" -" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ -" jmp .L_get_length_code_one_time\n" - -".align 32,0x90\n" -".L_while_test:\n" -" cmpq %%rdi, %%r10\n" -" jbe .L_break_loop\n" -" cmpq %%rsi, %%r9\n" -" jbe .L_break_loop\n" - -".L_do_loop:\n" -" movq %%r12, %%r8\n" /* r8 = lmask */ -" cmpb $32, %%bl\n" -" ja .L_get_length_code\n" /* if (32 < bits) */ - -" lodsl\n" /* eax = *(uint *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $32, %%bl\n" /* bits += 32 */ -" shlq %%cl, %%rax\n" -" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ - -".L_get_length_code:\n" -" andq %%rdx, %%r8\n" /* r8 &= hold */ -" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ - -" movb %%ah, %%cl\n" /* cl = this.bits */ -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ - -" testb %%al, %%al\n" -" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ - -" movq %%r12, %%r8\n" /* r8 = lmask */ -" shrl $16, %%eax\n" /* output this.val char */ -" stosb\n" - -".L_get_length_code_one_time:\n" -" andq %%rdx, %%r8\n" /* r8 &= hold */ -" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ - -".L_dolen:\n" -" movb %%ah, %%cl\n" /* cl = this.bits */ -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ - -" testb %%al, %%al\n" -" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ - -" shrl $16, %%eax\n" /* output this.val char */ -" stosb\n" -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_test_for_length_base:\n" -" movl %%eax, %%r14d\n" /* len = this */ -" shrl $16, %%r14d\n" /* len = this.val */ -" movb %%al, %%cl\n" - -" testb $16, %%al\n" -" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_decode_distance\n" /* if (!op) */ - -".L_add_bits_to_len:\n" -" subb %%cl, %%bl\n" -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrq %%cl, %%rdx\n" -" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ - -".L_decode_distance:\n" -" movq %%r13, %%r8\n" /* r8 = dmask */ -" cmpb $32, %%bl\n" -" ja .L_get_distance_code\n" /* if (32 < bits) */ - -" lodsl\n" /* eax = *(uint *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $32, %%bl\n" /* bits += 32 */ -" shlq %%cl, %%rax\n" -" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ - -".L_get_distance_code:\n" -" andq %%rdx, %%r8\n" /* r8 &= hold */ -" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ - -".L_dodist:\n" -" movl %%eax, %%r15d\n" /* dist = this */ -" shrl $16, %%r15d\n" /* dist = this.val */ -" movb %%ah, %%cl\n" -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ -" movb %%al, %%cl\n" /* cl = this.op */ - -" testb $16, %%al\n" /* if ((op & 16) == 0) */ -" jz .L_test_for_second_level_dist\n" -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_check_dist_one\n" - -".L_add_bits_to_dist:\n" -" subb %%cl, %%bl\n" -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" /* (1 << op) - 1 */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrq %%cl, %%rdx\n" -" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ - -".L_check_window:\n" -" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ -" movq %%rdi, %%rax\n" -" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ - -" cmpl %%r15d, %%eax\n" -" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ - -" movl %%r14d, %%ecx\n" /* ecx = len */ -" movq %%rdi, %%rsi\n" -" subq %%r15, %%rsi\n" /* from = out - dist */ - -" sarl %%ecx\n" -" jnc .L_copy_two\n" /* if len % 2 == 0 */ - -" rep movsw\n" -" movb (%%rsi), %%al\n" -" movb %%al, (%%rdi)\n" -" incq %%rdi\n" - -" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ -" jmp .L_while_test\n" - -".L_copy_two:\n" -" rep movsw\n" -" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_check_dist_one:\n" -" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ -" jne .L_check_window\n" -" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ -" je .L_check_window\n" - -" movl %%r14d, %%ecx\n" /* ecx = len */ -" movb -1(%%rdi), %%al\n" -" movb %%al, %%ah\n" - -" sarl %%ecx\n" -" jnc .L_set_two\n" -" movb %%al, (%%rdi)\n" -" incq %%rdi\n" - -".L_set_two:\n" -" rep stosw\n" -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_test_for_second_level_length:\n" -" testb $64, %%al\n" -" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ - -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl %%r14d, %%eax\n" /* eax += len */ -" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ -" jmp .L_dolen\n" - -".align 32,0x90\n" -".L_test_for_second_level_dist:\n" -" testb $64, %%al\n" -" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ - -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl %%r15d, %%eax\n" /* eax += dist */ -" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ -" jmp .L_dodist\n" - -".align 32,0x90\n" -".L_clip_window:\n" -" movl %%eax, %%ecx\n" /* ecx = nbytes */ -" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ -" negl %%ecx\n" /* nbytes = -nbytes */ - -" cmpl %%r15d, %%eax\n" -" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ - -" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ -" cmpl $0, 96(%%rsp)\n" -" jne .L_wrap_around_window\n" /* if (write != 0) */ - -" movq 56(%%rsp), %%rsi\n" /* from = window */ -" subl %%ecx, %%eax\n" /* eax -= nbytes */ -" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ - -" movl %%r14d, %%eax\n" /* eax = len */ -" cmpl %%ecx, %%r14d\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* eax -= nbytes */ -" rep movsb\n" -" movq %%rdi, %%rsi\n" -" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ -" jmp .L_do_copy\n" - -".align 32,0x90\n" -".L_wrap_around_window:\n" -" movl 96(%%rsp), %%eax\n" /* eax = write */ -" cmpl %%eax, %%ecx\n" -" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ - -" movl 92(%%rsp), %%esi\n" /* from = wsize */ -" addq 56(%%rsp), %%rsi\n" /* from += window */ -" addq %%rax, %%rsi\n" /* from += write */ -" subq %%rcx, %%rsi\n" /* from -= nbytes */ -" subl %%eax, %%ecx\n" /* nbytes -= write */ - -" movl %%r14d, %%eax\n" /* eax = len */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movq 56(%%rsp), %%rsi\n" /* from = window */ -" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movq %%rdi, %%rsi\n" -" subq %%r15, %%rsi\n" /* from = out - dist */ -" jmp .L_do_copy\n" - -".align 32,0x90\n" -".L_contiguous_in_window:\n" -" movq 56(%%rsp), %%rsi\n" /* rsi = window */ -" addq %%rax, %%rsi\n" -" subq %%rcx, %%rsi\n" /* from += write - nbytes */ - -" movl %%r14d, %%eax\n" /* eax = len */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movq %%rdi, %%rsi\n" -" subq %%r15, %%rsi\n" /* from = out - dist */ -" jmp .L_do_copy\n" /* if (nbytes >= len) */ - -".align 32,0x90\n" -".L_do_copy:\n" -" movl %%eax, %%ecx\n" /* ecx = len */ -" rep movsb\n" - -" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ -" jmp .L_while_test\n" - -".L_test_for_end_of_block:\n" -" testb $32, %%al\n" -" jz .L_invalid_literal_length_code\n" -" movl $1, 116(%%rsp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_literal_length_code:\n" -" movl $2, 116(%%rsp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_code:\n" -" movl $3, 116(%%rsp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_too_far:\n" -" movl $4, 116(%%rsp)\n" -" jmp .L_break_loop_with_status\n" - -".L_break_loop:\n" -" movl $0, 116(%%rsp)\n" - -".L_break_loop_with_status:\n" -/* put in, out, bits, and hold back into ar and pop esp */ -" movq %%rsi, 16(%%rsp)\n" /* in */ -" movq %%rdi, 32(%%rsp)\n" /* out */ -" movl %%ebx, 88(%%rsp)\n" /* bits */ -" movq %%rdx, 80(%%rsp)\n" /* hold */ -" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ -" movq 8(%%rsp), %%rbp\n" -" movq %%rax, %%rsp\n" - : - : "m" (ar) - : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", - "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" - ); -#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) - __asm__ __volatile__ ( -" leal %0, %%eax\n" -" movl %%esp, (%%eax)\n" /* save esp, ebp */ -" movl %%ebp, 4(%%eax)\n" -" movl %%eax, %%esp\n" -" movl 8(%%esp), %%esi\n" /* esi = in */ -" movl 16(%%esp), %%edi\n" /* edi = out */ -" movl 40(%%esp), %%edx\n" /* edx = hold */ -" movl 44(%%esp), %%ebx\n" /* ebx = bits */ -" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ - -" cld\n" -" jmp .L_do_loop\n" - -".align 32,0x90\n" -".L_while_test:\n" -" cmpl %%edi, 24(%%esp)\n" /* out < end */ -" jbe .L_break_loop\n" -" cmpl %%esi, 12(%%esp)\n" /* in < last */ -" jbe .L_break_loop\n" - -".L_do_loop:\n" -" cmpb $15, %%bl\n" -" ja .L_get_length_code\n" /* if (15 < bits) */ - -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ - -".L_get_length_code:\n" -" movl 56(%%esp), %%eax\n" /* eax = lmask */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ - -".L_dolen:\n" -" movb %%ah, %%cl\n" /* cl = this.bits */ -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrl %%cl, %%edx\n" /* hold >>= this.bits */ - -" testb %%al, %%al\n" -" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ - -" shrl $16, %%eax\n" /* output this.val char */ -" stosb\n" -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_test_for_length_base:\n" -" movl %%eax, %%ecx\n" /* len = this */ -" shrl $16, %%ecx\n" /* len = this.val */ -" movl %%ecx, 64(%%esp)\n" /* save len */ -" movb %%al, %%cl\n" - -" testb $16, %%al\n" -" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_decode_distance\n" /* if (!op) */ -" cmpb %%cl, %%bl\n" -" jae .L_add_bits_to_len\n" /* if (op <= bits) */ - -" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ -" movb %%ch, %%cl\n" /* move op back to ecx */ - -".L_add_bits_to_len:\n" -" subb %%cl, %%bl\n" -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrl %%cl, %%edx\n" -" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ - -".L_decode_distance:\n" -" cmpb $15, %%bl\n" -" ja .L_get_distance_code\n" /* if (15 < bits) */ - -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ - -".L_get_distance_code:\n" -" movl 60(%%esp), %%eax\n" /* eax = dmask */ -" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ - -".L_dodist:\n" -" movl %%eax, %%ebp\n" /* dist = this */ -" shrl $16, %%ebp\n" /* dist = this.val */ -" movb %%ah, %%cl\n" -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrl %%cl, %%edx\n" /* hold >>= this.bits */ -" movb %%al, %%cl\n" /* cl = this.op */ - -" testb $16, %%al\n" /* if ((op & 16) == 0) */ -" jz .L_test_for_second_level_dist\n" -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_check_dist_one\n" -" cmpb %%cl, %%bl\n" -" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ - -" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ -" movb %%ch, %%cl\n" /* move op back to ecx */ - -".L_add_bits_to_dist:\n" -" subb %%cl, %%bl\n" -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" /* (1 << op) - 1 */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrl %%cl, %%edx\n" -" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ - -".L_check_window:\n" -" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ -" movl %%edi, %%eax\n" -" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ - -" cmpl %%ebp, %%eax\n" -" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ - -" movl 64(%%esp), %%ecx\n" /* ecx = len */ -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ - -" sarl %%ecx\n" -" jnc .L_copy_two\n" /* if len % 2 == 0 */ - -" rep movsw\n" -" movb (%%esi), %%al\n" -" movb %%al, (%%edi)\n" -" incl %%edi\n" - -" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ -" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".L_copy_two:\n" -" rep movsw\n" -" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ -" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_check_dist_one:\n" -" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ -" jne .L_check_window\n" -" cmpl %%edi, 20(%%esp)\n" -" je .L_check_window\n" /* out == beg, if outside window */ - -" movl 64(%%esp), %%ecx\n" /* ecx = len */ -" movb -1(%%edi), %%al\n" -" movb %%al, %%ah\n" - -" sarl %%ecx\n" -" jnc .L_set_two\n" -" movb %%al, (%%edi)\n" -" incl %%edi\n" - -".L_set_two:\n" -" rep stosw\n" -" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".align 32,0x90\n" -".L_test_for_second_level_length:\n" -" testb $64, %%al\n" -" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ - -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl 64(%%esp), %%eax\n" /* eax += len */ -" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ -" jmp .L_dolen\n" - -".align 32,0x90\n" -".L_test_for_second_level_dist:\n" -" testb $64, %%al\n" -" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ - -" xorl %%eax, %%eax\n" -" incl %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl %%ebp, %%eax\n" /* eax += dist */ -" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ -" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ -" jmp .L_dodist\n" - -".align 32,0x90\n" -".L_clip_window:\n" -" movl %%eax, %%ecx\n" -" movl 48(%%esp), %%eax\n" /* eax = wsize */ -" negl %%ecx\n" /* nbytes = -nbytes */ -" movl 28(%%esp), %%esi\n" /* from = window */ - -" cmpl %%ebp, %%eax\n" -" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ - -" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ -" cmpl $0, 52(%%esp)\n" -" jne .L_wrap_around_window\n" /* if (write != 0) */ - -" subl %%ecx, %%eax\n" -" addl %%eax, %%esi\n" /* from += wsize - nbytes */ - -" movl 64(%%esp), %%eax\n" /* eax = len */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy\n" - -".align 32,0x90\n" -".L_wrap_around_window:\n" -" movl 52(%%esp), %%eax\n" /* eax = write */ -" cmpl %%eax, %%ecx\n" -" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ - -" addl 48(%%esp), %%esi\n" /* from += wsize */ -" addl %%eax, %%esi\n" /* from += write */ -" subl %%ecx, %%esi\n" /* from -= nbytes */ -" subl %%eax, %%ecx\n" /* nbytes -= write */ - -" movl 64(%%esp), %%eax\n" /* eax = len */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl 28(%%esp), %%esi\n" /* from = window */ -" movl 52(%%esp), %%ecx\n" /* nbytes = write */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy\n" - -".align 32,0x90\n" -".L_contiguous_in_window:\n" -" addl %%eax, %%esi\n" -" subl %%ecx, %%esi\n" /* from += write - nbytes */ - -" movl 64(%%esp), %%eax\n" /* eax = len */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy\n" /* if (nbytes >= len) */ - -".align 32,0x90\n" -".L_do_copy:\n" -" movl %%eax, %%ecx\n" -" rep movsb\n" - -" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ -" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".L_test_for_end_of_block:\n" -" testb $32, %%al\n" -" jz .L_invalid_literal_length_code\n" -" movl $1, 72(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_literal_length_code:\n" -" movl $2, 72(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_code:\n" -" movl $3, 72(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_too_far:\n" -" movl 8(%%esp), %%esi\n" -" movl $4, 72(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_break_loop:\n" -" movl $0, 72(%%esp)\n" - -".L_break_loop_with_status:\n" -/* put in, out, bits, and hold back into ar and pop esp */ -" movl %%esi, 8(%%esp)\n" /* save in */ -" movl %%edi, 16(%%esp)\n" /* save out */ -" movl %%ebx, 44(%%esp)\n" /* save bits */ -" movl %%edx, 40(%%esp)\n" /* save hold */ -" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ -" movl (%%esp), %%esp\n" - : - : "m" (ar) - : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" - ); -#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) - __asm { - lea eax, ar - mov [eax], esp /* save esp, ebp */ - mov [eax+4], ebp - mov esp, eax - mov esi, [esp+8] /* esi = in */ - mov edi, [esp+16] /* edi = out */ - mov edx, [esp+40] /* edx = hold */ - mov ebx, [esp+44] /* ebx = bits */ - mov ebp, [esp+32] /* ebp = lcode */ - - cld - jmp L_do_loop - -ALIGN 4 -L_while_test: - cmp [esp+24], edi - jbe L_break_loop - cmp [esp+12], esi - jbe L_break_loop - -L_do_loop: - cmp bl, 15 - ja L_get_length_code /* if (15 < bits) */ - - xor eax, eax - lodsw /* al = *(ushort *)in++ */ - mov cl, bl /* cl = bits, needs it for shifting */ - add bl, 16 /* bits += 16 */ - shl eax, cl - or edx, eax /* hold |= *((ushort *)in)++ << bits */ - -L_get_length_code: - mov eax, [esp+56] /* eax = lmask */ - and eax, edx /* eax &= hold */ - mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ - -L_dolen: - mov cl, ah /* cl = this.bits */ - sub bl, ah /* bits -= this.bits */ - shr edx, cl /* hold >>= this.bits */ - - test al, al - jnz L_test_for_length_base /* if (op != 0) 45.7% */ - - shr eax, 16 /* output this.val char */ - stosb - jmp L_while_test - -ALIGN 4 -L_test_for_length_base: - mov ecx, eax /* len = this */ - shr ecx, 16 /* len = this.val */ - mov [esp+64], ecx /* save len */ - mov cl, al - - test al, 16 - jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ - and cl, 15 /* op &= 15 */ - jz L_decode_distance /* if (!op) */ - cmp bl, cl - jae L_add_bits_to_len /* if (op <= bits) */ - - mov ch, cl /* stash op in ch, freeing cl */ - xor eax, eax - lodsw /* al = *(ushort *)in++ */ - mov cl, bl /* cl = bits, needs it for shifting */ - add bl, 16 /* bits += 16 */ - shl eax, cl - or edx, eax /* hold |= *((ushort *)in)++ << bits */ - mov cl, ch /* move op back to ecx */ - -L_add_bits_to_len: - sub bl, cl - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx /* eax &= hold */ - shr edx, cl - add [esp+64], eax /* len += hold & mask[op] */ - -L_decode_distance: - cmp bl, 15 - ja L_get_distance_code /* if (15 < bits) */ - - xor eax, eax - lodsw /* al = *(ushort *)in++ */ - mov cl, bl /* cl = bits, needs it for shifting */ - add bl, 16 /* bits += 16 */ - shl eax, cl - or edx, eax /* hold |= *((ushort *)in)++ << bits */ - -L_get_distance_code: - mov eax, [esp+60] /* eax = dmask */ - mov ecx, [esp+36] /* ecx = dcode */ - and eax, edx /* eax &= hold */ - mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ - -L_dodist: - mov ebp, eax /* dist = this */ - shr ebp, 16 /* dist = this.val */ - mov cl, ah - sub bl, ah /* bits -= this.bits */ - shr edx, cl /* hold >>= this.bits */ - mov cl, al /* cl = this.op */ - - test al, 16 /* if ((op & 16) == 0) */ - jz L_test_for_second_level_dist - and cl, 15 /* op &= 15 */ - jz L_check_dist_one - cmp bl, cl - jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ - - mov ch, cl /* stash op in ch, freeing cl */ - xor eax, eax - lodsw /* al = *(ushort *)in++ */ - mov cl, bl /* cl = bits, needs it for shifting */ - add bl, 16 /* bits += 16 */ - shl eax, cl - or edx, eax /* hold |= *((ushort *)in)++ << bits */ - mov cl, ch /* move op back to ecx */ - -L_add_bits_to_dist: - sub bl, cl - xor eax, eax - inc eax - shl eax, cl - dec eax /* (1 << op) - 1 */ - and eax, edx /* eax &= hold */ - shr edx, cl - add ebp, eax /* dist += hold & ((1 << op) - 1) */ - -L_check_window: - mov [esp+8], esi /* save in so from can use it's reg */ - mov eax, edi - sub eax, [esp+20] /* nbytes = out - beg */ - - cmp eax, ebp - jb L_clip_window /* if (dist > nbytes) 4.2% */ - - mov ecx, [esp+64] /* ecx = len */ - mov esi, edi - sub esi, ebp /* from = out - dist */ - - sar ecx, 1 - jnc L_copy_two - - rep movsw - mov al, [esi] - mov [edi], al - inc edi - - mov esi, [esp+8] /* move in back to %esi, toss from */ - mov ebp, [esp+32] /* ebp = lcode */ - jmp L_while_test - -L_copy_two: - rep movsw - mov esi, [esp+8] /* move in back to %esi, toss from */ - mov ebp, [esp+32] /* ebp = lcode */ - jmp L_while_test - -ALIGN 4 -L_check_dist_one: - cmp ebp, 1 /* if dist 1, is a memset */ - jne L_check_window - cmp [esp+20], edi - je L_check_window /* out == beg, if outside window */ - - mov ecx, [esp+64] /* ecx = len */ - mov al, [edi-1] - mov ah, al - - sar ecx, 1 - jnc L_set_two - mov [edi], al /* memset out with from[-1] */ - inc edi - -L_set_two: - rep stosw - mov ebp, [esp+32] /* ebp = lcode */ - jmp L_while_test - -ALIGN 4 -L_test_for_second_level_length: - test al, 64 - jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ - - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx /* eax &= hold */ - add eax, [esp+64] /* eax += len */ - mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ - jmp L_dolen - -ALIGN 4 -L_test_for_second_level_dist: - test al, 64 - jnz L_invalid_distance_code /* if ((op & 64) != 0) */ - - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx /* eax &= hold */ - add eax, ebp /* eax += dist */ - mov ecx, [esp+36] /* ecx = dcode */ - mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ - jmp L_dodist - -ALIGN 4 -L_clip_window: - mov ecx, eax - mov eax, [esp+48] /* eax = wsize */ - neg ecx /* nbytes = -nbytes */ - mov esi, [esp+28] /* from = window */ - - cmp eax, ebp - jb L_invalid_distance_too_far /* if (dist > wsize) */ - - add ecx, ebp /* nbytes = dist - nbytes */ - cmp dword ptr [esp+52], 0 - jne L_wrap_around_window /* if (write != 0) */ - - sub eax, ecx - add esi, eax /* from += wsize - nbytes */ - - mov eax, [esp+64] /* eax = len */ - cmp eax, ecx - jbe L_do_copy /* if (nbytes >= len) */ - - sub eax, ecx /* len -= nbytes */ - rep movsb - mov esi, edi - sub esi, ebp /* from = out - dist */ - jmp L_do_copy - -ALIGN 4 -L_wrap_around_window: - mov eax, [esp+52] /* eax = write */ - cmp ecx, eax - jbe L_contiguous_in_window /* if (write >= nbytes) */ - - add esi, [esp+48] /* from += wsize */ - add esi, eax /* from += write */ - sub esi, ecx /* from -= nbytes */ - sub ecx, eax /* nbytes -= write */ - - mov eax, [esp+64] /* eax = len */ - cmp eax, ecx - jbe L_do_copy /* if (nbytes >= len) */ - - sub eax, ecx /* len -= nbytes */ - rep movsb - mov esi, [esp+28] /* from = window */ - mov ecx, [esp+52] /* nbytes = write */ - cmp eax, ecx - jbe L_do_copy /* if (nbytes >= len) */ - - sub eax, ecx /* len -= nbytes */ - rep movsb - mov esi, edi - sub esi, ebp /* from = out - dist */ - jmp L_do_copy - -ALIGN 4 -L_contiguous_in_window: - add esi, eax - sub esi, ecx /* from += write - nbytes */ - - mov eax, [esp+64] /* eax = len */ - cmp eax, ecx - jbe L_do_copy /* if (nbytes >= len) */ - - sub eax, ecx /* len -= nbytes */ - rep movsb - mov esi, edi - sub esi, ebp /* from = out - dist */ - jmp L_do_copy - -ALIGN 4 -L_do_copy: - mov ecx, eax - rep movsb - - mov esi, [esp+8] /* move in back to %esi, toss from */ - mov ebp, [esp+32] /* ebp = lcode */ - jmp L_while_test - -L_test_for_end_of_block: - test al, 32 - jz L_invalid_literal_length_code - mov dword ptr [esp+72], 1 - jmp L_break_loop_with_status - -L_invalid_literal_length_code: - mov dword ptr [esp+72], 2 - jmp L_break_loop_with_status - -L_invalid_distance_code: - mov dword ptr [esp+72], 3 - jmp L_break_loop_with_status - -L_invalid_distance_too_far: - mov esi, [esp+4] - mov dword ptr [esp+72], 4 - jmp L_break_loop_with_status - -L_break_loop: - mov dword ptr [esp+72], 0 - -L_break_loop_with_status: -/* put in, out, bits, and hold back into ar and pop esp */ - mov [esp+8], esi /* save in */ - mov [esp+16], edi /* save out */ - mov [esp+44], ebx /* save bits */ - mov [esp+40], edx /* save hold */ - mov ebp, [esp+4] /* restore esp, ebp */ - mov esp, [esp] - } -#else -#error "x86 architecture not defined" -#endif - - if (ar.status > 1) { - if (ar.status == 2) - strm->msg = "invalid literal/length code"; - else if (ar.status == 3) - strm->msg = "invalid distance code"; - else - strm->msg = "invalid distance too far back"; - state->mode = BAD; - } - else if ( ar.status == 1 ) { - state->mode = TYPE; - } - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - ar.len = ar.bits >> 3; - ar.in -= ar.len; - ar.bits -= ar.len << 3; - ar.hold &= (1U << ar.bits) - 1; - - /* update state and return */ - strm->next_in = ar.in; - strm->next_out = ar.out; - strm->avail_in = (unsigned)(ar.in < ar.last ? - PAD_AVAIL_IN + (ar.last - ar.in) : - PAD_AVAIL_IN - (ar.in - ar.last)); - strm->avail_out = (unsigned)(ar.out < ar.end ? - PAD_AVAIL_OUT + (ar.end - ar.out) : - PAD_AVAIL_OUT - (ar.out - ar.end)); - state->hold = ar.hold; - state->bits = ar.bits; - return; -} - diff --git a/src/dependencies/zlib-1.2.11/contrib/inflate86/inffast.S b/src/dependencies/zlib-1.2.11/contrib/inflate86/inffast.S deleted file mode 100644 index 2245a29..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/inflate86/inffast.S +++ /dev/null @@ -1,1368 +0,0 @@ -/* - * inffast.S is a hand tuned assembler version of: - * - * inffast.c -- fast decoding - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Copyright (C) 2003 Chris Anderson - * Please use the copyright conditions above. - * - * This version (Jan-23-2003) of inflate_fast was coded and tested under - * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that - * machine, I found that gzip style archives decompressed about 20% faster than - * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will - * depend on how large of a buffer is used for z_stream.next_in & next_out - * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in - * stream processing I/O and crc32/addler32. In my case, this routine used - * 70% of the cpu time and crc32 used 20%. - * - * I am confident that this version will work in the general case, but I have - * not tested a wide variety of datasets or a wide variety of platforms. - * - * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. - * It should be a runtime flag instead of compile time flag... - * - * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. - * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code - * is compiled. Without either option, runtime detection is enabled. Runtime - * detection should work on all modern cpus and the recomended algorithm (flip - * ID bit on eflags and then use the cpuid instruction) is used in many - * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 - * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o - * inffast.obj generates a COFF object which can then be linked with MSVC++ - * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. - * - * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and - * slower than compiler generated code). Adjusted cpuid check to use the MMX - * code only for Pentiums < P4 until I have more data on the P4. Speed - * improvment is only about 15% on the Athlon when compared with code generated - * with MSVC++. Not sure yet, but I think the P4 will also be slower using the - * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and - * have less latency than MMX ops. Added code to buffer the last 11 bytes of - * the input stream since the MMX code grabs bits in chunks of 32, which - * differs from the inffast.c algorithm. I don't think there would have been - * read overruns where a page boundary was crossed (a segfault), but there - * could have been overruns when next_in ends on unaligned memory (unintialized - * memory read). - * - * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C - * version of the non-MMX code so that it doesn't depend on zstrm and zstate - * structure offsets which are hard coded in this file. This was last tested - * with zlib-1.2.0 which is currently in beta testing, newer versions of this - * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and - * http://www.charm.net/~christop/zlib/ - */ - - -/* - * if you have underscore linking problems (_inflate_fast undefined), try - * using -DGAS_COFF - */ -#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) - -#if defined( WIN32 ) || defined( __CYGWIN__ ) -#define GAS_COFF /* windows object format */ -#else -#define GAS_ELF -#endif - -#endif /* ! GAS_COFF && ! GAS_ELF */ - - -#if defined( GAS_COFF ) - -/* coff externals have underscores */ -#define inflate_fast _inflate_fast -#define inflate_fast_use_mmx _inflate_fast_use_mmx - -#endif /* GAS_COFF */ - - -.file "inffast.S" - -.globl inflate_fast - -.text -.align 4,0 -.L_invalid_literal_length_code_msg: -.string "invalid literal/length code" - -.align 4,0 -.L_invalid_distance_code_msg: -.string "invalid distance code" - -.align 4,0 -.L_invalid_distance_too_far_msg: -.string "invalid distance too far back" - -#if ! defined( NO_MMX ) -.align 4,0 -.L_mask: /* mask[N] = ( 1 << N ) - 1 */ -.long 0 -.long 1 -.long 3 -.long 7 -.long 15 -.long 31 -.long 63 -.long 127 -.long 255 -.long 511 -.long 1023 -.long 2047 -.long 4095 -.long 8191 -.long 16383 -.long 32767 -.long 65535 -.long 131071 -.long 262143 -.long 524287 -.long 1048575 -.long 2097151 -.long 4194303 -.long 8388607 -.long 16777215 -.long 33554431 -.long 67108863 -.long 134217727 -.long 268435455 -.long 536870911 -.long 1073741823 -.long 2147483647 -.long 4294967295 -#endif /* NO_MMX */ - -.text - -/* - * struct z_stream offsets, in zlib.h - */ -#define next_in_strm 0 /* strm->next_in */ -#define avail_in_strm 4 /* strm->avail_in */ -#define next_out_strm 12 /* strm->next_out */ -#define avail_out_strm 16 /* strm->avail_out */ -#define msg_strm 24 /* strm->msg */ -#define state_strm 28 /* strm->state */ - -/* - * struct inflate_state offsets, in inflate.h - */ -#define mode_state 0 /* state->mode */ -#define wsize_state 32 /* state->wsize */ -#define write_state 40 /* state->write */ -#define window_state 44 /* state->window */ -#define hold_state 48 /* state->hold */ -#define bits_state 52 /* state->bits */ -#define lencode_state 68 /* state->lencode */ -#define distcode_state 72 /* state->distcode */ -#define lenbits_state 76 /* state->lenbits */ -#define distbits_state 80 /* state->distbits */ - -/* - * inflate_fast's activation record - */ -#define local_var_size 64 /* how much local space for vars */ -#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ -#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ - -/* - * offsets for local vars on stack - */ -#define out 60 /* unsigned char* */ -#define window 56 /* unsigned char* */ -#define wsize 52 /* unsigned int */ -#define write 48 /* unsigned int */ -#define in 44 /* unsigned char* */ -#define beg 40 /* unsigned char* */ -#define buf 28 /* char[ 12 ] */ -#define len 24 /* unsigned int */ -#define last 20 /* unsigned char* */ -#define end 16 /* unsigned char* */ -#define dcode 12 /* code* */ -#define lcode 8 /* code* */ -#define dmask 4 /* unsigned int */ -#define lmask 0 /* unsigned int */ - -/* - * typedef enum inflate_mode consts, in inflate.h - */ -#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ -#define INFLATE_MODE_BAD 26 - - -#if ! defined( USE_MMX ) && ! defined( NO_MMX ) - -#define RUN_TIME_MMX - -#define CHECK_MMX 1 -#define DO_USE_MMX 2 -#define DONT_USE_MMX 3 - -.globl inflate_fast_use_mmx - -.data - -.align 4,0 -inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ -.long CHECK_MMX - -#if defined( GAS_ELF ) -/* elf info */ -.type inflate_fast_use_mmx,@object -.size inflate_fast_use_mmx,4 -#endif - -#endif /* RUN_TIME_MMX */ - -#if defined( GAS_COFF ) -/* coff info: scl 2 = extern, type 32 = function */ -.def inflate_fast; .scl 2; .type 32; .endef -#endif - -.text - -.align 32,0x90 -inflate_fast: - pushl %edi - pushl %esi - pushl %ebp - pushl %ebx - pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ - subl $local_var_size, %esp - cld - -#define strm_r %esi -#define state_r %edi - - movl strm_sp(%esp), strm_r - movl state_strm(strm_r), state_r - - /* in = strm->next_in; - * out = strm->next_out; - * last = in + strm->avail_in - 11; - * beg = out - (start - strm->avail_out); - * end = out + (strm->avail_out - 257); - */ - movl avail_in_strm(strm_r), %edx - movl next_in_strm(strm_r), %eax - - addl %eax, %edx /* avail_in += next_in */ - subl $11, %edx /* avail_in -= 11 */ - - movl %eax, in(%esp) - movl %edx, last(%esp) - - movl start_sp(%esp), %ebp - movl avail_out_strm(strm_r), %ecx - movl next_out_strm(strm_r), %ebx - - subl %ecx, %ebp /* start -= avail_out */ - negl %ebp /* start = -start */ - addl %ebx, %ebp /* start += next_out */ - - subl $257, %ecx /* avail_out -= 257 */ - addl %ebx, %ecx /* avail_out += out */ - - movl %ebx, out(%esp) - movl %ebp, beg(%esp) - movl %ecx, end(%esp) - - /* wsize = state->wsize; - * write = state->write; - * window = state->window; - * hold = state->hold; - * bits = state->bits; - * lcode = state->lencode; - * dcode = state->distcode; - * lmask = ( 1 << state->lenbits ) - 1; - * dmask = ( 1 << state->distbits ) - 1; - */ - - movl lencode_state(state_r), %eax - movl distcode_state(state_r), %ecx - - movl %eax, lcode(%esp) - movl %ecx, dcode(%esp) - - movl $1, %eax - movl lenbits_state(state_r), %ecx - shll %cl, %eax - decl %eax - movl %eax, lmask(%esp) - - movl $1, %eax - movl distbits_state(state_r), %ecx - shll %cl, %eax - decl %eax - movl %eax, dmask(%esp) - - movl wsize_state(state_r), %eax - movl write_state(state_r), %ecx - movl window_state(state_r), %edx - - movl %eax, wsize(%esp) - movl %ecx, write(%esp) - movl %edx, window(%esp) - - movl hold_state(state_r), %ebp - movl bits_state(state_r), %ebx - -#undef strm_r -#undef state_r - -#define in_r %esi -#define from_r %esi -#define out_r %edi - - movl in(%esp), in_r - movl last(%esp), %ecx - cmpl in_r, %ecx - ja .L_align_long /* if in < last */ - - addl $11, %ecx /* ecx = &in[ avail_in ] */ - subl in_r, %ecx /* ecx = avail_in */ - movl $12, %eax - subl %ecx, %eax /* eax = 12 - avail_in */ - leal buf(%esp), %edi - rep movsb /* memcpy( buf, in, avail_in ) */ - movl %eax, %ecx - xorl %eax, %eax - rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ - leal buf(%esp), in_r /* in = buf */ - movl in_r, last(%esp) /* last = in, do just one iteration */ - jmp .L_is_aligned - - /* align in_r on long boundary */ -.L_align_long: - testl $3, in_r - jz .L_is_aligned - xorl %eax, %eax - movb (in_r), %al - incl in_r - movl %ebx, %ecx - addl $8, %ebx - shll %cl, %eax - orl %eax, %ebp - jmp .L_align_long - -.L_is_aligned: - movl out(%esp), out_r - -#if defined( NO_MMX ) - jmp .L_do_loop -#endif - -#if defined( USE_MMX ) - jmp .L_init_mmx -#endif - -/*** Runtime MMX check ***/ - -#if defined( RUN_TIME_MMX ) -.L_check_mmx: - cmpl $DO_USE_MMX, inflate_fast_use_mmx - je .L_init_mmx - ja .L_do_loop /* > 2 */ - - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushf - movl (%esp), %eax /* copy eflags to eax */ - xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) - * to see if cpu supports cpuid... - * ID bit method not supported by NexGen but - * bios may load a cpuid instruction and - * cpuid may be disabled on Cyrix 5-6x86 */ - popf - pushf - popl %edx /* copy new eflags to edx */ - xorl %eax, %edx /* test if ID bit is flipped */ - jz .L_dont_use_mmx /* not flipped if zero */ - xorl %eax, %eax - cpuid - cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ - jne .L_dont_use_mmx - cmpl $0x6c65746e, %ecx - jne .L_dont_use_mmx - cmpl $0x49656e69, %edx - jne .L_dont_use_mmx - movl $1, %eax - cpuid /* get cpu features */ - shrl $8, %eax - andl $15, %eax - cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ - jne .L_dont_use_mmx - testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ - jnz .L_use_mmx - jmp .L_dont_use_mmx -.L_use_mmx: - movl $DO_USE_MMX, inflate_fast_use_mmx - jmp .L_check_mmx_pop -.L_dont_use_mmx: - movl $DONT_USE_MMX, inflate_fast_use_mmx -.L_check_mmx_pop: - popl %edx - popl %ecx - popl %ebx - popl %eax - jmp .L_check_mmx -#endif - - -/*** Non-MMX code ***/ - -#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) - -#define hold_r %ebp -#define bits_r %bl -#define bitslong_r %ebx - -.align 32,0x90 -.L_while_test: - /* while (in < last && out < end) - */ - cmpl out_r, end(%esp) - jbe .L_break_loop /* if (out >= end) */ - - cmpl in_r, last(%esp) - jbe .L_break_loop - -.L_do_loop: - /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out - * - * do { - * if (bits < 15) { - * hold |= *((unsigned short *)in)++ << bits; - * bits += 16 - * } - * this = lcode[hold & lmask] - */ - cmpb $15, bits_r - ja .L_get_length_code /* if (15 < bits) */ - - xorl %eax, %eax - lodsw /* al = *(ushort *)in++ */ - movb bits_r, %cl /* cl = bits, needs it for shifting */ - addb $16, bits_r /* bits += 16 */ - shll %cl, %eax - orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ - -.L_get_length_code: - movl lmask(%esp), %edx /* edx = lmask */ - movl lcode(%esp), %ecx /* ecx = lcode */ - andl hold_r, %edx /* edx &= hold */ - movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ - -.L_dolen: - /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out - * - * dolen: - * bits -= this.bits; - * hold >>= this.bits - */ - movb %ah, %cl /* cl = this.bits */ - subb %ah, bits_r /* bits -= this.bits */ - shrl %cl, hold_r /* hold >>= this.bits */ - - /* check if op is a literal - * if (op == 0) { - * PUP(out) = this.val; - * } - */ - testb %al, %al - jnz .L_test_for_length_base /* if (op != 0) 45.7% */ - - shrl $16, %eax /* output this.val char */ - stosb - jmp .L_while_test - -.L_test_for_length_base: - /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len - * - * else if (op & 16) { - * len = this.val - * op &= 15 - * if (op) { - * if (op > bits) { - * hold |= *((unsigned short *)in)++ << bits; - * bits += 16 - * } - * len += hold & mask[op]; - * bits -= op; - * hold >>= op; - * } - */ -#define len_r %edx - movl %eax, len_r /* len = this */ - shrl $16, len_r /* len = this.val */ - movb %al, %cl - - testb $16, %al - jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ - andb $15, %cl /* op &= 15 */ - jz .L_save_len /* if (!op) */ - cmpb %cl, bits_r - jae .L_add_bits_to_len /* if (op <= bits) */ - - movb %cl, %ch /* stash op in ch, freeing cl */ - xorl %eax, %eax - lodsw /* al = *(ushort *)in++ */ - movb bits_r, %cl /* cl = bits, needs it for shifting */ - addb $16, bits_r /* bits += 16 */ - shll %cl, %eax - orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ - movb %ch, %cl /* move op back to ecx */ - -.L_add_bits_to_len: - movl $1, %eax - shll %cl, %eax - decl %eax - subb %cl, bits_r - andl hold_r, %eax /* eax &= hold */ - shrl %cl, hold_r - addl %eax, len_r /* len += hold & mask[op] */ - -.L_save_len: - movl len_r, len(%esp) /* save len */ -#undef len_r - -.L_decode_distance: - /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * - * if (bits < 15) { - * hold |= *((unsigned short *)in)++ << bits; - * bits += 16 - * } - * this = dcode[hold & dmask]; - * dodist: - * bits -= this.bits; - * hold >>= this.bits; - * op = this.op; - */ - - cmpb $15, bits_r - ja .L_get_distance_code /* if (15 < bits) */ - - xorl %eax, %eax - lodsw /* al = *(ushort *)in++ */ - movb bits_r, %cl /* cl = bits, needs it for shifting */ - addb $16, bits_r /* bits += 16 */ - shll %cl, %eax - orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ - -.L_get_distance_code: - movl dmask(%esp), %edx /* edx = dmask */ - movl dcode(%esp), %ecx /* ecx = dcode */ - andl hold_r, %edx /* edx &= hold */ - movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ - -#define dist_r %edx -.L_dodist: - movl %eax, dist_r /* dist = this */ - shrl $16, dist_r /* dist = this.val */ - movb %ah, %cl - subb %ah, bits_r /* bits -= this.bits */ - shrl %cl, hold_r /* hold >>= this.bits */ - - /* if (op & 16) { - * dist = this.val - * op &= 15 - * if (op > bits) { - * hold |= *((unsigned short *)in)++ << bits; - * bits += 16 - * } - * dist += hold & mask[op]; - * bits -= op; - * hold >>= op; - */ - movb %al, %cl /* cl = this.op */ - - testb $16, %al /* if ((op & 16) == 0) */ - jz .L_test_for_second_level_dist - andb $15, %cl /* op &= 15 */ - jz .L_check_dist_one - cmpb %cl, bits_r - jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ - - movb %cl, %ch /* stash op in ch, freeing cl */ - xorl %eax, %eax - lodsw /* al = *(ushort *)in++ */ - movb bits_r, %cl /* cl = bits, needs it for shifting */ - addb $16, bits_r /* bits += 16 */ - shll %cl, %eax - orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ - movb %ch, %cl /* move op back to ecx */ - -.L_add_bits_to_dist: - movl $1, %eax - shll %cl, %eax - decl %eax /* (1 << op) - 1 */ - subb %cl, bits_r - andl hold_r, %eax /* eax &= hold */ - shrl %cl, hold_r - addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ - jmp .L_check_window - -.L_check_window: - /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * %ecx = nbytes - * - * nbytes = out - beg; - * if (dist <= nbytes) { - * from = out - dist; - * do { - * PUP(out) = PUP(from); - * } while (--len > 0) { - * } - */ - - movl in_r, in(%esp) /* save in so from can use it's reg */ - movl out_r, %eax - subl beg(%esp), %eax /* nbytes = out - beg */ - - cmpl dist_r, %eax - jb .L_clip_window /* if (dist > nbytes) 4.2% */ - - movl len(%esp), %ecx - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - - subl $3, %ecx - movb (from_r), %al - movb %al, (out_r) - movb 1(from_r), %al - movb 2(from_r), %dl - addl $3, from_r - movb %al, 1(out_r) - movb %dl, 2(out_r) - addl $3, out_r - rep movsb - - movl in(%esp), in_r /* move in back to %esi, toss from */ - jmp .L_while_test - -.align 16,0x90 -.L_check_dist_one: - cmpl $1, dist_r - jne .L_check_window - cmpl out_r, beg(%esp) - je .L_check_window - - decl out_r - movl len(%esp), %ecx - movb (out_r), %al - subl $3, %ecx - - movb %al, 1(out_r) - movb %al, 2(out_r) - movb %al, 3(out_r) - addl $4, out_r - rep stosb - - jmp .L_while_test - -.align 16,0x90 -.L_test_for_second_level_length: - /* else if ((op & 64) == 0) { - * this = lcode[this.val + (hold & mask[op])]; - * } - */ - testb $64, %al - jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ - - movl $1, %eax - shll %cl, %eax - decl %eax - andl hold_r, %eax /* eax &= hold */ - addl %edx, %eax /* eax += this.val */ - movl lcode(%esp), %edx /* edx = lcode */ - movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ - jmp .L_dolen - -.align 16,0x90 -.L_test_for_second_level_dist: - /* else if ((op & 64) == 0) { - * this = dcode[this.val + (hold & mask[op])]; - * } - */ - testb $64, %al - jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ - - movl $1, %eax - shll %cl, %eax - decl %eax - andl hold_r, %eax /* eax &= hold */ - addl %edx, %eax /* eax += this.val */ - movl dcode(%esp), %edx /* edx = dcode */ - movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ - jmp .L_dodist - -.align 16,0x90 -.L_clip_window: - /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * %ecx = nbytes - * - * else { - * if (dist > wsize) { - * invalid distance - * } - * from = window; - * nbytes = dist - nbytes; - * if (write == 0) { - * from += wsize - nbytes; - */ -#define nbytes_r %ecx - movl %eax, nbytes_r - movl wsize(%esp), %eax /* prepare for dist compare */ - negl nbytes_r /* nbytes = -nbytes */ - movl window(%esp), from_r /* from = window */ - - cmpl dist_r, %eax - jb .L_invalid_distance_too_far /* if (dist > wsize) */ - - addl dist_r, nbytes_r /* nbytes = dist - nbytes */ - cmpl $0, write(%esp) - jne .L_wrap_around_window /* if (write != 0) */ - - subl nbytes_r, %eax - addl %eax, from_r /* from += wsize - nbytes */ - - /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * %ecx = nbytes, %eax = len - * - * if (nbytes < len) { - * len -= nbytes; - * do { - * PUP(out) = PUP(from); - * } while (--nbytes); - * from = out - dist; - * } - * } - */ -#define len_r %eax - movl len(%esp), len_r - cmpl nbytes_r, len_r - jbe .L_do_copy1 /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1 - - cmpl nbytes_r, len_r - jbe .L_do_copy1 /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1 - -.L_wrap_around_window: - /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * %ecx = nbytes, %eax = write, %eax = len - * - * else if (write < nbytes) { - * from += wsize + write - nbytes; - * nbytes -= write; - * if (nbytes < len) { - * len -= nbytes; - * do { - * PUP(out) = PUP(from); - * } while (--nbytes); - * from = window; - * nbytes = write; - * if (nbytes < len) { - * len -= nbytes; - * do { - * PUP(out) = PUP(from); - * } while(--nbytes); - * from = out - dist; - * } - * } - * } - */ -#define write_r %eax - movl write(%esp), write_r - cmpl write_r, nbytes_r - jbe .L_contiguous_in_window /* if (write >= nbytes) */ - - addl wsize(%esp), from_r - addl write_r, from_r - subl nbytes_r, from_r /* from += wsize + write - nbytes */ - subl write_r, nbytes_r /* nbytes -= write */ -#undef write_r - - movl len(%esp), len_r - cmpl nbytes_r, len_r - jbe .L_do_copy1 /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl window(%esp), from_r /* from = window */ - movl write(%esp), nbytes_r /* nbytes = write */ - cmpl nbytes_r, len_r - jbe .L_do_copy1 /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1 - -.L_contiguous_in_window: - /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist - * %ecx = nbytes, %eax = write, %eax = len - * - * else { - * from += write - nbytes; - * if (nbytes < len) { - * len -= nbytes; - * do { - * PUP(out) = PUP(from); - * } while (--nbytes); - * from = out - dist; - * } - * } - */ -#define write_r %eax - addl write_r, from_r - subl nbytes_r, from_r /* from += write - nbytes */ -#undef write_r - - movl len(%esp), len_r - cmpl nbytes_r, len_r - jbe .L_do_copy1 /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - -.L_do_copy1: - /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out - * %eax = len - * - * while (len > 0) { - * PUP(out) = PUP(from); - * len--; - * } - * } - * } while (in < last && out < end); - */ -#undef nbytes_r -#define in_r %esi - movl len_r, %ecx - rep movsb - - movl in(%esp), in_r /* move in back to %esi, toss from */ - jmp .L_while_test - -#undef len_r -#undef dist_r - -#endif /* NO_MMX || RUN_TIME_MMX */ - - -/*** MMX code ***/ - -#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) - -.align 32,0x90 -.L_init_mmx: - emms - -#undef bits_r -#undef bitslong_r -#define bitslong_r %ebp -#define hold_mm %mm0 - movd %ebp, hold_mm - movl %ebx, bitslong_r - -#define used_mm %mm1 -#define dmask2_mm %mm2 -#define lmask2_mm %mm3 -#define lmask_mm %mm4 -#define dmask_mm %mm5 -#define tmp_mm %mm6 - - movd lmask(%esp), lmask_mm - movq lmask_mm, lmask2_mm - movd dmask(%esp), dmask_mm - movq dmask_mm, dmask2_mm - pxor used_mm, used_mm - movl lcode(%esp), %ebx /* ebx = lcode */ - jmp .L_do_loop_mmx - -.align 32,0x90 -.L_while_test_mmx: - /* while (in < last && out < end) - */ - cmpl out_r, end(%esp) - jbe .L_break_loop /* if (out >= end) */ - - cmpl in_r, last(%esp) - jbe .L_break_loop - -.L_do_loop_mmx: - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - - cmpl $32, bitslong_r - ja .L_get_length_code_mmx /* if (32 < bits) */ - - movd bitslong_r, tmp_mm - movd (in_r), %mm7 - addl $4, in_r - psllq tmp_mm, %mm7 - addl $32, bitslong_r - por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ - -.L_get_length_code_mmx: - pand hold_mm, lmask_mm - movd lmask_mm, %eax - movq lmask2_mm, lmask_mm - movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ - -.L_dolen_mmx: - movzbl %ah, %ecx /* ecx = this.bits */ - movd %ecx, used_mm - subl %ecx, bitslong_r /* bits -= this.bits */ - - testb %al, %al - jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ - - shrl $16, %eax /* output this.val char */ - stosb - jmp .L_while_test_mmx - -.L_test_for_length_base_mmx: -#define len_r %edx - movl %eax, len_r /* len = this */ - shrl $16, len_r /* len = this.val */ - - testb $16, %al - jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ - andl $15, %eax /* op &= 15 */ - jz .L_decode_distance_mmx /* if (!op) */ - - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - movd %eax, used_mm - movd hold_mm, %ecx - subl %eax, bitslong_r - andl .L_mask(,%eax,4), %ecx - addl %ecx, len_r /* len += hold & mask[op] */ - -.L_decode_distance_mmx: - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - - cmpl $32, bitslong_r - ja .L_get_dist_code_mmx /* if (32 < bits) */ - - movd bitslong_r, tmp_mm - movd (in_r), %mm7 - addl $4, in_r - psllq tmp_mm, %mm7 - addl $32, bitslong_r - por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ - -.L_get_dist_code_mmx: - movl dcode(%esp), %ebx /* ebx = dcode */ - pand hold_mm, dmask_mm - movd dmask_mm, %eax - movq dmask2_mm, dmask_mm - movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ - -.L_dodist_mmx: -#define dist_r %ebx - movzbl %ah, %ecx /* ecx = this.bits */ - movl %eax, dist_r - shrl $16, dist_r /* dist = this.val */ - subl %ecx, bitslong_r /* bits -= this.bits */ - movd %ecx, used_mm - - testb $16, %al /* if ((op & 16) == 0) */ - jz .L_test_for_second_level_dist_mmx - andl $15, %eax /* op &= 15 */ - jz .L_check_dist_one_mmx - -.L_add_bits_to_dist_mmx: - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - movd %eax, used_mm /* save bit length of current op */ - movd hold_mm, %ecx /* get the next bits on input stream */ - subl %eax, bitslong_r /* bits -= op bits */ - andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ - addl %ecx, dist_r /* dist += hold & mask[op] */ - -.L_check_window_mmx: - movl in_r, in(%esp) /* save in so from can use it's reg */ - movl out_r, %eax - subl beg(%esp), %eax /* nbytes = out - beg */ - - cmpl dist_r, %eax - jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ - - movl len_r, %ecx - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - - subl $3, %ecx - movb (from_r), %al - movb %al, (out_r) - movb 1(from_r), %al - movb 2(from_r), %dl - addl $3, from_r - movb %al, 1(out_r) - movb %dl, 2(out_r) - addl $3, out_r - rep movsb - - movl in(%esp), in_r /* move in back to %esi, toss from */ - movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ - jmp .L_while_test_mmx - -.align 16,0x90 -.L_check_dist_one_mmx: - cmpl $1, dist_r - jne .L_check_window_mmx - cmpl out_r, beg(%esp) - je .L_check_window_mmx - - decl out_r - movl len_r, %ecx - movb (out_r), %al - subl $3, %ecx - - movb %al, 1(out_r) - movb %al, 2(out_r) - movb %al, 3(out_r) - addl $4, out_r - rep stosb - - movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ - jmp .L_while_test_mmx - -.align 16,0x90 -.L_test_for_second_level_length_mmx: - testb $64, %al - jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ - - andl $15, %eax - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - movd hold_mm, %ecx - andl .L_mask(,%eax,4), %ecx - addl len_r, %ecx - movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ - jmp .L_dolen_mmx - -.align 16,0x90 -.L_test_for_second_level_dist_mmx: - testb $64, %al - jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ - - andl $15, %eax - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - movd hold_mm, %ecx - andl .L_mask(,%eax,4), %ecx - movl dcode(%esp), %eax /* ecx = dcode */ - addl dist_r, %ecx - movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ - jmp .L_dodist_mmx - -.align 16,0x90 -.L_clip_window_mmx: -#define nbytes_r %ecx - movl %eax, nbytes_r - movl wsize(%esp), %eax /* prepare for dist compare */ - negl nbytes_r /* nbytes = -nbytes */ - movl window(%esp), from_r /* from = window */ - - cmpl dist_r, %eax - jb .L_invalid_distance_too_far /* if (dist > wsize) */ - - addl dist_r, nbytes_r /* nbytes = dist - nbytes */ - cmpl $0, write(%esp) - jne .L_wrap_around_window_mmx /* if (write != 0) */ - - subl nbytes_r, %eax - addl %eax, from_r /* from += wsize - nbytes */ - - cmpl nbytes_r, len_r - jbe .L_do_copy1_mmx /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1_mmx - - cmpl nbytes_r, len_r - jbe .L_do_copy1_mmx /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1_mmx - -.L_wrap_around_window_mmx: -#define write_r %eax - movl write(%esp), write_r - cmpl write_r, nbytes_r - jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ - - addl wsize(%esp), from_r - addl write_r, from_r - subl nbytes_r, from_r /* from += wsize + write - nbytes */ - subl write_r, nbytes_r /* nbytes -= write */ -#undef write_r - - cmpl nbytes_r, len_r - jbe .L_do_copy1_mmx /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl window(%esp), from_r /* from = window */ - movl write(%esp), nbytes_r /* nbytes = write */ - cmpl nbytes_r, len_r - jbe .L_do_copy1_mmx /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - jmp .L_do_copy1_mmx - -.L_contiguous_in_window_mmx: -#define write_r %eax - addl write_r, from_r - subl nbytes_r, from_r /* from += write - nbytes */ -#undef write_r - - cmpl nbytes_r, len_r - jbe .L_do_copy1_mmx /* if (nbytes >= len) */ - - subl nbytes_r, len_r /* len -= nbytes */ - rep movsb - movl out_r, from_r - subl dist_r, from_r /* from = out - dist */ - -.L_do_copy1_mmx: -#undef nbytes_r -#define in_r %esi - movl len_r, %ecx - rep movsb - - movl in(%esp), in_r /* move in back to %esi, toss from */ - movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ - jmp .L_while_test_mmx - -#undef hold_r -#undef bitslong_r - -#endif /* USE_MMX || RUN_TIME_MMX */ - - -/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ - -.L_invalid_distance_code: - /* else { - * strm->msg = "invalid distance code"; - * state->mode = BAD; - * } - */ - movl $.L_invalid_distance_code_msg, %ecx - movl $INFLATE_MODE_BAD, %edx - jmp .L_update_stream_state - -.L_test_for_end_of_block: - /* else if (op & 32) { - * state->mode = TYPE; - * break; - * } - */ - testb $32, %al - jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ - - movl $0, %ecx - movl $INFLATE_MODE_TYPE, %edx - jmp .L_update_stream_state - -.L_invalid_literal_length_code: - /* else { - * strm->msg = "invalid literal/length code"; - * state->mode = BAD; - * } - */ - movl $.L_invalid_literal_length_code_msg, %ecx - movl $INFLATE_MODE_BAD, %edx - jmp .L_update_stream_state - -.L_invalid_distance_too_far: - /* strm->msg = "invalid distance too far back"; - * state->mode = BAD; - */ - movl in(%esp), in_r /* from_r has in's reg, put in back */ - movl $.L_invalid_distance_too_far_msg, %ecx - movl $INFLATE_MODE_BAD, %edx - jmp .L_update_stream_state - -.L_update_stream_state: - /* set strm->msg = %ecx, strm->state->mode = %edx */ - movl strm_sp(%esp), %eax - testl %ecx, %ecx /* if (msg != NULL) */ - jz .L_skip_msg - movl %ecx, msg_strm(%eax) /* strm->msg = msg */ -.L_skip_msg: - movl state_strm(%eax), %eax /* state = strm->state */ - movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ - jmp .L_break_loop - -.align 32,0x90 -.L_break_loop: - -/* - * Regs: - * - * bits = %ebp when mmx, and in %ebx when non-mmx - * hold = %hold_mm when mmx, and in %ebp when non-mmx - * in = %esi - * out = %edi - */ - -#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) - -#if defined( RUN_TIME_MMX ) - - cmpl $DO_USE_MMX, inflate_fast_use_mmx - jne .L_update_next_in - -#endif /* RUN_TIME_MMX */ - - movl %ebp, %ebx - -.L_update_next_in: - -#endif - -#define strm_r %eax -#define state_r %edx - - /* len = bits >> 3; - * in -= len; - * bits -= len << 3; - * hold &= (1U << bits) - 1; - * state->hold = hold; - * state->bits = bits; - * strm->next_in = in; - * strm->next_out = out; - */ - movl strm_sp(%esp), strm_r - movl %ebx, %ecx - movl state_strm(strm_r), state_r - shrl $3, %ecx - subl %ecx, in_r - shll $3, %ecx - subl %ecx, %ebx - movl out_r, next_out_strm(strm_r) - movl %ebx, bits_state(state_r) - movl %ebx, %ecx - - leal buf(%esp), %ebx - cmpl %ebx, last(%esp) - jne .L_buf_not_used /* if buf != last */ - - subl %ebx, in_r /* in -= buf */ - movl next_in_strm(strm_r), %ebx - movl %ebx, last(%esp) /* last = strm->next_in */ - addl %ebx, in_r /* in += strm->next_in */ - movl avail_in_strm(strm_r), %ebx - subl $11, %ebx - addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ - -.L_buf_not_used: - movl in_r, next_in_strm(strm_r) - - movl $1, %ebx - shll %cl, %ebx - decl %ebx - -#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) - -#if defined( RUN_TIME_MMX ) - - cmpl $DO_USE_MMX, inflate_fast_use_mmx - jne .L_update_hold - -#endif /* RUN_TIME_MMX */ - - psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ - movd hold_mm, %ebp - - emms - -.L_update_hold: - -#endif /* USE_MMX || RUN_TIME_MMX */ - - andl %ebx, %ebp - movl %ebp, hold_state(state_r) - -#define last_r %ebx - - /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ - movl last(%esp), last_r - cmpl in_r, last_r - jbe .L_last_is_smaller /* if (in >= last) */ - - subl in_r, last_r /* last -= in */ - addl $11, last_r /* last += 11 */ - movl last_r, avail_in_strm(strm_r) - jmp .L_fixup_out -.L_last_is_smaller: - subl last_r, in_r /* in -= last */ - negl in_r /* in = -in */ - addl $11, in_r /* in += 11 */ - movl in_r, avail_in_strm(strm_r) - -#undef last_r -#define end_r %ebx - -.L_fixup_out: - /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ - movl end(%esp), end_r - cmpl out_r, end_r - jbe .L_end_is_smaller /* if (out >= end) */ - - subl out_r, end_r /* end -= out */ - addl $257, end_r /* end += 257 */ - movl end_r, avail_out_strm(strm_r) - jmp .L_done -.L_end_is_smaller: - subl end_r, out_r /* out -= end */ - negl out_r /* out = -out */ - addl $257, out_r /* out += 257 */ - movl out_r, avail_out_strm(strm_r) - -#undef end_r -#undef strm_r -#undef state_r - -.L_done: - addl $local_var_size, %esp - popf - popl %ebx - popl %ebp - popl %esi - popl %edi - ret - -#if defined( GAS_ELF ) -/* elf info */ -.type inflate_fast,@function -.size inflate_fast,.-inflate_fast -#endif diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx64/bld_ml64.bat b/src/dependencies/zlib-1.2.11/contrib/masmx64/bld_ml64.bat deleted file mode 100644 index 8f9343d..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx64/bld_ml64.bat +++ /dev/null @@ -1,2 +0,0 @@ -ml64.exe /Flinffasx64 /c /Zi inffasx64.asm -ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx64/gvmat64.asm b/src/dependencies/zlib-1.2.11/contrib/masmx64/gvmat64.asm deleted file mode 100644 index 9879c28..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx64/gvmat64.asm +++ /dev/null @@ -1,553 +0,0 @@ -;uInt longest_match_x64( -; deflate_state *s, -; IPos cur_match); /* current match */ - -; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 -; (AMD64 on Athlon 64, Opteron, Phenom -; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) -; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. -; -; File written by Gilles Vollant, by converting to assembly the longest_match -; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. -; -; and by taking inspiration on asm686 with masm, optimised assembly code -; from Brian Raiter, written 1998 -; -; This software is provided 'as-is', without any express or implied -; warranty. In no event will the authors be held liable for any damages -; arising from the use of this software. -; -; Permission is granted to anyone to use this software for any purpose, -; including commercial applications, and to alter it and redistribute it -; freely, subject to the following restrictions: -; -; 1. The origin of this software must not be misrepresented; you must not -; claim that you wrote the original software. If you use this software -; in a product, an acknowledgment in the product documentation would be -; appreciated but is not required. -; 2. Altered source versions must be plainly marked as such, and must not be -; misrepresented as being the original software -; 3. This notice may not be removed or altered from any source distribution. -; -; -; -; http://www.zlib.net -; http://www.winimage.com/zLibDll -; http://www.muppetlabs.com/~breadbox/software/assembly.html -; -; to compile this file for infozip Zip, I use option: -; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm -; -; to compile this file for zLib, I use option: -; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm -; Be carrefull to adapt zlib1222add below to your version of zLib -; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change -; value of zlib1222add later) -; -; This file compile with Microsoft Macro Assembler (x64) for AMD64 -; -; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK -; -; (you can get Windows WDK with ml64 for AMD64 from -; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) -; - - -;uInt longest_match(s, cur_match) -; deflate_state *s; -; IPos cur_match; /* current match */ -.code -longest_match PROC - - -;LocalVarsSize equ 88 - LocalVarsSize equ 72 - -; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 -; free register : r14,r15 -; register can be saved : rsp - - chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len - ; low word: s->wmask -;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 -;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 -;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w -;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx -;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 -;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d -;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 -IFDEF INFOZIP -ELSE - nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size -ENDIF - -save_rdi equ rsp + 24 - LocalVarsSize -save_rsi equ rsp + 32 - LocalVarsSize -save_rbx equ rsp + 40 - LocalVarsSize -save_rbp equ rsp + 48 - LocalVarsSize -save_r12 equ rsp + 56 - LocalVarsSize -save_r13 equ rsp + 64 - LocalVarsSize -;save_r14 equ rsp + 72 - LocalVarsSize -;save_r15 equ rsp + 80 - LocalVarsSize - - -; summary of register usage -; scanend ebx -; scanendw bx -; chainlenwmask edx -; curmatch rsi -; curmatchd esi -; windowbestlen r8 -; scanalign r9 -; scanalignd r9d -; window r10 -; bestlen r11 -; bestlend r11d -; scanstart r12d -; scanstartw r12w -; scan r13 -; nicematch r14d -; limit r15 -; limitd r15d -; prev rcx - -; all the +4 offsets are due to the addition of pending_buf_size (in zlib -; in the deflate_state structure since the asm code was first written -; (if you compile with zlib 1.0.4 or older, remove the +4). -; Note : these value are good with a 8 bytes boundary pack structure - - - MAX_MATCH equ 258 - MIN_MATCH equ 3 - MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) - - -;;; Offsets for fields in the deflate_state structure. These numbers -;;; are calculated from the definition of deflate_state, with the -;;; assumption that the compiler will dword-align the fields. (Thus, -;;; changing the definition of deflate_state could easily cause this -;;; program to crash horribly, without so much as a warning at -;;; compile time. Sigh.) - -; all the +zlib1222add offsets are due to the addition of fields -; in zlib in the deflate_state structure since the asm code was first written -; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). -; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). -; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). - - -IFDEF INFOZIP - -_DATA SEGMENT -COMM window_size:DWORD -; WMask ; 7fff -COMM window:BYTE:010040H -COMM prev:WORD:08000H -; MatchLen : unused -; PrevMatch : unused -COMM strstart:DWORD -COMM match_start:DWORD -; Lookahead : ignore -COMM prev_length:DWORD ; PrevLen -COMM max_chain_length:DWORD -COMM good_match:DWORD -COMM nice_match:DWORD -prev_ad equ OFFSET prev -window_ad equ OFFSET window -nicematch equ nice_match -_DATA ENDS -WMask equ 07fffh - -ELSE - - IFNDEF zlib1222add - zlib1222add equ 8 - ENDIF -dsWSize equ 56+zlib1222add+(zlib1222add/2) -dsWMask equ 64+zlib1222add+(zlib1222add/2) -dsWindow equ 72+zlib1222add -dsPrev equ 88+zlib1222add -dsMatchLen equ 128+zlib1222add -dsPrevMatch equ 132+zlib1222add -dsStrStart equ 140+zlib1222add -dsMatchStart equ 144+zlib1222add -dsLookahead equ 148+zlib1222add -dsPrevLen equ 152+zlib1222add -dsMaxChainLen equ 156+zlib1222add -dsGoodMatch equ 172+zlib1222add -dsNiceMatch equ 176+zlib1222add - -window_size equ [ rcx + dsWSize] -WMask equ [ rcx + dsWMask] -window_ad equ [ rcx + dsWindow] -prev_ad equ [ rcx + dsPrev] -strstart equ [ rcx + dsStrStart] -match_start equ [ rcx + dsMatchStart] -Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip -prev_length equ [ rcx + dsPrevLen] -max_chain_length equ [ rcx + dsMaxChainLen] -good_match equ [ rcx + dsGoodMatch] -nice_match equ [ rcx + dsNiceMatch] -ENDIF - -; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) - -; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and -; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp -; -; All registers must be preserved across the call, except for -; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. - - - -;;; Save registers that the compiler may be using, and adjust esp to -;;; make room for our stack frame. - - -;;; Retrieve the function arguments. r8d will hold cur_match -;;; throughout the entire function. edx will hold the pointer to the -;;; deflate_state structure during the function's setup (before -;;; entering the main loop. - -; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) - -; this clear high 32 bits of r8, which can be garbage in both r8 and rdx - - mov [save_rdi],rdi - mov [save_rsi],rsi - mov [save_rbx],rbx - mov [save_rbp],rbp -IFDEF INFOZIP - mov r8d,ecx -ELSE - mov r8d,edx -ENDIF - mov [save_r12],r12 - mov [save_r13],r13 -; mov [save_r14],r14 -; mov [save_r15],r15 - - -;;; uInt wmask = s->w_mask; -;;; unsigned chain_length = s->max_chain_length; -;;; if (s->prev_length >= s->good_match) { -;;; chain_length >>= 2; -;;; } - - mov edi, prev_length - mov esi, good_match - mov eax, WMask - mov ebx, max_chain_length - cmp edi, esi - jl LastMatchGood - shr ebx, 2 -LastMatchGood: - -;;; chainlen is decremented once beforehand so that the function can -;;; use the sign flag instead of the zero flag for the exit test. -;;; It is then shifted into the high word, to make room for the wmask -;;; value, which it will always accompany. - - dec ebx - shl ebx, 16 - or ebx, eax - -;;; on zlib only -;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - -IFDEF INFOZIP - mov [chainlenwmask], ebx -; on infozip nice_match = [nice_match] -ELSE - mov eax, nice_match - mov [chainlenwmask], ebx - mov r10d, Lookahead - cmp r10d, eax - cmovnl r10d, eax - mov [nicematch],r10d -ENDIF - -;;; register Bytef *scan = s->window + s->strstart; - mov r10, window_ad - mov ebp, strstart - lea r13, [r10 + rbp] - -;;; Determine how many bytes the scan ptr is off from being -;;; dword-aligned. - - mov r9,r13 - neg r13 - and r13,3 - -;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? -;;; s->strstart - (IPos)MAX_DIST(s) : NIL; -IFDEF INFOZIP - mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) -ELSE - mov eax, window_size - sub eax, MIN_LOOKAHEAD -ENDIF - xor edi,edi - sub ebp, eax - - mov r11d, prev_length - - cmovng ebp,edi - -;;; int best_len = s->prev_length; - - -;;; Store the sum of s->window + best_len in esi locally, and in esi. - - lea rsi,[r10+r11] - -;;; register ush scan_start = *(ushf*)scan; -;;; register ush scan_end = *(ushf*)(scan+best_len-1); -;;; Posf *prev = s->prev; - - movzx r12d,word ptr [r9] - movzx ebx, word ptr [r9 + r11 - 1] - - mov rdi, prev_ad - -;;; Jump into the main loop. - - mov edx, [chainlenwmask] - - cmp bx,word ptr [rsi + r8 - 1] - jz LookupLoopIsZero - -LookupLoop1: - and r8d, edx - - movzx r8d, word ptr [rdi + r8*2] - cmp r8d, ebp - jbe LeaveNow - sub edx, 00010000h - js LeaveNow - -LoopEntry1: - cmp bx,word ptr [rsi + r8 - 1] - jz LookupLoopIsZero - -LookupLoop2: - and r8d, edx - - movzx r8d, word ptr [rdi + r8*2] - cmp r8d, ebp - jbe LeaveNow - sub edx, 00010000h - js LeaveNow - -LoopEntry2: - cmp bx,word ptr [rsi + r8 - 1] - jz LookupLoopIsZero - -LookupLoop4: - and r8d, edx - - movzx r8d, word ptr [rdi + r8*2] - cmp r8d, ebp - jbe LeaveNow - sub edx, 00010000h - js LeaveNow - -LoopEntry4: - - cmp bx,word ptr [rsi + r8 - 1] - jnz LookupLoop1 - jmp LookupLoopIsZero - - -;;; do { -;;; match = s->window + cur_match; -;;; if (*(ushf*)(match+best_len-1) != scan_end || -;;; *(ushf*)match != scan_start) continue; -;;; [...] -;;; } while ((cur_match = prev[cur_match & wmask]) > limit -;;; && --chain_length != 0); -;;; -;;; Here is the inner loop of the function. The function will spend the -;;; majority of its time in this loop, and majority of that time will -;;; be spent in the first ten instructions. -;;; -;;; Within this loop: -;;; ebx = scanend -;;; r8d = curmatch -;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) -;;; esi = windowbestlen - i.e., (window + bestlen) -;;; edi = prev -;;; ebp = limit - -LookupLoop: - and r8d, edx - - movzx r8d, word ptr [rdi + r8*2] - cmp r8d, ebp - jbe LeaveNow - sub edx, 00010000h - js LeaveNow - -LoopEntry: - - cmp bx,word ptr [rsi + r8 - 1] - jnz LookupLoop1 -LookupLoopIsZero: - cmp r12w, word ptr [r10 + r8] - jnz LookupLoop1 - - -;;; Store the current value of chainlen. - mov [chainlenwmask], edx - -;;; Point edi to the string under scrutiny, and esi to the string we -;;; are hoping to match it up with. In actuality, esi and edi are -;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is -;;; initialized to -(MAX_MATCH_8 - scanalign). - - lea rsi,[r8+r10] - mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) - lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] - lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] - - prefetcht1 [rsi+rdx] - prefetcht1 [rdi+rdx] - - -;;; Test the strings for equality, 8 bytes at a time. At the end, -;;; adjust rdx so that it is offset to the exact byte that mismatched. -;;; -;;; We already know at this point that the first three bytes of the -;;; strings match each other, and they can be safely passed over before -;;; starting the compare loop. So what this code does is skip over 0-3 -;;; bytes, as much as necessary in order to dword-align the edi -;;; pointer. (rsi will still be misaligned three times out of four.) -;;; -;;; It should be confessed that this loop usually does not represent -;;; much of the total running time. Replacing it with a more -;;; straightforward "rep cmpsb" would not drastically degrade -;;; performance. - - -LoopCmps: - mov rax, [rsi + rdx] - xor rax, [rdi + rdx] - jnz LeaveLoopCmps - - mov rax, [rsi + rdx + 8] - xor rax, [rdi + rdx + 8] - jnz LeaveLoopCmps8 - - - mov rax, [rsi + rdx + 8+8] - xor rax, [rdi + rdx + 8+8] - jnz LeaveLoopCmps16 - - add rdx,8+8+8 - - jnz short LoopCmps - jmp short LenMaximum -LeaveLoopCmps16: add rdx,8 -LeaveLoopCmps8: add rdx,8 -LeaveLoopCmps: - - test eax, 0000FFFFh - jnz LenLower - - test eax,0ffffffffh - - jnz LenLower32 - - add rdx,4 - shr rax,32 - or ax,ax - jnz LenLower - -LenLower32: - shr eax,16 - add rdx,2 -LenLower: sub al, 1 - adc rdx, 0 -;;; Calculate the length of the match. If it is longer than MAX_MATCH, -;;; then automatically accept it as the best possible match and leave. - - lea rax, [rdi + rdx] - sub rax, r9 - cmp eax, MAX_MATCH - jge LenMaximum - -;;; If the length of the match is not longer than the best match we -;;; have so far, then forget it and return to the lookup loop. -;/////////////////////////////////// - - cmp eax, r11d - jg LongerMatch - - lea rsi,[r10+r11] - - mov rdi, prev_ad - mov edx, [chainlenwmask] - jmp LookupLoop - -;;; s->match_start = cur_match; -;;; best_len = len; -;;; if (len >= nice_match) break; -;;; scan_end = *(ushf*)(scan+best_len-1); - -LongerMatch: - mov r11d, eax - mov match_start, r8d - cmp eax, [nicematch] - jge LeaveNow - - lea rsi,[r10+rax] - - movzx ebx, word ptr [r9 + rax - 1] - mov rdi, prev_ad - mov edx, [chainlenwmask] - jmp LookupLoop - -;;; Accept the current string, with the maximum possible length. - -LenMaximum: - mov r11d,MAX_MATCH - mov match_start, r8d - -;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; -;;; return s->lookahead; - -LeaveNow: -IFDEF INFOZIP - mov eax,r11d -ELSE - mov eax, Lookahead - cmp r11d, eax - cmovng eax, r11d -ENDIF - -;;; Restore the stack and return from whence we came. - - - mov rsi,[save_rsi] - mov rdi,[save_rdi] - mov rbx,[save_rbx] - mov rbp,[save_rbp] - mov r12,[save_r12] - mov r13,[save_r13] -; mov r14,[save_r14] -; mov r15,[save_r15] - - - ret 0 -; please don't remove this string ! -; Your can freely use gvmat64 in any free or commercial app -; but it is far better don't remove the string in the binary! - db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 -longest_match ENDP - -match_init PROC - ret 0 -match_init ENDP - - -END diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx64/inffas8664.c b/src/dependencies/zlib-1.2.11/contrib/masmx64/inffas8664.c deleted file mode 100644 index e8af06f..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx64/inffas8664.c +++ /dev/null @@ -1,186 +0,0 @@ -/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding - * version for AMD64 on Windows using Microsoft C compiler - * - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Copyright (C) 2003 Chris Anderson - * Please use the copyright conditions above. - * - * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant - * - * inffas8664.c call function inffas8664fnc in inffasx64.asm - * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c - * - * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also - * slightly quicker on x86 systems because, instead of using rep movsb to copy - * data, it uses rep movsw, which moves data in 2-byte chunks instead of single - * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates - * from http://fedora.linux.duke.edu/fc1_x86_64 - * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with - * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, - * when decompressing mozilla-source-1.3.tar.gz. - * - * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from - * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at - * the moment. I have successfully compiled and tested this code with gcc2.96, - * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S - * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX - * enabled. I will attempt to merge the MMX code into this version. Newer - * versions of this and inffast.S can be found at - * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ - * - */ - -#include -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* Mark Adler's comments from inffast.c: */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ - - - - typedef struct inffast_ar { -/* 64 32 x86 x86_64 */ -/* ar offset register */ -/* 0 0 */ void *esp; /* esp save */ -/* 8 4 */ void *ebp; /* ebp save */ -/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ -/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ -/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ -/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ -/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ -/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ -/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ -/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ -/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ -/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ -/* 92 48 */ unsigned wsize; /* window size */ -/* 96 52 */ unsigned write; /* window write index */ -/*100 56 */ unsigned lmask; /* r12 mask for lcode */ -/*104 60 */ unsigned dmask; /* r13 mask for dcode */ -/*108 64 */ unsigned len; /* r14 match length */ -/*112 68 */ unsigned dist; /* r15 match distance */ -/*116 72 */ unsigned status; /* set when state chng*/ - } type_ar; -#ifdef ASMINF - -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - type_ar ar; - void inffas8664fnc(struct inffast_ar * par); - - - -#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) -#define PAD_AVAIL_IN 6 -#define PAD_AVAIL_OUT 258 -#else -#define PAD_AVAIL_IN 5 -#define PAD_AVAIL_OUT 257 -#endif - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - - ar.in = strm->next_in; - ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); - ar.out = strm->next_out; - ar.beg = ar.out - (start - strm->avail_out); - ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); - ar.wsize = state->wsize; - ar.write = state->wnext; - ar.window = state->window; - ar.hold = state->hold; - ar.bits = state->bits; - ar.lcode = state->lencode; - ar.dcode = state->distcode; - ar.lmask = (1U << state->lenbits) - 1; - ar.dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - /* align in on 1/2 hold size boundary */ - while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { - ar.hold += (unsigned long)*ar.in++ << ar.bits; - ar.bits += 8; - } - - inffas8664fnc(&ar); - - if (ar.status > 1) { - if (ar.status == 2) - strm->msg = "invalid literal/length code"; - else if (ar.status == 3) - strm->msg = "invalid distance code"; - else - strm->msg = "invalid distance too far back"; - state->mode = BAD; - } - else if ( ar.status == 1 ) { - state->mode = TYPE; - } - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - ar.len = ar.bits >> 3; - ar.in -= ar.len; - ar.bits -= ar.len << 3; - ar.hold &= (1U << ar.bits) - 1; - - /* update state and return */ - strm->next_in = ar.in; - strm->next_out = ar.out; - strm->avail_in = (unsigned)(ar.in < ar.last ? - PAD_AVAIL_IN + (ar.last - ar.in) : - PAD_AVAIL_IN - (ar.in - ar.last)); - strm->avail_out = (unsigned)(ar.out < ar.end ? - PAD_AVAIL_OUT + (ar.end - ar.out) : - PAD_AVAIL_OUT - (ar.out - ar.end)); - state->hold = (unsigned long)ar.hold; - state->bits = ar.bits; - return; -} - -#endif diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx64/inffasx64.asm b/src/dependencies/zlib-1.2.11/contrib/masmx64/inffasx64.asm deleted file mode 100644 index 60a8d89..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx64/inffasx64.asm +++ /dev/null @@ -1,396 +0,0 @@ -; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding -; version for AMD64 on Windows using Microsoft C compiler -; -; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c -; inffasx64.asm is called by inffas8664.c, which contain more info. - - -; to compile this file, I use option -; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm -; with Microsoft Macro Assembler (x64) for AMD64 -; - -; This file compile with Microsoft Macro Assembler (x64) for AMD64 -; -; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK -; -; (you can get Windows WDK with ml64 for AMD64 from -; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) -; - - -.code -inffas8664fnc PROC - -; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and -; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp -; -; All registers must be preserved across the call, except for -; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. - - - mov [rsp-8],rsi - mov [rsp-16],rdi - mov [rsp-24],r12 - mov [rsp-32],r13 - mov [rsp-40],r14 - mov [rsp-48],r15 - mov [rsp-56],rbx - - mov rax,rcx - - mov [rax+8], rbp ; /* save regs rbp and rsp */ - mov [rax], rsp - - mov rsp, rax ; /* make rsp point to &ar */ - - mov rsi, [rsp+16] ; /* rsi = in */ - mov rdi, [rsp+32] ; /* rdi = out */ - mov r9, [rsp+24] ; /* r9 = last */ - mov r10, [rsp+48] ; /* r10 = end */ - mov rbp, [rsp+64] ; /* rbp = lcode */ - mov r11, [rsp+72] ; /* r11 = dcode */ - mov rdx, [rsp+80] ; /* rdx = hold */ - mov ebx, [rsp+88] ; /* ebx = bits */ - mov r12d, [rsp+100] ; /* r12d = lmask */ - mov r13d, [rsp+104] ; /* r13d = dmask */ - ; /* r14d = len */ - ; /* r15d = dist */ - - - cld - cmp r10, rdi - je L_one_time ; /* if only one decode left */ - cmp r9, rsi - - jne L_do_loop - - -L_one_time: - mov r8, r12 ; /* r8 = lmask */ - cmp bl, 32 - ja L_get_length_code_one_time - - lodsd ; /* eax = *(uint *)in++ */ - mov cl, bl ; /* cl = bits, needs it for shifting */ - add bl, 32 ; /* bits += 32 */ - shl rax, cl - or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ - jmp L_get_length_code_one_time - -ALIGN 4 -L_while_test: - cmp r10, rdi - jbe L_break_loop - cmp r9, rsi - jbe L_break_loop - -L_do_loop: - mov r8, r12 ; /* r8 = lmask */ - cmp bl, 32 - ja L_get_length_code ; /* if (32 < bits) */ - - lodsd ; /* eax = *(uint *)in++ */ - mov cl, bl ; /* cl = bits, needs it for shifting */ - add bl, 32 ; /* bits += 32 */ - shl rax, cl - or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ - -L_get_length_code: - and r8, rdx ; /* r8 &= hold */ - mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ - - mov cl, ah ; /* cl = this.bits */ - sub bl, ah ; /* bits -= this.bits */ - shr rdx, cl ; /* hold >>= this.bits */ - - test al, al - jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ - - mov r8, r12 ; /* r8 = lmask */ - shr eax, 16 ; /* output this.val char */ - stosb - -L_get_length_code_one_time: - and r8, rdx ; /* r8 &= hold */ - mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ - -L_dolen: - mov cl, ah ; /* cl = this.bits */ - sub bl, ah ; /* bits -= this.bits */ - shr rdx, cl ; /* hold >>= this.bits */ - - test al, al - jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ - - shr eax, 16 ; /* output this.val char */ - stosb - jmp L_while_test - -ALIGN 4 -L_test_for_length_base: - mov r14d, eax ; /* len = this */ - shr r14d, 16 ; /* len = this.val */ - mov cl, al - - test al, 16 - jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ - and cl, 15 ; /* op &= 15 */ - jz L_decode_distance ; /* if (!op) */ - -L_add_bits_to_len: - sub bl, cl - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx ; /* eax &= hold */ - shr rdx, cl - add r14d, eax ; /* len += hold & mask[op] */ - -L_decode_distance: - mov r8, r13 ; /* r8 = dmask */ - cmp bl, 32 - ja L_get_distance_code ; /* if (32 < bits) */ - - lodsd ; /* eax = *(uint *)in++ */ - mov cl, bl ; /* cl = bits, needs it for shifting */ - add bl, 32 ; /* bits += 32 */ - shl rax, cl - or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ - -L_get_distance_code: - and r8, rdx ; /* r8 &= hold */ - mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ - -L_dodist: - mov r15d, eax ; /* dist = this */ - shr r15d, 16 ; /* dist = this.val */ - mov cl, ah - sub bl, ah ; /* bits -= this.bits */ - shr rdx, cl ; /* hold >>= this.bits */ - mov cl, al ; /* cl = this.op */ - - test al, 16 ; /* if ((op & 16) == 0) */ - jz L_test_for_second_level_dist - and cl, 15 ; /* op &= 15 */ - jz L_check_dist_one - -L_add_bits_to_dist: - sub bl, cl - xor eax, eax - inc eax - shl eax, cl - dec eax ; /* (1 << op) - 1 */ - and eax, edx ; /* eax &= hold */ - shr rdx, cl - add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ - -L_check_window: - mov r8, rsi ; /* save in so from can use it's reg */ - mov rax, rdi - sub rax, [rsp+40] ; /* nbytes = out - beg */ - - cmp eax, r15d - jb L_clip_window ; /* if (dist > nbytes) 4.2% */ - - mov ecx, r14d ; /* ecx = len */ - mov rsi, rdi - sub rsi, r15 ; /* from = out - dist */ - - sar ecx, 1 - jnc L_copy_two ; /* if len % 2 == 0 */ - - rep movsw - mov al, [rsi] - mov [rdi], al - inc rdi - - mov rsi, r8 ; /* move in back to %rsi, toss from */ - jmp L_while_test - -L_copy_two: - rep movsw - mov rsi, r8 ; /* move in back to %rsi, toss from */ - jmp L_while_test - -ALIGN 4 -L_check_dist_one: - cmp r15d, 1 ; /* if dist 1, is a memset */ - jne L_check_window - cmp [rsp+40], rdi ; /* if out == beg, outside window */ - je L_check_window - - mov ecx, r14d ; /* ecx = len */ - mov al, [rdi-1] - mov ah, al - - sar ecx, 1 - jnc L_set_two - mov [rdi], al - inc rdi - -L_set_two: - rep stosw - jmp L_while_test - -ALIGN 4 -L_test_for_second_level_length: - test al, 64 - jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ - - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx ; /* eax &= hold */ - add eax, r14d ; /* eax += len */ - mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ - jmp L_dolen - -ALIGN 4 -L_test_for_second_level_dist: - test al, 64 - jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ - - xor eax, eax - inc eax - shl eax, cl - dec eax - and eax, edx ; /* eax &= hold */ - add eax, r15d ; /* eax += dist */ - mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ - jmp L_dodist - -ALIGN 4 -L_clip_window: - mov ecx, eax ; /* ecx = nbytes */ - mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ - neg ecx ; /* nbytes = -nbytes */ - - cmp eax, r15d - jb L_invalid_distance_too_far ; /* if (dist > wsize) */ - - add ecx, r15d ; /* nbytes = dist - nbytes */ - cmp dword ptr [rsp+96], 0 - jne L_wrap_around_window ; /* if (write != 0) */ - - mov rsi, [rsp+56] ; /* from = window */ - sub eax, ecx ; /* eax -= nbytes */ - add rsi, rax ; /* from += wsize - nbytes */ - - mov eax, r14d ; /* eax = len */ - cmp r14d, ecx - jbe L_do_copy ; /* if (nbytes >= len) */ - - sub eax, ecx ; /* eax -= nbytes */ - rep movsb - mov rsi, rdi - sub rsi, r15 ; /* from = &out[ -dist ] */ - jmp L_do_copy - -ALIGN 4 -L_wrap_around_window: - mov eax, [rsp+96] ; /* eax = write */ - cmp ecx, eax - jbe L_contiguous_in_window ; /* if (write >= nbytes) */ - - mov esi, [rsp+92] ; /* from = wsize */ - add rsi, [rsp+56] ; /* from += window */ - add rsi, rax ; /* from += write */ - sub rsi, rcx ; /* from -= nbytes */ - sub ecx, eax ; /* nbytes -= write */ - - mov eax, r14d ; /* eax = len */ - cmp eax, ecx - jbe L_do_copy ; /* if (nbytes >= len) */ - - sub eax, ecx ; /* len -= nbytes */ - rep movsb - mov rsi, [rsp+56] ; /* from = window */ - mov ecx, [rsp+96] ; /* nbytes = write */ - cmp eax, ecx - jbe L_do_copy ; /* if (nbytes >= len) */ - - sub eax, ecx ; /* len -= nbytes */ - rep movsb - mov rsi, rdi - sub rsi, r15 ; /* from = out - dist */ - jmp L_do_copy - -ALIGN 4 -L_contiguous_in_window: - mov rsi, [rsp+56] ; /* rsi = window */ - add rsi, rax - sub rsi, rcx ; /* from += write - nbytes */ - - mov eax, r14d ; /* eax = len */ - cmp eax, ecx - jbe L_do_copy ; /* if (nbytes >= len) */ - - sub eax, ecx ; /* len -= nbytes */ - rep movsb - mov rsi, rdi - sub rsi, r15 ; /* from = out - dist */ - jmp L_do_copy ; /* if (nbytes >= len) */ - -ALIGN 4 -L_do_copy: - mov ecx, eax ; /* ecx = len */ - rep movsb - - mov rsi, r8 ; /* move in back to %esi, toss from */ - jmp L_while_test - -L_test_for_end_of_block: - test al, 32 - jz L_invalid_literal_length_code - mov dword ptr [rsp+116], 1 - jmp L_break_loop_with_status - -L_invalid_literal_length_code: - mov dword ptr [rsp+116], 2 - jmp L_break_loop_with_status - -L_invalid_distance_code: - mov dword ptr [rsp+116], 3 - jmp L_break_loop_with_status - -L_invalid_distance_too_far: - mov dword ptr [rsp+116], 4 - jmp L_break_loop_with_status - -L_break_loop: - mov dword ptr [rsp+116], 0 - -L_break_loop_with_status: -; /* put in, out, bits, and hold back into ar and pop esp */ - mov [rsp+16], rsi ; /* in */ - mov [rsp+32], rdi ; /* out */ - mov [rsp+88], ebx ; /* bits */ - mov [rsp+80], rdx ; /* hold */ - - mov rax, [rsp] ; /* restore rbp and rsp */ - mov rbp, [rsp+8] - mov rsp, rax - - - - mov rsi,[rsp-8] - mov rdi,[rsp-16] - mov r12,[rsp-24] - mov r13,[rsp-32] - mov r14,[rsp-40] - mov r15,[rsp-48] - mov rbx,[rsp-56] - - ret 0 -; : -; : "m" (ar) -; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", -; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" -; ); - -inffas8664fnc ENDP -;_TEXT ENDS -END diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx64/readme.txt b/src/dependencies/zlib-1.2.11/contrib/masmx64/readme.txt deleted file mode 100644 index 2da6733..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx64/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -Summary -------- -This directory contains ASM implementations of the functions -longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), -for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. - -gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits - assembly optimized version from Jean-loup Gailly original longest_match function - -inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing - original function from Mark Adler - -Use instructions ----------------- -Assemble the .asm files using MASM and put the object files into the zlib source -directory. You can also get object files here: - - http://www.winimage.com/zLibDll/zlib124_masm_obj.zip - -define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, -and inffasx64.obj and gvmat64.obj as object to link. - - -Build instructions ------------------- -run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) - -ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK - -You can get Windows 2003 server DDK with ml64 and cl for AMD64 from - http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx86/bld_ml32.bat b/src/dependencies/zlib-1.2.11/contrib/masmx86/bld_ml32.bat deleted file mode 100644 index e1b86bf..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx86/bld_ml32.bat +++ /dev/null @@ -1,2 +0,0 @@ -ml /coff /Zi /c /Flmatch686.lst match686.asm -ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx86/inffas32.asm b/src/dependencies/zlib-1.2.11/contrib/masmx86/inffas32.asm deleted file mode 100644 index 03d20f8..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx86/inffas32.asm +++ /dev/null @@ -1,1080 +0,0 @@ -;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding -; * -; * inffas32.asm is derivated from inffas86.c, with translation of assembly code -; * -; * Copyright (C) 1995-2003 Mark Adler -; * For conditions of distribution and use, see copyright notice in zlib.h -; * -; * Copyright (C) 2003 Chris Anderson -; * Please use the copyright conditions above. -; * -; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from -; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at -; * the moment. I have successfully compiled and tested this code with gcc2.96, -; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S -; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX -; * enabled. I will attempt to merge the MMX code into this version. Newer -; * versions of this and inffast.S can be found at -; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ -; * -; * 2005 : modification by Gilles Vollant -; */ -; For Visual C++ 4.x and higher and ML 6.x and higher -; ml.exe is in directory \MASM611C of Win95 DDK -; ml.exe is also distributed in http://www.masm32.com/masmdl.htm -; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ -; -; -; compile with command line option -; ml /coff /Zi /c /Flinffas32.lst inffas32.asm - -; if you define NO_GZIP (see inflate.h), compile with -; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm - - -; zlib122sup is 0 fort zlib 1.2.2.1 and lower -; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head -; in inflate_state in inflate.h) -zlib1222sup equ 8 - - -IFDEF GUNZIP - INFLATE_MODE_TYPE equ 11 - INFLATE_MODE_BAD equ 26 -ELSE - IFNDEF NO_GUNZIP - INFLATE_MODE_TYPE equ 11 - INFLATE_MODE_BAD equ 26 - ELSE - INFLATE_MODE_TYPE equ 3 - INFLATE_MODE_BAD equ 17 - ENDIF -ENDIF - - -; 75 "inffast.S" -;FILE "inffast.S" - -;;;GLOBAL _inflate_fast - -;;;SECTION .text - - - - .586p - .mmx - - name inflate_fast_x86 - .MODEL FLAT - -_DATA segment -inflate_fast_use_mmx: - dd 1 - - -_TEXT segment - - - -ALIGN 4 - db 'Fast decoding Code from Chris Anderson' - db 0 - -ALIGN 4 -invalid_literal_length_code_msg: - db 'invalid literal/length code' - db 0 - -ALIGN 4 -invalid_distance_code_msg: - db 'invalid distance code' - db 0 - -ALIGN 4 -invalid_distance_too_far_msg: - db 'invalid distance too far back' - db 0 - - -ALIGN 4 -inflate_fast_mask: -dd 0 -dd 1 -dd 3 -dd 7 -dd 15 -dd 31 -dd 63 -dd 127 -dd 255 -dd 511 -dd 1023 -dd 2047 -dd 4095 -dd 8191 -dd 16383 -dd 32767 -dd 65535 -dd 131071 -dd 262143 -dd 524287 -dd 1048575 -dd 2097151 -dd 4194303 -dd 8388607 -dd 16777215 -dd 33554431 -dd 67108863 -dd 134217727 -dd 268435455 -dd 536870911 -dd 1073741823 -dd 2147483647 -dd 4294967295 - - -mode_state equ 0 ;/* state->mode */ -wsize_state equ (32+zlib1222sup) ;/* state->wsize */ -write_state equ (36+4+zlib1222sup) ;/* state->write */ -window_state equ (40+4+zlib1222sup) ;/* state->window */ -hold_state equ (44+4+zlib1222sup) ;/* state->hold */ -bits_state equ (48+4+zlib1222sup) ;/* state->bits */ -lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ -distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ -lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ -distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ - - -;;SECTION .text -; 205 "inffast.S" -;GLOBAL inflate_fast_use_mmx - -;SECTION .data - - -; GLOBAL inflate_fast_use_mmx:object -;.size inflate_fast_use_mmx, 4 -; 226 "inffast.S" -;SECTION .text - -ALIGN 4 -_inflate_fast proc near -.FPO (16, 4, 0, 0, 1, 0) - push edi - push esi - push ebp - push ebx - pushfd - sub esp,64 - cld - - - - - mov esi, [esp+88] - mov edi, [esi+28] - - - - - - - - mov edx, [esi+4] - mov eax, [esi+0] - - add edx,eax - sub edx,11 - - mov [esp+44],eax - mov [esp+20],edx - - mov ebp, [esp+92] - mov ecx, [esi+16] - mov ebx, [esi+12] - - sub ebp,ecx - neg ebp - add ebp,ebx - - sub ecx,257 - add ecx,ebx - - mov [esp+60],ebx - mov [esp+40],ebp - mov [esp+16],ecx -; 285 "inffast.S" - mov eax, [edi+lencode_state] - mov ecx, [edi+distcode_state] - - mov [esp+8],eax - mov [esp+12],ecx - - mov eax,1 - mov ecx, [edi+lenbits_state] - shl eax,cl - dec eax - mov [esp+0],eax - - mov eax,1 - mov ecx, [edi+distbits_state] - shl eax,cl - dec eax - mov [esp+4],eax - - mov eax, [edi+wsize_state] - mov ecx, [edi+write_state] - mov edx, [edi+window_state] - - mov [esp+52],eax - mov [esp+48],ecx - mov [esp+56],edx - - mov ebp, [edi+hold_state] - mov ebx, [edi+bits_state] -; 321 "inffast.S" - mov esi, [esp+44] - mov ecx, [esp+20] - cmp ecx,esi - ja L_align_long - - add ecx,11 - sub ecx,esi - mov eax,12 - sub eax,ecx - lea edi, [esp+28] - rep movsb - mov ecx,eax - xor eax,eax - rep stosb - lea esi, [esp+28] - mov [esp+20],esi - jmp L_is_aligned - - -L_align_long: - test esi,3 - jz L_is_aligned - xor eax,eax - mov al, [esi] - inc esi - mov ecx,ebx - add ebx,8 - shl eax,cl - or ebp,eax - jmp L_align_long - -L_is_aligned: - mov edi, [esp+60] -; 366 "inffast.S" -L_check_mmx: - cmp dword ptr [inflate_fast_use_mmx],2 - je L_init_mmx - ja L_do_loop - - push eax - push ebx - push ecx - push edx - pushfd - mov eax, [esp] - xor dword ptr [esp],0200000h - - - - - popfd - pushfd - pop edx - xor edx,eax - jz L_dont_use_mmx - xor eax,eax - cpuid - cmp ebx,0756e6547h - jne L_dont_use_mmx - cmp ecx,06c65746eh - jne L_dont_use_mmx - cmp edx,049656e69h - jne L_dont_use_mmx - mov eax,1 - cpuid - shr eax,8 - and eax,15 - cmp eax,6 - jne L_dont_use_mmx - test edx,0800000h - jnz L_use_mmx - jmp L_dont_use_mmx -L_use_mmx: - mov dword ptr [inflate_fast_use_mmx],2 - jmp L_check_mmx_pop -L_dont_use_mmx: - mov dword ptr [inflate_fast_use_mmx],3 -L_check_mmx_pop: - pop edx - pop ecx - pop ebx - pop eax - jmp L_check_mmx -; 426 "inffast.S" -ALIGN 4 -L_do_loop: -; 437 "inffast.S" - cmp bl,15 - ja L_get_length_code - - xor eax,eax - lodsw - mov cl,bl - add bl,16 - shl eax,cl - or ebp,eax - -L_get_length_code: - mov edx, [esp+0] - mov ecx, [esp+8] - and edx,ebp - mov eax, [ecx+edx*4] - -L_dolen: - - - - - - - mov cl,ah - sub bl,ah - shr ebp,cl - - - - - - - test al,al - jnz L_test_for_length_base - - shr eax,16 - stosb - -L_while_test: - - - cmp [esp+16],edi - jbe L_break_loop - - cmp [esp+20],esi - ja L_do_loop - jmp L_break_loop - -L_test_for_length_base: -; 502 "inffast.S" - mov edx,eax - shr edx,16 - mov cl,al - - test al,16 - jz L_test_for_second_level_length - and cl,15 - jz L_save_len - cmp bl,cl - jae L_add_bits_to_len - - mov ch,cl - xor eax,eax - lodsw - mov cl,bl - add bl,16 - shl eax,cl - or ebp,eax - mov cl,ch - -L_add_bits_to_len: - mov eax,1 - shl eax,cl - dec eax - sub bl,cl - and eax,ebp - shr ebp,cl - add edx,eax - -L_save_len: - mov [esp+24],edx - - -L_decode_distance: -; 549 "inffast.S" - cmp bl,15 - ja L_get_distance_code - - xor eax,eax - lodsw - mov cl,bl - add bl,16 - shl eax,cl - or ebp,eax - -L_get_distance_code: - mov edx, [esp+4] - mov ecx, [esp+12] - and edx,ebp - mov eax, [ecx+edx*4] - - -L_dodist: - mov edx,eax - shr edx,16 - mov cl,ah - sub bl,ah - shr ebp,cl -; 584 "inffast.S" - mov cl,al - - test al,16 - jz L_test_for_second_level_dist - and cl,15 - jz L_check_dist_one - cmp bl,cl - jae L_add_bits_to_dist - - mov ch,cl - xor eax,eax - lodsw - mov cl,bl - add bl,16 - shl eax,cl - or ebp,eax - mov cl,ch - -L_add_bits_to_dist: - mov eax,1 - shl eax,cl - dec eax - sub bl,cl - and eax,ebp - shr ebp,cl - add edx,eax - jmp L_check_window - -L_check_window: -; 625 "inffast.S" - mov [esp+44],esi - mov eax,edi - sub eax, [esp+40] - - cmp eax,edx - jb L_clip_window - - mov ecx, [esp+24] - mov esi,edi - sub esi,edx - - sub ecx,3 - mov al, [esi] - mov [edi],al - mov al, [esi+1] - mov dl, [esi+2] - add esi,3 - mov [edi+1],al - mov [edi+2],dl - add edi,3 - rep movsb - - mov esi, [esp+44] - jmp L_while_test - -ALIGN 4 -L_check_dist_one: - cmp edx,1 - jne L_check_window - cmp [esp+40],edi - je L_check_window - - dec edi - mov ecx, [esp+24] - mov al, [edi] - sub ecx,3 - - mov [edi+1],al - mov [edi+2],al - mov [edi+3],al - add edi,4 - rep stosb - - jmp L_while_test - -ALIGN 4 -L_test_for_second_level_length: - - - - - test al,64 - jnz L_test_for_end_of_block - - mov eax,1 - shl eax,cl - dec eax - and eax,ebp - add eax,edx - mov edx, [esp+8] - mov eax, [edx+eax*4] - jmp L_dolen - -ALIGN 4 -L_test_for_second_level_dist: - - - - - test al,64 - jnz L_invalid_distance_code - - mov eax,1 - shl eax,cl - dec eax - and eax,ebp - add eax,edx - mov edx, [esp+12] - mov eax, [edx+eax*4] - jmp L_dodist - -ALIGN 4 -L_clip_window: -; 721 "inffast.S" - mov ecx,eax - mov eax, [esp+52] - neg ecx - mov esi, [esp+56] - - cmp eax,edx - jb L_invalid_distance_too_far - - add ecx,edx - cmp dword ptr [esp+48],0 - jne L_wrap_around_window - - sub eax,ecx - add esi,eax -; 749 "inffast.S" - mov eax, [esp+24] - cmp eax,ecx - jbe L_do_copy1 - - sub eax,ecx - rep movsb - mov esi,edi - sub esi,edx - jmp L_do_copy1 - - cmp eax,ecx - jbe L_do_copy1 - - sub eax,ecx - rep movsb - mov esi,edi - sub esi,edx - jmp L_do_copy1 - -L_wrap_around_window: -; 793 "inffast.S" - mov eax, [esp+48] - cmp ecx,eax - jbe L_contiguous_in_window - - add esi, [esp+52] - add esi,eax - sub esi,ecx - sub ecx,eax - - - mov eax, [esp+24] - cmp eax,ecx - jbe L_do_copy1 - - sub eax,ecx - rep movsb - mov esi, [esp+56] - mov ecx, [esp+48] - cmp eax,ecx - jbe L_do_copy1 - - sub eax,ecx - rep movsb - mov esi,edi - sub esi,edx - jmp L_do_copy1 - -L_contiguous_in_window: -; 836 "inffast.S" - add esi,eax - sub esi,ecx - - - mov eax, [esp+24] - cmp eax,ecx - jbe L_do_copy1 - - sub eax,ecx - rep movsb - mov esi,edi - sub esi,edx - -L_do_copy1: -; 862 "inffast.S" - mov ecx,eax - rep movsb - - mov esi, [esp+44] - jmp L_while_test -; 878 "inffast.S" -ALIGN 4 -L_init_mmx: - emms - - - - - - movd mm0,ebp - mov ebp,ebx -; 896 "inffast.S" - movd mm4,dword ptr [esp+0] - movq mm3,mm4 - movd mm5,dword ptr [esp+4] - movq mm2,mm5 - pxor mm1,mm1 - mov ebx, [esp+8] - jmp L_do_loop_mmx - -ALIGN 4 -L_do_loop_mmx: - psrlq mm0,mm1 - - cmp ebp,32 - ja L_get_length_code_mmx - - movd mm6,ebp - movd mm7,dword ptr [esi] - add esi,4 - psllq mm7,mm6 - add ebp,32 - por mm0,mm7 - -L_get_length_code_mmx: - pand mm4,mm0 - movd eax,mm4 - movq mm4,mm3 - mov eax, [ebx+eax*4] - -L_dolen_mmx: - movzx ecx,ah - movd mm1,ecx - sub ebp,ecx - - test al,al - jnz L_test_for_length_base_mmx - - shr eax,16 - stosb - -L_while_test_mmx: - - - cmp [esp+16],edi - jbe L_break_loop - - cmp [esp+20],esi - ja L_do_loop_mmx - jmp L_break_loop - -L_test_for_length_base_mmx: - - mov edx,eax - shr edx,16 - - test al,16 - jz L_test_for_second_level_length_mmx - and eax,15 - jz L_decode_distance_mmx - - psrlq mm0,mm1 - movd mm1,eax - movd ecx,mm0 - sub ebp,eax - and ecx, [inflate_fast_mask+eax*4] - add edx,ecx - -L_decode_distance_mmx: - psrlq mm0,mm1 - - cmp ebp,32 - ja L_get_dist_code_mmx - - movd mm6,ebp - movd mm7,dword ptr [esi] - add esi,4 - psllq mm7,mm6 - add ebp,32 - por mm0,mm7 - -L_get_dist_code_mmx: - mov ebx, [esp+12] - pand mm5,mm0 - movd eax,mm5 - movq mm5,mm2 - mov eax, [ebx+eax*4] - -L_dodist_mmx: - - movzx ecx,ah - mov ebx,eax - shr ebx,16 - sub ebp,ecx - movd mm1,ecx - - test al,16 - jz L_test_for_second_level_dist_mmx - and eax,15 - jz L_check_dist_one_mmx - -L_add_bits_to_dist_mmx: - psrlq mm0,mm1 - movd mm1,eax - movd ecx,mm0 - sub ebp,eax - and ecx, [inflate_fast_mask+eax*4] - add ebx,ecx - -L_check_window_mmx: - mov [esp+44],esi - mov eax,edi - sub eax, [esp+40] - - cmp eax,ebx - jb L_clip_window_mmx - - mov ecx,edx - mov esi,edi - sub esi,ebx - - sub ecx,3 - mov al, [esi] - mov [edi],al - mov al, [esi+1] - mov dl, [esi+2] - add esi,3 - mov [edi+1],al - mov [edi+2],dl - add edi,3 - rep movsb - - mov esi, [esp+44] - mov ebx, [esp+8] - jmp L_while_test_mmx - -ALIGN 4 -L_check_dist_one_mmx: - cmp ebx,1 - jne L_check_window_mmx - cmp [esp+40],edi - je L_check_window_mmx - - dec edi - mov ecx,edx - mov al, [edi] - sub ecx,3 - - mov [edi+1],al - mov [edi+2],al - mov [edi+3],al - add edi,4 - rep stosb - - mov ebx, [esp+8] - jmp L_while_test_mmx - -ALIGN 4 -L_test_for_second_level_length_mmx: - test al,64 - jnz L_test_for_end_of_block - - and eax,15 - psrlq mm0,mm1 - movd ecx,mm0 - and ecx, [inflate_fast_mask+eax*4] - add ecx,edx - mov eax, [ebx+ecx*4] - jmp L_dolen_mmx - -ALIGN 4 -L_test_for_second_level_dist_mmx: - test al,64 - jnz L_invalid_distance_code - - and eax,15 - psrlq mm0,mm1 - movd ecx,mm0 - and ecx, [inflate_fast_mask+eax*4] - mov eax, [esp+12] - add ecx,ebx - mov eax, [eax+ecx*4] - jmp L_dodist_mmx - -ALIGN 4 -L_clip_window_mmx: - - mov ecx,eax - mov eax, [esp+52] - neg ecx - mov esi, [esp+56] - - cmp eax,ebx - jb L_invalid_distance_too_far - - add ecx,ebx - cmp dword ptr [esp+48],0 - jne L_wrap_around_window_mmx - - sub eax,ecx - add esi,eax - - cmp edx,ecx - jbe L_do_copy1_mmx - - sub edx,ecx - rep movsb - mov esi,edi - sub esi,ebx - jmp L_do_copy1_mmx - - cmp edx,ecx - jbe L_do_copy1_mmx - - sub edx,ecx - rep movsb - mov esi,edi - sub esi,ebx - jmp L_do_copy1_mmx - -L_wrap_around_window_mmx: - - mov eax, [esp+48] - cmp ecx,eax - jbe L_contiguous_in_window_mmx - - add esi, [esp+52] - add esi,eax - sub esi,ecx - sub ecx,eax - - - cmp edx,ecx - jbe L_do_copy1_mmx - - sub edx,ecx - rep movsb - mov esi, [esp+56] - mov ecx, [esp+48] - cmp edx,ecx - jbe L_do_copy1_mmx - - sub edx,ecx - rep movsb - mov esi,edi - sub esi,ebx - jmp L_do_copy1_mmx - -L_contiguous_in_window_mmx: - - add esi,eax - sub esi,ecx - - - cmp edx,ecx - jbe L_do_copy1_mmx - - sub edx,ecx - rep movsb - mov esi,edi - sub esi,ebx - -L_do_copy1_mmx: - - - mov ecx,edx - rep movsb - - mov esi, [esp+44] - mov ebx, [esp+8] - jmp L_while_test_mmx -; 1174 "inffast.S" -L_invalid_distance_code: - - - - - - mov ecx, invalid_distance_code_msg - mov edx,INFLATE_MODE_BAD - jmp L_update_stream_state - -L_test_for_end_of_block: - - - - - - test al,32 - jz L_invalid_literal_length_code - - mov ecx,0 - mov edx,INFLATE_MODE_TYPE - jmp L_update_stream_state - -L_invalid_literal_length_code: - - - - - - mov ecx, invalid_literal_length_code_msg - mov edx,INFLATE_MODE_BAD - jmp L_update_stream_state - -L_invalid_distance_too_far: - - - - mov esi, [esp+44] - mov ecx, invalid_distance_too_far_msg - mov edx,INFLATE_MODE_BAD - jmp L_update_stream_state - -L_update_stream_state: - - mov eax, [esp+88] - test ecx,ecx - jz L_skip_msg - mov [eax+24],ecx -L_skip_msg: - mov eax, [eax+28] - mov [eax+mode_state],edx - jmp L_break_loop - -ALIGN 4 -L_break_loop: -; 1243 "inffast.S" - cmp dword ptr [inflate_fast_use_mmx],2 - jne L_update_next_in - - - - mov ebx,ebp - -L_update_next_in: -; 1266 "inffast.S" - mov eax, [esp+88] - mov ecx,ebx - mov edx, [eax+28] - shr ecx,3 - sub esi,ecx - shl ecx,3 - sub ebx,ecx - mov [eax+12],edi - mov [edx+bits_state],ebx - mov ecx,ebx - - lea ebx, [esp+28] - cmp [esp+20],ebx - jne L_buf_not_used - - sub esi,ebx - mov ebx, [eax+0] - mov [esp+20],ebx - add esi,ebx - mov ebx, [eax+4] - sub ebx,11 - add [esp+20],ebx - -L_buf_not_used: - mov [eax+0],esi - - mov ebx,1 - shl ebx,cl - dec ebx - - - - - - cmp dword ptr [inflate_fast_use_mmx],2 - jne L_update_hold - - - - psrlq mm0,mm1 - movd ebp,mm0 - - emms - -L_update_hold: - - - - and ebp,ebx - mov [edx+hold_state],ebp - - - - - mov ebx, [esp+20] - cmp ebx,esi - jbe L_last_is_smaller - - sub ebx,esi - add ebx,11 - mov [eax+4],ebx - jmp L_fixup_out -L_last_is_smaller: - sub esi,ebx - neg esi - add esi,11 - mov [eax+4],esi - - - - -L_fixup_out: - - mov ebx, [esp+16] - cmp ebx,edi - jbe L_end_is_smaller - - sub ebx,edi - add ebx,257 - mov [eax+16],ebx - jmp L_done -L_end_is_smaller: - sub edi,ebx - neg edi - add edi,257 - mov [eax+16],edi - - - - - -L_done: - add esp,64 - popfd - pop ebx - pop ebp - pop esi - pop edi - ret -_inflate_fast endp - -_TEXT ends -end diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx86/match686.asm b/src/dependencies/zlib-1.2.11/contrib/masmx86/match686.asm deleted file mode 100644 index 3b09212..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx86/match686.asm +++ /dev/null @@ -1,479 +0,0 @@ -; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 -; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. -; File written by Gilles Vollant, by converting match686.S from Brian Raiter -; for MASM. This is as assembly version of longest_match -; from Jean-loup Gailly in deflate.c -; -; http://www.zlib.net -; http://www.winimage.com/zLibDll -; http://www.muppetlabs.com/~breadbox/software/assembly.html -; -; For Visual C++ 4.x and higher and ML 6.x and higher -; ml.exe is distributed in -; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 -; -; this file contain two implementation of longest_match -; -; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro -; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) -; -; for using an assembly version of longest_match, you need define ASMV in project -; -; compile the asm file running -; ml /coff /Zi /c /Flmatch686.lst match686.asm -; and do not include match686.obj in your project -; -; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for -; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor -; with autoselect (with cpu detection code) -; if you want support the old pentium optimization, you can still use these version -; -; this file is not optimized for old pentium, but it compatible with all x86 32 bits -; processor (starting 80386) -; -; -; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 - -;uInt longest_match(s, cur_match) -; deflate_state *s; -; IPos cur_match; /* current match */ - - NbStack equ 76 - cur_match equ dword ptr[esp+NbStack-0] - str_s equ dword ptr[esp+NbStack-4] -; 5 dword on top (ret,ebp,esi,edi,ebx) - adrret equ dword ptr[esp+NbStack-8] - pushebp equ dword ptr[esp+NbStack-12] - pushedi equ dword ptr[esp+NbStack-16] - pushesi equ dword ptr[esp+NbStack-20] - pushebx equ dword ptr[esp+NbStack-24] - - chain_length equ dword ptr [esp+NbStack-28] - limit equ dword ptr [esp+NbStack-32] - best_len equ dword ptr [esp+NbStack-36] - window equ dword ptr [esp+NbStack-40] - prev equ dword ptr [esp+NbStack-44] - scan_start equ word ptr [esp+NbStack-48] - wmask equ dword ptr [esp+NbStack-52] - match_start_ptr equ dword ptr [esp+NbStack-56] - nice_match equ dword ptr [esp+NbStack-60] - scan equ dword ptr [esp+NbStack-64] - - windowlen equ dword ptr [esp+NbStack-68] - match_start equ dword ptr [esp+NbStack-72] - strend equ dword ptr [esp+NbStack-76] - NbStackAdd equ (NbStack-24) - - .386p - - name gvmatch - .MODEL FLAT - - - -; all the +zlib1222add offsets are due to the addition of fields -; in zlib in the deflate_state structure since the asm code was first written -; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). -; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). -; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). - - zlib1222add equ 8 - -; Note : these value are good with a 8 bytes boundary pack structure - dep_chain_length equ 74h+zlib1222add - dep_window equ 30h+zlib1222add - dep_strstart equ 64h+zlib1222add - dep_prev_length equ 70h+zlib1222add - dep_nice_match equ 88h+zlib1222add - dep_w_size equ 24h+zlib1222add - dep_prev equ 38h+zlib1222add - dep_w_mask equ 2ch+zlib1222add - dep_good_match equ 84h+zlib1222add - dep_match_start equ 68h+zlib1222add - dep_lookahead equ 6ch+zlib1222add - - -_TEXT segment - -IFDEF NOUNDERLINE - public longest_match - public match_init -ELSE - public _longest_match - public _match_init -ENDIF - - MAX_MATCH equ 258 - MIN_MATCH equ 3 - MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) - - - -MAX_MATCH equ 258 -MIN_MATCH equ 3 -MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) -MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) - - -;;; stack frame offsets - -chainlenwmask equ esp + 0 ; high word: current chain len - ; low word: s->wmask -window equ esp + 4 ; local copy of s->window -windowbestlen equ esp + 8 ; s->window + bestlen -scanstart equ esp + 16 ; first two bytes of string -scanend equ esp + 12 ; last two bytes of string -scanalign equ esp + 20 ; dword-misalignment of string -nicematch equ esp + 24 ; a good enough match size -bestlen equ esp + 28 ; size of best match so far -scan equ esp + 32 ; ptr to string wanting match - -LocalVarsSize equ 36 -; saved ebx byte esp + 36 -; saved edi byte esp + 40 -; saved esi byte esp + 44 -; saved ebp byte esp + 48 -; return address byte esp + 52 -deflatestate equ esp + 56 ; the function arguments -curmatch equ esp + 60 - -;;; Offsets for fields in the deflate_state structure. These numbers -;;; are calculated from the definition of deflate_state, with the -;;; assumption that the compiler will dword-align the fields. (Thus, -;;; changing the definition of deflate_state could easily cause this -;;; program to crash horribly, without so much as a warning at -;;; compile time. Sigh.) - -dsWSize equ 36+zlib1222add -dsWMask equ 44+zlib1222add -dsWindow equ 48+zlib1222add -dsPrev equ 56+zlib1222add -dsMatchLen equ 88+zlib1222add -dsPrevMatch equ 92+zlib1222add -dsStrStart equ 100+zlib1222add -dsMatchStart equ 104+zlib1222add -dsLookahead equ 108+zlib1222add -dsPrevLen equ 112+zlib1222add -dsMaxChainLen equ 116+zlib1222add -dsGoodMatch equ 132+zlib1222add -dsNiceMatch equ 136+zlib1222add - - -;;; match686.asm -- Pentium-Pro-optimized version of longest_match() -;;; Written for zlib 1.1.2 -;;; Copyright (C) 1998 Brian Raiter -;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html -;;; -;; -;; This software is provided 'as-is', without any express or implied -;; warranty. In no event will the authors be held liable for any damages -;; arising from the use of this software. -;; -;; Permission is granted to anyone to use this software for any purpose, -;; including commercial applications, and to alter it and redistribute it -;; freely, subject to the following restrictions: -;; -;; 1. The origin of this software must not be misrepresented; you must not -;; claim that you wrote the original software. If you use this software -;; in a product, an acknowledgment in the product documentation would be -;; appreciated but is not required. -;; 2. Altered source versions must be plainly marked as such, and must not be -;; misrepresented as being the original software -;; 3. This notice may not be removed or altered from any source distribution. -;; - -;GLOBAL _longest_match, _match_init - - -;SECTION .text - -;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) - -;_longest_match: - IFDEF NOUNDERLINE - longest_match proc near - ELSE - _longest_match proc near - ENDIF -.FPO (9, 4, 0, 0, 1, 0) - -;;; Save registers that the compiler may be using, and adjust esp to -;;; make room for our stack frame. - - push ebp - push edi - push esi - push ebx - sub esp, LocalVarsSize - -;;; Retrieve the function arguments. ecx will hold cur_match -;;; throughout the entire function. edx will hold the pointer to the -;;; deflate_state structure during the function's setup (before -;;; entering the main loop. - - mov edx, [deflatestate] - mov ecx, [curmatch] - -;;; uInt wmask = s->w_mask; -;;; unsigned chain_length = s->max_chain_length; -;;; if (s->prev_length >= s->good_match) { -;;; chain_length >>= 2; -;;; } - - mov eax, [edx + dsPrevLen] - mov ebx, [edx + dsGoodMatch] - cmp eax, ebx - mov eax, [edx + dsWMask] - mov ebx, [edx + dsMaxChainLen] - jl LastMatchGood - shr ebx, 2 -LastMatchGood: - -;;; chainlen is decremented once beforehand so that the function can -;;; use the sign flag instead of the zero flag for the exit test. -;;; It is then shifted into the high word, to make room for the wmask -;;; value, which it will always accompany. - - dec ebx - shl ebx, 16 - or ebx, eax - mov [chainlenwmask], ebx - -;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - mov eax, [edx + dsNiceMatch] - mov ebx, [edx + dsLookahead] - cmp ebx, eax - jl LookaheadLess - mov ebx, eax -LookaheadLess: mov [nicematch], ebx - -;;; register Bytef *scan = s->window + s->strstart; - - mov esi, [edx + dsWindow] - mov [window], esi - mov ebp, [edx + dsStrStart] - lea edi, [esi + ebp] - mov [scan], edi - -;;; Determine how many bytes the scan ptr is off from being -;;; dword-aligned. - - mov eax, edi - neg eax - and eax, 3 - mov [scanalign], eax - -;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? -;;; s->strstart - (IPos)MAX_DIST(s) : NIL; - - mov eax, [edx + dsWSize] - sub eax, MIN_LOOKAHEAD - sub ebp, eax - jg LimitPositive - xor ebp, ebp -LimitPositive: - -;;; int best_len = s->prev_length; - - mov eax, [edx + dsPrevLen] - mov [bestlen], eax - -;;; Store the sum of s->window + best_len in esi locally, and in esi. - - add esi, eax - mov [windowbestlen], esi - -;;; register ush scan_start = *(ushf*)scan; -;;; register ush scan_end = *(ushf*)(scan+best_len-1); -;;; Posf *prev = s->prev; - - movzx ebx, word ptr [edi] - mov [scanstart], ebx - movzx ebx, word ptr [edi + eax - 1] - mov [scanend], ebx - mov edi, [edx + dsPrev] - -;;; Jump into the main loop. - - mov edx, [chainlenwmask] - jmp short LoopEntry - -align 4 - -;;; do { -;;; match = s->window + cur_match; -;;; if (*(ushf*)(match+best_len-1) != scan_end || -;;; *(ushf*)match != scan_start) continue; -;;; [...] -;;; } while ((cur_match = prev[cur_match & wmask]) > limit -;;; && --chain_length != 0); -;;; -;;; Here is the inner loop of the function. The function will spend the -;;; majority of its time in this loop, and majority of that time will -;;; be spent in the first ten instructions. -;;; -;;; Within this loop: -;;; ebx = scanend -;;; ecx = curmatch -;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) -;;; esi = windowbestlen - i.e., (window + bestlen) -;;; edi = prev -;;; ebp = limit - -LookupLoop: - and ecx, edx - movzx ecx, word ptr [edi + ecx*2] - cmp ecx, ebp - jbe LeaveNow - sub edx, 00010000h - js LeaveNow -LoopEntry: movzx eax, word ptr [esi + ecx - 1] - cmp eax, ebx - jnz LookupLoop - mov eax, [window] - movzx eax, word ptr [eax + ecx] - cmp eax, [scanstart] - jnz LookupLoop - -;;; Store the current value of chainlen. - - mov [chainlenwmask], edx - -;;; Point edi to the string under scrutiny, and esi to the string we -;;; are hoping to match it up with. In actuality, esi and edi are -;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is -;;; initialized to -(MAX_MATCH_8 - scanalign). - - mov esi, [window] - mov edi, [scan] - add esi, ecx - mov eax, [scanalign] - mov edx, 0fffffef8h; -(MAX_MATCH_8) - lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] - lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] - -;;; Test the strings for equality, 8 bytes at a time. At the end, -;;; adjust edx so that it is offset to the exact byte that mismatched. -;;; -;;; We already know at this point that the first three bytes of the -;;; strings match each other, and they can be safely passed over before -;;; starting the compare loop. So what this code does is skip over 0-3 -;;; bytes, as much as necessary in order to dword-align the edi -;;; pointer. (esi will still be misaligned three times out of four.) -;;; -;;; It should be confessed that this loop usually does not represent -;;; much of the total running time. Replacing it with a more -;;; straightforward "rep cmpsb" would not drastically degrade -;;; performance. - -LoopCmps: - mov eax, [esi + edx] - xor eax, [edi + edx] - jnz LeaveLoopCmps - mov eax, [esi + edx + 4] - xor eax, [edi + edx + 4] - jnz LeaveLoopCmps4 - add edx, 8 - jnz LoopCmps - jmp short LenMaximum -LeaveLoopCmps4: add edx, 4 -LeaveLoopCmps: test eax, 0000FFFFh - jnz LenLower - add edx, 2 - shr eax, 16 -LenLower: sub al, 1 - adc edx, 0 - -;;; Calculate the length of the match. If it is longer than MAX_MATCH, -;;; then automatically accept it as the best possible match and leave. - - lea eax, [edi + edx] - mov edi, [scan] - sub eax, edi - cmp eax, MAX_MATCH - jge LenMaximum - -;;; If the length of the match is not longer than the best match we -;;; have so far, then forget it and return to the lookup loop. - - mov edx, [deflatestate] - mov ebx, [bestlen] - cmp eax, ebx - jg LongerMatch - mov esi, [windowbestlen] - mov edi, [edx + dsPrev] - mov ebx, [scanend] - mov edx, [chainlenwmask] - jmp LookupLoop - -;;; s->match_start = cur_match; -;;; best_len = len; -;;; if (len >= nice_match) break; -;;; scan_end = *(ushf*)(scan+best_len-1); - -LongerMatch: mov ebx, [nicematch] - mov [bestlen], eax - mov [edx + dsMatchStart], ecx - cmp eax, ebx - jge LeaveNow - mov esi, [window] - add esi, eax - mov [windowbestlen], esi - movzx ebx, word ptr [edi + eax - 1] - mov edi, [edx + dsPrev] - mov [scanend], ebx - mov edx, [chainlenwmask] - jmp LookupLoop - -;;; Accept the current string, with the maximum possible length. - -LenMaximum: mov edx, [deflatestate] - mov dword ptr [bestlen], MAX_MATCH - mov [edx + dsMatchStart], ecx - -;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; -;;; return s->lookahead; - -LeaveNow: - mov edx, [deflatestate] - mov ebx, [bestlen] - mov eax, [edx + dsLookahead] - cmp ebx, eax - jg LookaheadRet - mov eax, ebx -LookaheadRet: - -;;; Restore the stack and return from whence we came. - - add esp, LocalVarsSize - pop ebx - pop esi - pop edi - pop ebp - - ret -; please don't remove this string ! -; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! - db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah - - - IFDEF NOUNDERLINE - longest_match endp - ELSE - _longest_match endp - ENDIF - - IFDEF NOUNDERLINE - match_init proc near - ret - match_init endp - ELSE - _match_init proc near - ret - _match_init endp - ENDIF - - -_TEXT ends -end diff --git a/src/dependencies/zlib-1.2.11/contrib/masmx86/readme.txt b/src/dependencies/zlib-1.2.11/contrib/masmx86/readme.txt deleted file mode 100644 index 3271f72..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/masmx86/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ - -Summary -------- -This directory contains ASM implementations of the functions -longest_match() and inflate_fast(). - - -Use instructions ----------------- -Assemble using MASM, and copy the object files into the zlib source -directory, then run the appropriate makefile, as suggested below. You can -donwload MASM from here: - - http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 - -You can also get objects files here: - - http://www.winimage.com/zLibDll/zlib124_masm_obj.zip - -Build instructions ------------------- -* With Microsoft C and MASM: -nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" - -* With Borland C and TASM: -make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc b/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc deleted file mode 100644 index fee177a..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc +++ /dev/null @@ -1,32 +0,0 @@ -#include - -#define IDR_VERSION1 1 -IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK - FILEFLAGS 0 - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE 0 // not used -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - //language ID = U.S. English, char set = Windows, Multilingual - - BEGIN - VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" - VALUE "InternalName", "zlib\0" - VALUE "OriginalFilename", "zlibwapi.dll\0" - VALUE "ProductName", "ZLib.DLL\0" - VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def b/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def deleted file mode 100644 index 54e683d..0000000 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def +++ /dev/null @@ -1,153 +0,0 @@ -LIBRARY -; zlib data compression and ZIP file I/O library - -VERSION 1.2 - -EXPORTS - adler32 @1 - compress @2 - crc32 @3 - deflate @4 - deflateCopy @5 - deflateEnd @6 - deflateInit2_ @7 - deflateInit_ @8 - deflateParams @9 - deflateReset @10 - deflateSetDictionary @11 - gzclose @12 - gzdopen @13 - gzerror @14 - gzflush @15 - gzopen @16 - gzread @17 - gzwrite @18 - inflate @19 - inflateEnd @20 - inflateInit2_ @21 - inflateInit_ @22 - inflateReset @23 - inflateSetDictionary @24 - inflateSync @25 - uncompress @26 - zlibVersion @27 - gzprintf @28 - gzputc @29 - gzgetc @30 - gzseek @31 - gzrewind @32 - gztell @33 - gzeof @34 - gzsetparams @35 - zError @36 - inflateSyncPoint @37 - get_crc_table @38 - compress2 @39 - gzputs @40 - gzgets @41 - inflateCopy @42 - inflateBackInit_ @43 - inflateBack @44 - inflateBackEnd @45 - compressBound @46 - deflateBound @47 - gzclearerr @48 - gzungetc @49 - zlibCompileFlags @50 - deflatePrime @51 - deflatePending @52 - - unzOpen @61 - unzClose @62 - unzGetGlobalInfo @63 - unzGetCurrentFileInfo @64 - unzGoToFirstFile @65 - unzGoToNextFile @66 - unzOpenCurrentFile @67 - unzReadCurrentFile @68 - unzOpenCurrentFile3 @69 - unztell @70 - unzeof @71 - unzCloseCurrentFile @72 - unzGetGlobalComment @73 - unzStringFileNameCompare @74 - unzLocateFile @75 - unzGetLocalExtrafield @76 - unzOpen2 @77 - unzOpenCurrentFile2 @78 - unzOpenCurrentFilePassword @79 - - zipOpen @80 - zipOpenNewFileInZip @81 - zipWriteInFileInZip @82 - zipCloseFileInZip @83 - zipClose @84 - zipOpenNewFileInZip2 @86 - zipCloseFileInZipRaw @87 - zipOpen2 @88 - zipOpenNewFileInZip3 @89 - - unzGetFilePos @100 - unzGoToFilePos @101 - - fill_win32_filefunc @110 - -; zlibwapi v1.2.4 added: - fill_win32_filefunc64 @111 - fill_win32_filefunc64A @112 - fill_win32_filefunc64W @113 - - unzOpen64 @120 - unzOpen2_64 @121 - unzGetGlobalInfo64 @122 - unzGetCurrentFileInfo64 @124 - unzGetCurrentFileZStreamPos64 @125 - unztell64 @126 - unzGetFilePos64 @127 - unzGoToFilePos64 @128 - - zipOpen64 @130 - zipOpen2_64 @131 - zipOpenNewFileInZip64 @132 - zipOpenNewFileInZip2_64 @133 - zipOpenNewFileInZip3_64 @134 - zipOpenNewFileInZip4_64 @135 - zipCloseFileInZipRaw64 @136 - -; zlib1 v1.2.4 added: - adler32_combine @140 - crc32_combine @142 - deflateSetHeader @144 - deflateTune @145 - gzbuffer @146 - gzclose_r @147 - gzclose_w @148 - gzdirect @149 - gzoffset @150 - inflateGetHeader @156 - inflateMark @157 - inflatePrime @158 - inflateReset2 @159 - inflateUndermine @160 - -; zlib1 v1.2.6 added: - gzgetc_ @161 - inflateResetKeep @163 - deflateResetKeep @164 - -; zlib1 v1.2.7 added: - gzopen_w @165 - -; zlib1 v1.2.8 added: - inflateGetDictionary @166 - gzvprintf @167 - -; zlib1 v1.2.9 added: - inflateCodesUsed @168 - inflateValidate @169 - uncompress2 @170 - gzfread @171 - gzfwrite @172 - deflateGetDictionary @173 - adler32_z @174 - crc32_z @175 diff --git a/src/dependencies/zlib-1.2.11/crc32.c b/src/dependencies/zlib-1.2.11/crc32.c deleted file mode 100644 index 9580440..0000000 --- a/src/dependencies/zlib-1.2.11/crc32.c +++ /dev/null @@ -1,442 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR -#endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, z_size_t)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, z_size_t)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); - - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const z_crc_t FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", - (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const z_crc_t FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - return crc32_z(crc, buf, len); -} - -#ifdef BYFOUR - -/* - This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit - integer pointer type. This violates the strict aliasing rule, where a - compiler can assume, for optimization purposes, that two pointers to - fundamentally different types won't ever point to the same memory. This can - manifest as a problem only if one of the pointers is written to. This code - only reads from those pointers. So long as this code remains isolated in - this compilation unit, there won't be a problem. For this reason, this code - should not be copied and pasted into a compilation unit in which other code - writes to the buffer that is passed to these routines. - */ - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *buf4++; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} diff --git a/src/dependencies/zlib-1.2.11/crc32.h b/src/dependencies/zlib-1.2.11/crc32.h deleted file mode 100644 index 9e0c778..0000000 --- a/src/dependencies/zlib-1.2.11/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/src/dependencies/zlib-1.2.11/examples/enough.c b/src/dependencies/zlib-1.2.11/examples/enough.c deleted file mode 100644 index b991144..0000000 --- a/src/dependencies/zlib-1.2.11/examples/enough.c +++ /dev/null @@ -1,572 +0,0 @@ -/* enough.c -- determine the maximum size of inflate's Huffman code tables over - * all possible valid and complete Huffman codes, subject to a length limit. - * Copyright (C) 2007, 2008, 2012 Mark Adler - * Version 1.4 18 August 2012 Mark Adler - */ - -/* Version history: - 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4) - 1.1 4 Jan 2007 Use faster incremental table usage computation - Prune examine() search on previously visited states - 1.2 5 Jan 2007 Comments clean up - As inflate does, decrease root for short codes - Refuse cases where inflate would increase root - 1.3 17 Feb 2008 Add argument for initial root table size - Fix bug for initial root table size == max - 1 - Use a macro to compute the history index - 1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!) - Clean up comparisons of different types - Clean up code indentation - */ - -/* - Examine all possible Huffman codes for a given number of symbols and a - maximum code length in bits to determine the maximum table size for zilb's - inflate. Only complete Huffman codes are counted. - - Two codes are considered distinct if the vectors of the number of codes per - length are not identical. So permutations of the symbol assignments result - in the same code for the counting, as do permutations of the assignments of - the bit values to the codes (i.e. only canonical codes are counted). - - We build a code from shorter to longer lengths, determining how many symbols - are coded at each length. At each step, we have how many symbols remain to - be coded, what the last code length used was, and how many bit patterns of - that length remain unused. Then we add one to the code length and double the - number of unused patterns to graduate to the next code length. We then - assign all portions of the remaining symbols to that code length that - preserve the properties of a correct and eventually complete code. Those - properties are: we cannot use more bit patterns than are available; and when - all the symbols are used, there are exactly zero possible bit patterns - remaining. - - The inflate Huffman decoding algorithm uses two-level lookup tables for - speed. There is a single first-level table to decode codes up to root bits - in length (root == 9 in the current inflate implementation). The table - has 1 << root entries and is indexed by the next root bits of input. Codes - shorter than root bits have replicated table entries, so that the correct - entry is pointed to regardless of the bits that follow the short code. If - the code is longer than root bits, then the table entry points to a second- - level table. The size of that table is determined by the longest code with - that root-bit prefix. If that longest code has length len, then the table - has size 1 << (len - root), to index the remaining bits in that set of - codes. Each subsequent root-bit prefix then has its own sub-table. The - total number of table entries required by the code is calculated - incrementally as the number of codes at each bit length is populated. When - all of the codes are shorter than root bits, then root is reduced to the - longest code length, resulting in a single, smaller, one-level table. - - The inflate algorithm also provides for small values of root (relative to - the log2 of the number of symbols), where the shortest code has more bits - than root. In that case, root is increased to the length of the shortest - code. This program, by design, does not handle that case, so it is verified - that the number of symbols is less than 2^(root + 1). - - In order to speed up the examination (by about ten orders of magnitude for - the default arguments), the intermediate states in the build-up of a code - are remembered and previously visited branches are pruned. The memory - required for this will increase rapidly with the total number of symbols and - the maximum code length in bits. However this is a very small price to pay - for the vast speedup. - - First, all of the possible Huffman codes are counted, and reachable - intermediate states are noted by a non-zero count in a saved-results array. - Second, the intermediate states that lead to (root + 1) bit or longer codes - are used to look at all sub-codes from those junctures for their inflate - memory usage. (The amount of memory used is not affected by the number of - codes of root bits or less in length.) Third, the visited states in the - construction of those sub-codes and the associated calculation of the table - size is recalled in order to avoid recalculating from the same juncture. - Beginning the code examination at (root + 1) bit codes, which is enabled by - identifying the reachable nodes, accounts for about six of the orders of - magnitude of improvement for the default arguments. About another four - orders of magnitude come from not revisiting previous states. Out of - approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes - need to be examined to cover all of the possible table memory usage cases - for the default arguments of 286 symbols limited to 15-bit codes. - - Note that an unsigned long long type is used for counting. It is quite easy - to exceed the capacity of an eight-byte integer with a large number of - symbols and a large maximum code length, so multiple-precision arithmetic - would need to replace the unsigned long long arithmetic in that case. This - program will abort if an overflow occurs. The big_t type identifies where - the counting takes place. - - An unsigned long long type is also used for calculating the number of - possible codes remaining at the maximum length. This limits the maximum - code length to the number of bits in a long long minus the number of bits - needed to represent the symbols in a flat code. The code_t type identifies - where the bit pattern counting takes place. - */ - -#include -#include -#include -#include - -#define local static - -/* special data types */ -typedef unsigned long long big_t; /* type for code counting */ -typedef unsigned long long code_t; /* type for bit pattern counting */ -struct tab { /* type for been here check */ - size_t len; /* length of bit vector in char's */ - char *vec; /* allocated bit vector */ -}; - -/* The array for saving results, num[], is indexed with this triplet: - - syms: number of symbols remaining to code - left: number of available bit patterns at length len - len: number of bits in the codes currently being assigned - - Those indices are constrained thusly when saving results: - - syms: 3..totsym (totsym == total symbols to code) - left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) - len: 1..max - 1 (max == maximum code length in bits) - - syms == 2 is not saved since that immediately leads to a single code. left - must be even, since it represents the number of available bit patterns at - the current length, which is double the number at the previous length. - left ends at syms-1 since left == syms immediately results in a single code. - (left > sym is not allowed since that would result in an incomplete code.) - len is less than max, since the code completes immediately when len == max. - - The offset into the array is calculated for the three indices with the - first one (syms) being outermost, and the last one (len) being innermost. - We build the array with length max-1 lists for the len index, with syms-3 - of those for each symbol. There are totsym-2 of those, with each one - varying in length as a function of sym. See the calculation of index in - count() for the index, and the calculation of size in main() for the size - of the array. - - For the deflate example of 286 symbols limited to 15-bit codes, the array - has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than - half of the space allocated for saved results is actually used -- not all - possible triplets are reached in the generation of valid Huffman codes. - */ - -/* The array for tracking visited states, done[], is itself indexed identically - to the num[] array as described above for the (syms, left, len) triplet. - Each element in the array is further indexed by the (mem, rem) doublet, - where mem is the amount of inflate table space used so far, and rem is the - remaining unused entries in the current inflate sub-table. Each indexed - element is simply one bit indicating whether the state has been visited or - not. Since the ranges for mem and rem are not known a priori, each bit - vector is of a variable size, and grows as needed to accommodate the visited - states. mem and rem are used to calculate a single index in a triangular - array. Since the range of mem is expected in the default case to be about - ten times larger than the range of rem, the array is skewed to reduce the - memory usage, with eight times the range for mem than for rem. See the - calculations for offset and bit in beenhere() for the details. - - For the deflate example of 286 symbols limited to 15-bit codes, the bit - vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] - array itself. - */ - -/* Globals to avoid propagating constants or constant pointers recursively */ -local int max; /* maximum allowed bit length for the codes */ -local int root; /* size of base code table in bits */ -local int large; /* largest code table so far */ -local size_t size; /* number of elements in num and done */ -local int *code; /* number of symbols assigned to each bit length */ -local big_t *num; /* saved results array for code counting */ -local struct tab *done; /* states already evaluated array */ - -/* Index function for num[] and done[] */ -#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) - -/* Free allocated space. Uses globals code, num, and done. */ -local void cleanup(void) -{ - size_t n; - - if (done != NULL) { - for (n = 0; n < size; n++) - if (done[n].len) - free(done[n].vec); - free(done); - } - if (num != NULL) - free(num); - if (code != NULL) - free(code); -} - -/* Return the number of possible Huffman codes using bit patterns of lengths - len through max inclusive, coding syms symbols, with left bit patterns of - length len unused -- return -1 if there is an overflow in the counting. - Keep a record of previous results in num to prevent repeating the same - calculation. Uses the globals max and num. */ -local big_t count(int syms, int len, int left) -{ - big_t sum; /* number of possible codes from this juncture */ - big_t got; /* value returned from count() */ - int least; /* least number of syms to use at this juncture */ - int most; /* most number of syms to use at this juncture */ - int use; /* number of bit patterns to use in next call */ - size_t index; /* index of this case in *num */ - - /* see if only one possible code */ - if (syms == left) - return 1; - - /* note and verify the expected state */ - assert(syms > left && left > 0 && len < max); - - /* see if we've done this one already */ - index = INDEX(syms, left, len); - got = num[index]; - if (got) - return got; /* we have -- return the saved result */ - - /* we need to use at least this many bit patterns so that the code won't be - incomplete at the next length (more bit patterns than symbols) */ - least = (left << 1) - syms; - if (least < 0) - least = 0; - - /* we can use at most this many bit patterns, lest there not be enough - available for the remaining symbols at the maximum length (if there were - no limit to the code length, this would become: most = left - 1) */ - most = (((code_t)left << (max - len)) - syms) / - (((code_t)1 << (max - len)) - 1); - - /* count all possible codes from this juncture and add them up */ - sum = 0; - for (use = least; use <= most; use++) { - got = count(syms - use, len + 1, (left - use) << 1); - sum += got; - if (got == (big_t)0 - 1 || sum < got) /* overflow */ - return (big_t)0 - 1; - } - - /* verify that all recursive calls are productive */ - assert(sum != 0); - - /* save the result and return it */ - num[index] = sum; - return sum; -} - -/* Return true if we've been here before, set to true if not. Set a bit in a - bit vector to indicate visiting this state. Each (syms,len,left) state - has a variable size bit vector indexed by (mem,rem). The bit vector is - lengthened if needed to allow setting the (mem,rem) bit. */ -local int beenhere(int syms, int len, int left, int mem, int rem) -{ - size_t index; /* index for this state's bit vector */ - size_t offset; /* offset in this state's bit vector */ - int bit; /* mask for this state's bit */ - size_t length; /* length of the bit vector in bytes */ - char *vector; /* new or enlarged bit vector */ - - /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ - index = INDEX(syms, left, len); - mem -= 1 << root; - offset = (mem >> 3) + rem; - offset = ((offset * (offset + 1)) >> 1) + rem; - bit = 1 << (mem & 7); - - /* see if we've been here */ - length = done[index].len; - if (offset < length && (done[index].vec[offset] & bit) != 0) - return 1; /* done this! */ - - /* we haven't been here before -- set the bit to show we have now */ - - /* see if we need to lengthen the vector in order to set the bit */ - if (length <= offset) { - /* if we have one already, enlarge it, zero out the appended space */ - if (length) { - do { - length <<= 1; - } while (length <= offset); - vector = realloc(done[index].vec, length); - if (vector != NULL) - memset(vector + done[index].len, 0, length - done[index].len); - } - - /* otherwise we need to make a new vector and zero it out */ - else { - length = 1 << (len - root); - while (length <= offset) - length <<= 1; - vector = calloc(length, sizeof(char)); - } - - /* in either case, bail if we can't get the memory */ - if (vector == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - exit(1); - } - - /* install the new vector */ - done[index].len = length; - done[index].vec = vector; - } - - /* set the bit */ - done[index].vec[offset] |= bit; - return 0; -} - -/* Examine all possible codes from the given node (syms, len, left). Compute - the amount of memory required to build inflate's decoding tables, where the - number of code structures used so far is mem, and the number remaining in - the current sub-table is rem. Uses the globals max, code, root, large, and - done. */ -local void examine(int syms, int len, int left, int mem, int rem) -{ - int least; /* least number of syms to use at this juncture */ - int most; /* most number of syms to use at this juncture */ - int use; /* number of bit patterns to use in next call */ - - /* see if we have a complete code */ - if (syms == left) { - /* set the last code entry */ - code[len] = left; - - /* complete computation of memory used by this code */ - while (rem < left) { - left -= rem; - rem = 1 << (len - root); - mem += rem; - } - assert(rem == left); - - /* if this is a new maximum, show the entries used and the sub-code */ - if (mem > large) { - large = mem; - printf("max %d: ", mem); - for (use = root + 1; use <= max; use++) - if (code[use]) - printf("%d[%d] ", code[use], use); - putchar('\n'); - fflush(stdout); - } - - /* remove entries as we drop back down in the recursion */ - code[len] = 0; - return; - } - - /* prune the tree if we can */ - if (beenhere(syms, len, left, mem, rem)) - return; - - /* we need to use at least this many bit patterns so that the code won't be - incomplete at the next length (more bit patterns than symbols) */ - least = (left << 1) - syms; - if (least < 0) - least = 0; - - /* we can use at most this many bit patterns, lest there not be enough - available for the remaining symbols at the maximum length (if there were - no limit to the code length, this would become: most = left - 1) */ - most = (((code_t)left << (max - len)) - syms) / - (((code_t)1 << (max - len)) - 1); - - /* occupy least table spaces, creating new sub-tables as needed */ - use = least; - while (rem < use) { - use -= rem; - rem = 1 << (len - root); - mem += rem; - } - rem -= use; - - /* examine codes from here, updating table space as we go */ - for (use = least; use <= most; use++) { - code[len] = use; - examine(syms - use, len + 1, (left - use) << 1, - mem + (rem ? 1 << (len - root) : 0), rem << 1); - if (rem == 0) { - rem = 1 << (len - root); - mem += rem; - } - rem--; - } - - /* remove entries as we drop back down in the recursion */ - code[len] = 0; -} - -/* Look at all sub-codes starting with root + 1 bits. Look at only the valid - intermediate code states (syms, left, len). For each completed code, - calculate the amount of memory required by inflate to build the decoding - tables. Find the maximum amount of memory required and show the code that - requires that maximum. Uses the globals max, root, and num. */ -local void enough(int syms) -{ - int n; /* number of remaing symbols for this node */ - int left; /* number of unused bit patterns at this length */ - size_t index; /* index of this case in *num */ - - /* clear code */ - for (n = 0; n <= max; n++) - code[n] = 0; - - /* look at all (root + 1) bit and longer codes */ - large = 1 << root; /* base table */ - if (root < max) /* otherwise, there's only a base table */ - for (n = 3; n <= syms; n++) - for (left = 2; left < n; left += 2) - { - /* look at all reachable (root + 1) bit nodes, and the - resulting codes (complete at root + 2 or more) */ - index = INDEX(n, left, root + 1); - if (root + 1 < max && num[index]) /* reachable node */ - examine(n, root + 1, left, 1 << root, 0); - - /* also look at root bit codes with completions at root + 1 - bits (not saved in num, since complete), just in case */ - if (num[index - 1] && n <= left << 1) - examine((n - left) << 1, root + 1, (n - left) << 1, - 1 << root, 0); - } - - /* done */ - printf("done: maximum of %d table entries\n", large); -} - -/* - Examine and show the total number of possible Huffman codes for a given - maximum number of symbols, initial root table size, and maximum code length - in bits -- those are the command arguments in that order. The default - values are 286, 9, and 15 respectively, for the deflate literal/length code. - The possible codes are counted for each number of coded symbols from two to - the maximum. The counts for each of those and the total number of codes are - shown. The maximum number of inflate table entires is then calculated - across all possible codes. Each new maximum number of table entries and the - associated sub-code (starting at root + 1 == 10 bits) is shown. - - To count and examine Huffman codes that are not length-limited, provide a - maximum length equal to the number of symbols minus one. - - For the deflate literal/length code, use "enough". For the deflate distance - code, use "enough 30 6". - - This uses the %llu printf format to print big_t numbers, which assumes that - big_t is an unsigned long long. If the big_t type is changed (for example - to a multiple precision type), the method of printing will also need to be - updated. - */ -int main(int argc, char **argv) -{ - int syms; /* total number of symbols to code */ - int n; /* number of symbols to code for this run */ - big_t got; /* return value of count() */ - big_t sum; /* accumulated number of codes over n */ - code_t word; /* for counting bits in code_t */ - - /* set up globals for cleanup() */ - code = NULL; - num = NULL; - done = NULL; - - /* get arguments -- default to the deflate literal/length code */ - syms = 286; - root = 9; - max = 15; - if (argc > 1) { - syms = atoi(argv[1]); - if (argc > 2) { - root = atoi(argv[2]); - if (argc > 3) - max = atoi(argv[3]); - } - } - if (argc > 4 || syms < 2 || root < 1 || max < 1) { - fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", - stderr); - return 1; - } - - /* if not restricting the code length, the longest is syms - 1 */ - if (max > syms - 1) - max = syms - 1; - - /* determine the number of bits in a code_t */ - for (n = 0, word = 1; word; n++, word <<= 1) - ; - - /* make sure that the calculation of most will not overflow */ - if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) { - fputs("abort: code length too long for internal types\n", stderr); - return 1; - } - - /* reject impossible code requests */ - if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) { - fprintf(stderr, "%d symbols cannot be coded in %d bits\n", - syms, max); - return 1; - } - - /* allocate code vector */ - code = calloc(max + 1, sizeof(int)); - if (code == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - return 1; - } - - /* determine size of saved results array, checking for overflows, - allocate and clear the array (set all to zero with calloc()) */ - if (syms == 2) /* iff max == 1 */ - num = NULL; /* won't be saving any results */ - else { - size = syms >> 1; - if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || - (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || - (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || - (num = calloc(size, sizeof(big_t))) == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - return 1; - } - } - - /* count possible codes for all numbers of symbols, add up counts */ - sum = 0; - for (n = 2; n <= syms; n++) { - got = count(n, 1, 2); - sum += got; - if (got == (big_t)0 - 1 || sum < got) { /* overflow */ - fputs("abort: can't count that high!\n", stderr); - cleanup(); - return 1; - } - printf("%llu %d-codes\n", got, n); - } - printf("%llu total codes for 2 to %d symbols", sum, syms); - if (max < syms - 1) - printf(" (%d-bit length limit)\n", max); - else - puts(" (no length limit)"); - - /* allocate and clear done array for beenhere() */ - if (syms == 2) - done = NULL; - else if (size > ((size_t)0 - 1) / sizeof(struct tab) || - (done = calloc(size, sizeof(struct tab))) == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - return 1; - } - - /* find and show maximum inflate table usage */ - if (root > max) /* reduce root to max length */ - root = max; - if ((code_t)syms < ((code_t)1 << (root + 1))) - enough(syms); - else - puts("cannot handle minimum code lengths > root"); - - /* done */ - cleanup(); - return 0; -} diff --git a/src/dependencies/zlib-1.2.11/zlib.3.pdf b/src/dependencies/zlib-1.2.11/zlib.3.pdf deleted file mode 100644 index 6fa519c5bdf5df33b2f17549e1df142c619c916c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19318 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 8 to avoid a bug in the encoder for a window size - of 256 bytes. (A complete fix will be available in 1.1.5). + of 256 bytes. (A complete fix will be available in 1.1.5) Changes in 1.1.3 (9 July 1998) - fix "an inflate input buffer bug that shows up on rare but persistent @@ -1117,7 +1192,7 @@ Changes in 1.1.1 (27 Feb 98) - remove block truncation heuristic which had very marginal effect for zlib (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the compression ratio on some files. This also allows inlining _tr_tally for - matches in deflate_slow. + matches in deflate_slow - added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) Changes in 1.1.0 (24 Feb 98) @@ -1148,7 +1223,7 @@ Changes in 1.0.9 (17 Feb 1998) - Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 - in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) - in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with - the declaration of FAR (Gilles VOllant) + the declaration of FAR (Gilles Vollant) - install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) - read_buf buf parameter of type Bytef* instead of charf* - zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) @@ -1162,7 +1237,7 @@ Changes in 1.0.8 (27 Jan 1998) - include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) - use constant arrays for the static trees in trees.c instead of computing them at run time (thanks to Ken Raeburn for this suggestion). To create - trees.h, compile with GEN_TREES_H and run "make test". + trees.h, compile with GEN_TREES_H and run "make test" - check return code of example in "make test" and display result - pass minigzip command line options to file_compress - simplifying code of inflateSync to avoid gcc 2.8 bug @@ -1201,12 +1276,12 @@ Changes in 1.0.6 (19 Jan 1998) - add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) - Fix a deflate bug occurring only with compression level 0 (thanks to - Andy Buckler for finding this one). -- In minigzip, pass transparently also the first byte for .Z files. + Andy Buckler for finding this one) +- In minigzip, pass transparently also the first byte for .Z files - return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() - check Z_FINISH in inflate (thanks to Marc Schluper) - Implement deflateCopy (thanks to Adam Costello) -- make static libraries by default in configure, add --shared option. +- make static libraries by default in configure, add --shared option - move MSDOS or Windows specific files to directory msdos - suppress the notion of partial flush to simplify the interface (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) @@ -1218,7 +1293,7 @@ Changes in 1.0.6 (19 Jan 1998) - added Makefile.nt (thanks to Stephen Williams) - added the unsupported "contrib" directory: contrib/asm386/ by Gilles Vollant - 386 asm code replacing longest_match(). + 386 asm code replacing longest_match() contrib/iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions contrib/iostream2/ by Tyge Løvset @@ -1226,7 +1301,7 @@ Changes in 1.0.6 (19 Jan 1998) contrib/untgz/ by "Pedro A. Aranda Guti\irrez" A very simple tar.gz file extractor using zlib contrib/visual-basic.txt by Carlos Rios - How to use compress(), uncompress() and the gz* functions from VB. + How to use compress(), uncompress() and the gz* functions from VB - pass params -f (filtered data), -h (huffman only), -1 to -9 (compression level) in minigzip (thanks to Tom Lane) @@ -1235,8 +1310,8 @@ Changes in 1.0.6 (19 Jan 1998) - add undocumented function inflateSyncPoint() (hack for Paul Mackerras) - add undocumented function zError to convert error code to string (for Tim Smithers) -- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. -- Use default memcpy for Symantec MSDOS compiler. +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code +- Use default memcpy for Symantec MSDOS compiler - Add EXPORT keyword for check_func (needed for Windows DLL) - add current directory to LD_LIBRARY_PATH for "make test" - create also a link for libz.so.1 @@ -1249,7 +1324,7 @@ Changes in 1.0.6 (19 Jan 1998) - allow compilation with ANSI keywords only enabled for TurboC in large model - avoid "versionString"[0] (Borland bug) - add NEED_DUMMY_RETURN for Borland -- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch) - allow compilation with CC - defined STDC for OS/2 (David Charlap) - limit external names to 8 chars for MVS (Thomas Lund) @@ -1259,7 +1334,7 @@ Changes in 1.0.6 (19 Jan 1998) - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) - added makelcc.bat for lcc-win32 (Tom St Denis) - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) -- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion - check for unistd.h in configure (for off_t) - remove useless check parameter in inflate_blocks_free - avoid useless assignment of s->check to itself in inflate_blocks_new @@ -1280,7 +1355,7 @@ Changes in 1.0.5 (3 Jan 98) Changes in 1.0.4 (24 Jul 96) - In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF bit, so the decompressor could decompress all the correct data but went - on to attempt decompressing extra garbage data. This affected minigzip too. + on to attempt decompressing extra garbage data. This affected minigzip too - zlibVersion and gzerror return const char* (needed for DLL) - port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) - use z_error only for DEBUG (avoid problem with DLLs) @@ -1310,7 +1385,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] - fix array overlay in deflate.c which sometimes caused bad compressed data - fix inflate bug with empty stored block - fix MSDOS medium model which was broken in 0.99 -- fix deflateParams() which could generate bad compressed data. +- fix deflateParams() which could generate bad compressed data - Bytef is define'd instead of typedef'ed (work around Borland bug) - added an INDEX file - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), @@ -1331,7 +1406,7 @@ Changes in 0.99 (27 Jan 96) - allow preset dictionary shared between compressor and decompressor - allow compression level 0 (no compression) - add deflateParams in zlib.h: allow dynamic change of compression level - and compression strategy. + and compression strategy - test large buffers and deflateParams in example.c - add optional "configure" to build zlib as a shared library - suppress Makefile.qnx, use configure instead @@ -1373,30 +1448,30 @@ Changes in 0.99 (27 Jan 96) - use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... - use Z_BINARY instead of BINARY - document that gzclose after gzdopen will close the file -- allow "a" as mode in gzopen. +- allow "a" as mode in gzopen - fix error checking in gzread - allow skipping .gz extra-field on pipes - added reference to Perl interface in README - put the crc table in FAR data (I dislike more and more the medium model :) - added get_crc_table -- added a dimension to all arrays (Borland C can't count). +- added a dimension to all arrays (Borland C can't count) - workaround Borland C bug in declaration of inflate_codes_new & inflate_fast - guard against multiple inclusion of *.h (for precompiled header on Mac) -- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- Watcom C pretends to be Microsoft C small model even in 32 bit mode - don't use unsized arrays to avoid silly warnings by Visual C++: warning C4746: 'inflate_mask' : unsized array treated as '__far' - (what's wrong with far data in far model?). + (what's wrong with far data in far model?) - define enum out of inflate_blocks_state to allow compilation with C++ Changes in 0.95 (16 Aug 95) - fix MSDOS small and medium model (now easier to adapt to any compiler) - inlined send_bits - fix the final (:-) bug for deflate with flush (output was correct but - not completely flushed in rare occasions). + not completely flushed in rare occasions) - default window size is same for compression and decompression - (it's now sufficient to set MAX_WBITS in zconf.h). + (it's now sufficient to set MAX_WBITS in zconf.h) - voidp -> voidpf and voidnp -> voidp (for consistency with other - typedefs and because voidnp was not near in large model). + typedefs and because voidnp was not near in large model) Changes in 0.94 (13 Aug 95) - support MSDOS medium model @@ -1405,12 +1480,12 @@ Changes in 0.94 (13 Aug 95) - added support for VMS - allow a compression level in gzopen() - gzflush now calls fflush -- For deflate with flush, flush even if no more input is provided. +- For deflate with flush, flush even if no more input is provided - rename libgz.a as libz.a - avoid complex expression in infcodes.c triggering Turbo C bug - work around a problem with gcc on Alpha (in INSERT_STRING) - don't use inline functions (problem with some gcc versions) -- allow renaming of Byte, uInt, etc... with #define. +- allow renaming of Byte, uInt, etc... with #define - avoid warning about (unused) pointer before start of array in deflate.c - avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c - avoid reserved word 'new' in trees.c @@ -1429,7 +1504,7 @@ Changes in 0.92 (3 May 95) - no memcpy on Pyramid - suppressed inftest.c - optimized fill_window, put longest_match inline for gcc -- optimized inflate on stored blocks. +- optimized inflate on stored blocks - untabify all sources to simplify patches Changes in 0.91 (2 May 95) @@ -1447,7 +1522,7 @@ Changes in 0.9 (1 May 95) - let again gzread copy uncompressed data unchanged (was working in 0.71) - deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented - added a test of inflateSync in example.c -- moved MAX_WBITS to zconf.h because users might want to change that. +- moved MAX_WBITS to zconf.h because users might want to change that - document explicitly that zalloc(64K) on MSDOS must return a normalized pointer (zero offset) - added Makefiles for Microsoft C, Turbo C, Borland C++ @@ -1456,7 +1531,7 @@ Changes in 0.9 (1 May 95) Changes in 0.8 (29 April 95) - added fast inflate (inffast.c) - deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this - is incompatible with previous versions of zlib which returned Z_OK. + is incompatible with previous versions of zlib which returned Z_OK - work around a TurboC compiler bug (bad code for b << 0, see infutil.h) (actually that was not a compiler bug, see 0.81 above) - gzread no longer reads one extra byte in certain cases @@ -1466,50 +1541,50 @@ Changes in 0.8 (29 April 95) Changes in 0.71 (14 April 95) - Fixed more MSDOS compilation problems :( There is still a bug with - TurboC large model. + TurboC large model Changes in 0.7 (14 April 95) -- Added full inflate support. +- Added full inflate support - Simplified the crc32() interface. The pre- and post-conditioning (one's complement) is now done inside crc32(). WARNING: this is - incompatible with previous versions; see zlib.h for the new usage. + incompatible with previous versions; see zlib.h for the new usage Changes in 0.61 (12 April 95) -- workaround for a bug in TurboC. example and minigzip now work on MSDOS. +- workaround for a bug in TurboC. example and minigzip now work on MSDOS Changes in 0.6 (11 April 95) - added minigzip.c - added gzdopen to reopen a file descriptor as gzFile -- added transparent reading of non-gziped files in gzread. +- added transparent reading of non-gziped files in gzread - fixed bug in gzread (don't read crc as data) -- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose) - don't allocate big arrays in the stack (for MSDOS) - fix some MSDOS compilation problems Changes in 0.5: - do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but - not yet Z_FULL_FLUSH. + not yet Z_FULL_FLUSH - support decompression but only in a single step (forced Z_FINISH) -- added opaque object for zalloc and zfree. +- added opaque object for zalloc and zfree - added deflateReset and inflateReset -- added a variable zlib_version for consistency checking. -- renamed the 'filter' parameter of deflateInit2 as 'strategy'. - Added Z_FILTERED and Z_HUFFMAN_ONLY constants. +- added a variable zlib_version for consistency checking +- renamed the 'filter' parameter of deflateInit2 as 'strategy' + Added Z_FILTERED and Z_HUFFMAN_ONLY constants Changes in 0.4: -- avoid "zip" everywhere, use zlib instead of ziplib. +- avoid "zip" everywhere, use zlib instead of ziplib - suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush - if compression method == 8. + if compression method == 8 - added adler32 and crc32 - renamed deflateOptions as deflateInit2, call one or the other but not both -- added the method parameter for deflateInit2. +- added the method parameter for deflateInit2 - added inflateInit2 -- simplied considerably deflateInit and inflateInit by not supporting +- simplified considerably deflateInit and inflateInit by not supporting user-provided history buffer. This is supported only in deflateInit2 - and inflateInit2. + and inflateInit2 Changes in 0.3: - prefix all macro names with Z_ -- use Z_FINISH instead of deflateEnd to finish compression. +- use Z_FINISH instead of deflateEnd to finish compression - added Z_HUFFMAN_ONLY - added gzerror() diff --git a/src/dependencies/zlib-1.2.11/FAQ b/src/dependencies/zlib-1.2.13/FAQ similarity index 100% rename from src/dependencies/zlib-1.2.11/FAQ rename to src/dependencies/zlib-1.2.13/FAQ diff --git a/src/dependencies/zlib-1.2.11/INDEX b/src/dependencies/zlib-1.2.13/INDEX similarity index 100% rename from src/dependencies/zlib-1.2.11/INDEX rename to src/dependencies/zlib-1.2.13/INDEX diff --git a/src/dependencies/zlib-1.2.13/LICENSE b/src/dependencies/zlib-1.2.13/LICENSE new file mode 100644 index 0000000..ab8ee6f --- /dev/null +++ b/src/dependencies/zlib-1.2.13/LICENSE @@ -0,0 +1,22 @@ +Copyright notice: + + (C) 1995-2022 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu diff --git a/src/dependencies/zlib-1.2.11/Makefile b/src/dependencies/zlib-1.2.13/Makefile similarity index 100% rename from src/dependencies/zlib-1.2.11/Makefile rename to src/dependencies/zlib-1.2.13/Makefile diff --git a/src/dependencies/zlib-1.2.11/Makefile.in b/src/dependencies/zlib-1.2.13/Makefile.in similarity index 94% rename from src/dependencies/zlib-1.2.11/Makefile.in rename to src/dependencies/zlib-1.2.13/Makefile.in index 5a77949..7d2713f 100644 --- a/src/dependencies/zlib-1.2.11/Makefile.in +++ b/src/dependencies/zlib-1.2.13/Makefile.in @@ -7,10 +7,6 @@ # Normally configure builds both a static and a shared library. # If you want to build just a static library, use: ./configure --static -# To use the asm code, type: -# cp contrib/asm?86/match.S ./match.S -# make LOC=-DASMV OBJA=match.o - # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: # make install # To install in $HOME instead of /usr/local, use: @@ -26,13 +22,13 @@ CFLAGS=-O SFLAGS=-O LDFLAGS= -TEST_LDFLAGS=-L. libz.a +TEST_LDFLAGS=$(LDFLAGS) -L. libz.a LDSHARED=$(CC) CPP=$(CC) -E STATICLIB=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.11 +SHAREDLIBV=libz.so.1.2.13 SHAREDLIBM=libz.so.1 LIBS=$(STATICLIB) $(SHAREDLIBV) @@ -87,12 +83,12 @@ test: all teststatic testshared teststatic: static @TMPST=tmpst_$$; \ - if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ + if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \ echo ' *** zlib test OK ***'; \ else \ echo ' *** zlib test FAILED ***'; false; \ - fi; \ - rm -f $$TMPST + fi + @rm -f tmpst_$$ testshared: shared @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ @@ -100,21 +96,21 @@ testshared: shared DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ TMPSH=tmpsh_$$; \ - if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ + if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH; then \ echo ' *** zlib shared test OK ***'; \ else \ echo ' *** zlib shared test FAILED ***'; false; \ - fi; \ - rm -f $$TMPSH + fi + @rm -f tmpsh_$$ test64: all64 @TMP64=tmp64_$$; \ - if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ + if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \ echo ' *** zlib 64-bit test OK ***'; \ else \ echo ' *** zlib 64-bit test FAILED ***'; false; \ - fi; \ - rm -f $$TMP64 + fi + @rm -f tmp64_$$ infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c @@ -124,7 +120,7 @@ infcover: infcover.o libz.a cover: infcover rm -f *.gcda - ./infcover + ${QEMU_RUN} ./infcover gcov inf*.c libz.a: $(OBJS) @@ -292,10 +288,10 @@ minigzip$(EXE): minigzip.o $(STATICLIB) $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) examplesh$(EXE): example.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV) minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV) example64$(EXE): example64.o $(STATICLIB) $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) @@ -376,15 +372,13 @@ clean: rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov maintainer-clean: distclean -distclean: clean zconf zconf.h.cmakein docs +distclean: clean zconf zconf.h.cmakein rm -f Makefile zlib.pc configure.log -@rm -f .DS_Store @if [ -f Makefile.in ]; then \ printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \ printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \ touch -r $(SRCDIR)Makefile.in Makefile ; fi - @if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi - @if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi tags: etags $(SRCDIR)*.[ch] diff --git a/src/dependencies/zlib-1.2.11/README b/src/dependencies/zlib-1.2.13/README similarity index 92% rename from src/dependencies/zlib-1.2.11/README rename to src/dependencies/zlib-1.2.13/README index 51106de..ba34d18 100644 --- a/src/dependencies/zlib-1.2.11/README +++ b/src/dependencies/zlib-1.2.13/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.11 is a general purpose data compression library. All the code is +zlib 1.2.13 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -31,7 +31,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.11 are documented in the file ChangeLog. +The changes made in version 1.2.13 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -84,7 +84,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2017 Jean-loup Gailly and Mark Adler + (C) 1995-2022 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -108,7 +108,10 @@ Copyright notice: If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. +Gailly and Mark Adler; it does not include third-party code. We make all +contributions to and distributions of this project solely in our personal +capacity, and are not conveying any rights to any intellectual property of +any third parties. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read diff --git a/src/dependencies/zlib-1.2.11/adler32.c b/src/dependencies/zlib-1.2.13/adler32.c similarity index 100% rename from src/dependencies/zlib-1.2.11/adler32.c rename to src/dependencies/zlib-1.2.13/adler32.c diff --git a/src/dependencies/zlib-1.2.11/amiga/Makefile.pup b/src/dependencies/zlib-1.2.13/amiga/Makefile.pup similarity index 100% rename from src/dependencies/zlib-1.2.11/amiga/Makefile.pup rename to src/dependencies/zlib-1.2.13/amiga/Makefile.pup diff --git a/src/dependencies/zlib-1.2.11/amiga/Makefile.sas b/src/dependencies/zlib-1.2.13/amiga/Makefile.sas similarity index 100% rename from src/dependencies/zlib-1.2.11/amiga/Makefile.sas rename to src/dependencies/zlib-1.2.13/amiga/Makefile.sas diff --git a/src/dependencies/zlib-1.2.11/compress.c b/src/dependencies/zlib-1.2.13/compress.c similarity index 94% rename from src/dependencies/zlib-1.2.11/compress.c rename to src/dependencies/zlib-1.2.13/compress.c index e2db404..2ad5326 100644 --- a/src/dependencies/zlib-1.2.11/compress.c +++ b/src/dependencies/zlib-1.2.13/compress.c @@ -19,7 +19,7 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) +int ZEXPORT compress2(dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; @@ -65,7 +65,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) /* =========================================================================== */ -int ZEXPORT compress (dest, destLen, source, sourceLen) +int ZEXPORT compress(dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; @@ -78,7 +78,7 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -uLong ZEXPORT compressBound (sourceLen) +uLong ZEXPORT compressBound(sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + diff --git a/src/dependencies/zlib-1.2.11/configure b/src/dependencies/zlib-1.2.13/configure old mode 100644 new mode 100755 similarity index 90% rename from src/dependencies/zlib-1.2.11/configure rename to src/dependencies/zlib-1.2.13/configure index e974d1f..fa4d5da --- a/src/dependencies/zlib-1.2.11/configure +++ b/src/dependencies/zlib-1.2.13/configure @@ -32,8 +32,11 @@ fi # set command prefix for cross-compilation if [ -n "${CHOST}" ]; then - uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" + uname=${CHOST} + mname=${CHOST} CROSS_PREFIX="${CHOST}-" +else + mname=`(uname -a || echo unknown) 2>/dev/null` fi # destination name for static library @@ -87,6 +90,7 @@ build64=0 gcc=0 warn=0 debug=0 +sanitize=0 old_cc="$CC" old_cflags="$CFLAGS" OBJC='$(OBJZ) $(OBJG)' @@ -137,6 +141,7 @@ case "$1" in -c* | --const) zconst=1; shift ;; -w* | --warn) warn=1; shift ;; -d* | --debug) debug=1; shift ;; + --sanitize) sanitize=1; shift ;; *) echo "unknown option: $1" | tee -a configure.log echo "$0 --help for help" | tee -a configure.log @@ -165,10 +170,17 @@ extern int getchar(); int hello() {return getchar();} EOF -test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log -cc=${CC-${CROSS_PREFIX}gcc} -cflags=${CFLAGS-"-O3"} -# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure +if test -z "$CC"; then + echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log + if ${CROSS_PREFIX}gcc -v >/dev/null 2>&1; then + cc=${CROSS_PREFIX}gcc + else + cc=${CROSS_PREFIX}cc + fi +else + cc=${CC} +fi + case "$cc" in *gcc*) gcc=1 ;; *clang*) gcc=1 ;; @@ -194,11 +206,14 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then fi if test "$warn" -eq 1; then if test "$zconst" -eq 1; then - CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST" + CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -DZLIB_CONST" else - CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + CFLAGS="${CFLAGS} -Wall -Wextra" fi fi + if test $sanitize -eq 1; then + CFLAGS="${CFLAGS} -g -fsanitize=address" + fi if test $debug -eq 1; then CFLAGS="${CFLAGS} -DZLIB_DEBUG" SFLAGS="${SFLAGS} -DZLIB_DEBUG" @@ -207,47 +222,52 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then uname=`(uname -s || echo unknown) 2>/dev/null` fi case "$uname" in - Linux* | linux* | GNU | GNU/* | solaris*) + Linux* | linux* | *-linux* | GNU | GNU/* | solaris*) + case "$mname" in + *sparc*) + LDFLAGS="${LDFLAGS} -Wl,--no-warn-rwx-segments" ;; + esac LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;; *BSD | *bsd* | DragonFly) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} LDCONFIG="ldconfig -m" ;; - CYGWIN* | Cygwin* | cygwin* | OS/2*) + CYGWIN* | Cygwin* | cygwin* | *-cygwin* | OS/2*) EXE='.exe' ;; - MINGW* | mingw*) -# temporary bypass + MINGW* | mingw* | *-mingw*) rm -f $test.[co] $test $test$shared_ext - echo "Please use win32/Makefile.gcc instead." | tee -a configure.log - leave 1 + echo "If this doesn't work for you, try win32/Makefile.gcc." | tee -a configure.log LDSHARED=${LDSHARED-"$cc -shared"} LDSHAREDLIBC="" EXE='.exe' ;; - QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 - # (alain.bonnefoy@icbt.com) - LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; + QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 + # (alain.bonnefoy@icbt.com) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; HP-UX*) - LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} - case `(uname -m || echo unknown) 2>/dev/null` in - ia64) - shared_ext='.so' - SHAREDLIB='libz.so' ;; - *) - shared_ext='.sl' - SHAREDLIB='libz.sl' ;; - esac ;; - Darwin* | darwin*) - shared_ext='.dylib' - SHAREDLIB=libz$shared_ext - SHAREDLIBV=libz.$VER$shared_ext - SHAREDLIBM=libz.$VER1$shared_ext - LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} - if libtool -V 2>&1 | grep Apple > /dev/null; then - AR="libtool" - else - AR="/usr/bin/libtool" - fi - ARFLAGS="-o" ;; - *) LDSHARED=${LDSHARED-"$cc -shared"} ;; + LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so' ;; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl' ;; + esac ;; + AIX*) + LDFLAGS="${LDFLAGS} -Wl,-brtl" ;; + Darwin* | darwin* | *-darwin*) + shared_ext='.dylib' + SHAREDLIB=libz$shared_ext + SHAREDLIBV=libz.$VER$shared_ext + SHAREDLIBM=libz.$VER1$shared_ext + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + if libtool -V 2>&1 | grep Apple > /dev/null; then + AR="libtool" + else + AR="/usr/bin/libtool" + fi + ARFLAGS="-o" ;; + *) + LDSHARED=${LDSHARED-"$cc -shared"} ;; esac else # find system name and corresponding cc options @@ -367,8 +387,11 @@ else try() { show $* - ( $* ) >> configure.log 2>&1 + got=`( $* ) 2>&1` ret=$? + if test "$got" != ""; then + printf "%s\n" "$got" >> configure.log + fi if test $ret -ne 0; then echo "(exit code "$ret")" >> configure.log fi @@ -381,8 +404,11 @@ tryboth() show $* got=`( $* ) 2>&1` ret=$? - printf %s "$got" >> configure.log + if test "$got" != ""; then + printf "%s\n" "$got" >> configure.log + fi if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log return $ret fi test "$got" = "" @@ -433,20 +459,6 @@ else TEST="all teststatic testshared" fi -# check for underscores in external names for use by assembler code -CPP=${CPP-"$CC -E"} -case $CFLAGS in - *ASMV*) - echo >> configure.log - show "$NM $test.o | grep _hello" - if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then - CPP="$CPP -DNO_UNDERLINE" - echo Checking for underline in external names... No. | tee -a configure.log - else - echo Checking for underline in external names... Yes. | tee -a configure.log - fi ;; -esac - echo >> configure.log # check for size_t @@ -457,17 +469,11 @@ size_t dummy = 0; EOF if try $CC -c $CFLAGS $test.c; then echo "Checking for size_t... Yes." | tee -a configure.log - need_sizet=0 else echo "Checking for size_t... No." | tee -a configure.log - need_sizet=1 -fi - -echo >> configure.log - -# find the size_t integer type, if needed -if test $need_sizet -eq 1; then - cat > $test.c < $test.c << EOF long long dummy = 0; EOF if try $CC -c $CFLAGS $test.c; then @@ -495,17 +501,13 @@ EOF if try $CC $CFLAGS -o $test $test.c; then sizet=`./$test` echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log + CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}" + SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}" else - echo "Failed to find a pointer-size integer type." | tee -a configure.log - leave 1 + echo "Checking for a pointer-size integer type... not found." | tee -a configure.log fi fi -if test $need_sizet -eq 1; then - CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}" - SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}" -fi - echo >> configure.log # check for large file support, and if none, check for fseeko() @@ -849,7 +851,6 @@ echo SHAREDLIBV = $SHAREDLIBV >> configure.log echo STATICLIB = $STATICLIB >> configure.log echo TEST = $TEST >> configure.log echo VER = $VER >> configure.log -echo Z_U4 = $Z_U4 >> configure.log echo SRCDIR = $SRCDIR >> configure.log echo exec_prefix = $exec_prefix >> configure.log echo includedir = $includedir >> configure.log diff --git a/src/dependencies/zlib-1.2.11/contrib/README.contrib b/src/dependencies/zlib-1.2.13/contrib/README.contrib similarity index 68% rename from src/dependencies/zlib-1.2.11/contrib/README.contrib rename to src/dependencies/zlib-1.2.13/contrib/README.contrib index a411d5c..5e5f950 100644 --- a/src/dependencies/zlib-1.2.11/contrib/README.contrib +++ b/src/dependencies/zlib-1.2.13/contrib/README.contrib @@ -1,4 +1,4 @@ -All files under this contrib directory are UNSUPPORTED. There were +All files under this contrib directory are UNSUPPORTED. They were provided by users of zlib and were not tested by the authors of zlib. Use at your own risk. Please contact the authors of the contributions for help about these, not the zlib authors. Thanks. @@ -8,14 +8,6 @@ ada/ by Dmitriy Anisimkov Support for Ada See http://zlib-ada.sourceforge.net/ -amd64/ by Mikhail Teterin - asm code for AMD64 - See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 - -asm686/ by Brian Raiter - asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax - See http://www.muppetlabs.com/~breadbox/software/assembly.html - blast/ by Mark Adler Decompressor for output of PKWare Data Compression Library (DCL) @@ -32,9 +24,6 @@ gcc_gvmat64/by Gilles Vollant infback9/ by Mark Adler Unsupported diffs to infback to decode the deflate64 format -inflate86/ by Chris Anderson - Tuned x86 gcc asm code to replace inflate_fast() - iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions @@ -45,16 +34,6 @@ iostream3/ by Ludwig Schwardt and Kevin Ruland Yet another C++ I/O streams interface -masmx64/ by Gilles Vollant - x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to - replace longest_match() and inflate_fast(), also masm x86 - 64-bits translation of Chris Anderson inflate_fast() - -masmx86/ by Gilles Vollant - x86 asm code to replace longest_match() and inflate_fast(), - for Visual C++ and MASM (32 bits). - Based on Brian Raiter (asm686) and Chris Anderson (inflate86) - minizip/ by Gilles Vollant Mini zip and unzip based on zlib Includes Zip64 support by Mathias Svensson diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/buffer_demo.adb b/src/dependencies/zlib-1.2.13/contrib/ada/buffer_demo.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/buffer_demo.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/buffer_demo.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/mtest.adb b/src/dependencies/zlib-1.2.13/contrib/ada/mtest.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/mtest.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/mtest.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/read.adb b/src/dependencies/zlib-1.2.13/contrib/ada/read.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/read.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/read.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/readme.txt b/src/dependencies/zlib-1.2.13/contrib/ada/readme.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/readme.txt rename to src/dependencies/zlib-1.2.13/contrib/ada/readme.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/test.adb b/src/dependencies/zlib-1.2.13/contrib/ada/test.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/test.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/test.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib-streams.adb b/src/dependencies/zlib-1.2.13/contrib/ada/zlib-streams.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib-streams.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib-streams.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib-streams.ads b/src/dependencies/zlib-1.2.13/contrib/ada/zlib-streams.ads similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib-streams.ads rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib-streams.ads diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib-thin.adb b/src/dependencies/zlib-1.2.13/contrib/ada/zlib-thin.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib-thin.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib-thin.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib-thin.ads b/src/dependencies/zlib-1.2.13/contrib/ada/zlib-thin.ads similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib-thin.ads rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib-thin.ads diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib.adb b/src/dependencies/zlib-1.2.13/contrib/ada/zlib.adb similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib.adb rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib.adb diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib.ads b/src/dependencies/zlib-1.2.13/contrib/ada/zlib.ads similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib.ads rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib.ads diff --git a/src/dependencies/zlib-1.2.11/contrib/ada/zlib.gpr b/src/dependencies/zlib-1.2.13/contrib/ada/zlib.gpr similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/ada/zlib.gpr rename to src/dependencies/zlib-1.2.13/contrib/ada/zlib.gpr diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/Makefile b/src/dependencies/zlib-1.2.13/contrib/blast/Makefile similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/blast/Makefile rename to src/dependencies/zlib-1.2.13/contrib/blast/Makefile diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/README b/src/dependencies/zlib-1.2.13/contrib/blast/README similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/blast/README rename to src/dependencies/zlib-1.2.13/contrib/blast/README diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/blast.c b/src/dependencies/zlib-1.2.13/contrib/blast/blast.c similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/blast/blast.c rename to src/dependencies/zlib-1.2.13/contrib/blast/blast.c diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/blast.h b/src/dependencies/zlib-1.2.13/contrib/blast/blast.h similarity index 97% rename from src/dependencies/zlib-1.2.11/contrib/blast/blast.h rename to src/dependencies/zlib-1.2.13/contrib/blast/blast.h index 6cf65ed..ef8544c 100644 --- a/src/dependencies/zlib-1.2.11/contrib/blast/blast.h +++ b/src/dependencies/zlib-1.2.13/contrib/blast/blast.h @@ -57,7 +57,7 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, * use by the application to pass an input descriptor to infun(), if desired. * * If left and in are not NULL and *left is not zero when blast() is called, - * then the *left bytes are *in are consumed for input before infun() is used. + * then the *left bytes at *in are consumed for input before infun() is used. * * The output function is invoked: err = outfun(how, buf, len), where the bytes * to be written are buf[0..len-1]. If err is not zero, then blast() returns diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/test.pk b/src/dependencies/zlib-1.2.13/contrib/blast/test.pk similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/blast/test.pk rename to src/dependencies/zlib-1.2.13/contrib/blast/test.pk diff --git a/src/dependencies/zlib-1.2.11/contrib/blast/test.txt b/src/dependencies/zlib-1.2.13/contrib/blast/test.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/blast/test.txt rename to src/dependencies/zlib-1.2.13/contrib/blast/test.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/delphi/ZLib.pas b/src/dependencies/zlib-1.2.13/contrib/delphi/ZLib.pas similarity index 99% rename from src/dependencies/zlib-1.2.11/contrib/delphi/ZLib.pas rename to src/dependencies/zlib-1.2.13/contrib/delphi/ZLib.pas index 060e199..8be5fa2 100644 --- a/src/dependencies/zlib-1.2.11/contrib/delphi/ZLib.pas +++ b/src/dependencies/zlib-1.2.13/contrib/delphi/ZLib.pas @@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; const OutBuf: Pointer; BufSize: Integer); const - zlib_version = '1.2.11'; + zlib_version = '1.2.13'; type EZlibError = class(Exception); diff --git a/src/dependencies/zlib-1.2.11/contrib/delphi/ZLibConst.pas b/src/dependencies/zlib-1.2.13/contrib/delphi/ZLibConst.pas similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/delphi/ZLibConst.pas rename to src/dependencies/zlib-1.2.13/contrib/delphi/ZLibConst.pas diff --git a/src/dependencies/zlib-1.2.11/contrib/delphi/readme.txt b/src/dependencies/zlib-1.2.13/contrib/delphi/readme.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/delphi/readme.txt rename to src/dependencies/zlib-1.2.13/contrib/delphi/readme.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/delphi/zlibd32.mak b/src/dependencies/zlib-1.2.13/contrib/delphi/zlibd32.mak similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/delphi/zlibd32.mak rename to src/dependencies/zlib-1.2.13/contrib/delphi/zlibd32.mak diff --git a/src/dependencies/zlib-1.2.11/contrib/dotzlib/DotZLib.build b/src/dependencies/zlib-1.2.13/contrib/dotzlib/DotZLib.build similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/dotzlib/DotZLib.build rename to src/dependencies/zlib-1.2.13/contrib/dotzlib/DotZLib.build diff --git a/src/dependencies/zlib-1.2.13/contrib/dotzlib/DotZLib.chm b/src/dependencies/zlib-1.2.13/contrib/dotzlib/DotZLib.chm new file mode 100644 index 0000000000000000000000000000000000000000..f214a444aebb20950fb3e8499b36731e1f12be95 GIT binary patch literal 72726 zcmeGEby!tR_Xmt0Lb^-3ySqWUyF;2oNq0+kgMffYgLESxDJ4jYNJ^JTHv%sx-r#-v zJooqc<9Geu_qyC%`^?@mpEY~UXU(jcS?6pdRg}fR004mg^$Bu)%1mlyL4X4QNEaZU zg&sr5>2QFIcf>23$bY-P!QUL1KN5iJZK}ffiW3R5Bgdsi#SjndZHoZ7pFgTx{Kvz zl?C`=WYS*WsmLox3SSrcy2a>U->NFfT;oBWza%PF`f;lwBm?q1PBTK{x+--^IT3kv zWsrnPVqY0p22wFe6GwAd19NMT#CmhT0wib#Qh6aMNjYT|ki;D7XOGYsNY&K^9UN?o z%ncmPoq;mu)=wO6G{*aFfr7n_EzsW4?OK=|9Qg(!4Rmv{u{Zup4&xu0LMrw^AV|WL zwQsr1_s9JrB4XfZ0FoHNo#>AC4@p@ATad(TRwb-|l-$z;f)Is4#Ky?U3TW+k-2@wJ zdNVU4khpqL-+b49mOKH8pXU?Axt4I$k})@=7c{m6+6$Wjjh;9-S<#z0T3Lel_6kK{ z(ESI5s;#ksBT&!A8E9{5V_>Yu@xs_Wvg1a4XW~9`%&`_aeeJ)((#LPDYM4 z_P1bvf^b5Le+4t$qN5&#DE~W}`4*jo5@tpG`?_U;R)#?PTaA4`Y7~qAN1&sbjq%T> zWj@XEAo#1spY)0Yt%3FicWv5~3zH%HFDNCT1JLn@j{f;lA>2&=1^aiq+%n<6i4ckN zzsTKk;{Vw>0`q^7yX^=5y$_%1{V#H?x9w}T45wlIzqjv}X#aBXD6{`Yp_+lE6Y%yC zvAiK_cU|-!MiDY_0MhFjIoaD^52PO=0n>~j#w7n)tM4M;$Bh3eRfG)Hzaa0~Gw=m` zs1Vz~;Qxb71J`(?*#1}9Te}8M!9+6uud=tc4Qv-omi%93Z|xgc;}Ido`oFdJ*2aN( z^3k;aM(sU22kdBss?h)UNBzUU1eD1|h%o%0g>FYzz#EiM{{OqwtqlS?6~amWr9oom zK+B)rBw)xPoR9jy>-LME3J7$1rTMP{_xx4B8EuxqoyY&}(72s(%z?LN30Ou87rAra z|B(4bBfn$pD4YKZzNd|U3Q8pBf8povn)nAnhqK(dWnmj*pwacbW_&kE-I^B!eDF&e= zzkBj6o3~FM*9s%~T{Et&W?*UVerwo}d9M&^{NJ?pzHvh~C_>#H{s#2jz(Kp%;Y`0X z@Dm{?6BD4l@?Q@N9w7}8yj%Eu9}3^ukhlI#J3|f#Lu`Imul>!!L*B{pj=c-S5S`y4 zuW`RxEi}+F4Eb+k>_&rsc--J>v|t0ge>Pdv`Fi@j?J1$rUSY<+!QA(b!HrIlD!<|P z7ylFVO}b9F@p~coG=qg7vHB_q7h1r3{n#+fe>h8z0>mi+=#_ zX%duU7QywmcK=kGfX+b6A00F_2Rs_*9zsc&h52vBsv-z? zxaaqOLHvF7!SbWlux6I~D}CYrCUa}Xurk*BEB#+Y{?RW&zi8fH>HjD2txFF*a=X9M z|4-;!FBN(vbAP4(3;Gueg|?vFU+Mo1c+XN{VO%*LcisJ$K_+2feY3f`rELr zJe2%;+xxr25HSWJ1O5n30L~7!4rT+I2HFJ51=0yZ?STQf6qqY$0th@v6o4OK0=U`# z(?Z#%dGKq@!3>E)vb-&IgQ7?o;=7W_=qr> zNUgi+?Ow4A(Aw1TcD)h#nk|C;w;CzfIGF#4Gu%WAB0HW$-1E`*YP;h!s!S#M_hj8* zgxr3T71aY9N_}U>dv)CrA2rMt#dbI1e!)22Z$Q*%iwK9`QgzQfQJXr6F2AkqJLpce zXn&Px?7JE8?y>*quMx{0VfuHY_qWJf?-jA59i{Lu&|B9PaYYk}@H?aZG7ch=$@^7* zkGeM!B8TPM>3-Mfzt1s|5nQqE@PBor@4d&jfGZ37&XGx4{})FVlcay&k^L5X>&Rjv zaql~_zo5T3vY33K`;P1{(0xZ1Q|25>e&=)k!hBagI?g&=^sZC?Ec}NJqsO^|#qK)d zPuwqDN2jyg_c?c%drU{qJ}t$&v&S{YhF-$JK?G>%WcvN)yH>F=tRbQ|p}HR-xx0dx zdfYJazlq;0_T)|EO-%lZ4aFwAg(%#)nD630PzpBY);E*PkEdixhA8~fCL8)6FjdK) z0gu>1tPrWYF>|jfRT&#=)7y$FjY8z^hQfD{ssqsBI*NK7EwgmHS#{nb8<|3M?iM=V zk!siBwC_R68|M+*fe<3}t4{y0Ma&+4@T0rs)=ee9*dgYvQ7O;eChVsC@BKLDR3}mW zZY6XR_!M92`IrQfOLS5E*Rk&7G})H(ik4)Z7FlAp$%Y z4&gf2#?j;^r0_j6e%mn^_g0`xVT42e~2LWd0%_zvdF;1&76%6hF32tv=dGj!U z1uoUU;;%KbzUf2&LnwxS1*_N_SUZ^5*jq7tSD%+$?|%^S;1CmL=Hy~!q~j7{VWMMV z61lz-V&Jxr-`6Pf_{Lii%x zdZoL)i++*|5t=&fa-*N3>gCP@d3pHNAOm#Lr_Lg7m#Xz(9Ql|at87Hcm8)v z@Si*TA8W$9;J}}&KMed~;12_T82H1$9|ry~@P~mv4E$l>4+DP~_`|>-2L3c!ufYge={Z>GIXM`auggilzhiMD^ZmVvAHsn0 zKJ~2h7aczvcilR8z|YX(O$-PC20*yZxc3480OC5w_?Mgq0BC@$gR!*)(9#wFdHt+1 zD5GMy>-6Th<_bxLL|OI~aW%-zV}ict{&<7q_VSmvJZ^r~@%Q5f_m_%4h5n>}82H1$ z9|ry~@P~mv4E$l>4+DP~_`|>-2L3Schk-u~{J)9;#M@W^64Fidgau511pq))O(ryd z1lkJ<4U}b!vlFh=$D7i8MMuk2Nz7V{XY;j|=6tiZHcmtQJY)|M{NXWUF#tfqtS<@y zkOZWYRRSyJ)PzW-rIW-?Bok@f2oou!{V6E}wf86Bn|cRo9k!a1=<6%bC$jZADJ=&a z7pWfWw>tNp1R$Ovql(VwWf2_s5U3IgsvhL#TSH^So#=o{Uuy^+Qqys*;DvUL}rA?=4`lbR=jsW0?YvR*h$HnNhp= zC!izu;7A+DiZ@kulAlK{n{*^;+WBXnvVm^`j#IMvXU-V}_qao1<69ICjx z#>je?dOT5Wl|%`3vbEPHG~%aFZzYFws0JrvGib&2P+KG9gm@|Na;`dR;@hXdF0GoZ zA-H|QH*e*41=$Iq5bI%HN<7~G#@%@RB7i{JIIaZ}5Wwy4o<;eoy+hDvrhjIDL?wm@1uB1Q#CKL+EnX#od_o5Ll)IMaO z7NBj&@^Kd;)<%OES%^J;dru5(Byz|)wNe231+*1B;m&Izkxf{~q>@M^K5oRE!sTob zc|{J+dp9AWy9VYkT9+9Xs~h za7ux3s^H@U1XPuqE^Qhl@AX5bvU0-YlbYY7u#DLoD@_$+y~NzrtM0>7+1`o^!%<4#Gz6nx%!45)1j#*6H%w}%lL>bkPU;E?AJ8F+BF#1h*)IhVyMi_Ov zsP^M0U`mpo15%jKwLnIhv>I@EEM%1`z#gA-uZa|{w;0Fa<;p*AlslXpj&U`@7sC2t z^zDl(eNUPt;1!(3LTitPAQ;BOW~318lc{z8PH}Qizn}}TOCKI8urso=eH&5)*=8`` zp2~o#l&9$#hnp<9m0A6^0!0mYp=~A0p6kv&f``RmG&`p&3S1xA1q#Z&mWDQ+e8$QU zdYCmRYx5Uo_^3Kpt2*gWb+llW=!(}qid*e*;K%r3yXT@z9M~6J6s4W)yAYFWe5HLK zLzt|wA*)yYu{qhsS{D>18jm#IH$G*d<0Wc!%;ZV=R!Zbb{^7V)aDh~#YlpjpjKM9N=; z>p{p}tsH%-GWJ_W?06|`VM8Q3<;UnLcV=dbQ(dHnG(Sljt7YptrcYv!i*oOTH}{dKWA=+9*g{ZYWJuh2k-7#a>5t$bF)tT%YE zXknN}yshg~aR3ihYrf2JAi1;`U>8O3G~wXHJT%z47}=uULl5)|GbC{@3l!y+B2*~f z5DjcU3lNj0L9LvJs2$yYo&PnlA$`0mw8lE44re*ay-w$)@TQd*clNAR(%5uPdB1zi z$VV@;e2am|gwU=bi3Ahc2-#RQ@Nj4ZR|M%yV{F)u1EjT!9~IyGxH=6o=bI!9tM4V9 zbj_g>xz2R!1`{swDfWX?J_xn2!x`6(1sn7`%cIC}oA8KLKFZ6G`1-{Mb%Gh{twcVN zq6VA;DyiF|ZA@EJ=2F1GleU)erF@D~9hw9hVXb^lDkhymJIUFHVbQAc(AH!-KEV8w zAjx)Vwy>U^Iw=20(<2uf(23nLxb!{&gdH4nxP_*xYF?fdBUT{!B>#)%AdnKLLoAd% zF)T0&Lw=ZSZHt59{(K>Bkvty(DpM`l82!)rC-3lEYU$}o8c0{qipkSGIh)_p6+1p# zvQ=^Jkc`a9Sh>;&={E<<*3Q65XH(xKGsk_s8o{X6xD&4X*)r4CLE#*tde3<2Ftz&J z-bRK2D)TE^O0lz+q_}32BSXH1giVjkV-(CZqm^v#z3`3d>Q)Jlz#WZ2C|%q+1=V7( zOL<5p{(S34Nr@ks)(@gEk0mIzP1K$3)Az#HKgrY=yXS2rUBJ+Y=+H1-R5Fa~QBCT! z;f*{V=ue75&_o`g?M=eV>fF=Ze+=&v4p)Cx6@aLwjlc>kTCyq1q@mr`ZM7q*a8^Ly z7rz}o$wn8ZUHU<+Y8&|JQlkt+Luh{UZ0GGW=pkwJ@fV_I9S-k7!Cuo$&2Vpl9RZKd zRQCZ-s|f59qfG4gNx(e7C8Y721+6zf4~s=w7U|a_o6;>swO!S`4CNDZwO@EKZpwjQ z@Pb_6ThX|78nr(WG{ROYB;F7^oFX=zE~dK9y4#dXex!BgnaRaZU$J?%%%?&@hbFD_ z%Ej3Yq2$%}j60QKxp?1@dHrs(8ZPvf(sVTU+E_+p@nQTY&2sr@D^;-;ho|sPO(8yoxcfqEqX?w-F68l>x{*l95$+F#fzj1+VJ-K+ktL;m{t$ zn*%I&+651%T{a&pFy@uVK)CaMp}j?{^FkcEfLYv<4xTgo(Wqm$#Om052eiCYmD5DZ z&ijs8rrC14S&PxVisY*Kk%D6meU3**RHOwGs&qZsrpG0M*RMk9!HROcM%3-mu)-(XZb)E($w()#z-L!EMb*e%#1Z&iG(gpF+| zPXJUKk3eY3l_H->hMO+$C1jVgFKG1?m&zkX*b&7{SCJIYlb(0r-{B6Oe9N(5)5M=Uak}sB*b)ZU~ghv z(IG(iUu5B<3fH9T^vKy~ats%hi{$1Kr^pY|L96c7P4Ov5#}w|2zlD{iskUo=IVpM& z5&@Ix^_sV=wO8TrX-WhxY#pk%*a8z;q0z?Y<$dMxBn;Zozj{YZV2o7z&>-DtLB`*fMufc%%(P`up2-<26ztjiYl_%skr?=WwAIm-DJTPl3SZ?3yXxi-;#GI?^qq0Vz>4 z17s=BFD^xg9QS3XB!9=mS(}0@iPiJn9F_P{+q@xoiB?Pdx_epH5dJ=0UgN)10zR@>e3E?b9{{ zu=7O-DJXpk$DfkL>3b_qCwqJZ(UJ*8MzM^gggLS^N`54;Yct-#~H$Opm6;`8YGxoQ}nH}tDm6C{>AWzyOt zc*q%{(5GjR-L*c-SM-qC8rWtpJ}eyPLfs2(;`=O)&pfpP?+S}`2*d-mA)Gz(@Ft?R zt2G~BJg^gwVe2)myY~)kl+hL5HM6v*|CE5I0N*l$uUwYfeSNjeS z`)!3Mh4u&uQ#rhcI;Damwu(b;3wdYGeE#~QH2~Q}43<5R`+2?}n;|>zyo?cv{eTw- zriS0vVZYvMCV^{zOFyle9<$auzW9~f7(b#M^>`otrAN#T%&-+lM;i#CcGV|Kq`IIT zf;N?5q-`97b)<>Z5tBoK^NWxKcbHM5957zsdeFKAo1-weVs;pe$jiL8B7qK@+Se1& zXa+-)2$2@;Eb2y4lmv>Y)31$JA!c467rmo)o3P%2aapVL?BrhZdYJdl$-%C~;;j&o&8+sIuC5Hud||g|)0M~D+^e+JPOja>HqYSdkF2!= zgGe!}hQQ_+Gkdd(J=c=$`tfz|1&_XOo>|5>oW#%Vf*atEtQXbgyN&#ESLSPS$QOmq8~BiXU;z6*+xu=JQSQ+JU~{t_=sVL>ii(V-}H6M-2+xf>cp> zIMCfb4tePxIM{PVzTgVEX~XBfSH@ArgQ?rgVuj+KEw;e1sYH^vCBEZf@jht=o(vh0 zn~>wHx`X_i$*#mR0uKVRmx_9rR7y)Dk54veWKQB*0V(P+L<65F)^;aRpkKp|uzBQ# zo}#0DW&>}U>Y9$o;AA+UuF9WZo{;{aJKq%kvUXhy@=*89D=Ub?a*T7eU=t2h+ju^F zT_5)2dY8%7pe$0{d=*6%?4Gze7XqdRlwH+q2?g_SN?906dm++;hlki%IqQRNO@&Q% z!SKZIOzqvXZ3rpRV5U&ucY9@~&?Y0Necd9wZF3id>w>~;lKJf8M9mK061%TP^D8Kb zef?xC;PJJB%t}etmuBPK6ZAmAKR04Yp&^}d-hxC0@DY`!5%Sq1AU0k}@zaS<{_efl zXBtzKcG?TAhz9f?RcZV09+=C0U0L^`zEC%$(&r{GWIUWFL1Kp=f_aO?8DHW53I-`u z4V*tDLS-;4uBl^929^3*t!}ClMZqHi{2n<)AM5OlG$KK6{1ii(a#N**5Ev=Xup_*I zEX8BvB%cD69?VhC-nAo5&*$&7D^H~kO6|04QqmFHP9^o}rY89F+v6*7?T|%yH4v}_ zE7|Rc_i_q_AM$%n)CxcyESmRZrjxoq=Pt^|TMQqH9t&kO(dBN?7O_MO`NhuVg&e2`KMd?Bt{8q+~=86vNUk!`z}G?0+n9sB%)sDV^{OiS*9!yH7{@mmZ){U%dVb_5R?MpzGt|H7&>z1wlHDwoin!&tU!a z1pS$dTb84Jqm{4~VT0ck=J#;p?w26bGjL)w$3pSqz17UwhJQp&f<52e$)-SwkIoJw zl3+6_my0ke)>r#ck&~DB_0+Q~Vzkg@UHqpJX6b<>II!X;$L}{tsz%|S$N!8RZ3f;J|*8y zv-j+r-|k1;Y=AN`lLUfxzTlPCpSoT%X|6@lc?;IY1ayVOOgT^2PUUS?)o#U^i0_9i zTu0o-kv;+dSXi&KzyNDt1QPnyF)2_WG$5e-t!3@@=)yKWI$x^$+nv9bmT8PRmo~bD zTUb3gZZ0YLI@35=QnR}on^ZU%wOiL+*w_`uz&o<4W#t;GZfYG72->_;5iCFmzHkm8 z0sxSiz_J;Anjg)cZyn8SUCk)h%|rk-s~&!~t{r>w^`p5;&Wi+D79=|DR7aDT0%}$$ znXClJbk}rfKOa!P9H=m6P(q(aKK_8{y+`dCnBfFzgtyO?}e)*?u*m%?G=5O*z`2edwRd!QC4AjE(XI{AQK2_nUv53>yY}6 zXY1or!u*R;p2vY6(a9ttr!Wah^~>vqHMv#|;cYFG!>CPR>D$x7>7(4Vy0WcXIZ`{L zMdOi2Gu)UBX-RrtJW^m~;VGc4ww$%#wNmA?CnLF%QyG~(_IfAiAJDb83#6H<)E#XQ zuNPlD*h$;|@vFy<+50j@lULpkJNe-tbg#!CXGM}dThN0wY zd0vvwsyF$cYcB;lFx7re)zbU6b@2G|M z7#N0IF?1Tz^kwo`N`MlDJc%7H?5U1E970xI&R&U>=N~t!|BzT>?G{ zi2LohH00cJBGqih8UXLB-)vMXOm3E3*_x>%MGb6Y*y6F)mhTS!iL>*b#!5PiqhZVI z$~m()Do1J`!oH-CrLC+9)HTDH#iJkwaWSOy-Fjc6o?NPaY;+0=vs?I+Cm=_x2Z|CR1tz2#D!j>Ky_mvG8YTe#^)P^=aWIVm1W+!q?2PpDdy z!?>rDk1u3$O-du}p_t;`9-r~}ifx7sI7ctJyM|jq=E%Y+ZHXdcB zD^_NV)L~*WNzzaAmMIcvsT0)5a$murA&+jb$#ZTbm|7gO7-y_K@f>_1uX}=w2i-cq z3Pgw{kejSq7cPDurWz?n7QAO!Up7fOsNC)kOZ6%f0n7IE+-wRwcoT0G;tFO) z-D^=T48wu}uwoZAI&#b^nC--lEY|;+K+tdXLkEM^s;5z6fD1eq!>Mln*iy&K(k|_n z41HBF3y`~EyqV0J<~){HJ`eWDtFVWNBZG8ao-{tJXhE7?6wKn9IxDDEEZ>{D>*8Jd%etAphHkuB|@oH-*n(2lBVC9(vdED#>(+ zPWLRJ5*Ngw5`y@2p;3Pe_UJ>x(r>Nf7auUlUg8-s^P41)A=Q=dZCpA!A6hLDt+LA| z#*1MGMjyYYqYw){pTOjse_3HF?t+M)T&}IaG?+S%vc0mabYi&Onw27s-2Ub)D4cg! zv2j0;48?)7!zjwIEmYd9mTo6&9S)IGqO9jjw-v)dq*XUur=Nj_*7SNoq8MageL`!0 zvh=ahxC!Zp)kZZU0?{*yOkC1cD$Ycwrn!BkS6oW_jJcl4!AzQ4A*QX05lbN2!U4Fd z=-qF@_K4l1bn6V*o*T-okqm#pPB+? z{(?uujG%lulY0g%vS13?ZExpbCw;v|ZPVT!z-7_e`l*Z%Q}ihmEkjcw)QY*k5@?3z zgSF{yM+-+$;8+kBO9(v^)9~_Wh64SDZUE=kgiD%|+x$8vZb$D!$mAfnCLfV2pPBka zXsh$GcwRb!mARyeN5ckNa}F3e?TU=1Q5kc0lBQyCI8#`ON-V31H9%9|#x_cZEj~tG zAH2g0*bA=kBxYBc2!ebgIWLGFNJd8Rn9iJ;lFOm{NFZp346wiUsI0G;DPY={^i4cI zI@8<-nmOwDp32#z_uHhSC;IU_M3&tvexDsqgxF3h`}BkkEGDu!mx;D(`bC>Q4ahLH z&4+doE0`V5H80hmcXz>?vI+q*w&HWnTiQ#4-y~r|M7$m)BxS&Go6kv90$D00N-P3< zz4?s;&W$~kK64y%dKg*grOr|DLA{}Ltu%&o_i1DoDsfWT4zh+23WO)N;n2cKWIDmi zUbup8~!V0J%e5xsHP@-#daiW)*n9C+tON1&Rc~%Smt}T>mS- z?vjE;;;Zfhe{&Kz#E3o9Md^CLGSqueKlR4g?6Ad0d{W}dC@;3A&ex~wqAx^0=O+j8 zoSH?vieTcMugR+RL8b$fjsF5|>nv% zxEn^)8#(2^009s{*V&13z&H9 z=*@0}=T0=^)#^QZHrcEYR>9P=P#Zqx%0ZpZzE}04u)l#zd(QQw8PWQoedN2vehh{S zbg_5OM_Va2DOu)11^5`q*9J1I%fVlMa)DlWpWt-{B_+(zU#IJ&lz_?0pGne~AOl^; zDN_$LN%cyYbPfu@dz@t77=x}Gh-#|y`G`(vf%8`+8erGxC=cKT}~!RUv|^lX+J+VF^7FRJIUc*hvsNK$Y+Yr z=`FWwRA)%e9qe-$9`q;_)uzR3ww`gPN>&PI!A9s(sb}Xso%|H9RZ!zfm+0VSyccH+ z!K)XJRQMZjRyZO+;} z6#GxzQqxEQ{VY#pc%R3A9DSYV;(2jMiErqwYZM zTvm6f1&%lib=g>dzUEcF&^HkmAB?!3nf&FV%`$Nk#7C}L zgxtM7h-S1Omi*i>+54-v(JIqg>Qs8ss2T9EUAi#=E!HnONh1p%KTxh! z_o^5o|N2P;7Y{YgQ{>@=pD>_0YAqLy^#qgyCnmqA;4CiV%p5n_9-a<=x&XtMTA>0~ zfhmX`Hq#5mOPMxA{%T|-)*AEyAjfSv=}R4)-(V>*;d=l+7kj~rRf*Fj*fi?8@aC<8 zUFq_9HFaZ`*{g>PxSg7!JS{SkGcbNNwW$PWae-szqRcd*L+Xe$g#Wj~c{cr$J$g#||a$w_zoQDn}38gsA#hiNTz=exy zcJRYD#5Uxrr&WOn$J(nI+2boL5fAJx4Ij&cDxxvtKC3Bddzv=&DpI2-jkw64qgORN zc$m=nL3+khHT^M(vnTp7!3L%JRAUn-odw!^%RaNL=Nyy!yX+9nm_kU44x%7X=c$S& zY%7e`HA56^;uSA2O1_HM2n{Z$Lt+Yk?86qO;A!Kw4Y8k8^q(AT^;FV!psmj0DiAl( z7Wo#b>?Qu9`+@MMN!nFQk}1xx7$rwbLOe)A#V5ua@a4mvHR0|tG(2Mm zdQ!tsw~%b}t<$!DA`IpY>xEnx663d%D%!2xEpv}kPOx>VQ57w18LH3fvxvEZ6NJG| z3M+unT*e<;5YKrZ0!<7G>3LqNpoyl6K&`|$8+L+Lz+oL|6-I439VQiuy$)BndftMp z8m#Ee2SvW!;v+kt@%*FSGpJ1eWHiuc2+ixo^V&hGh6*I&vdI+B-&Henmq^IiscUY2 z!$?vj{IJb5QjZb!HA~n%P54RpWYMrRTCGl~H`_VAj7WulF;G)6Ed=rdCG~z zxs?L3y*5#mq+|(wzmfLQn#I2y)XUS-;RT zxKe2?d;DaKx=Hywz1Q>vfB~a#UP7n(G+YA*+Y?)Ca-f%GG~%2P>nF2>aI@Ly4y5nX zsinVFN8qb6(g_#}_@c3TP&_0ywbf0t%zTBtEJU{5Z(O_?;J&pr1jF_~`6*aT4>zFNJ%Y8>&WmbBO%?!Un`jw`rG}8sB%ohe6 zbBev?3Gr@gmI&03t)mlNf*Ok<|8Nj#;T2^KY=TApTsc$5@sZ*4i-7Q_+>Zk1#+_#} z^HERFrc#S8-!*t!&f1uP#RiT8N-f?lvJ9cGFk5nz)u?FE@Ml(i%1=EYb01v`KS;q&H)QEwZ|;4l-{Y0H_h7?d#(eWX zjsKRi<`y2Dlg#PQy7^3|_o1t7p*E?=Cc*RWK4hlY4mcQQCONBp5_(bE%lJBSB{|lC zx=o==x?WSWRJJS8py0i(0Joe<@fqF`m;6thPkWMwFNh3mJ3J%`%_Bd^usic|O36xC zWUmCdlyVuO`0&xIiQ3T*K;Tc2S@<7#w8ZbfA#b0qf!}1*j}r!M?jqr!RUzcYJEsFD znO#>H6gr2T;V6MJc>HzgQ`r^KVIX}?+>*GU@PMMc()cCHr@~kaX>6+)LQ#_opFBk! z`CMpGYdf3?F8yh-JT3Pli<~sLJ>oBn>WcOgZ=-h%C#9B1!E-b=Uc8nJL-qVDp``D2 zWg6{sNa{X2-Oc|jmZI|=4Y{?}6P%Hel5@@ogSH}rCmnq_V=_&ZxI_`VVr}Un9k^=)>b%#rc`Pr6D!se2|f9-X&6=t5!Sl0V+;$Re8Au!aFETzne2n z1q6BMfq<&}ER4R)ZVCjQ;XDJuYnIQ|XiLM!s=}oK;m&>Q)TOve#(n?B#LBVFS_f zq})=lXaLeyI0b+YnDZGx;5H0m^!!jH6565`;nIu&G8J%MDbwE?WP z!nHFz%Y)7hjmZ=9Z?aCnKspZtE&u@Il~OYRU~`TD6x2KbTL>D`7is52yBL9$RG?P1 zuhZSR?v&1yWA@B?AZ4a;%7$*-eu~eFzPECEcejKhu@W!ubDh;dS9jf;izoCY3qfUr zwI|?#@o%(g2>^&Z(zv?-0dRns$y^2^oX7UprlYNyt*V))9(mfa{dljo+^4>b*OXX| z^-~H@cIZe6LVduVdQ)8@Ed~uO2`vPLiE@xn8Um#uO6CpXV+TU(4FDzDrvVM|0i<|W zF}-qIJPpOx1vX|r=Lan? zWrk@FJ8A{nnrR1hN4_FCgod}IN~(tGYwSL$D&)Ym$2NgSYVIj2!2$o`xy@=GP%-7j zh5SYn%dfUJn+R6>EKZcx#ib#Q}#owtZNV&s)&e&)QlB_KmssY0AFq7Dlh;GkuRPVhCz^b)q3{DRlE8|=TZPo zjln9~$nKn}%npe#$-SGGq< zuA1#U)^I;K$nc~9=wgq=WVCWvmDju>KJc|-e=?i-{q}+ zD1<_NO-EnM4Z4oGmrXaq7nYJB{SdgV+kM*b*87Z9)u;in_|j{tqqK=w&Yf31F3RhW|d`J?28 zOzzY-EKi?fMX2~3`M`a~8tFH7hpGEEckig`$ut6x{4$CjmxTEYLz!c|rS`yQlM!OkS!6 z&%Jn77(OTL^6+ElHr=L9^SGs%!Je4&hbPIXnYpF!3rD7|?A`3b#orbzN1Mn|MoHBK zmy|%Rmwkyt3vhW@Gbf`MDjIzZ!x#Q^IY75krD!(x6H2z!YaMT9+bAa~Hqgp}MFEu}*)km1lIMv5^2`;0Ce`;wbZ+u*0)9?M@DS6da ziCz^2)#-|G#o@8N@|2gg^0fAptaG?I32}D?yUmhaw^b(y@lyqsD~aVHo(BEUZ^i=G z-$0`d=?p#@8+fu-dM4{jdA^t-EY5a<g3?d=X5U1J@mfoh>gdfGr?3Wv7)4k*m^w$YcgyNw*4$~V*)k)dyrF@Af1FvkaL zXdj}n>MO(=qk^{%xe%e~v%yV$em;1(tjBFtFwY{3s3KnlfmoHTB5mh|wA*Cxa3u@IbHZ9TLnZcjP1#j%N|pQpwTVS ziJS|JT;-W#!qsuaXBZUf0%J@tcbEtK7&%X{mp9-T1sFw=srhn=xbWsUgr?rr*G*J+ zJ+ICq8#Le0)HC6H9aLuSiDbt->LD0Lo=r*A!P%Y#yXy~SogvVAYW$KBTp12+n&<4#;QY@G@*kGtLj_WBe`8Z(W&F@~ z{zWu2Ys?PTq5VKFC?c$8dU-#66kE~rTzA2m0!xI;e_r;PzLk1hcqj7X3FC0wl}PS% zm;62UruR`239S1~AbJoCzO1m1OPA_f4W}}{Olw?J74}y?k>3517c&|gXUV|zFumJZ z_}$U7lIDlcdE<*DyF>3zA*>jv@|3dW(e2D&wCs2;>@-q30r$ze_20wn_%TV0-wxZ~pfqPPKfwjl{ zNa?KjDx3l@1`|?gd+eMRS3Wf)2K$k7?Pdw@n~bp#+(Rrk^$V!{N4s7xx3@t z93hkt&y0gNG3f_)eLq0vFN+AdiAHUp@S?DNtd>Z9)s-!H2+b79fdpwkWz|1=$g+s7 z=Lm4FU|y3|0>h2FOz+Y{;n?LJ+khC+03K#5B&lCoP&I#+wAH5MXX);nR!@=v^% zgL;ny(*`YTtm=CGcfM9MuNXY$bUxZRQf3fQ<+0x4Cz_<9aTwD9y&6!RAjGdk%U>e3 z!7|1p1AE9NTMA2Z>X2crMo8O0@BZo2uqmh}+vv6)B6>H=Qq3E@d6`G98%U808lLsRy{2R!zBIcX3N$|2((bsfL1;gNMBtc`9~`L7~ceO(JSh9udrT(pD}Y z4d5R;@;j~vJF8mMu!rSDzf?0+8N?cWcG8=j{HamY-8I`jMPAIY1-+C+NtUi!$=!UPGqz1PuMvpU0TOsKk2{4{h%=R}_0AmL5> z$!9OLQ*@D15|?0T@Dr1tE^=Dc{Nrc;rRLEw6L6XRg%dSq+gh=+OT)B0j9EGelj z2gNN~OnwmRrAzP@t%)y{fCme-oY;YgDIzlWfD!;3CarFr6x3Z`ueYeG>3Xn$`@Hgz z=LI0YH#YiwD{NfI?h7Ujl-E%*L;_-J5uOGg?W~`fRRF>wE*(rJhHKv5v!P|1^F}U} zbYHFp6C7Y26BpSmY0Xg=dqIMJ)hzKUqR=zg1Uw~-#--Jg;$;ap!4G1rsmgMxXAUL~ zQYtEqBcjmH#>%e$RRsS|25bZX4FK>-2Z@3A09?+^#EwR7HG!!B8UTP%M5J+^!bAwC zGw-8$W?vd_SW5If1WFAlwejJZz=Flhu?%2K`7)ly>v21(gEhbh;yOXYz>&;D6vsZ- z%G7jkOolgZdknpW0eA|J<~Aw&Yz@E`iKIu_Yw@KF)_FK4Q^L2%r&?ar7Lec_^wq&v z$jDUhTAOVSkJ7_Vn7I(B^P4gj7k}A0v?*Jk(ovmpuh)EpQ&O>MPP^zvXilA0M054& z@gU8|IC@PLuoXh5XZTA_pNh5Q7oM}~KYNA?lL}e5As@n41U*Ki_CSS$1;LpJgom%s zNiOA+Eb#5(stw%k96dVXX;55i$bOH}ljcmK)`_o0^@omM@LbwqJFJ)srzOPk%$dyQ za2MS_wUI0`7WjE<%nK357caqjyo|tpFhlt4qC82+5h&IFQFrz!X3r-~^XB(^0jw|9}G}I;-J!=Vj zJqEkBF|Y1JFznYMh`O^J@_r5@%R=Iy=t;v?HqDgVn~;wzJ0O3s(;4oAGMh zztEo;!|q*-ja#eL8G$qf1Rbtb7MbNQR|`s#Aq1r<*FhtD!>G}mHO_(bmcOjA*465Tl3ZL1<01_5IS)wR)nuQ<$%i^iDATzYrJ>9OyUM8TW(UB-u z?5`l!>H>h{Sj{LW+zD+N<8KCLYtgdhnF0-2;F?92XbG?8ULNwR!Dkpsp0OHteloGm z=6%2-I%!6oDVZ3g@6As@p+q@@yM=D(;qy_cBB@#QM20e`#}yXwVMgv?!ROMJ$6bR> z9V+oJELlepgL?U!H!~cctUf0&qFhHJZ%P0;Z0qskCvxmtZ^Wx_F0L>Zeoq!ZOB5&NuCD8s&p+ouk*dav|C-G8zq0`>m>E zQ6PG3U#f(jtoA^pB)|^_P)rC5@D#ZIGO87TnZZ>Ka7hLbUOR@Po44E!K#*m~IJ)Y+ zOxP923V}=oJa4H#NL4?7ADDG6X_!)~UiADCYKbTm0p*njZV%Mo&*TP(gwcvY!9*O4{sWSi&A$A`5#I29xqJQ6^D-#(tZRa=p+!n! z{)#4nF|z)AjSV^k2BlILn{5e+R-wDLm=YuL(?{eK4|tb44&b2GN9&PZGd;yiU%soUJpEO=nmJ=7)0-tTH6;_3ja!or z{S#Y9&V8SayCcf%Dx3#^-*!u^s-EpeCT%CGJ*45^HSB}XYy+{e1&s$M^a0pi|EPwl zqmUKQB))yx>{5H&G=(=-Sn}K%kIY5A#%fB3M>W}0Q)LW0Q$&{ZN;^;vg-Fp?(OcyI z0ark%zZSj%6cTVa@Hq|~zySdcoWqCt7@rLPBmI*V8Il5N7_ua>lW55di$@ca3GNh< zZc}9R$v$dRm5szKF2&`C)f|xAT}H8(lV)vDVEZkqoz|L z(ivRGV%%7EcI-?*#IPB&C9#{u%_mL$_(zdS^ZrE>oh;q(vW|m)eeak2h>4ccGUPI| zs`!k#$tt}3%$%8kOxA{DjqXitm^8zP+hPgAYTmiNa?Iq(Q)65kk9WZ5CQW#3sqnhyu-025`t}*CP zyYZVk9kK(FYaX(yRjse6E)$F2vfY2}GAznjX!qRz)DRZlx-GCAQ^qr`8D6@sl?DEI z%BN24x8ice67z*w6}!~$F(Ze7OJd=@U=TGz#iC7d0tCxYX}|@c@;XZ%1VUzD_FMUqWC5Rg4HL(5{lz# z@cOk?8RN&lFP~)a%273(-baQWyS6$Rc1s-RiS_8NTOG=&wwviFt6}1CFvU4Cq|n1# z=4DPEnUj{v()#3a+^mT4 zeZmcLn7d}Yz(vt7LhMrmmxFHS?3hTTfn++U4 zBf*9TF%4=%hto~p#TRQV;d`IO9EK1L3m z{J<0+B}r!*FCKnw051q(4=T&yq084fLbX5#al*=aj15sPO*1M%|Xvor8?;swt$avlw^{#mX1Yq6M2*6@Dt# z=h51|W}clgxU?92u_KeiMArOK;F#?>waDM<9;u#`C|!FH+`f-84_z)*aRi-O>gQ_y zFRYjXEP`*I%?QtmdfKpQpN^{n&N~*|ZDGUp5@0m7cx|6sYB|&N?=*%1X<*4N?b0FX zRCNNw^oI6y^uQouha~he?O)V~8KLB7y9$N?A$JWgP9SC}XoOi;O}U%Y!l_o@29i&Q z6}XwOip+{^hxAu?-`~P}&5-u~GsX<_U4=^eJsOePqX!bUNjFCKUf+;s8;#ICyunE; za9e{d8fwPBf8G0|Lp0D9vFoSP6QDqkJd?ln2J{Ns2>SgfYF6!Sfs4n8kjjQ?-e?&# zJ#1P}N|Pn)nt>q+Pn`gOsO9*T?2!HPAgJqvj2S}|g2?Mosc&m@l{A)o-`Y)lHeoS0 ziZrArO(K^cS?lt$kf*)rYm0ToAq+or=z7axIwvDIY@ja9#I2hT(i^#k<)NgH?!e^J zkgMb8HMi%Io`W8souPy(2hQ7Co5r|FkA!YT+5aUmvzBY*eiK@A5qJYeJ8@acW{&R~ zmp|>%!EOiR9-|?S1_u)uFASLNQ{ig!y5IL2&+1|L%|XwUP(k3hJE-0v5$F44VP!(aAVECl4(O-aMO1M@Q<0kGD&`YjPFN+YRcak zJ*+6+{b6PL&nUI!*Mqjena*M_G32<74x5IN3YdLm za9tIT;Bi#BbCqFTN4=p!Vn<}y3=Gs^?H30>lwvcXNM6@xJEbJKsj0o?EMx>I9ilif z%IFykN<2*nHPk>L+Z}Prmpl22a$=17I%AUkA0BQHlE}t+*f+VekYDNBe#rU+d4lHv zkhhcV?i;v*DHGVxJv(vy0R#)`@v0|PXPN-6MS~!?tgMaT1+gTUu!U_yV}tL#FArw0 z_3aPVw5s|(=x}aIRjC$rD3!#E%^20u0bqV5Y7Nxl&H1xby~HvdI_a@?SebKtifvcP zerl5SjqZrJgFreo#tiJxp153Hr~~3V=FFImkIcXGJFM;xIy~_ayx_>jKJ`~Na|Uw| z2o(dd6ZSC|!oAib1hIi$k8a_5+F-)TcUUk66^=AgIZkQ1H9rSg?aASYGkbP)vNo?L z2L=75+t{2))Zj)Vy(l4cgGk7XVY`#x1^jq~StjN>pVZ~hGK(*B@Bu&b1EC2CtDAo= z-YV4~%_25?IHq-4h`aUpswqeOiG#hXbniaaxjDDjk-;betlThW1v3(E-n?Q3n79=N zfL95tbmERnp?3Rf&CN%D9F#{iauErzym}VC&agD_(1~g!i!#G+F@6PGt8~NWI;$m< zz2PxK$nF<@Rp}hq*1}+@@4uwTk|0D^NJY^TFci^xn!}_(qbZy9priKar5njuBt!rJ zy8+Dz2z|m(NITDC8}Z%a`P7_`yk$b7JYS@2tRP(1PY#pAdqa7{pHL9wT;2Jv9)Z!} z!2Ii@T7rN-!PGiM^u@2x{Z|jh! ziV9DJ{H~$9>cOQHc;AURg_rym0sjTF9UibtXVcUgButGt)K267*GoRtm@!YZm9>Kv z5GqRQGL}vR)(h(=<&2U(5HSTf9ri?sfeydHjs)>w7e7ZNy_CynV3bUv8AJep%>gw2 z2zF2@zj+AS^`J{ipyEFmkAlC25cNU-L&gIa000mN007`S000000002WmZD!~z9bmK zgt%9jm_FZ0XteP+xEQ*`GK9lHI_(U>Z=ith9S4+_sBIWC42Xbxg! zWw|8$sIBFgZlSb}dV?i8XUvdW#buw1Xzr~F8ll>5HuMyjSTnqSZnE!$_Bq%Xd zz2Q`-gCeAL-V}sBm+g(Et)Uc`!($t5=~6h2B;q7_-%^ZCR=CYq`-x70 z*^}|ojXCs*U{B_ap#PS+>_+mxM2mjyccCV!8d85?-to<+wft*G(Z5|}o(ar#2sNgY zyvAT&HQ1x*MPLL<10xRlmT$$Rfl57W0k+4Uk%RdSW$(<8U^2&)!h(f=r=9i%>|G*n z9qqr5m7l${b9AKJLbq|J>oI2fbJgp9y$ zM`A~qC1{Ib{u@mUfd>F1!^4kf1{fV0OwNI7)rI9g__EmF`(SH@Gm3tdte}8N*5S#g z7^{QP=Mlic&z53D@xforIEkI8B8!W@n9UDsO4GVw#IzSl<45%(U5Bt&p5?^Yw}}wA zDRZ{!QF=@X8%zn&=QQis(-Hb@<+E;hnZcueXCo5yN zRq8)V-X@c~R$(^lDmQ*k)P#Mh08zpI44TO6W|Tjc@bL}1s*T~i?bS$oK%BEdxb^}> zKcfsk;4xIduS>~>*3Ff~FszPklu|#CND_)o6*>E&Hfb4=sVcH$WxJicKH*o)1MJoA z(jt9PMJ$(`Hk_(=Nc9jg$Trft>{j-4EJ)_ik97D3kOnI8VI4y4ikSdn7$Ud7Rf>ri ztfJR|N44KTD~3u+3H{zlCKhoNsbZe+--p|Yo(weMFeRP*cUBV%SXrbkLo&Lw*w_V+ zM|6 zpxuWN%iqurQM1Qf-7lR^1gpyG8ffY2b$#A~ub8($t7*WcW}+&|mvA@xLDjKZXt^sl zO?hR!6G>z4*lc3{dQoDXbqpkOUaOtQ47{UI~S3-4QW(eujpBg7*qqdK~=t@fAOht7nA_B697m-833H1 z3IG6L0NQv4DgYNK04UZp000mW0ssI2G$UX&004b(yW91;rQ>zH7N^zHVfxsKy_0eZ9T+YPU47EM+j3*hUeEW{QO|0|Wt~K@eJc z<*_y(Bmlr4YE=-3AQpcNm;eC)8JV!60{~F~rzVZE*(Jp!5=GBQSn){`H0s3KPZL{8 z0e9UTqmWI#_d;%M+wN{w2Hb4-J6$%m)V?_!Ms00+a!T9UDSmli*A}gOe6%XAR=!Tb z9YsMoGP%P6D3D0p9I|PWKsW#ZW(3S=3;^d1`JQg?+wNVvnJu=q5M8&L?q0jw?RVF% zEn5`Ux9@S(Q8JK#Ig&^SVkt2)QGf^t5{*I;0VId{5#a~;AL2of=?8#4 zeSelr1Oq$&B?}V;j}danNe@Vc0rk&7EQR`n6l9JI`ox8fISPg_dP<~#DoSBwVyQWw zh9;{^LWh(WDNSsU|bTF+8NNvq5}^elRTwTX`PMHVTdHk zdz|d+X;g&Fb~GtDRn;miNLgRlmAE*5`urz(`$C&vChH}UjgkvtktxWPkI= zXa4!G@gkR|7iXK!iEfXXm7x%x)nd!-_4jkvnMQo(1m1hPlqyURcBTQbrXb$Rm*E_RSbHve$x8Hc1dK64AxdG z5+~@w#BdUzMuC+buoF7^+v&dqk+@oEGGFS{_ya?KpY(kCH6`#W$HYBGPE@+sDsDO& zB?vM#Kun^1bak(%vxVo39TCzl(=&NPq_7#!)HKG<>e!b$TTf1qOPY)kyIQtkiC3Il zsMHhES@H)uryGnO;OapY<8F0hW2n%GwVu;Xk}Qg28ppLZQj8BOQ(E0d$r zR&*WvCS`{);FiUY-3NtnY8%hTGdc98DXLD(F}*CC^wy#6ElB~#s07RuolH^bICR7SrQk_<$^js*X;hw0m z&3toUHC)Kg+6y+Q>5r@v6LK2Oib}F3nDsfYgNSlhP7ECJRclRMnORl>oAe z)tAnxxuMiycRCV~WHiI7P(Cfj{SmYk7sDeC=eDY{|H;?Bg(N5|?t<+cW6u}Hd1t!00z zZ|oQ=aF)3g#&;za=IJjT{B%vzg4dqN#+TyhtvO=i4VAwy&y}2s8{(yCk`}?ROMW0P z@cH?ZBhfd~)Fc~zrBAA#8(Yl%wXSTq?IWVfU9OQ1ZUHoHGSY73+>#y;pPYj)XnPJD zjrWQ)Kj5|zCh!!hAprcSe>OY;qG`}AI@y{)X%&#I7=jIPCuW3zV6|g>{}cLXgLI;$ z_HR0YHCNNbW*tlPiPll*RBAM41gsyZTPPqq;3P}^08SfWAq*Afoea(wGBem=@P`S^ z&brVMB2*KI_X7)yZ)DH*ogzdk;Ie>*o209q)!y+!@ zl5Z%1LycpA9zRVL9YL)tb|(ZI_Op>J(o6Yg^)3b8_5C}%tKAR&0pdf-VqO)XcO>oX zsetukIqivRnSoJMvKjUV1T3wsW62jI9og_$-zWqeF0;l*YT;JT02sTRer3}#TzSWI zK|#aBrxH3RVgQf8;h(^_L}fRM=VlpN$HihLUf-}XIOp>#?sLw7$vm*Nq~9O&0id1g4gLCHu{J-cz4vZxjxXaxs2Uu`j6TTT#(ypN;VDmG7RAq~vT9 zdk*4?>sakGUR}Y~tmHFDhQ(h*s{$L}j?g=2nk0=PbYUC#1wZlee-q3qYwOBBC~=qs zRhk~N_&7w7u#<$gIwK;twpvAh`|+Qg^0Wu9hTTb&Y>*D8^yml^FcYH1yDc&JzGWF@E?1g_>i?As1M(v}E{BwK)NZu^v&GP}axG4~>mgZ|#qXOY!DLf>o}y%TI*mvj zs;;gRlp(SYGllv|ZTNC_vr!2*Msvoy zomLUsPRh0B*t?HF)3oEs!@}L@a=Hf0($2?Qml?oi&X(y!?c^m2#5@lkjGLKP8vl>+ ziGyA=vs>Ed`{MhqXWR5$(2`k@t(>Zy@`6&1aP4~6kY`DS?Wk`etBTCco!%!+(@L_2 z;dA$~u$y)vvlrgmycfH2n-+p*9Pb$o@oK6-FI^rxt*)(ySZ|Tk3YY3k6Ipw*tzicf z1NJsxDr_~`{_j`13boWQCqf|wum>_|OT&+#=haCj?hX-Jb>n+w;+RSyG$+LqV6lXc zW77o3+rMCNeiFIOvDcK>LTB$~+^I4L8`9>-{O}rpn%L{%XZZ30y8uze6D)jEH;}8) zNWS?ZaR3KU0WG@Xbl4NzAAL{6V~0b6kV84-Lk^hl$Xd(z=N5>CFqc8Lt@;61X20zA z24)yh<=Z!9z_bjuZ&9Txm+IA*`kw*=K2UvtxBWL>*wvAE-^>B$#}Q(}y!;xJ6an>zjQ9w6Kc?kx1%acIvUYc%Hi`g-Aw_Zh@$*oG#Si#nM9Z!5 z)u`(o1`{|D)DL-?02R?htoVb!op^hB`9bWH0F48Rn)0xp6#>LYFx9AlaayNX`2yTr zCd+3^MZo#-<97o14=dA(D%e~TInzfFZz4RAgc{Y$6UU3RO;{|nA_DjiE?LQjP_)34 zI!)gs*N=Q8ak?8his_vWgBuMUD%pU=Rh~^PoSi?}?(%z%3Fw`gNZ0p&sw$o5ojzhF zl-q`;YlvyAtK>hUfs`wXMzm>luSyVC5=nJkQuYy9&w~*IJIz_|D1v!%3NtVAy1Ol=q6ZJGg0@pup$^2y>3pxN!&%HM!S@Av^%pyuXkW)HvvT4vRzFm2T4iPT{07haIG2e)}F`r z^!q&hKXsUw)GLc)LS8|!zRn$o2(yv1n65m3v|O~zemXsWBR3N~Ao=r+3;+*GO!a4) z-n-mx$Zpl~Yhj15K1@d=RlRN(6i5^exSxq@zVdWTr1ZRUVI+BHBQ@73 zwl*MNp~vX3X(g1bTw=0!3@#{X2A;I#tueri0V3m?=$@LJVLykmZ?*<~ z5^!i8Hig}EakkB{3E6;B93F9EA~v5!-*(wkKM+3PLiJ6yJU`c=YvF9;{pP||W~5A} zX4j&d@O;YmJ2&5^UP5(omeC%%fw#_y=G5*K=ZF&B&w1ftdr z-Eg1%j{uvT`4M5;v-XPP2fagdagJ`0PB91Jo*}~;SiAB!#C`z9J24;b%ZJ>2ju(mQ zS$Kyi1@Zcan&B^QWLGIBGJk){k!oxgh>2AWmHR*=P!a3Ss0lFdjy^ljI?ZVB7e>E1 zQCXh#c9V?g2V~H$-W?eKfLbcocnWQL(2g}A^l5_YkaFQUZP4j#=p;*#xxF7qi}Yc3 z3kHet;94zG7Aj^<;v-RK88Ntcw?Bl20*-?qwjnxpypnTU zZw<-<*Rv^%GzkQ%p8MiSN?7x#9mD?7U%QWV>&!*?AQ9J(=@*SLkKG{=2n`tF-ClBK zgBsGXoELbF4$8wUfGgo7SfF0|qsZ}-7d&4Ws~?f%Tub>-qz})}K;x#O(oW6whaU~K^UOE@Q#fs;?xy=WHR2*%j zW?p8kN*7Ai>|(0hd)5wi%N4#UrUPrOmbb2Wtyv%MYc;%41?1CmzHj4%hLFjKW231V zT}Vucl82SYEhetcW319nkYGDyjM;kTrf-=wU-x0mlQUxio-rAWMvRz#9#j2{>hMhQ zV)b`S+cQ^-XM!~jwCHRQ-J}gk#;b7Ce$S-tEMvvnRq3FZ?OwbaFF%t)I^6-MJb#Mu z-Gw`reLcy9pH26Y^-e7WrL%x+>ADH1rFwAZ73c>ltiNmacUCay7>M+ShiD{ikwSqA z*x6FjQWX;O2v=T+_Cf{|8tH~lvu#o_Sp%Ih8-2idj8x0kW2X?>9@1}*lbnks9()m+ zXQ2ft8sAb~luEe9O9*Am_#kT?0{SA63uH!)GWI0{=AsMXPv+Q0XT&}l0B&TOjkE@f z>3teI+f1FTF6mMsCp)fa#9tHP)9KBb(Ef} zg`!k3>U5)+nNmDzo83I>(BJl>fbH^8C6<2pq6R{V4uz9=DXf8|Iz_^Yn7>NhH9Ne~2#g!wX(}&&ShDMNSzj+})qfoNb2E8G`#eHKbXMdjl4;!sh&F!e`Kf{{Jyy-FiT6bTr4qb^Xb zLBZXksuZ;D2D?;~Tu_Q=YzaZpl68=5T1C5=aiGuI6=hM-fn4*FXh$q)poU>w?%u0I zS+R#`reTdEZneqmlUDLMlhEg7?*J#FN;@7R+IgR4)DWR-#~eTSc|=%~ZY@X9cS(*D zj+HrpUGLxsy(_Ffc~8_3*#%W#%ZZX}~lBb`HJ^yn;DC$XOq-8k6Y#<4sXHr1xv=5J)$A~^-?%3iH{Ba+T`4bts z!`#NiYg#h#x$m-Ytoeta{~=G$xBTSm<<#Nxi`?KqPjcKB7Y~#VftkN~FyR!~oSc`! z@WNhP87EWxuHT;FulUV*A@luX|7FV!`S6c732SfcH@x>RWVw8k7{~Q{r~PE>xN>3t zi-xcLgMReh?;QQ(8J9fzCtv#mv;Oh&%YI{|94;}*({DpI_ z!InWtqTkOwinlQ4kKB9bWBlg#r+#qbW_*wXFy`N!dAgzCXFp5Yl>4VY*)aci-0IIf zN*#U|3;jCw_C8-nxC(!i+vvCyKjhl<_!|qqzJmO44@Au8-)lS=STJV1_ES>T6Pf3O za^~;27huAv*8LR|d6jX%XCHxz4E_zQ|MJ4$U$F3t0DgmC{p{aE?=|xfK2Y-S|2XYe z+3$f*>oL4<{%w|L^TVJgFy2mF;}uPw`_G=&0}eX(UJvu1)_wi~^ZF=pMP}I)A6e+h zCGG?>bUE9fa%g{uFPvkT!h9&Zlt4ab#F=5x%PcW+1hI_d#l#A+S%ml*2Rn4Q*C66i<@s`M-~w; zUeb;g6Fztn4`7A>4DbdNK!AQB0HFW?AreHID*)>~d;Ryi>-~P#EZfVLle^YtyRlbF zH?o^G6Ag0>5D~;P_#l2n{4n*=0*D9ukL2N$a0edlqkS3QL#1ts&G??TnpxuPH8dX9 zcrZ8~drDem0s?3sY-qcy7bNzI^bQ=c&hECn%?|NOT6L<4w{>vL-S%hmUAElq1-Fds z6>vryb=&yjX+QYrt7?HkmMm?{!>%`CJ|k9DcAPJ`!tSv6I&MVn0H>@|D4Uv#JY z8*`8KF>z)G&fphm_nKT+2@kkR(=|dX?lqu%M22s$(9Vs1RmhL$pyu@XKp*_Ujicm+ z-nh~uopLuZ@(g~b1RE1J8ybk48hJMSYzRLlx4iNY_%#r0NZ7y55H~gQZ1~s^{YW># z@(}nn5Nu4?2#XnRYvkDQupv8=>ydWMH)Nz8&DBXnDJLVSoF`Cd5vLFojG(`NAt*sj zixP6iIEA2y1cf0e3PDi_z>_SJ@5-4QaaKv#$Q>f~`A32gG)KroPSS{$XpBxFC?dp` ze~eBcQ5^v?qeR0|QGObNnjPJIvmataG3&IP(v6fXE8jy#mPAbw5|PA3fk!J5QJU!_ zWU2FH3XS3vf+7$Ug`h(OO%x&krZeHSye2+Pk9nfm5-~Dcl_e`98M#PS*^@mIKO&6C zITA3U)|oT&60`Z_@e%!PN$xhT9FdjJY!QrXlcAa0Gdyyiwl3Z+JIM8?BAmhVJ~rQx1Ux z;NjKAwUDl4rQkWwJgpRdKXPdhxrsG9uJvM=>b;v#Hj9&{+aBPNi+1)+-!7tTc{xTt zQ~z(W>r@qQL9{ir9^LVbfIEf0#-Y8%E_s3%IpPiug|%)s7xJ%{zCricCl7hZ8O%Sw zJHIiT@yR}T(wVCSHtIdw#9qxD#yqa)v54(1qQ>|IS6s1p(K~8n_-*PWRR@+S*ryOP{mGNy#tyW;l-o$J8stskU@W4Nu->B|dqqi@-JG=2~UAxU+ zX!>(6gI*iog6U=pJGs~Kd-|T0#Icv~{rj^jyMFZ<@BWzDn&O%}>Dk)}wcz3QuWr$& z@{5MF1>br^0`nSvhm6A0qrf4CQ+xS;`45K39+7%7|2EMP4hydxhoK%)NP^QTq4%9n z28;gc*~H#VCoyQ_51-h-am9jwtQ_l@Yyi>eI-liLIbD2shD2xt+OhdwAiLza3UMY0 z*Tilf9y7Mp!I9hS^zq0ScBP3{jnRs?i0-uc>k#C@r5B%f6FHC(!Htn$?@2`JKR}+l zZH>mUjkmRz%6t&LoE$THSupAi-Y=o#8hf}^kqM#k)f(&STMm95ssznhPseCI~sma(`Ob_4qeJD8FLc%?Th)~&F63%Zyr z(j-DI8|8jn>XkkXBUBUcI&O>k(lJOM^njOkUje_+JFPUGerC!JwXF}8O|ISQ#B&mz z$GQyLI`p{^s@HWI{XDNGw4ScaJ5f6*i{3Qq9nf&kp~@1M+k>tghk8(e6qh2bD&~L| z^qsHVqzNxhsV`^*sK{CYQZnqsWdn24IvfUdK^LIHd8c&LgRp3PN9yQ|kPq{@oG#PP zeVJT4gQJI)>N*vC+vb2yV@_Ij8xo6pTJty@xd=T;Bp;OSN`_A}hwVh7q25q$9LQwU zW?G*6C5tcNw9-6ulZj|N7I#P(p-=)`a)RaN(xED#A!&`(jsSOOFht^fC5;5}?Npsj z=PU23F8YLqvml=4Zf z^H2T`oNY6Tm{QLs`9WjnK>MlQ^@hxtlB;*3=LDswuPR_-u_By}*PS~9I|wfaSN?6+ zEPVH~X$$A^1O6#JL}zpOBklhTOX4s?I}_^NF$eqebdu40QJV~$@WG3=RX&U#evmsm zeo#NOF00dESloaf4MjppeWFl{nSt_C;wiJ8>lA}vrcq~h-f9{m;_Y{nq>V>`n67y{ z(;Zf$Cv<7hbtm&3VbjE6-)ZrcIUX!ubb2Hk8ozh28f4S}y;;m2#pstnc2IiK>KscM zrKJ9vOlykS(C6beOPq~shok+G;-zP+X36W;-QA8pN?#$ad|ytE-;9YTc?`%4KOPUD;yn z-GN{R>!JabKV{P2(4(fqgO@W)u&KD_=tGwE@dLN-n-JVb)c_<#l0s~j=pyRg6Er$- zLqxf~Ysq8>wX<|Hxsl@`o*aNcnH?Ha$xdjvoH_?sGS^?aq%B z`W_@$oyav-T|rs`QQ`Jsv(-wNWQ9Sc_J^37oi%?NC?-f0&nrl;Q1?e^^DbNXOp0hdEs9?45`8l-X0%C{5Zs zR~RQI?kvPrxjs@${Im;g>7is{19b*U8^YlN=8Gr_B9GSe$}ePshf`!b zzR2vGtM;~KG2vm4I{<`*pqKD-;oaU}*L;ep1$*~PwhK^E+BvMV*d@-v?pRZVGDu`) zA)W`DVj%Ggh3?!>Wz8r+wYevrY86_zZ&%Y-?`$=2M}}g(%qRBI?ryAZu^+1IUM=S{ zTW-&gdb3o7V+7-dgj}L~?j~9tF#B zoQ7XW5ceX-kdFPEYK&7UK{ZO<G?pQnp}U35=tM>5{AlucddT?fAp$^GACf)h0#wuT6DwPjxU2%4}E| zYFbcfiv46?9cTRvt8L%)&WXfRI@zU=vSrUZ5d}l|B*F-o7$TgIN$rwbY3)gDX>6%( zId6i>hy{snj8+q2VvgeD#XrbodxYE&JxrF^b*C|ASCp++dx-gLBNr}8K`tZAr^DAT z?Dx&1iD`0A>naSa>X>!ewfN@I%C;Wx>@+$n2Z7d7Qia{jDtJf+L4nM3+Yxp?@PljdGrKmg>ebBZ208BGAPsx02-;$J)2 z#Xe(R0Qyl?{VM3`0JX<5SQI>8w1OtNW0?ew*txHC{qjbIG&iu-WLfn##0hT9s*MnZ;0=P}V@8y658@#^ zm$y2kkU}d?^x%`DP#lUX7tkE7_?SVRau~A*Y9H+VfR>?qj>&N3b1N{I?W1j9*oJco z??C3UCw2fU;VQLFrlwkh(9;nR^JUfn8#RDV2CgtG4B*%MtlMIs3}cRhv%otBurZ-j z3m;i{nFB9mxtdUccP!SnT~HX>0m$`TA%N+QEP#et>x~~s#uoW>7Q$E70)+8IO;95> zRjh}*wtQdEiO2YbxJ{rRIu?uZbD+=s1bU~dBwb(qpbm%O#bpy*oU&e7V3xRkMeGHy zm88);b3eFqY(L{MqN=p?>tTbl=8uA7t^=!xigp7LH#s?@H@6L_G!oa(a;MTo@2)pi zB9r_A?cu7&@YgNU_v{|MhN}lk)r$sAVMO_(F|?Ke^-Qox$SU2@#B&6lqI1!`09z8= ze=-9JdqQCC3)?3ym-W(WCpjMcxB)^Iu1^o%5)gjE@Rk)`o>@{yHwyh2D*&62yC!M= zWf39ZS3hgMKLamW=(I&=@jV zseC>1tQlN&#R1i-u@BIjqpFZPIcK?s)&na@N*HI}a)N`nEt6qLl*zE#{duV)28Tre z0Jrgbul52z#l;14q%B!^k5YnBs=P)8fo1ZDpbc{>^&7W~5NC|3g}4C5UULPip&<0j z$lA{lrvXybB6Y8*s#cL z!XKwPEFaV2J@9sr2r(pTJqY8-Euuj}ifJ?;!En&3{$QEWN_*Cn8KF7y0LH6#SQW5z z>Ca|Sg%PxDhJj+AQph>rLyaci-!tw1?7NZ6<^2;NkD7`rQK-oP32wXiNh@y4<_73F zkFf@oJ|GEuMfG}&NKQ=t-%rfUGi`Pc5@!c5LvU?U#Y z8JL>w%Yx}q9(X+QZInZ|uoM)p3Rr-n2B=Xv6>~v{3|L{58O;Z^tz*C4@(IgCg{^_Q zeb_9Q!_(0EHZa)W11+P;Tab@lxnQ;i)mhG%q}QYQ4Cc|42JAkzc7uc-q?0vR_}F7F zr^#C)n{79+?!fMH7x-|1UP&%B-|qFe!k^ZBQ`(aD13|;|t>9rz&WPJEU?H$y95YY5 z^f{lg-35Y2AcCL=QS0l6^Oy70`YD6II{7E75Nbz%Y_@^gHpce;Q8#AC6UWRqS z^Bp=&jkOAfAbz+q&yD|{rQ_NLJ70u2YVr*91C84T;BE)r^Vmy|lP(5$8UAjeUe67D zzOu%H1CJTW4(XZmPP7#WUke6VZ{G4C!DG;NG2CzBKyT{uMwJrP(ETddR7@yyMo$|x z`$_}&mLMi;pHMT(>l{)}{Xo}9sA2_{gZ=tZ6NoTnK1%7w2C_4jn9Yk-@D4I#0B9BD zbqXq~gJq*_z%tuT4CM378#zW0A-86k9!TbnKt8Pz^=1D{B%pv;_8Hlm5qU`sH*x$J z{cQ>P{mM2W(l?THeQI|g04`*`6}%EBaPd*2cl01mB`Q-JsG>Jm8JQNA8|P*q&7WdB z*9eX8(nmcMWN_~ynKpYvnNi|tP=5wgV|tN_lwiT8^%yCbmEoIAWy7-t#|&+?3|?96 z)rG-g11#4uvkoJM=PqMA^$2Ffdp_s}5E%)xrK%r*j~dy%5*yOBG$#b9TP5)IXb^w% zd4Z}t03KExS@uK83W;ZmNj2kEEpUE}3!u{8IjXR4tFZ1qrl=HuPnGF6+%ECsbOh$@ zFS{X_e3`Fc4%}ZdhDcbdJ=)}OXXe~|HK)|Y(LIu@^98Rwjq zEO&ww2X`QqG>k;k&u3J)q`q%4PYLG;8G@dkywL_Egjyn%EWuGjQtGglX3ouX38{u+ z<*FC>=RzLkm44PPJnHo6fxk%lTucuE`TsOyZ^-+B`=9y1pn)gF7v&Vqz@Hh3`=bbE z06`2n~(ndGFHE-`TDsJm&c%*4wdHl%Cv_~m$IrCAxhA) zVkxpADbeLZP?0v9q;+hF3bnaVC?FdmVl5(;EgO__ZZ2XoX<`$qd}fb{8_7$bHMUqNsY+)BDW8TYRLzA_6~+m5HlYeq zW+$3Zuo6T;RMrggd!s>+?-J;D?h9Ch-qKg z;i^(o#GR(D>&Bp3R4B?nt!}BPSE>FlGd5^Fu1#NdsQFu9B+CYK?^G)C_eUB44`nNLh+2AIGkpV?(RF`Yp%u`@UnHu1!N zhLkekBqjbAjw2Yz5}24+DI*Hf?+9-nQDB&98_H6`Z^>=oiL(TrCiHeq=8?OH|1uC~ z^%x`5do3pt1k%{jb~`~yJ5lSo1iiG#+SVrd(jaWRo9jyi!L+}&pH7gc0q}Mcq?+R! zZv=Uo;9F29h_udIzbDAF)!e@)2sGNbp-+%$zqx=-5UM@6^Gy(`Y0MQ}f{~gC-NGj% zwUD}qPl0M6c}a;SYUJ(^O@!dd@I0ZLa73X$ zY4C(&DjcD?&|@C=`=KNtl#MqNF4e#U)WFCW(?UDU?J> zNhFF&qESo|C1O%2iIb8^6qH1wm?TQYq)`$kC6XvSp_{lw!J+x7FXD;b#1m6Q=ab&& z6TgHfCK8Pg4uww%$G?9s{3|~Lru*1^5}OeB-Vn%y1~QUxH2`-9002|tSVLnP5+DWx zP4+|@8uV`1J&>N8e`9wxu-MRy?(!CJ--aDz$GF=~0`8AU+E*(XpV1#mY*w+*Nb$B- zkv=R+@moB3EG%pKY1gmTlFr+2TfdE#uUDh#l`12%swy)XA~?9Bqm`yHsJK>KhN`ND zFs$<%<9-|n2{=X=bZhg?ki!}U1V6YTtQMyU(WDeL6g5&^X=%Z7uBRPPRo`86-%047 zDUycoRo_7DliD=kuBv0G?_OH+&ik93l~WlA&wKCL#c}8J-Fm~!c?tZ)=-HUSpIK*( z009&g0RR9I4Mzb%lw*j(!QL3DjQOf6tGr38*%$8b-$C+G*9DU1&ind7r#V1tuIsFN zBkl7EUH%d?)qHbu*@yc7zed%``ERx7;KMmS21SX(*O1|^U98zy(#r?cNXe5S{srFe z-UILhvR+$=yb=MVJsU_O8?@8BfInXNxYzjwuk+^1mhf)EX4h(HlI5gNUI?S8@8Gw(3WE>eiT8VJ=)DL$|0o zijEGvk*u&AHUf9%j5r0JxNQVh&<`IG5ksd_$dQw~_Q95qSdG&~=W${iKjBxbSg=>3 z^{kKGdj!r)S8@6vy_>E-rfVdwh^L=>dt%gMg^@8@QDBU2tiU&@?on4c)atnf9jPDO z-Ps?buLj#vVL&t$qNdVQ)tmSwU%sCOGuaUT`Y31E6?lpBVl&$5h|@A?7g9xxrBt4 z)P;rS)G(4Pdx75s*5>TFbMjC-EoKzwpIsoQBObRz(w}NS5}#^1QjBVDU6;D1=JT(A z!c#;5RU?uDRr`^hRV7K!s)!_K)ivV;TH22atu09sRE$B1G4OW`9e(XGfGs=Ns(5+y`@u4Ns6kz^;5U)rYS6+-SuaM zCG+cn8I~R2*S+IAi&Z;)txUXF9v+c7$1pYatyiEoYql>|=<*A~Xa6sAoly3lTi=>) z`vvXf?Xl0MiS`P%kNIl=dmn}F zKyhu39+F5=d8lb2|G{nZA?k9r4$VwyaI_mRhbWl2(utSM!=bNQ>Gw?yor0`$=8i}9 zWNDCt80oCCTG_9Ld(ZTs=SdOVyKFz@=P{1Y$vchDg%9w5s#?gzK`|_RSXnw7De5KX zLSyX|Eb5eeRPQ6(N@|uY;sg{=>hZq|b{Cg(*cZz&e<74q(X)psI=C3H4gFj*_72cK zIB7|c0){I8`f?Fn;~#i-g||)1ao&*igeU%|7Y=PHzkf!_mUaY54LANg5w>Yf-*}Jj9W{}U-4y_psf4ipJ{s(}3 zziTSQS0Xy#eoounOqV9W%T!X(^IU`L3lk(oB>O{OE;=T}C^I1&68^(yV?}WSAr&zq zSsB{GM^R7<1PsLFiMb@82mAx$R7+L$A0bPUZZ2eS7{aki8F}iBvgkq`)|X*RlTx`} z?nYKAt;fs3Y#gj+DKJUnm5)r8C0d!Boyh?@+q)Ua;b+NZDPa~6zhcLT+@vwTjs#m0 zuo>3}GB_?@lA#(Wp~MbSdRg0rOwmpn50wn50$R?J=9bhct#@$6GpRbQZ=BK`nbqo) zM4FVh03T$ICLi&^LGKb{B6i}R8CPTy5Fa5{7+$p>^h(72LEkHj^WuCcCI`R#yA zed&d7lLRN|wN(G6cA3&s*C04EFKcb)n=F~cn%Sc^bWzkfin!~phnx8RfEiTP%DOPx z{s#oOt}5rByn8WrfAckvPEu~;1J|PXGoU3g_$}{jw;ky5UI?W5)mT&sVZJ&SDpY$I zWUx~T4-keI_llDDm@l)u*-xqaJJc5GUBRo<1sb-_*F0)3aUY$;4_m+W$bi5oxQ14f z{yuJO6fFnfpBL3e)Z3txy5YAL2SdlNCx23#8@lV=klhQrgCtCK^6iq&yiGFX5gCk? zJi$U8oA&ueV5a4Hibx?Jp{Wc)@yX=My*( zL7_7NhVB~}!;y46N@yX6=YrUu?q0n2-ayE&8Ho^2BXfon%n2sU9aqf$oy;6~8J}>H zA=e6|(V|~0e$zg3m8eUa8xk-7JsYyzuqpOft-`Rs zH^+xTx^N`$Z(RqLP=&Cgt{C(VUdUC!mI((V)P4m!0wiLB9-ShsWtBKhe;Uo=S~*pirGTs*K95*3FV&@Z1ZZvE zs5;LRT(8aVhx$2Rw2m9u0ed~~K_>+K?D zQ->Y$as3~}ncAQf`Px+BhWYurUqwNYCk}Ae9}f!cSZ}aN419)jz}OD?14EuQj7E8X z%#CFCGLl{2KeqR z93I_m2RRq+EpkhL`5qeZZZFA@Dd>i!S9QL#ocuX<;Di515AeJnM5)m&{DwdT6}UGZ z?Uh#$Y6g>e%;_3}a`FG(76i>` zmP&lVdBNoMCUt}+xUcScH_sZfJF@aMJ)L>t4NOU#VH&1h(E9s5WOKHKC=ly-4$9jM zEE55DTxES{$aq3gb#=7Xg1ESn06x3_JrvU+xr;S91oUY&5OtS?NMJf*nj>gnH;|xK!p;vm&%_V^CrBt#gE)ST&-YNyWb6|sl#a@W0#~i; z>m$o(W>{vB=VoSS*c^DP8JSff`(OOoRt{y=K8i6ijAu^8kQOiFVY9A6YRG}3WZtmf zkfh?J<7%3aopW%u8OKyPCuxSr0oa(YMje=_9za>@!5@Kol$Wr2q)=Bq{%R!EunQm% ztoS>ixZ&obHjK|T+tb7Le3)`4dNMDRk&f~7`9jv>k+LQ<4;-g(@S%OL4_-Ptc@aJr zk`wpgV9(o5$pjM9{~2-P@y*dEad{cg54z|u5EJ3W&!*{eT{hXjfJ%vY@F;a0u z<@HFN*82RvNu61V2%s4i!^wbFKSOa-c}QPvs-( zb*|>|LLp>$ExD{S(NZG@#Cpwc;n>Whycyunvc`pAE{1-#>?b?RWqK22XyaN<5izLq zG3}x#N<8`Ivbh*zRrd}i%cXMRd}MQ~*Y|+#F6@H~+cQQ)+==?`zmk5$Th*v>#)!6daf6%pp=)r>m|T!9zXv%$ zALcUT6Mtq3n2oAw!Kk14-vkwTET!yNzq8HH5YQa2_Xi z6ArY?2h91VXJre5ABlpB7?R_uPC+ir!7GnbV#s+GP7EJgiPPA@5S(diaorAAD8cTF zo(+{hTmwJS?xrM^9vJ3Cjb7lKA2tJXefPF*(qK0H+>WP%5ZR?E0W`87l_1-d}X zD5lzwmnGk^*g}kFDKoSYTC`RLhX8ULYgRbqRFhv&BaU?N1mOv`CREcA&Ol-s3LLOM zHC|%Ag~wplRiIqM)G*!|=tLR$*5C{C!vov@H`};}Zp%9qGHhg$A0$Zngj}Sk zteKOn-C%ZcLK1SB+AGzQ|wl z(}r`j%?N8sv?Bl?>1bK7jJJ04HGUE{IkB<^jm!^`)U~VD9>-i1enVWHf=1p#&r( zmW0s>DifF>2x~^{;aMSkj}M&%D=XDMuESWZdpS~JRQpQx2qm6g0dBkhc+@^B0pv|_ zA4B|gY7X?aDh2$T*C?k~Ad>?3ZX{SCg<#yJtuvTSKL;8$`A7cht-N$XeNOMa8Ucv0 zrh&TsHQV*=PJxg2RW#lIXFh{(*HiUu9H!!&8X3A$mS}|ga|I3Kdt?+z(%LX`jzS!~lz3XM#v-%kdpx-a|XEtI#F%U`ccf zvTc)Df*4cU@J({p*ZhEm)`)|q1x@yPo?`3uKr};Qua`i!$&&kVx5UlOip)w^oEaQ> z!%%0aOxpsfQFv71R;G*s9C<0(+17TatOJbmV@@&gRIsiV48}%#=lF8BYliTqKl$J@j~wsTyyg=-C z%jEV3!BoWtTqx4?vMyIR2#~9;wT(D5-~$gCg3A?r^3X?$xE5tbNzGbB=&dmhH)cvO zh%rh4Jjn*eCN_$3n^#0^0dYCLV{dzC~ zLJRO}{N-*0x*=|8i+NN*e3?lRr9eQ#E zJ5{&Y+2F>)$J$A*c^}yUIO;G_z{M3|F6t>&WmF< z>e*q@&`PqvSrhE(m8s@FO5RNiH4=Um+Uu4-0N2@VsZl|!+dFxvD#Ew4c>R?IaO#)j z)M(w-=J7+y-}_yi#H*_ye~s4Cl5M%E&#i4osmC?6bB9`X$Q<7LqlT_72UQ%bNJ?4o zj!yVuk6+V>+#&NXlvuni4lgdZEu3(caof~1^%hy^f;Mjy-qNLuCXsjsANoH%MVb+s zZh5(!ie|UNAxx0j2?AR%M##dN;-J zr&q-Om)4Juy{qW;GA*batgd@?!W!q}OH?yUAY5WRkB^_

    %dT8#&n9#M4$?9@Y?VN*Gm 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 test.txt + ./minizip test test.txt ./miniunz -l test.zip - mv readme.txt readme.old + @mv test.txt test.old ./miniunz test.zip + @cmp test.txt test.old + @rm -f test.* clean: - /bin/rm -f *.o *~ minizip miniunz + /bin/rm -f *.o *~ minizip miniunz test.* diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/Makefile.am b/src/dependencies/zlib-1.2.13/contrib/minizip/Makefile.am similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/Makefile.am rename to src/dependencies/zlib-1.2.13/contrib/minizip/Makefile.am diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt b/src/dependencies/zlib-1.2.13/contrib/minizip/MiniZip64_Changes.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt rename to src/dependencies/zlib-1.2.13/contrib/minizip/MiniZip64_Changes.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt b/src/dependencies/zlib-1.2.13/contrib/minizip/MiniZip64_info.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt rename to src/dependencies/zlib-1.2.13/contrib/minizip/MiniZip64_info.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/configure.ac b/src/dependencies/zlib-1.2.13/contrib/minizip/configure.ac similarity index 93% rename from src/dependencies/zlib-1.2.11/contrib/minizip/configure.ac rename to src/dependencies/zlib-1.2.13/contrib/minizip/configure.ac index 5b11970..bff300b 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/configure.ac +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com]) +AC_INIT([minizip], [1.2.13], [bugzilla.redhat.com]) AC_CONFIG_SRCDIR([minizip.c]) AM_INIT_AUTOMAKE([foreign]) LT_INIT diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/crypt.h b/src/dependencies/zlib-1.2.13/contrib/minizip/crypt.h similarity index 88% rename from src/dependencies/zlib-1.2.11/contrib/minizip/crypt.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/crypt.h index 1e9e820..1cc41f1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/crypt.h +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/crypt.h @@ -38,6 +38,7 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ + (void)pcrc_32_tab; temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } @@ -77,24 +78,24 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcr (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) #define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), (Byte)t^(c)) #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define RAND_HEAD_LEN 12 /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif -static int crypthead(const char* passwd, /* password string */ - unsigned char* buf, /* where to write header */ - int bufSize, - unsigned long* pkeys, - const z_crc_t* pcrc_32_tab, - unsigned long crcForCrypting) +static unsigned crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) { - int n; /* index in random header */ + unsigned n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */ diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.c b/src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.c similarity index 94% rename from src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.c index 7f5c191..814a6fd 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.c @@ -58,7 +58,7 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); else { - uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); if ((tell_uLong) == MAXU32) return (ZPOS64_T)-1; else @@ -96,6 +96,7 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in { FILE* file = NULL; const char* mode_fopen = NULL; + (void)opaque; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else @@ -114,6 +115,7 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, { FILE* file = NULL; const char* mode_fopen = NULL; + (void)opaque; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else @@ -132,6 +134,7 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; + (void)opaque; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } @@ -139,6 +142,7 @@ static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; + (void)opaque; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } @@ -146,6 +150,7 @@ static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const voi static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) { long ret; + (void)opaque; ret = ftell((FILE *)stream); return ret; } @@ -154,7 +159,8 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) { ZPOS64_T ret; - ret = FTELLO_FUNC((FILE *)stream); + (void)opaque; + ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream); return ret; } @@ -162,6 +168,7 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs { int fseek_origin=0; long ret; + (void)opaque; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : @@ -176,7 +183,7 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs default: return -1; } ret = 0; - if (fseek((FILE *)stream, offset, fseek_origin) != 0) + if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0) ret = -1; return ret; } @@ -185,6 +192,7 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T { int fseek_origin=0; long ret; + (void)opaque; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : @@ -200,7 +208,7 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T } ret = 0; - if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + if(FSEEKO_FUNC((FILE *)stream, (z_off_t)offset, fseek_origin) != 0) ret = -1; return ret; @@ -210,6 +218,7 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) { int ret; + (void)opaque; ret = fclose((FILE *)stream); return ret; } @@ -217,6 +226,7 @@ static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) { int ret; + (void)opaque; ret = ferror((FILE *)stream); return ret; } diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.h b/src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.h similarity index 98% rename from src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.h index 8dcbdb0..ae9ca7e 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/ioapi.h +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/ioapi.h @@ -50,7 +50,7 @@ #define ftello64 ftell #define fseeko64 fseek #else -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) #define fopen64 fopen #define ftello64 ftello #define fseeko64 fseeko @@ -91,8 +91,7 @@ typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; typedef uint64_t ZPOS64_T; #else -/* Maximum unsigned 32-bit value used as placeholder for zip64 */ -#define MAXU32 0xffffffff + #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 ZPOS64_T; @@ -102,7 +101,10 @@ typedef unsigned long long int ZPOS64_T; #endif #endif - +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#ifndef MAXU32 +#define MAXU32 (0xffffffff) +#endif #ifdef __cplusplus extern "C" { diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/iowin32.c b/src/dependencies/zlib-1.2.13/contrib/minizip/iowin32.c similarity index 98% rename from src/dependencies/zlib-1.2.11/contrib/minizip/iowin32.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/iowin32.c index 274f39e..7df5251 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/iowin32.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/iowin32.c @@ -28,6 +28,11 @@ // see Include/shared/winapifamily.h in the Windows Kit #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) + +#if !defined(WINAPI_FAMILY_ONE_PARTITION) +#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition) +#endif + #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) #define IOWIN32_USING_WINRT_API 1 #endif diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/iowin32.h b/src/dependencies/zlib-1.2.13/contrib/minizip/iowin32.h similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/iowin32.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/iowin32.h diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/make_vms.com b/src/dependencies/zlib-1.2.13/contrib/minizip/make_vms.com similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/make_vms.com rename to src/dependencies/zlib-1.2.13/contrib/minizip/make_vms.com diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/miniunz.c b/src/dependencies/zlib-1.2.13/contrib/minizip/miniunz.c similarity index 95% rename from src/dependencies/zlib-1.2.11/contrib/minizip/miniunz.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/miniunz.c index 3d65401..0dc9b50 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/miniunz.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/miniunz.c @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef _WIN32 # include @@ -80,7 +81,7 @@ filename : the filename of the file where date/time must be modified dosdate : the new date at the MSDos format (4 bytes) tmu_date : the SAME new date at the tm_unz format */ -void change_file_date(filename,dosdate,tmu_date) +static void change_file_date(filename,dosdate,tmu_date) const char *filename; uLong dosdate; tm_unz tmu_date; @@ -97,7 +98,8 @@ void change_file_date(filename,dosdate,tmu_date) SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); CloseHandle(hFile); #else -#ifdef unix || __APPLE__ +#if defined(unix) || defined(__APPLE__) + (void)dosdate; struct utimbuf ut; struct tm newdate; newdate.tm_sec = tmu_date.tm_sec; @@ -121,7 +123,7 @@ void change_file_date(filename,dosdate,tmu_date) /* mymkdir and change_file_date are not 100 % portable As I don't know well Unix, I wait feedback for the unix portion */ -int mymkdir(dirname) +static int mymkdir(dirname) const char* dirname; { int ret=0; @@ -135,14 +137,14 @@ int mymkdir(dirname) return ret; } -int makedir (newdir) - char *newdir; +static int makedir (newdir) + const char *newdir; { char *buffer ; char *p; - int len = (int)strlen(newdir); + size_t len = strlen(newdir); - if (len <= 0) + if (len == 0) return 0; buffer = (char*)malloc(len+1); @@ -185,13 +187,13 @@ int makedir (newdir) return 1; } -void do_banner() +static void do_banner() { printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); } -void do_help() +static void do_help() { printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ " -e Extract without pathname (junk paths)\n" \ @@ -203,7 +205,7 @@ void do_help() " -p extract crypted file using password\n\n"); } -void Display64BitsSize(ZPOS64_T n, int size_char) +static void Display64BitsSize(ZPOS64_T n, int size_char) { /* to avoid compatibility problem , we do here the conversion */ char number[21]; @@ -231,7 +233,7 @@ void Display64BitsSize(ZPOS64_T n, int size_char) printf("%s",&number[pos_string]); } -int do_list(uf) +static int do_list(uf) unzFile uf; { uLong i; @@ -309,7 +311,7 @@ int do_list(uf) } -int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) +static int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) unzFile uf; const int* popt_extract_without_path; int* popt_overwrite; @@ -324,7 +326,6 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) uInt size_buf; unz_file_info64 file_info; - uLong ratio=0; err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); if (err!=UNZ_OK) @@ -439,7 +440,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) break; } if (err>0) - if (fwrite(buf,err,1,fout)!=1) + if (fwrite(buf,(unsigned)err,1,fout)!=1) { printf("error in writing extracted file\n"); err=UNZ_ERRNO; @@ -472,7 +473,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) } -int do_extract(uf,opt_extract_without_path,opt_overwrite,password) +static int do_extract(uf,opt_extract_without_path,opt_overwrite,password) unzFile uf; int opt_extract_without_path; int opt_overwrite; @@ -481,7 +482,6 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password) uLong i; unz_global_info64 gi; int err; - FILE* fout=NULL; err = unzGetGlobalInfo64(uf,&gi); if (err!=UNZ_OK) @@ -508,14 +508,13 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password) return 0; } -int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) +static int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) unzFile uf; const char* filename; int opt_extract_without_path; int opt_overwrite; const char* password; { - int err = UNZ_OK; if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) { printf("file %s not found in the zipfile\n",filename); @@ -565,7 +564,7 @@ int main(argc,argv) while ((*p)!='\0') { - char c=*(p++);; + char c=*(p++); if ((c=='l') || (c=='L')) opt_do_list = 1; if ((c=='v') || (c=='V')) diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/miniunzip.1 b/src/dependencies/zlib-1.2.13/contrib/minizip/miniunzip.1 similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/miniunzip.1 rename to src/dependencies/zlib-1.2.13/contrib/minizip/miniunzip.1 diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/minizip.1 b/src/dependencies/zlib-1.2.13/contrib/minizip/minizip.1 similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/minizip.1 rename to src/dependencies/zlib-1.2.13/contrib/minizip/minizip.1 diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/minizip.c b/src/dependencies/zlib-1.2.13/contrib/minizip/minizip.c similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/minizip/minizip.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/minizip.c index 4288962..e8561b1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/minizip.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/minizip.c @@ -71,8 +71,8 @@ #define MAXFILENAME (256) #ifdef _WIN32 -uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ +static int filetime(f, tmzip, dt) + const char *f; /* name of file to get info on */ tm_zip *tmzip; /* return value: access, modific. and creation times */ uLong *dt; /* dostime */ { @@ -94,12 +94,13 @@ uLong filetime(f, tmzip, dt) return ret; } #else -#ifdef unix || __APPLE__ -uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ +#if defined(unix) || defined(__APPLE__) +static int filetime(f, tmzip, dt) + const char *f; /* name of file to get info on */ tm_zip *tmzip; /* return value: access, modific. and creation times */ uLong *dt; /* dostime */ { + (void)dt; int ret=0; struct stat s; /* results of stat() */ struct tm* filedate; @@ -108,7 +109,7 @@ uLong filetime(f, tmzip, dt) if (strcmp(f,"-")!=0) { char name[MAXFILENAME+1]; - int len = strlen(f); + size_t len = strlen(f); if (len > MAXFILENAME) len = MAXFILENAME; @@ -138,7 +139,7 @@ uLong filetime(f, tmzip, dt) } #else uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ + const char *f; /* name of file to get info on */ tm_zip *tmzip; /* return value: access, modific. and creation times */ uLong *dt; /* dostime */ { @@ -150,7 +151,7 @@ uLong filetime(f, tmzip, dt) -int check_exist_file(filename) +static int check_exist_file(filename) const char* filename; { FILE* ftestexist; @@ -163,13 +164,13 @@ int check_exist_file(filename) return ret; } -void do_banner() +static void do_banner() { printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); } -void do_help() +static void do_help() { printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ " -o Overwrite existing file.zip\n" \ @@ -182,14 +183,14 @@ void do_help() /* calculate the CRC32 of a file, because to encrypt a file, we need known the CRC32 of the file before */ -int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +static int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) { unsigned long calculate_crc=0; int err=ZIP_OK; FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); unsigned long size_read = 0; - unsigned long total_read = 0; + /* unsigned long total_read = 0; */ if (fin==NULL) { err = ZIP_ERRNO; @@ -199,7 +200,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne do { err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); + size_read = fread(buf,1,size_buf,fin); if (size_read < size_buf) if (feof(fin)==0) { @@ -208,8 +209,8 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne } if (size_read>0) - calculate_crc = crc32(calculate_crc,buf,size_read); - total_read += size_read; + calculate_crc = crc32_z(calculate_crc,buf,size_read); + /* total_read += size_read; */ } while ((err == ZIP_OK) && (size_read>0)); @@ -221,7 +222,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne return err; } -int isLargeFile(const char* filename) +static int isLargeFile(const char* filename) { int largeFile = 0; ZPOS64_T pos = 0; @@ -229,8 +230,8 @@ int isLargeFile(const char* filename) if(pFile != NULL) { - int n = FSEEKO_FUNC(pFile, 0, SEEK_END); - pos = FTELLO_FUNC(pFile); + FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = (ZPOS64_T)FTELLO_FUNC(pFile); printf("File : %s is %lld bytes\n", filename, pos); @@ -255,7 +256,7 @@ int main(argc,argv) char filename_try[MAXFILENAME+16]; int zipok; int err=0; - int size_buf=0; + size_t size_buf=0; void* buf=NULL; const char* password=NULL; @@ -276,7 +277,7 @@ int main(argc,argv) while ((*p)!='\0') { - char c=*(p++);; + char c=*(p++); if ((c=='o') || (c=='O')) opt_overwrite = 1; if ((c=='a') || (c=='A')) @@ -396,7 +397,7 @@ int main(argc,argv) (strlen(argv[i]) == 2))) { FILE * fin; - int size_read; + size_t size_read; const char* filenameinzip = argv[i]; const char *savefilenameinzip; zip_fileinfo zi; @@ -472,7 +473,7 @@ int main(argc,argv) do { err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); + size_read = fread(buf,1,size_buf,fin); if (size_read < size_buf) if (feof(fin)==0) { @@ -482,7 +483,7 @@ int main(argc,argv) if (size_read>0) { - err = zipWriteInFileInZip (zf,buf,size_read); + err = zipWriteInFileInZip (zf,buf,(unsigned)size_read); if (err<0) { printf("error in writing %s in the zipfile\n", diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/minizip.pc.in b/src/dependencies/zlib-1.2.13/contrib/minizip/minizip.pc.in similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/minizip.pc.in rename to src/dependencies/zlib-1.2.13/contrib/minizip/minizip.pc.in diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/mztools.c b/src/dependencies/zlib-1.2.13/contrib/minizip/mztools.c similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/mztools.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/mztools.c diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/mztools.h b/src/dependencies/zlib-1.2.13/contrib/minizip/mztools.h similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/minizip/mztools.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/mztools.h diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/unzip.c b/src/dependencies/zlib-1.2.13/contrib/minizip/unzip.c similarity index 98% rename from src/dependencies/zlib-1.2.11/contrib/minizip/unzip.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/unzip.c index bcfb941..3036b47 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/unzip.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/unzip.c @@ -112,7 +112,7 @@ # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} +# define TRYFREE(p) { free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) @@ -455,7 +455,7 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } @@ -523,7 +523,7 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } @@ -853,13 +853,13 @@ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) { ZPOS64_T uDate; uDate = (ZPOS64_T)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + ptm->tm_mday = (int)(uDate&0x1f) ; + ptm->tm_mon = (int)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (int)(((uDate&0x0FE00)/0x0200)+1980) ; - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; + ptm->tm_hour = (int) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (int) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (int) (2*(ulDosDate&0x1f)) ; } /* @@ -993,7 +993,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1018,7 +1018,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1090,7 +1090,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1566,6 +1566,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; else { + TRYFREE(pfile_in_zip_read_info->read_buffer); TRYFREE(pfile_in_zip_read_info); return err; } @@ -1586,6 +1587,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; else { + TRYFREE(pfile_in_zip_read_info->read_buffer); TRYFREE(pfile_in_zip_read_info); return err; } @@ -1767,7 +1769,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; + return (iRead==0) ? UNZ_EOF : (int)iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) @@ -1857,6 +1859,9 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + /* Detect overflow, because z_stream.total_out is uLong (32 bits) */ + if (uTotalOutAftertotal_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; @@ -1871,14 +1876,14 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; + return (iRead==0) ? UNZ_EOF : (int)iRead; if (err!=Z_OK) break; } } if (err==Z_OK) - return iRead; + return (int)iRead; return err; } diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/unzip.h b/src/dependencies/zlib-1.2.13/contrib/minizip/unzip.h similarity index 97% rename from src/dependencies/zlib-1.2.11/contrib/minizip/unzip.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/unzip.h index 2104e39..6f95e94 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/unzip.h +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/unzip.h @@ -83,12 +83,12 @@ typedef voidp unzFile; /* tm_unz contain date/time info */ typedef struct tm_unz_s { - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/zip.c b/src/dependencies/zlib-1.2.13/contrib/minizip/zip.c similarity index 98% rename from src/dependencies/zlib-1.2.11/contrib/minizip/zip.c rename to src/dependencies/zlib-1.2.13/contrib/minizip/zip.c index 44e88a9..66d693f 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/zip.c +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/zip.c @@ -158,7 +158,7 @@ typedef struct #ifndef NOCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const z_crc_t* pcrc_32_tab; - int crypt_header_size; + unsigned crypt_header_size; #endif } curfile64_info; @@ -301,7 +301,7 @@ local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, } } - if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,(uLong)nbByte)!=(uLong)nbByte) return ZIP_ERRNO; else return ZIP_OK; @@ -337,8 +337,8 @@ local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) else if (year>=80) year-=80; return - (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); + (uLong) (((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon+1)) + (512 * year)) << 16) | + (((uLong)ptm->tm_sec/2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); } @@ -522,12 +522,12 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } - if (uPosFound!=0) - break; + if (uPosFound!=0) + break; } TRYFREE(buf); return uPosFound; @@ -586,7 +586,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib // Signature "0x07064b50" Zip64 end of central directory locater if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } } @@ -637,7 +637,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib return relativeOffset; } -int LoadCentralDirectoryRecord(zip64_internal* pziinit) +local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { int err=ZIP_OK; ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ @@ -955,7 +955,7 @@ extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) return zipOpen3(pathname,append,NULL,NULL); } -int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) { /* write the local header */ int err; @@ -1034,8 +1034,8 @@ int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_ex // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize,2); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); @@ -1471,11 +1471,6 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in { uLong uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_NO_FLUSH); - if(uTotalOutBefore > zi->ci.stream.total_out) - { - int bBreak = 0; - bBreak++; - } zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } @@ -1516,7 +1511,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s zip64_internal* zi; ZPOS64_T compressed_size; uLong invalidValue = 0xffffffff; - short datasize = 0; + unsigned datasize = 0; int err=ZIP_OK; if (file == NULL) @@ -1752,7 +1747,7 @@ extern int ZEXPORT zipCloseFileInZip (zipFile file) return zipCloseFileInZipRaw (file,0,0); } -int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) { int err = ZIP_OK; ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; @@ -1774,7 +1769,7 @@ int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eo return err; } -int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; @@ -1813,7 +1808,7 @@ int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centra } return err; } -int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; @@ -1861,7 +1856,7 @@ int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, return err; } -int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) { int err = ZIP_OK; uInt size_global_comment = 0; @@ -1959,10 +1954,10 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe int retVal = ZIP_OK; - if(pData == NULL || *dataLen < 4) + if(pData == NULL || dataLen == NULL || *dataLen < 4) return ZIP_PARAMERROR; - pNewHeader = (char*)ALLOC(*dataLen); + pNewHeader = (char*)ALLOC((unsigned)*dataLen); pTmp = pNewHeader; while(p < (pData + *dataLen)) diff --git a/src/dependencies/zlib-1.2.11/contrib/minizip/zip.h b/src/dependencies/zlib-1.2.13/contrib/minizip/zip.h similarity index 95% rename from src/dependencies/zlib-1.2.11/contrib/minizip/zip.h rename to src/dependencies/zlib-1.2.13/contrib/minizip/zip.h index 8aaebb6..7e4509d 100644 --- a/src/dependencies/zlib-1.2.11/contrib/minizip/zip.h +++ b/src/dependencies/zlib-1.2.13/contrib/minizip/zip.h @@ -88,12 +88,12 @@ typedef voidp zipFile; /* tm_zip contain date/time info */ typedef struct tm_zip_s { - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years - [1980..2044] */ } tm_zip; typedef struct @@ -144,6 +144,11 @@ extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)); +extern zipFile ZEXPORT zipOpen3 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def)); + extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, diff --git a/src/dependencies/zlib-1.2.11/contrib/pascal/example.pas b/src/dependencies/zlib-1.2.13/contrib/pascal/example.pas similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/pascal/example.pas rename to src/dependencies/zlib-1.2.13/contrib/pascal/example.pas diff --git a/src/dependencies/zlib-1.2.11/contrib/pascal/readme.txt b/src/dependencies/zlib-1.2.13/contrib/pascal/readme.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/pascal/readme.txt rename to src/dependencies/zlib-1.2.13/contrib/pascal/readme.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/pascal/zlibd32.mak b/src/dependencies/zlib-1.2.13/contrib/pascal/zlibd32.mak similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/pascal/zlibd32.mak rename to src/dependencies/zlib-1.2.13/contrib/pascal/zlibd32.mak diff --git a/src/dependencies/zlib-1.2.11/contrib/pascal/zlibpas.pas b/src/dependencies/zlib-1.2.13/contrib/pascal/zlibpas.pas similarity index 99% rename from src/dependencies/zlib-1.2.11/contrib/pascal/zlibpas.pas rename to src/dependencies/zlib-1.2.13/contrib/pascal/zlibpas.pas index a0dff11..bf3fff6 100644 --- a/src/dependencies/zlib-1.2.11/contrib/pascal/zlibpas.pas +++ b/src/dependencies/zlib-1.2.13/contrib/pascal/zlibpas.pas @@ -10,7 +10,7 @@ unit zlibpas; interface const - ZLIB_VERSION = '1.2.11'; + ZLIB_VERSION = '1.2.13'; ZLIB_VERNUM = $12a0; type diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/Makefile b/src/dependencies/zlib-1.2.13/contrib/puff/Makefile similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/puff/Makefile rename to src/dependencies/zlib-1.2.13/contrib/puff/Makefile diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/README b/src/dependencies/zlib-1.2.13/contrib/puff/README similarity index 99% rename from src/dependencies/zlib-1.2.11/contrib/puff/README rename to src/dependencies/zlib-1.2.13/contrib/puff/README index bbc4cb5..d8192c7 100644 --- a/src/dependencies/zlib-1.2.11/contrib/puff/README +++ b/src/dependencies/zlib-1.2.13/contrib/puff/README @@ -38,7 +38,7 @@ Then you can call puff() to decompress a deflate stream that is in memory in its entirety at source, to a sufficiently sized block of memory for the decompressed data at dest. puff() is the only external symbol in puff.c The only C library functions that puff.c needs are setjmp() and longjmp(), which -are used to simplify error checking in the code to improve readabilty. puff.c +are used to simplify error checking in the code to improve readability. puff.c does no memory allocation, and uses less than 2K bytes off of the stack. If destlen is not enough space for the uncompressed data, then inflate will diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/puff.c b/src/dependencies/zlib-1.2.13/contrib/puff/puff.c similarity index 99% rename from src/dependencies/zlib-1.2.11/contrib/puff/puff.c rename to src/dependencies/zlib-1.2.13/contrib/puff/puff.c index c6c90d7..6737ff6 100644 --- a/src/dependencies/zlib-1.2.11/contrib/puff/puff.c +++ b/src/dependencies/zlib-1.2.13/contrib/puff/puff.c @@ -43,7 +43,7 @@ * - Use pointers instead of long to specify source and * destination sizes to avoid arbitrary 4 GB limits * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), - * but leave simple version for readabilty + * but leave simple version for readability * - Make sure invalid distances detected if pointers * are 16 bits * - Fix fixed codes table error @@ -624,7 +624,7 @@ local int fixed(struct state *s) * are themselves compressed using Huffman codes and run-length encoding. In * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means * that length, and the symbols 16, 17, and 18 are run-length instructions. - * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * Each of 16, 17, and 18 are followed by extra bits to define the length of * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols * are common, hence the special coding for zero lengths. diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/puff.h b/src/dependencies/zlib-1.2.13/contrib/puff/puff.h similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/puff/puff.h rename to src/dependencies/zlib-1.2.13/contrib/puff/puff.h diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/pufftest.c b/src/dependencies/zlib-1.2.13/contrib/puff/pufftest.c similarity index 98% rename from src/dependencies/zlib-1.2.11/contrib/puff/pufftest.c rename to src/dependencies/zlib-1.2.13/contrib/puff/pufftest.c index 7764814..5f72ecc 100644 --- a/src/dependencies/zlib-1.2.11/contrib/puff/pufftest.c +++ b/src/dependencies/zlib-1.2.13/contrib/puff/pufftest.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) len - sourcelen); } - /* if requested, inflate again and write decompressd data to stdout */ + /* if requested, inflate again and write decompressed data to stdout */ if (put && ret == 0) { if (fail) destlen >>= 1; diff --git a/src/dependencies/zlib-1.2.11/contrib/puff/zeros.raw b/src/dependencies/zlib-1.2.13/contrib/puff/zeros.raw similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/puff/zeros.raw rename to src/dependencies/zlib-1.2.13/contrib/puff/zeros.raw diff --git a/src/dependencies/zlib-1.2.11/contrib/testzlib/testzlib.c b/src/dependencies/zlib-1.2.13/contrib/testzlib/testzlib.c similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/testzlib/testzlib.c rename to src/dependencies/zlib-1.2.13/contrib/testzlib/testzlib.c diff --git a/src/dependencies/zlib-1.2.11/contrib/testzlib/testzlib.txt b/src/dependencies/zlib-1.2.13/contrib/testzlib/testzlib.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/testzlib/testzlib.txt rename to src/dependencies/zlib-1.2.13/contrib/testzlib/testzlib.txt diff --git a/src/dependencies/zlib-1.2.11/contrib/untgz/Makefile b/src/dependencies/zlib-1.2.13/contrib/untgz/Makefile similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/untgz/Makefile rename to src/dependencies/zlib-1.2.13/contrib/untgz/Makefile diff --git a/src/dependencies/zlib-1.2.11/contrib/untgz/Makefile.msc b/src/dependencies/zlib-1.2.13/contrib/untgz/Makefile.msc similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/untgz/Makefile.msc rename to src/dependencies/zlib-1.2.13/contrib/untgz/Makefile.msc diff --git a/src/dependencies/zlib-1.2.11/contrib/untgz/untgz.c b/src/dependencies/zlib-1.2.13/contrib/untgz/untgz.c similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/untgz/untgz.c rename to src/dependencies/zlib-1.2.13/contrib/untgz/untgz.c diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/readme.txt b/src/dependencies/zlib-1.2.13/contrib/vstudio/readme.txt similarity index 90% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/readme.txt rename to src/dependencies/zlib-1.2.13/contrib/vstudio/readme.txt index f67eae8..17e693f 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/readme.txt +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/readme.txt @@ -1,4 +1,4 @@ -Building instructions for the DLL versions of Zlib 1.2.11 +Building instructions for the DLL versions of Zlib 1.2.13 ======================================================== This directory contains projects that build zlib and minizip using @@ -17,9 +17,6 @@ More information can be found at this site. Build instructions for Visual Studio 2008 (32 bits or 64 bits) -------------------------------------------------------------- - Decompress current zlib, including all contrib/* files -- Compile assembly code (with Visual Studio Command Prompt) by running: - bld_ml64.bat (in contrib\masmx64) - bld_ml32.bat (in contrib\masmx86) - Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 - Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/miniunz.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/miniunz.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/miniunz.vcxproj.filters similarity index 89% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/miniunz.vcxproj.filters index 0b2a3de..e53556a 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -3,7 +3,7 @@ {048af943-022b-4db6-beeb-a54c34774ee2} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/minizip.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/minizip.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/minizip.vcxproj.filters similarity index 89% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/minizip.vcxproj.filters index dd73cd3..bd18d71 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -3,7 +3,7 @@ {c0419b40-bf50-40da-b153-ff74215b79de} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {bb87b070-735b-478e-92ce-7383abb2f36c} diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj similarity index 90% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj index 9088d17..0e668f7 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj @@ -181,7 +181,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebug @@ -194,7 +194,7 @@ EditAndContinue - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -241,7 +241,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -254,7 +254,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -269,14 +269,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -352,14 +352,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -398,14 +398,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj.filters similarity index 88% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj.filters index 249daa8..3cf52ee 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -3,7 +3,7 @@ {c1f6a2e3-5da5-4955-8653-310d3efe05a9} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} @@ -30,9 +30,6 @@ Source Files - - Source Files - Source Files diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlibdll.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlibdll.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlibdll.vcxproj.filters similarity index 89% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlibdll.vcxproj.filters index 53a8693..aeb550e 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -3,7 +3,7 @@ {fa61a89f-93fc-4c89-b29e-36224b7592f4} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {d4b85da0-2ba2-4934-b57f-e2584e3848ee} diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlib.rc similarity index 80% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlib.rc index fee177a..8760274 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 2, 13, 0 + PRODUCTVERSION 1, 2, 13, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.2.13\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj similarity index 88% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj index b9f2bbe..c7ed09e 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj @@ -160,7 +160,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -182,16 +182,12 @@ $(OutDir)zlibstat.lib true - - cd ..\..\masmx86 -bld_ml32.bat - OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -210,19 +206,15 @@ bld_ml32.bat /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true - - cd ..\..\masmx86 -bld_ml32.bat - OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -252,7 +244,7 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -274,10 +266,6 @@ bld_ml32.bat $(OutDir)zlibstat.lib true - - cd ..\..\masmx64 -bld_ml64.bat - @@ -285,7 +273,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -314,8 +302,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -334,14 +322,10 @@ bld_ml64.bat /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true - - cd ..\..\masmx64 -bld_ml64.bat - @@ -349,7 +333,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -379,7 +363,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -409,7 +393,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -443,14 +427,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj.filters similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj.filters index c8c7f7e..ba7e23d 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -33,9 +33,6 @@ Source Files - - Source Files - Source Files diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.def similarity index 96% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.def index 54e683d..ba09bc1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.def @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.sln similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.sln diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj similarity index 90% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj index 6ff9ddb..19dfc35 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj @@ -197,8 +197,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebug @@ -219,7 +219,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true .\zlibvc.def true @@ -229,10 +229,6 @@ - - cd ..\..\masmx86 -bld_ml32.bat - @@ -244,7 +240,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -288,8 +284,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -312,7 +308,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true false .\zlibvc.def @@ -322,10 +318,6 @@ bld_ml32.bat - - cd ..\..\masmx86 -bld_ml32.bat - @@ -337,8 +329,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -358,7 +350,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true .\zlibvc.def true @@ -366,10 +358,6 @@ bld_ml32.bat Windows MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -381,7 +369,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -424,7 +412,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -465,7 +453,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -510,8 +498,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -533,7 +521,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true false .\zlibvc.def @@ -541,10 +529,6 @@ bld_ml64.bat Windows MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -556,7 +540,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -601,14 +585,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj.filters similarity index 94% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj.filters index 180b71c..67c444a 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -42,9 +42,6 @@ Source Files - - Source Files - Source Files diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/miniunz.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/miniunz.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/minizip.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/minizip.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/testzlib.vcxproj similarity index 90% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/testzlib.vcxproj index 6d55954..c6198c1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/testzlib.vcxproj @@ -187,7 +187,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -200,7 +200,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -247,7 +247,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -260,7 +260,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -275,14 +275,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -358,14 +358,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -404,14 +404,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/testzlibdll.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/testzlibdll.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlib.rc similarity index 80% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlib.rc index fee177a..8760274 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 2, 13, 0 + PRODUCTVERSION 1, 2, 13, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.2.13\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibstat.vcxproj similarity index 89% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibstat.vcxproj index 806b76a..86fb1c8 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibstat.vcxproj @@ -167,7 +167,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -193,8 +193,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -213,7 +213,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -221,7 +221,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -251,7 +251,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -280,7 +280,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -309,8 +309,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -329,7 +329,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -340,7 +340,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -370,7 +370,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -400,7 +400,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -434,14 +434,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.def similarity index 96% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.def index 54e683d..ba09bc1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.def @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.sln similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.sln diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.vcxproj similarity index 90% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.vcxproj index c65b95f..fc8cd9c 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc11/zlibvc.vcxproj @@ -204,8 +204,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -226,7 +226,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -240,10 +240,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -255,7 +251,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -303,8 +299,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -327,7 +323,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -341,10 +337,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -356,8 +348,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -377,7 +369,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -389,10 +381,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -404,7 +392,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -447,7 +435,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -492,7 +480,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -537,8 +525,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -560,7 +548,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -572,10 +560,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -587,7 +571,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -632,14 +616,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/miniunz.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/miniunz.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/minizip.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/minizip.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/testzlib.vcxproj similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/testzlib.vcxproj index 64b2cbe..41303c0 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/testzlib.vcxproj @@ -190,7 +190,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -203,7 +203,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -250,7 +250,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -263,7 +263,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -279,14 +279,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -362,14 +362,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -408,14 +408,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/testzlibdll.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/testzlibdll.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlib.rc similarity index 82% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlib.rc index c4e4b01..cdd7985 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 2, 13, 0 + PRODUCTVERSION 1, 2, 13, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.2.13\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibstat.vcxproj similarity index 91% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibstat.vcxproj index 3fdee7c..6629d8e 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibstat.vcxproj @@ -170,7 +170,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -196,8 +196,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -216,7 +216,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -224,7 +224,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -254,7 +254,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -283,7 +283,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -312,8 +312,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -332,7 +332,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -343,7 +343,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -373,7 +373,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -403,7 +403,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -437,14 +437,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.def similarity index 96% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.def index 54e683d..ba09bc1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.def @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.sln similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.sln diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.vcxproj similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.vcxproj index ab2b6c3..4e0de69 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc12/zlibvc.vcxproj @@ -207,8 +207,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -229,7 +229,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -243,10 +243,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -258,7 +254,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -306,8 +302,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -330,7 +326,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -345,10 +341,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib false - - cd ..\..\masmx86 -bld_ml32.bat - @@ -360,8 +352,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -381,7 +373,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -393,10 +385,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -408,7 +396,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -451,7 +439,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -496,7 +484,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -541,8 +529,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -564,7 +552,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -576,10 +564,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -591,7 +575,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -636,14 +620,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/miniunz.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/miniunz.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/minizip.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/minizip.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/testzlib.vcxproj similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/testzlib.vcxproj index 2c37125..5452049 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/testzlib.vcxproj @@ -190,7 +190,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -203,7 +203,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -250,7 +250,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -263,7 +263,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -279,14 +279,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -362,14 +362,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -408,14 +408,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/testzlibdll.vcxproj similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/testzlibdll.vcxproj diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlib.rc similarity index 82% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlib.rc index c4e4b01..cdd7985 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 2, 13, 0 + PRODUCTVERSION 1, 2, 13, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.2.13\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibstat.vcxproj similarity index 91% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibstat.vcxproj index 3e4b986..85c1e89 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibstat.vcxproj @@ -170,7 +170,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -196,8 +196,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -216,7 +216,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -224,7 +224,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -254,7 +254,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -283,7 +283,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -312,8 +312,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -332,7 +332,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -343,7 +343,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -373,7 +373,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -403,7 +403,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -437,14 +437,6 @@ - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.def similarity index 96% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.def index 54e683d..ba09bc1 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.def @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.sln similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.sln diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.vcxproj similarity index 92% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.vcxproj index f8f673c..424ff55 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc14/zlibvc.vcxproj @@ -207,8 +207,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -229,7 +229,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -243,10 +243,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -258,7 +254,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -306,8 +302,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -330,7 +326,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -345,10 +341,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib false - - cd ..\..\masmx86 -bld_ml32.bat - @@ -360,8 +352,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -381,7 +373,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -393,10 +385,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -408,7 +396,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -451,7 +439,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -496,7 +484,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -541,8 +529,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -564,7 +552,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -576,10 +564,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -591,7 +575,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -636,14 +620,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/miniunz.vcproj similarity index 95% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/miniunz.vcproj index 7da32b9..cc3d13a 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/miniunz.vcproj @@ -542,7 +542,7 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/testzlibdll.vcproj similarity index 95% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/testzlibdll.vcproj index b1ddde0..6448b49 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/testzlibdll.vcproj @@ -542,7 +542,7 @@ + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 13, 0 + PRODUCTVERSION 1, 2, 13, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.13\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibstat.vcproj similarity index 86% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibstat.vcproj index 61c76c7..1bf1563 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibstat.vcproj @@ -47,7 +47,7 @@ @@ -343,8 +342,8 @@ @@ -418,7 +416,7 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.def b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 0000000..ba09bc1 --- /dev/null +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,158 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.sln similarity index 100% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.sln diff --git a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.vcproj similarity index 88% rename from src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj rename to src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.vcproj index c9a8947..f11dd1f 100644 --- a/src/dependencies/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj +++ b/src/dependencies/zlib-1.2.13/contrib/vstudio/vc9/zlibvc.vcproj @@ -53,8 +53,8 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/dependencies/zlib-1.2.13/crc32.c b/src/dependencies/zlib-1.2.13/crc32.c new file mode 100644 index 0000000..f8357b0 --- /dev/null +++ b/src/dependencies/zlib-1.2.13/crc32.c @@ -0,0 +1,1125 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * This interleaved implementation of a CRC makes use of pipelined multiple + * arithmetic-logic units, commonly found in modern CPU cores. It is due to + * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + MAKECRCH can be #defined to write out crc32.h. A main() routine is also + produced, so that this one source file can be compiled to an executable. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ + + /* + A CRC of a message is computed on N braids of words in the message, where + each word consists of W bytes (4 or 8). If N is 3, for example, then three + running sparse CRCs are calculated respectively on each braid, at these + indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ... + This is done starting at a word boundary, and continues until as many blocks + of N * W bytes as are available have been processed. The results are combined + into a single CRC at the end. For this code, N must be in the range 1..6 and + W must be 4 or 8. The upper limit on N can be increased if desired by adding + more #if blocks, extending the patterns apparent in the code. In addition, + crc32.h would need to be regenerated, if the maximum N value is increased. + + N and W are chosen empirically by benchmarking the execution time on a given + processor. The choices for N and W below were based on testing on Intel Kaby + Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64 + Octeon II processors. The Intel, AMD, and ARM processors were all fastest + with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4. + They were all tested with either gcc or clang, all using the -O3 optimization + level. Your mileage may vary. + */ + +/* Define N */ +#ifdef Z_TESTN +# define N Z_TESTN +#else +# define N 5 +#endif +#if N < 1 || N > 6 +# error N must be in 1..6 +#endif + +/* + z_crc_t must be at least 32 bits. z_word_t must be at least as long as + z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and + that bytes are eight bits. + */ + +/* + Define W and the associated z_word_t type. If W is not defined, then a + braided calculation is not used, and the associated tables and code are not + compiled. + */ +#ifdef Z_TESTW +# if Z_TESTW-1 != -1 +# define W Z_TESTW +# endif +#else +# ifdef MAKECRCH +# define W 8 /* required for MAKECRCH */ +# else +# if defined(__x86_64__) || defined(__aarch64__) +# define W 8 +# else +# define W 4 +# endif +# endif +#endif +#ifdef W +# if W == 8 && defined(Z_U8) + typedef Z_U8 z_word_t; +# elif defined(Z_U4) +# undef W +# define W 4 + typedef Z_U4 z_word_t; +# else +# undef W +# endif +#endif + +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 +# define ARMCRC32 +#endif + +/* Local functions. */ +local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); +local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); + +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) + local z_word_t byte_swap OF((z_word_t word)); +#endif + +#if defined(W) && !defined(ARMCRC32) + local z_crc_t crc_word OF((z_word_t data)); + local z_word_t crc_word_big OF((z_word_t data)); +#endif + +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) +/* + Swap the bytes in a z_word_t to convert between little and big endian. Any + self-respecting compiler will optimize this to a single machine byte-swap + instruction, if one is available. This assumes that word_t is either 32 bits + or 64 bits. + */ +local z_word_t byte_swap(word) + z_word_t word; +{ +# if W == 8 + return + (word & 0xff00000000000000) >> 56 | + (word & 0xff000000000000) >> 40 | + (word & 0xff0000000000) >> 24 | + (word & 0xff00000000) >> 8 | + (word & 0xff000000) << 8 | + (word & 0xff0000) << 24 | + (word & 0xff00) << 40 | + (word & 0xff) << 56; +# else /* W == 4 */ + return + (word & 0xff000000) >> 24 | + (word & 0xff0000) >> 8 | + (word & 0xff00) << 8 | + (word & 0xff) << 24; +# endif +} +#endif + +/* CRC polynomial. */ +#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ + +#ifdef DYNAMIC_CRC_TABLE + +local z_crc_t FAR crc_table[256]; +local z_crc_t FAR x2n_table[32]; +local void make_crc_table OF((void)); +#ifdef W + local z_word_t FAR crc_big_table[256]; + local z_crc_t FAR crc_braid_table[W][256]; + local z_word_t FAR crc_braid_big_table[W][256]; + local void braid OF((z_crc_t [][256], z_word_t [][256], int, int)); +#endif +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *, int)); + local void write_table32hi OF((FILE *, const z_word_t FAR *, int)); + local void write_table64 OF((FILE *, const z_word_t FAR *, int)); +#endif /* MAKECRCH */ + +/* + Define a once() function depending on the availability of atomics. If this is + compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in + multiple threads, and if atomics are not available, then get_crc_table() must + be called to initialize the tables and must return before any threads are + allowed to compute or combine CRCs. + */ + +/* Definition of once functionality. */ +typedef struct once_s once_t; +local void once OF((once_t *, void (*)(void))); + +/* Check for the availability of atomics. */ +#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ + !defined(__STDC_NO_ATOMICS__) + +#include + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + atomic_flag begun; + atomic_int done; +}; +#define ONCE_INIT {ATOMIC_FLAG_INIT, 0} + +/* + Run the provided init() function exactly once, even if multiple threads + invoke once() at the same time. The state must be a once_t initialized with + ONCE_INIT. + */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!atomic_load(&state->done)) { + if (atomic_flag_test_and_set(&state->begun)) + while (!atomic_load(&state->done)) + ; + else { + init(); + atomic_store(&state->done, 1); + } + } +} + +#else /* no atomics */ + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + volatile int begun; + volatile int done; +}; +#define ONCE_INIT {0, 0} + +/* Test and set. Alas, not atomic, but tries to minimize the period of + vulnerability. */ +local int test_and_set OF((int volatile *)); +local int test_and_set(flag) + int volatile *flag; +{ + int was; + + was = *flag; + *flag = 1; + return was; +} + +/* Run the provided init() function once. This is not thread-safe. */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!state->done) { + if (test_and_set(&state->begun)) + while (!state->done) + ; + else { + init(); + state->done = 1; + } + } +} + +#endif + +/* State for once(). */ +local once_t made = ONCE_INIT; + +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x + (which is shifting right by one and adding x^32 mod p if the bit shifted out + is a one). We start with the highest power (least significant bit) of q and + repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all the + information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. + */ + +local void make_crc_table() +{ + unsigned i, j, n; + z_crc_t p; + + /* initialize the CRC of bytes tables */ + for (i = 0; i < 256; i++) { + p = i; + for (j = 0; j < 8; j++) + p = p & 1 ? (p >> 1) ^ POLY : p >> 1; + crc_table[i] = p; +#ifdef W + crc_big_table[i] = byte_swap(p); +#endif + } + + /* initialize the x^2^n mod p(x) table */ + p = (z_crc_t)1 << 30; /* x^1 */ + x2n_table[0] = p; + for (n = 1; n < 32; n++) + x2n_table[n] = p = multmodp(p, p); + +#ifdef W + /* initialize the braiding tables -- needs x2n_table[] */ + braid(crc_braid_table, crc_braid_big_table, N, W); +#endif + +#ifdef MAKECRCH + { + /* + The crc32.h header file contains tables for both 32-bit and 64-bit + z_word_t's, and so requires a 64-bit type be available. In that case, + z_word_t must be defined to be 64-bits. This code then also generates + and writes out the tables for the case that z_word_t is 32 bits. + */ +#if !defined(W) || W != 8 +# error Need a 64-bit integer type in order to generate crc32.h. +#endif + FILE *out; + int k, n; + z_crc_t ltl[8][256]; + z_word_t big[8][256]; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + + /* write out little-endian CRC table to crc32.h */ + fprintf(out, + "/* crc32.h -- tables for rapid CRC calculation\n" + " * Generated automatically by crc32.c\n */\n" + "\n" + "local const z_crc_t FAR crc_table[] = {\n" + " "); + write_table(out, crc_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#ifdef W\n" + "\n" + "#if W == 8\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table64(out, crc_big_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table32hi(out, crc_big_table, 256); + fprintf(out, + "};\n" + "\n" + "#endif\n"); + + /* write out braid tables for each value of N */ + for (n = 1; n <= 6; n++) { + fprintf(out, + "\n" + "#if N == %d\n", n); + + /* compute braid tables for this N and 64-bit word_t */ + braid(ltl, big, n, 8); + + /* write out braid tables for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#if W == 8\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table64(out, big[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n"); + + /* compute braid tables for this N and 32-bit word_t */ + braid(ltl, big, n, 4); + + /* write out braid tables for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table32hi(out, big[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "#endif\n" + "\n" + "#endif\n"); + } + fprintf(out, + "\n" + "#endif\n"); + + /* write out zeros operator table to crc32.h */ + fprintf(out, + "\n" + "local const z_crc_t FAR x2n_table[] = {\n" + " "); + write_table(out, x2n_table, 32); + fprintf(out, + "};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH + +/* + Write the 32-bit values in table[0..k-1] to out, five per line in + hexadecimal separated by commas. + */ +local void write_table(out, table, k) + FILE *out; + const z_crc_t FAR *table; + int k; +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the high 32-bits of each value in table[0..k-1] to out, five per line + in hexadecimal separated by commas. + */ +local void write_table32hi(out, table, k) +FILE *out; +const z_word_t FAR *table; +int k; +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n] >> 32), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the 64-bit values in table[0..k-1] to out, three per line in + hexadecimal separated by commas. This assumes that if there is a 64-bit + type, then there is also a long long integer type, and it is at least 64 + bits. If not, then the type cast and format string can be adjusted + accordingly. + */ +local void write_table64(out, table, k) + FILE *out; + const z_word_t FAR *table; + int k; +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ", + (unsigned long long)(table[n]), + n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", ")); +} + +/* Actually do the deed. */ +int main() +{ + make_crc_table(); + return 0; +} + +#endif /* MAKECRCH */ + +#ifdef W +/* + Generate the little and big-endian braid tables for the given n and z_word_t + size w. Each array must have room for w blocks of 256 elements. + */ +local void braid(ltl, big, n, w) + z_crc_t ltl[][256]; + z_word_t big[][256]; + int n; + int w; +{ + int k; + z_crc_t i, p, q; + for (k = 0; k < w; k++) { + p = x2nmodp((n * w + 3 - k) << 3, 0); + ltl[k][0] = 0; + big[w - 1 - k][0] = 0; + for (i = 1; i < 256; i++) { + ltl[k][i] = q = multmodp(i << 24, p); + big[w - 1 - k][i] = byte_swap(q); + } + } +} +#endif + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ======================================================================== + * Routines used for CRC calculation. Some are also required for the table + * generation above. + */ + +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(a, b) + z_crc_t a; + z_crc_t b; +{ + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} + +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(n, k) + z_off64_t n; + unsigned k; +{ + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +/* ========================================================================= + * This function can be used by asm versions of crc32(), and to force the + * generation of the CRC tables in a threaded application. + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for + * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will + * only be defined if the compilation specifies an ARM processor architecture + * that has the instructions. For example, compiling with -march=armv8.1-a or + * -march=armv8-a+crc, or -march=native if the compile machine has the crc32 + * instructions. + */ +#ifdef ARMCRC32 + +/* + Constants empirically determined to maximize speed. These values are from + measurements on a Cortex-A57. Your mileage may vary. + */ +#define Z_BATCH 3990 /* number of words in a batch */ +#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ +#define Z_BATCH_MIN 800 /* fewest words in a final batch */ + +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + z_crc_t val; + z_word_t crc1, crc2; + const z_word_t *word; + z_word_t val0, val1, val2; + z_size_t last, last2, i; + z_size_t num; + + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */ + word = (z_word_t const *)buf; + num = len >> 3; + len &= 7; + + /* Do three interleaved CRCs to realize the throughput of one crc32x + instruction per cycle. Each CRC is calculated on Z_BATCH words. The + three CRCs are combined into a single CRC after each set of batches. */ + while (num >= 3 * Z_BATCH) { + crc1 = 0; + crc2 = 0; + for (i = 0; i < Z_BATCH; i++) { + val0 = word[i]; + val1 = word[i + Z_BATCH]; + val2 = word[i + 2 * Z_BATCH]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * Z_BATCH; + num -= 3 * Z_BATCH; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2; + } + + /* Do one last smaller batch with the remaining words, if there are enough + to pay for the combination of CRCs. */ + last = num / 3; + if (last >= Z_BATCH_MIN) { + last2 = last << 1; + crc1 = 0; + crc2 = 0; + for (i = 0; i < last; i++) { + val0 = word[i]; + val1 = word[i + last]; + val2 = word[i + last2]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * last; + num -= 3 * last; + val = x2nmodp(last, 6); + crc = multmodp(val, crc) ^ crc1; + crc = multmodp(val, crc) ^ crc2; + } + + /* Compute the CRC on any remaining words. */ + for (i = 0; i < num; i++) { + val0 = word[i]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + } + word += num; + + /* Complete the CRC on any remaining bytes. */ + buf = (const unsigned char FAR *)word; + while (len) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#else + +#ifdef W + +/* + Return the CRC of the W bytes in the word_t data, taking the + least-significant byte of the word as the first byte of data, without any pre + or post conditioning. This is used to combine the CRCs of each braid. + */ +local z_crc_t crc_word(data) + z_word_t data; +{ + int k; + for (k = 0; k < W; k++) + data = (data >> 8) ^ crc_table[data & 0xff]; + return (z_crc_t)data; +} + +local z_word_t crc_word_big(data) + z_word_t data; +{ + int k; + for (k = 0; k < W; k++) + data = (data << 8) ^ + crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; + return data; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + +#ifdef W + + /* If provided enough bytes, do a braided CRC calculation. */ + if (len >= N * W + W - 1) { + z_size_t blks; + z_word_t const *words; + unsigned endian; + int k; + + /* Compute the CRC up to a z_word_t boundary. */ + while (len && ((z_size_t)buf & (W - 1)) != 0) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Compute the CRC on as many N z_word_t blocks as are available. */ + blks = len / (N * W); + len -= blks * N * W; + words = (z_word_t const *)buf; + + /* Do endian check at execution time instead of compile time, since ARM + processors can change the endianess at execution time. If the + compiler knows what the endianess will be, it can optimize out the + check and the unused branch. */ + endian = 1; + if (*(unsigned char *)&endian) { + /* Little endian. */ + + z_crc_t crc0; + z_word_t word0; +#if N > 1 + z_crc_t crc1; + z_word_t word1; +#if N > 2 + z_crc_t crc2; + z_word_t word2; +#if N > 3 + z_crc_t crc3; + z_word_t word3; +#if N > 4 + z_crc_t crc4; + z_word_t word4; +#if N > 5 + z_crc_t crc5; + z_word_t word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = crc; +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + crc = crc_word(crc0 ^ words[0]); +#if N > 1 + crc = crc_word(crc1 ^ words[1] ^ crc); +#if N > 2 + crc = crc_word(crc2 ^ words[2] ^ crc); +#if N > 3 + crc = crc_word(crc3 ^ words[3] ^ crc); +#if N > 4 + crc = crc_word(crc4 ^ words[4] ^ crc); +#if N > 5 + crc = crc_word(crc5 ^ words[5] ^ crc); +#endif +#endif +#endif +#endif +#endif + words += N; + } + else { + /* Big endian. */ + + z_word_t crc0, word0, comb; +#if N > 1 + z_word_t crc1, word1; +#if N > 2 + z_word_t crc2, word2; +#if N > 3 + z_word_t crc3, word3; +#if N > 4 + z_word_t crc4, word4; +#if N > 5 + z_word_t crc5, word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = byte_swap(crc); +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_big_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_big_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_big_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_big_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_big_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_big_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + comb = crc_word_big(crc0 ^ words[0]); +#if N > 1 + comb = crc_word_big(crc1 ^ words[1] ^ comb); +#if N > 2 + comb = crc_word_big(crc2 ^ words[2] ^ comb); +#if N > 3 + comb = crc_word_big(crc3 ^ words[3] ^ comb); +#if N > 4 + comb = crc_word_big(crc4 ^ words[4] ^ comb); +#if N > 5 + comb = crc_word_big(crc5 ^ words[5] ^ comb); +#endif +#endif +#endif +#endif +#endif + words += N; + crc = byte_swap(comb); + } + + /* + Update the pointer to the remaining bytes to process. + */ + buf = (unsigned char const *)words; + } + +#endif /* W */ + + /* Complete the computation of the CRC on any remaining bytes. */ + while (len >= 8) { + len -= 8; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + while (len) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine64(crc1, crc2, (z_off64_t)len2); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen64(len2) + z_off64_t len2; +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return x2nmodp(len2, 3); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen(len2) + z_off_t len2; +{ + return crc32_combine_gen64((z_off64_t)len2); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_op(crc1, crc2, op) + uLong crc1; + uLong crc2; + uLong op; +{ + return multmodp(op, crc1) ^ (crc2 & 0xffffffff); +} diff --git a/src/dependencies/zlib-1.2.13/crc32.h b/src/dependencies/zlib-1.2.13/crc32.h new file mode 100644 index 0000000..137df68 --- /dev/null +++ b/src/dependencies/zlib-1.2.13/crc32.h @@ -0,0 +1,9446 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}; + +#ifdef W + +#if W == 8 + +local const z_word_t FAR crc_big_table[] = { + 0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}; + +#else /* W == 4 */ + +local const z_word_t FAR crc_big_table[] = { + 0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}; + +#endif + +#if N == 1 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}, + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}, + {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000, + 0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000, + 0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000, + 0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000, + 0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000, + 0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000, + 0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000, + 0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000, + 0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000, + 0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000, + 0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000, + 0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000, + 0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000, + 0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000, + 0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000, + 0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000, + 0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000, + 0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000, + 0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000, + 0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000, + 0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000, + 0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000, + 0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000, + 0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000, + 0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000, + 0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000, + 0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000, + 0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000, + 0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000, + 0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000, + 0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000, + 0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000, + 0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000, + 0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000, + 0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000, + 0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000, + 0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000, + 0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000, + 0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000, + 0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000, + 0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000, + 0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000, + 0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000, + 0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000, + 0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000, + 0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000, + 0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000, + 0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000, + 0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000, + 0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000, + 0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000, + 0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000, + 0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000, + 0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000, + 0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000, + 0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000, + 0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000, + 0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000, + 0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000, + 0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000, + 0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000, + 0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000, + 0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000, + 0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000, + 0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000, + 0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000, + 0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000, + 0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000, + 0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000, + 0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000, + 0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000, + 0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000, + 0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000, + 0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000, + 0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000, + 0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000, + 0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000, + 0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000, + 0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000, + 0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000, + 0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000, + 0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000, + 0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000, + 0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000, + 0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000, + 0x72fd249300000000}, + {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000, + 0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000, + 0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000, + 0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000, + 0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000, + 0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000, + 0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000, + 0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000, + 0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000, + 0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000, + 0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000, + 0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000, + 0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000, + 0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000, + 0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000, + 0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000, + 0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000, + 0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000, + 0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000, + 0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000, + 0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000, + 0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000, + 0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000, + 0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000, + 0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000, + 0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000, + 0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000, + 0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000, + 0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000, + 0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000, + 0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000, + 0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000, + 0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000, + 0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000, + 0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000, + 0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000, + 0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000, + 0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000, + 0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000, + 0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000, + 0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000, + 0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000, + 0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000, + 0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000, + 0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000, + 0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000, + 0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000, + 0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000, + 0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000, + 0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000, + 0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000, + 0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000, + 0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000, + 0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000, + 0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000, + 0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000, + 0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000, + 0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000, + 0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000, + 0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000, + 0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000, + 0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000, + 0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000, + 0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000, + 0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000, + 0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000, + 0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000, + 0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000, + 0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000, + 0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000, + 0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000, + 0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000, + 0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000, + 0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000, + 0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000, + 0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000, + 0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000, + 0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000, + 0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000, + 0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000, + 0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000, + 0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000, + 0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000, + 0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000, + 0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000, + 0xed3498be00000000}, + {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000, + 0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000, + 0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000, + 0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000, + 0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000, + 0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000, + 0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000, + 0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000, + 0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000, + 0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000, + 0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000, + 0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000, + 0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000, + 0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000, + 0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000, + 0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000, + 0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000, + 0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000, + 0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000, + 0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000, + 0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000, + 0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000, + 0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000, + 0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000, + 0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000, + 0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000, + 0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000, + 0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000, + 0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000, + 0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000, + 0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000, + 0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000, + 0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000, + 0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000, + 0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000, + 0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000, + 0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000, + 0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000, + 0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000, + 0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000, + 0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000, + 0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000, + 0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000, + 0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000, + 0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000, + 0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000, + 0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000, + 0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000, + 0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000, + 0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000, + 0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000, + 0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000, + 0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000, + 0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000, + 0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000, + 0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000, + 0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000, + 0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000, + 0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000, + 0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000, + 0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000, + 0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000, + 0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000, + 0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000, + 0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000, + 0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000, + 0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000, + 0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000, + 0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000, + 0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000, + 0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000, + 0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000, + 0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000, + 0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000, + 0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000, + 0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000, + 0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000, + 0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000, + 0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000, + 0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000, + 0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000, + 0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000, + 0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000, + 0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000, + 0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000, + 0xf10605de00000000}, + {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000, + 0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000, + 0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000, + 0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000, + 0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000, + 0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000, + 0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000, + 0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000, + 0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000, + 0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000, + 0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000, + 0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000, + 0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000, + 0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000, + 0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000, + 0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000, + 0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000, + 0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000, + 0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000, + 0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000, + 0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000, + 0x572f712300000000, 0x4958f35800000000, 0xf971936500000000, + 0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000, + 0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000, + 0x8813836800000000, 0x383ae35500000000, 0xe840431200000000, + 0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000, + 0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000, + 0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000, + 0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000, + 0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000, + 0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000, + 0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000, + 0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000, + 0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000, + 0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000, + 0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000, + 0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000, + 0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000, + 0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000, + 0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000, + 0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000, + 0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000, + 0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000, + 0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000, + 0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000, + 0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000, + 0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000, + 0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000, + 0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000, + 0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000, + 0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000, + 0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000, + 0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000, + 0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000, + 0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000, + 0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000, + 0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000, + 0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000, + 0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000, + 0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000, + 0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000, + 0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000, + 0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000, + 0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000, + 0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000, + 0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000, + 0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000, + 0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000, + 0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000, + 0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000, + 0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000, + 0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000, + 0x983485b900000000, 0x281de58400000000, 0xf86745c300000000, + 0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000, + 0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000, + 0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000, + 0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000, + 0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000, + 0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000, + 0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000, + 0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000, + 0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000, + 0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000, + 0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000, + 0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000, + 0x8cc764ca00000000}, + {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000, + 0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000, + 0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000, + 0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000, + 0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000, + 0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000, + 0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000, + 0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000, + 0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000, + 0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000, + 0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000, + 0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000, + 0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000, + 0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000, + 0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000, + 0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000, + 0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000, + 0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000, + 0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000, + 0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000, + 0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000, + 0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000, + 0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000, + 0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000, + 0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000, + 0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000, + 0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000, + 0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000, + 0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000, + 0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000, + 0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000, + 0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000, + 0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000, + 0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000, + 0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000, + 0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000, + 0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000, + 0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000, + 0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000, + 0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000, + 0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000, + 0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000, + 0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000, + 0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000, + 0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000, + 0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000, + 0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000, + 0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000, + 0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000, + 0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000, + 0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000, + 0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000, + 0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000, + 0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000, + 0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000, + 0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000, + 0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000, + 0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000, + 0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000, + 0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000, + 0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000, + 0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000, + 0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000, + 0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000, + 0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000, + 0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000, + 0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000, + 0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000, + 0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000, + 0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000, + 0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000, + 0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000, + 0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000, + 0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000, + 0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000, + 0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000, + 0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000, + 0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000, + 0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000, + 0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000, + 0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000, + 0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000, + 0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000, + 0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000, + 0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000, + 0xccabc4e400000000}, + {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000, + 0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000, + 0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000, + 0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000, + 0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000, + 0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000, + 0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000, + 0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000, + 0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000, + 0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000, + 0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000, + 0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000, + 0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000, + 0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000, + 0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000, + 0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000, + 0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000, + 0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000, + 0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000, + 0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000, + 0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000, + 0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000, + 0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000, + 0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000, + 0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000, + 0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000, + 0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000, + 0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000, + 0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000, + 0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000, + 0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000, + 0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000, + 0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000, + 0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000, + 0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000, + 0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000, + 0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000, + 0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000, + 0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000, + 0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000, + 0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000, + 0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000, + 0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000, + 0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000, + 0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000, + 0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000, + 0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000, + 0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000, + 0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000, + 0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000, + 0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000, + 0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000, + 0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000, + 0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000, + 0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000, + 0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000, + 0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000, + 0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000, + 0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000, + 0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000, + 0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000, + 0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000, + 0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000, + 0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000, + 0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000, + 0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000, + 0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000, + 0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000, + 0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000, + 0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000, + 0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000, + 0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000, + 0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000, + 0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000, + 0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000, + 0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000, + 0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000, + 0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000, + 0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000, + 0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000, + 0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000, + 0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000, + 0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000, + 0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000, + 0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000, + 0x304a369200000000}, + {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000, + 0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000, + 0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000, + 0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000, + 0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000, + 0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000, + 0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000, + 0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000, + 0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000, + 0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000, + 0x1923316900000000, 0x87239ba500000000, 0x566276f900000000, + 0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000, + 0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000, + 0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000, + 0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000, + 0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000, + 0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000, + 0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000, + 0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000, + 0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000, + 0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000, + 0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000, + 0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000, + 0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000, + 0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000, + 0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000, + 0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000, + 0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000, + 0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000, + 0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000, + 0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000, + 0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000, + 0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000, + 0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000, + 0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000, + 0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000, + 0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000, + 0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000, + 0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000, + 0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000, + 0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000, + 0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000, + 0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000, + 0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000, + 0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000, + 0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000, + 0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000, + 0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000, + 0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000, + 0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000, + 0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000, + 0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000, + 0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000, + 0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000, + 0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000, + 0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000, + 0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000, + 0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000, + 0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000, + 0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000, + 0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000, + 0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000, + 0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000, + 0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000, + 0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000, + 0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000, + 0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000, + 0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000, + 0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000, + 0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000, + 0x6171384400000000, 0xff71928800000000, 0xe678578200000000, + 0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000, + 0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000, + 0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000, + 0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000, + 0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000, + 0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000, + 0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000, + 0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000, + 0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000, + 0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000, + 0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000, + 0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000, + 0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000, + 0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000, + 0xe6064b2600000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}, + {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64, + 0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1, + 0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e, + 0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61, + 0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82, + 0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff, + 0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7, + 0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da, + 0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139, + 0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6, + 0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89, + 0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c, + 0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0, + 0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d, + 0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a, + 0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177, + 0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de, + 0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b, + 0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824, + 0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e, + 0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad, + 0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0, + 0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d, + 0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60, + 0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83, + 0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822, + 0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d, + 0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8, + 0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171, + 0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c, + 0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b, + 0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6, + 0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca, + 0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f, + 0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430, + 0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf, + 0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c, + 0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51, + 0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9, + 0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84, + 0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67, + 0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398, + 0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7, + 0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62, + 0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e, + 0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923, + 0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4, + 0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9, + 0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070, + 0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5, + 0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a, + 0x72fd2493}, + {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907, + 0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f, + 0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a, + 0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e, + 0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512, + 0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14, + 0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b, + 0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d, + 0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731, + 0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925, + 0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620, + 0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28, + 0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70, + 0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176, + 0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d, + 0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b, + 0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b, + 0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63, + 0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266, + 0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a, + 0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446, + 0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40, + 0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557, + 0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51, + 0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d, + 0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0, + 0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5, + 0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed, + 0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd, + 0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb, + 0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0, + 0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6, + 0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de, + 0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6, + 0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3, + 0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7, + 0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb, + 0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd, + 0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92, + 0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094, + 0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598, + 0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c, + 0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489, + 0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81, + 0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9, + 0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af, + 0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4, + 0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2, + 0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2, + 0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba, + 0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf, + 0xed3498be}, + {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f, + 0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d, + 0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0, + 0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42, + 0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95, + 0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2, + 0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a, + 0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d, + 0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea, + 0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748, + 0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5, + 0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27, + 0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b, + 0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac, + 0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4, + 0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3, + 0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44, + 0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6, + 0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b, + 0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329, + 0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe, + 0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9, + 0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1, + 0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6, + 0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921, + 0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555, + 0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8, + 0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a, + 0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd, + 0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a, + 0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2, + 0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5, + 0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2, + 0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330, + 0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad, + 0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f, + 0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8, + 0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef, + 0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc, + 0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb, + 0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c, + 0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e, + 0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03, + 0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1, + 0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6, + 0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1, + 0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9, + 0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e, + 0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409, + 0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb, + 0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966, + 0xf10605de}}; + +#endif + +#endif + +#if N == 2 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}, + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000, + 0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000, + 0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000, + 0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000, + 0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000, + 0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000, + 0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000, + 0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000, + 0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000, + 0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000, + 0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000, + 0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000, + 0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000, + 0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000, + 0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000, + 0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000, + 0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000, + 0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000, + 0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000, + 0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000, + 0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000, + 0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000, + 0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000, + 0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000, + 0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000, + 0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000, + 0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000, + 0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000, + 0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000, + 0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000, + 0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000, + 0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000, + 0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000, + 0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000, + 0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000, + 0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000, + 0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000, + 0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000, + 0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000, + 0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000, + 0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000, + 0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000, + 0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000, + 0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000, + 0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000, + 0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000, + 0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000, + 0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000, + 0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000, + 0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000, + 0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000, + 0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000, + 0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000, + 0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000, + 0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000, + 0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000, + 0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000, + 0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000, + 0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000, + 0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000, + 0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000, + 0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000, + 0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000, + 0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000, + 0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000, + 0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000, + 0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000, + 0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000, + 0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000, + 0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000, + 0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000, + 0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000, + 0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000, + 0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000, + 0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000, + 0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000, + 0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000, + 0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000, + 0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000, + 0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000, + 0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000, + 0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000, + 0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000, + 0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000, + 0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000, + 0x4b0c4f4900000000}, + {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000, + 0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000, + 0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000, + 0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000, + 0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000, + 0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000, + 0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000, + 0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000, + 0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000, + 0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000, + 0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000, + 0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000, + 0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000, + 0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000, + 0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000, + 0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000, + 0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000, + 0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000, + 0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000, + 0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000, + 0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000, + 0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000, + 0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000, + 0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000, + 0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000, + 0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000, + 0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000, + 0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000, + 0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000, + 0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000, + 0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000, + 0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000, + 0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000, + 0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000, + 0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000, + 0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000, + 0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000, + 0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000, + 0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000, + 0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000, + 0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000, + 0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000, + 0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000, + 0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000, + 0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000, + 0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000, + 0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000, + 0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000, + 0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000, + 0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000, + 0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000, + 0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000, + 0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000, + 0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000, + 0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000, + 0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000, + 0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000, + 0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000, + 0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000, + 0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000, + 0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000, + 0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000, + 0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000, + 0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000, + 0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000, + 0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000, + 0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000, + 0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000, + 0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000, + 0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000, + 0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000, + 0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000, + 0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000, + 0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000, + 0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000, + 0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000, + 0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000, + 0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000, + 0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000, + 0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000, + 0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000, + 0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000, + 0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000, + 0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000, + 0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000, + 0x14d747e100000000}, + {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000, + 0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000, + 0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000, + 0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000, + 0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000, + 0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000, + 0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000, + 0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000, + 0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000, + 0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000, + 0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000, + 0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000, + 0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000, + 0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000, + 0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000, + 0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000, + 0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000, + 0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000, + 0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000, + 0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000, + 0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000, + 0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000, + 0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000, + 0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000, + 0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000, + 0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000, + 0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000, + 0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000, + 0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000, + 0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000, + 0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000, + 0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000, + 0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000, + 0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000, + 0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000, + 0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000, + 0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000, + 0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000, + 0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000, + 0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000, + 0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000, + 0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000, + 0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000, + 0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000, + 0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000, + 0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000, + 0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000, + 0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000, + 0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000, + 0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000, + 0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000, + 0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000, + 0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000, + 0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000, + 0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000, + 0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000, + 0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000, + 0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000, + 0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000, + 0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000, + 0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000, + 0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000, + 0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000, + 0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000, + 0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000, + 0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000, + 0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000, + 0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000, + 0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000, + 0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000, + 0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000, + 0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000, + 0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000, + 0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000, + 0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000, + 0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000, + 0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000, + 0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000, + 0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000, + 0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000, + 0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000, + 0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000, + 0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000, + 0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000, + 0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000, + 0xaa933b1a00000000}, + {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000, + 0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000, + 0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000, + 0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000, + 0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000, + 0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000, + 0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000, + 0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000, + 0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000, + 0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000, + 0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000, + 0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000, + 0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000, + 0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000, + 0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000, + 0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000, + 0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000, + 0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000, + 0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000, + 0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000, + 0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000, + 0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000, + 0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000, + 0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000, + 0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000, + 0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000, + 0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000, + 0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000, + 0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000, + 0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000, + 0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000, + 0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000, + 0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000, + 0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000, + 0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000, + 0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000, + 0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000, + 0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000, + 0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000, + 0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000, + 0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000, + 0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000, + 0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000, + 0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000, + 0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000, + 0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000, + 0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000, + 0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000, + 0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000, + 0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000, + 0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000, + 0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000, + 0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000, + 0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000, + 0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000, + 0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000, + 0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000, + 0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000, + 0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000, + 0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000, + 0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000, + 0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000, + 0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000, + 0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000, + 0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000, + 0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000, + 0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000, + 0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000, + 0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000, + 0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000, + 0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000, + 0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000, + 0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000, + 0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000, + 0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000, + 0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000, + 0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000, + 0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000, + 0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000, + 0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000, + 0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000, + 0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000, + 0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000, + 0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000, + 0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000, + 0x6571193600000000}, + {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000, + 0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000, + 0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000, + 0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000, + 0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000, + 0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000, + 0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000, + 0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000, + 0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000, + 0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000, + 0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000, + 0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000, + 0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000, + 0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000, + 0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000, + 0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000, + 0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000, + 0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000, + 0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000, + 0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000, + 0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000, + 0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000, + 0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000, + 0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000, + 0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000, + 0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000, + 0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000, + 0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000, + 0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000, + 0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000, + 0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000, + 0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000, + 0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000, + 0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000, + 0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000, + 0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000, + 0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000, + 0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000, + 0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000, + 0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000, + 0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000, + 0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000, + 0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000, + 0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000, + 0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000, + 0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000, + 0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000, + 0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000, + 0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000, + 0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000, + 0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000, + 0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000, + 0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000, + 0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000, + 0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000, + 0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000, + 0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000, + 0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000, + 0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000, + 0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000, + 0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000, + 0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000, + 0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000, + 0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000, + 0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000, + 0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000, + 0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000, + 0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000, + 0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000, + 0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000, + 0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000, + 0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000, + 0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000, + 0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000, + 0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000, + 0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000, + 0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000, + 0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000, + 0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000, + 0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000, + 0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000, + 0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000, + 0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000, + 0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000, + 0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000, + 0xa68cee3d00000000}, + {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000, + 0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000, + 0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000, + 0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000, + 0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000, + 0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000, + 0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000, + 0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000, + 0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000, + 0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000, + 0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000, + 0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000, + 0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000, + 0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000, + 0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000, + 0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000, + 0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000, + 0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000, + 0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000, + 0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000, + 0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000, + 0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000, + 0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000, + 0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000, + 0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000, + 0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000, + 0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000, + 0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000, + 0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000, + 0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000, + 0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000, + 0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000, + 0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000, + 0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000, + 0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000, + 0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000, + 0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000, + 0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000, + 0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000, + 0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000, + 0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000, + 0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000, + 0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000, + 0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000, + 0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000, + 0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000, + 0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000, + 0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000, + 0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000, + 0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000, + 0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000, + 0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000, + 0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000, + 0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000, + 0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000, + 0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000, + 0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000, + 0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000, + 0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000, + 0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000, + 0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000, + 0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000, + 0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000, + 0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000, + 0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000, + 0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000, + 0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000, + 0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000, + 0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000, + 0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000, + 0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000, + 0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000, + 0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000, + 0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000, + 0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000, + 0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000, + 0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000, + 0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000, + 0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000, + 0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000, + 0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000, + 0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000, + 0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000, + 0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000, + 0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000, + 0x51e8883f00000000}, + {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000, + 0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000, + 0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000, + 0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000, + 0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000, + 0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000, + 0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000, + 0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000, + 0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000, + 0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000, + 0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000, + 0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000, + 0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000, + 0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000, + 0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000, + 0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000, + 0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000, + 0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000, + 0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000, + 0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000, + 0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000, + 0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000, + 0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000, + 0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000, + 0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000, + 0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000, + 0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000, + 0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000, + 0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000, + 0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000, + 0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000, + 0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000, + 0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000, + 0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000, + 0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000, + 0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000, + 0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000, + 0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000, + 0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000, + 0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000, + 0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000, + 0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000, + 0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000, + 0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000, + 0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000, + 0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000, + 0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000, + 0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000, + 0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000, + 0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000, + 0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000, + 0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000, + 0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000, + 0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000, + 0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000, + 0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000, + 0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000, + 0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000, + 0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000, + 0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000, + 0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000, + 0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000, + 0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000, + 0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000, + 0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000, + 0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000, + 0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000, + 0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000, + 0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000, + 0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000, + 0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000, + 0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000, + 0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000, + 0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000, + 0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000, + 0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000, + 0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000, + 0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000, + 0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000, + 0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000, + 0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000, + 0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000, + 0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000, + 0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000, + 0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000, + 0x8ae9531c00000000}, + {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000, + 0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000, + 0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000, + 0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000, + 0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000, + 0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000, + 0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000, + 0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000, + 0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000, + 0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000, + 0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000, + 0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000, + 0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000, + 0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000, + 0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000, + 0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000, + 0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000, + 0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000, + 0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000, + 0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000, + 0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000, + 0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000, + 0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000, + 0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000, + 0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000, + 0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000, + 0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000, + 0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000, + 0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000, + 0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000, + 0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000, + 0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000, + 0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000, + 0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000, + 0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000, + 0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000, + 0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000, + 0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000, + 0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000, + 0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000, + 0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000, + 0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000, + 0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000, + 0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000, + 0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000, + 0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000, + 0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000, + 0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000, + 0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000, + 0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000, + 0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000, + 0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000, + 0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000, + 0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000, + 0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000, + 0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000, + 0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000, + 0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000, + 0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000, + 0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000, + 0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000, + 0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000, + 0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000, + 0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000, + 0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000, + 0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000, + 0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000, + 0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000, + 0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000, + 0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000, + 0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000, + 0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000, + 0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000, + 0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000, + 0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000, + 0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000, + 0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000, + 0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000, + 0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000, + 0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000, + 0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000, + 0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000, + 0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000, + 0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000, + 0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000, + 0xd739710d00000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5, + 0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d, + 0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf, + 0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027, + 0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050, + 0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098, + 0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb, + 0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173, + 0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104, + 0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c, + 0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e, + 0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6, + 0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358, + 0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390, + 0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312, + 0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da, + 0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd, + 0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335, + 0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387, + 0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de, + 0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9, + 0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261, + 0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283, + 0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b, + 0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c, + 0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c, + 0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e, + 0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6, + 0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1, + 0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619, + 0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b, + 0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653, + 0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785, + 0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d, + 0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf, + 0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757, + 0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720, + 0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8, + 0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593, + 0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b, + 0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c, + 0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4, + 0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506, + 0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe, + 0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428, + 0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0, + 0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462, + 0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa, + 0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd, + 0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445, + 0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7, + 0x8cc764ca}, + {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b, + 0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27, + 0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a, + 0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285, + 0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef, + 0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf, + 0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a, + 0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a, + 0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70, + 0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf, + 0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2, + 0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e, + 0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f, + 0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f, + 0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae, + 0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe, + 0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97, + 0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b, + 0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436, + 0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e, + 0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4, + 0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4, + 0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46, + 0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716, + 0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c, + 0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5, + 0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8, + 0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774, + 0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d, + 0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d, + 0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc, + 0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec, + 0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82, + 0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e, + 0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623, + 0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c, + 0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6, + 0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6, + 0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c, + 0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c, + 0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66, + 0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9, + 0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4, + 0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978, + 0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416, + 0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946, + 0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7, + 0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7, + 0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e, + 0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32, + 0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f, + 0xccabc4e4}, + {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4, + 0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895, + 0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50, + 0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656, + 0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154, + 0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906, + 0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258, + 0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a, + 0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08, + 0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e, + 0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb, + 0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa, + 0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44, + 0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316, + 0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0, + 0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2, + 0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7, + 0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6, + 0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73, + 0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba, + 0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8, + 0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea, + 0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b, + 0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29, + 0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b, + 0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e, + 0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb, + 0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a, + 0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef, + 0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd, + 0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b, + 0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019, + 0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3, + 0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2, + 0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417, + 0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11, + 0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13, + 0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241, + 0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b, + 0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09, + 0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b, + 0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d, + 0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8, + 0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9, + 0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003, + 0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851, + 0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7, + 0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5, + 0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190, + 0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1, + 0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134, + 0x304a3692}, + {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84, + 0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f, + 0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15, + 0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2, + 0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf, + 0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7, + 0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb, + 0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3, + 0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae, + 0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749, + 0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243, + 0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8, + 0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29, + 0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61, + 0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8, + 0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0, + 0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1, + 0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a, + 0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40, + 0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e, + 0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03, + 0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b, + 0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee, + 0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6, + 0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb, + 0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f, + 0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495, + 0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e, + 0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f, + 0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067, + 0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be, + 0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6, + 0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e, + 0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5, + 0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf, + 0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958, + 0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305, + 0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d, + 0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338, + 0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370, + 0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d, + 0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca, + 0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0, + 0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b, + 0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083, + 0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb, + 0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012, + 0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a, + 0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b, + 0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0, + 0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea, + 0xe6064b26}}; + +#endif + +#endif + +#if N == 3 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}, + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000, + 0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000, + 0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000, + 0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000, + 0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000, + 0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000, + 0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000, + 0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000, + 0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000, + 0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000, + 0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000, + 0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000, + 0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000, + 0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000, + 0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000, + 0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000, + 0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000, + 0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000, + 0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000, + 0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000, + 0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000, + 0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000, + 0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000, + 0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000, + 0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000, + 0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000, + 0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000, + 0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000, + 0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000, + 0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000, + 0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000, + 0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000, + 0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000, + 0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000, + 0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000, + 0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000, + 0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000, + 0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000, + 0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000, + 0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000, + 0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000, + 0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000, + 0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000, + 0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000, + 0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000, + 0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000, + 0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000, + 0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000, + 0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000, + 0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000, + 0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000, + 0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000, + 0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000, + 0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000, + 0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000, + 0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000, + 0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000, + 0x08eda52100000000, 0x4391370100000000, 0x005a918600000000, + 0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000, + 0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000, + 0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000, + 0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000, + 0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000, + 0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000, + 0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000, + 0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000, + 0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000, + 0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000, + 0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000, + 0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000, + 0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000, + 0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000, + 0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000, + 0x7b23114500000000, 0x305f836500000000, 0x739425e200000000, + 0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000, + 0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000, + 0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000, + 0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000, + 0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000, + 0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000, + 0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000, + 0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000, + 0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000, + 0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000, + 0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000, + 0x4e36ba1800000000}, + {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000, + 0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000, + 0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000, + 0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000, + 0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000, + 0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000, + 0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000, + 0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000, + 0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000, + 0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000, + 0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000, + 0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000, + 0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000, + 0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000, + 0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000, + 0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000, + 0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000, + 0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000, + 0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000, + 0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000, + 0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000, + 0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000, + 0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000, + 0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000, + 0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000, + 0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000, + 0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000, + 0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000, + 0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000, + 0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000, + 0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000, + 0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000, + 0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000, + 0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000, + 0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000, + 0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000, + 0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000, + 0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000, + 0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000, + 0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000, + 0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000, + 0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000, + 0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000, + 0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000, + 0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000, + 0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000, + 0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000, + 0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000, + 0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000, + 0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000, + 0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000, + 0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000, + 0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000, + 0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000, + 0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000, + 0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000, + 0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000, + 0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000, + 0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000, + 0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000, + 0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000, + 0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000, + 0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000, + 0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000, + 0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000, + 0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000, + 0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000, + 0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000, + 0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000, + 0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000, + 0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000, + 0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000, + 0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000, + 0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000, + 0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000, + 0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000, + 0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000, + 0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000, + 0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000, + 0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000, + 0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000, + 0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000, + 0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000, + 0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000, + 0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000, + 0xa1d67c9100000000}, + {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000, + 0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000, + 0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000, + 0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000, + 0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000, + 0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000, + 0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000, + 0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000, + 0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000, + 0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000, + 0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000, + 0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000, + 0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000, + 0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000, + 0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000, + 0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000, + 0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000, + 0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000, + 0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000, + 0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000, + 0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000, + 0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000, + 0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000, + 0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000, + 0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000, + 0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000, + 0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000, + 0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000, + 0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000, + 0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000, + 0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000, + 0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000, + 0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000, + 0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000, + 0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000, + 0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000, + 0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000, + 0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000, + 0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000, + 0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000, + 0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000, + 0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000, + 0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000, + 0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000, + 0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000, + 0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000, + 0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000, + 0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000, + 0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000, + 0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000, + 0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000, + 0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000, + 0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000, + 0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000, + 0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000, + 0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000, + 0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000, + 0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000, + 0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000, + 0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000, + 0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000, + 0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000, + 0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000, + 0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000, + 0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000, + 0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000, + 0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000, + 0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000, + 0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000, + 0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000, + 0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000, + 0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000, + 0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000, + 0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000, + 0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000, + 0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000, + 0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000, + 0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000, + 0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000, + 0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000, + 0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000, + 0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000, + 0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000, + 0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000, + 0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000, + 0xa8ef40a100000000}, + {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000, + 0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000, + 0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000, + 0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000, + 0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000, + 0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000, + 0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000, + 0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000, + 0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000, + 0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000, + 0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000, + 0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000, + 0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000, + 0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000, + 0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000, + 0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000, + 0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000, + 0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000, + 0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000, + 0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000, + 0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000, + 0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000, + 0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000, + 0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000, + 0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000, + 0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000, + 0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000, + 0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000, + 0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000, + 0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000, + 0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000, + 0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000, + 0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000, + 0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000, + 0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000, + 0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000, + 0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000, + 0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000, + 0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000, + 0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000, + 0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000, + 0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000, + 0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000, + 0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000, + 0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000, + 0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000, + 0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000, + 0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000, + 0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000, + 0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000, + 0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000, + 0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000, + 0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000, + 0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000, + 0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000, + 0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000, + 0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000, + 0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000, + 0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000, + 0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000, + 0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000, + 0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000, + 0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000, + 0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000, + 0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000, + 0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000, + 0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000, + 0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000, + 0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000, + 0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000, + 0x933d017400000000, 0xd506661100000000, 0x46a022f000000000, + 0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000, + 0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000, + 0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000, + 0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000, + 0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000, + 0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000, + 0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000, + 0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000, + 0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000, + 0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000, + 0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000, + 0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000, + 0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000, + 0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000, + 0x356bacd800000000}, + {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000, + 0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000, + 0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000, + 0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000, + 0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000, + 0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000, + 0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000, + 0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000, + 0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000, + 0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000, + 0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000, + 0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000, + 0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000, + 0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000, + 0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000, + 0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000, + 0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000, + 0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000, + 0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000, + 0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000, + 0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000, + 0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000, + 0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000, + 0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000, + 0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000, + 0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000, + 0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000, + 0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000, + 0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000, + 0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000, + 0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000, + 0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000, + 0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000, + 0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000, + 0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000, + 0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000, + 0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000, + 0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000, + 0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000, + 0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000, + 0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000, + 0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000, + 0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000, + 0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000, + 0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000, + 0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000, + 0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000, + 0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000, + 0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000, + 0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000, + 0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000, + 0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000, + 0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000, + 0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000, + 0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000, + 0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000, + 0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000, + 0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000, + 0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000, + 0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000, + 0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000, + 0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000, + 0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000, + 0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000, + 0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000, + 0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000, + 0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000, + 0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000, + 0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000, + 0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000, + 0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000, + 0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000, + 0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000, + 0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000, + 0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000, + 0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000, + 0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000, + 0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000, + 0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000, + 0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000, + 0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000, + 0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000, + 0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000, + 0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000, + 0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000, + 0x48686b5600000000}, + {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000, + 0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000, + 0x805af17200000000, 0x403ed96500000000, 0x002643b900000000, + 0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000, + 0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000, + 0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000, + 0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000, + 0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000, + 0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000, + 0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000, + 0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000, + 0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000, + 0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000, + 0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000, + 0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000, + 0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000, + 0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000, + 0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000, + 0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000, + 0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000, + 0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000, + 0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000, + 0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000, + 0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000, + 0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000, + 0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000, + 0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000, + 0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000, + 0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000, + 0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000, + 0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000, + 0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000, + 0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000, + 0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000, + 0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000, + 0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000, + 0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000, + 0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000, + 0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000, + 0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000, + 0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000, + 0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000, + 0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000, + 0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000, + 0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000, + 0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000, + 0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000, + 0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000, + 0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000, + 0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000, + 0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000, + 0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000, + 0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000, + 0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000, + 0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000, + 0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000, + 0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000, + 0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000, + 0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000, + 0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000, + 0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000, + 0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000, + 0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000, + 0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000, + 0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000, + 0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000, + 0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000, + 0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000, + 0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000, + 0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000, + 0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000, + 0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000, + 0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000, + 0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000, + 0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000, + 0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000, + 0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000, + 0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000, + 0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000, + 0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000, + 0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000, + 0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000, + 0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000, + 0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000, + 0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000, + 0xcaa2517800000000}, + {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000, + 0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000, + 0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000, + 0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000, + 0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000, + 0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000, + 0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000, + 0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000, + 0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000, + 0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000, + 0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000, + 0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000, + 0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000, + 0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000, + 0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000, + 0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000, + 0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000, + 0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000, + 0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000, + 0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000, + 0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000, + 0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000, + 0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000, + 0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000, + 0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000, + 0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000, + 0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000, + 0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000, + 0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000, + 0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000, + 0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000, + 0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000, + 0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000, + 0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000, + 0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000, + 0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000, + 0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000, + 0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000, + 0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000, + 0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000, + 0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000, + 0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000, + 0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000, + 0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000, + 0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000, + 0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000, + 0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000, + 0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000, + 0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000, + 0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000, + 0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000, + 0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000, + 0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000, + 0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000, + 0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000, + 0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000, + 0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000, + 0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000, + 0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000, + 0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000, + 0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000, + 0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000, + 0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000, + 0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000, + 0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000, + 0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000, + 0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000, + 0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000, + 0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000, + 0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000, + 0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000, + 0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000, + 0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000, + 0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000, + 0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000, + 0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000, + 0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000, + 0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000, + 0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000, + 0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000, + 0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000, + 0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000, + 0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000, + 0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000, + 0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000, + 0x0c7ac97b00000000}, + {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000, + 0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000, + 0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000, + 0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000, + 0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000, + 0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000, + 0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000, + 0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000, + 0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000, + 0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000, + 0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000, + 0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000, + 0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000, + 0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000, + 0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000, + 0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000, + 0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000, + 0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000, + 0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000, + 0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000, + 0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000, + 0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000, + 0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000, + 0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000, + 0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000, + 0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000, + 0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000, + 0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000, + 0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000, + 0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000, + 0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000, + 0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000, + 0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000, + 0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000, + 0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000, + 0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000, + 0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000, + 0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000, + 0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000, + 0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000, + 0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000, + 0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000, + 0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000, + 0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000, + 0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000, + 0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000, + 0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000, + 0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000, + 0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000, + 0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000, + 0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000, + 0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000, + 0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000, + 0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000, + 0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000, + 0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000, + 0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000, + 0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000, + 0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000, + 0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000, + 0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000, + 0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000, + 0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000, + 0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000, + 0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000, + 0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000, + 0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000, + 0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000, + 0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000, + 0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000, + 0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000, + 0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000, + 0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000, + 0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000, + 0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000, + 0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000, + 0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000, + 0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000, + 0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000, + 0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000, + 0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000, + 0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000, + 0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000, + 0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000, + 0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000, + 0x5185cd0900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d, + 0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac, + 0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8, + 0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95, + 0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817, + 0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d, + 0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac, + 0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6, + 0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564, + 0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39, + 0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d, + 0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac, + 0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de, + 0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594, + 0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b, + 0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01, + 0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f, + 0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de, + 0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba, + 0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65, + 0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7, + 0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad, + 0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de, + 0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294, + 0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716, + 0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71, + 0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15, + 0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4, + 0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca, + 0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280, + 0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f, + 0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15, + 0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9, + 0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748, + 0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c, + 0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971, + 0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3, + 0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9, + 0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196, + 0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc, + 0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e, + 0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03, + 0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67, + 0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296, + 0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a, + 0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170, + 0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af, + 0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5, + 0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb, + 0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a, + 0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e, + 0x4b0c4f49}, + {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09, + 0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc, + 0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e, + 0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc, + 0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934, + 0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2, + 0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b, + 0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad, + 0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155, + 0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187, + 0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65, + 0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390, + 0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e, + 0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378, + 0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889, + 0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f, + 0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0, + 0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145, + 0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7, + 0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a, + 0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2, + 0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924, + 0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2, + 0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514, + 0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec, + 0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709, + 0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb, + 0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e, + 0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1, + 0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227, + 0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6, + 0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030, + 0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0, + 0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55, + 0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7, + 0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165, + 0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d, + 0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b, + 0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c, + 0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a, + 0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362, + 0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0, + 0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52, + 0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7, + 0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237, + 0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1, + 0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020, + 0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6, + 0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719, + 0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec, + 0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e, + 0x14d747e1}, + {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0, + 0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b, + 0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652, + 0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437, + 0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514, + 0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265, + 0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de, + 0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af, + 0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c, + 0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9, + 0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0, + 0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b, + 0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6, + 0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7, + 0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734, + 0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045, + 0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8, + 0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303, + 0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a, + 0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9, + 0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea, + 0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b, + 0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6, + 0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7, + 0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4, + 0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6, + 0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f, + 0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054, + 0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9, + 0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8, + 0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b, + 0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a, + 0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441, + 0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a, + 0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3, + 0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6, + 0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5, + 0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94, + 0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9, + 0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288, + 0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab, + 0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce, + 0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7, + 0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c, + 0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527, + 0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256, + 0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5, + 0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4, + 0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39, + 0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2, + 0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db, + 0xaa933b1a}, + {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603, + 0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d, + 0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9, + 0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b, + 0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a, + 0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792, + 0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4, + 0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c, + 0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d, + 0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f, + 0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb, + 0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65, + 0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330, + 0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8, + 0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da, + 0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742, + 0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f, + 0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1, + 0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5, + 0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f, + 0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e, + 0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6, + 0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8, + 0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250, + 0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021, + 0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb, + 0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f, + 0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511, + 0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c, + 0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4, + 0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886, + 0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e, + 0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b, + 0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5, + 0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791, + 0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003, + 0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272, + 0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea, + 0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc, + 0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24, + 0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55, + 0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7, + 0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3, + 0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d, + 0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548, + 0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0, + 0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2, + 0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a, + 0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47, + 0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9, + 0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad, + 0x65711936}}; + +#endif + +#endif + +#if N == 4 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a, + 0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe, + 0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b, + 0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656, + 0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd, + 0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d, + 0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7, + 0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47, + 0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac, + 0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691, + 0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404, + 0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0, + 0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4, + 0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424, + 0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5, + 0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65, + 0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67, + 0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3, + 0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626, + 0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9, + 0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222, + 0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2, + 0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a, + 0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a, + 0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1, + 0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2, + 0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077, + 0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3, + 0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1, + 0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621, + 0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0, + 0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60, + 0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0, + 0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64, + 0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1, + 0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc, + 0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027, + 0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7, + 0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9, + 0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79, + 0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292, + 0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af, + 0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a, + 0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee, + 0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e, + 0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe, + 0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f, + 0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff, + 0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd, + 0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29, + 0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc, + 0xe3c45916}, + {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344, + 0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59, + 0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e, + 0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463, + 0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98, + 0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d, + 0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3, + 0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656, + 0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad, + 0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0, + 0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397, + 0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a, + 0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2, + 0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357, + 0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8, + 0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d, + 0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696, + 0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b, + 0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc, + 0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0, + 0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b, + 0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be, + 0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811, + 0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384, + 0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f, + 0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955, + 0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362, + 0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f, + 0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94, + 0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701, + 0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe, + 0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b, + 0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1, + 0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc, + 0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b, + 0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986, + 0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d, + 0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8, + 0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4, + 0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371, + 0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a, + 0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87, + 0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0, + 0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad, + 0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527, + 0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2, + 0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d, + 0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998, + 0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73, + 0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e, + 0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59, + 0xa7520488}, + {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20, + 0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09, + 0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431, + 0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a, + 0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203, + 0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b, + 0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14, + 0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c, + 0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25, + 0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e, + 0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36, + 0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f, + 0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649, + 0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961, + 0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58, + 0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170, + 0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b, + 0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742, + 0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a, + 0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55, + 0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c, + 0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64, + 0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f, + 0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77, + 0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e, + 0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a, + 0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2, + 0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b, + 0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090, + 0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8, + 0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881, + 0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9, + 0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6, + 0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f, + 0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7, + 0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c, + 0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695, + 0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd, + 0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb, + 0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3, + 0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa, + 0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1, + 0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9, + 0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0, + 0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df, + 0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7, + 0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace, + 0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6, + 0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd, + 0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4, + 0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec, + 0x3522e9e4}, + {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1, + 0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86, + 0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b, + 0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669, + 0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7, + 0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352, + 0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03, + 0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6, + 0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38, + 0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a, + 0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7, + 0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80, + 0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7, + 0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522, + 0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d, + 0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8, + 0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103, + 0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54, + 0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9, + 0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0, + 0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e, + 0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb, + 0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1, + 0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624, + 0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea, + 0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a, + 0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37, + 0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360, + 0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab, + 0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e, + 0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741, + 0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4, + 0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334, + 0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63, + 0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de, + 0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c, + 0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942, + 0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7, + 0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131, + 0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4, + 0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a, + 0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758, + 0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5, + 0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2, + 0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32, + 0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7, + 0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8, + 0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d, + 0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6, + 0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1, + 0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c, + 0x97411e28}, + {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474, + 0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5, + 0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6, + 0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7, + 0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938, + 0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051, + 0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a, + 0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3, + 0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c, + 0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d, + 0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e, + 0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf, + 0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740, + 0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29, + 0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592, + 0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb, + 0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4, + 0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365, + 0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036, + 0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7, + 0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08, + 0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561, + 0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a, + 0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663, + 0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac, + 0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d, + 0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce, + 0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f, + 0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50, + 0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639, + 0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82, + 0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb, + 0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954, + 0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5, + 0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86, + 0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7, + 0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418, + 0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71, + 0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa, + 0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93, + 0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c, + 0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d, + 0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e, + 0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df, + 0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60, + 0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309, + 0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2, + 0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db, + 0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4, + 0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45, + 0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16, + 0x93c7a00b}, + {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45, + 0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb, + 0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d, + 0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696, + 0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf, + 0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb, + 0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028, + 0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c, + 0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65, + 0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be, + 0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038, + 0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6, + 0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15, + 0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11, + 0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d, + 0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19, + 0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05, + 0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b, + 0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d, + 0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c, + 0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35, + 0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31, + 0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068, + 0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c, + 0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25, + 0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a, + 0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac, + 0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22, + 0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e, + 0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a, + 0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36, + 0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32, + 0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84, + 0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a, + 0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c, + 0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057, + 0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e, + 0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a, + 0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc, + 0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8, + 0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1, + 0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a, + 0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec, + 0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62, + 0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4, + 0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0, + 0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc, + 0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8, + 0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4, + 0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a, + 0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc, + 0xce5f968d}, + {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de, + 0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b, + 0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d, + 0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680, + 0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4, + 0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d, + 0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde, + 0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97, + 0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3, + 0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e, + 0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678, + 0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d, + 0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723, + 0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a, + 0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0, + 0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9, + 0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85, + 0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770, + 0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56, + 0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a, + 0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e, + 0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67, + 0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785, + 0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc, + 0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788, + 0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90, + 0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6, + 0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843, + 0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f, + 0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336, + 0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac, + 0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5, + 0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68, + 0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d, + 0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb, + 0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36, + 0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72, + 0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b, + 0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b, + 0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402, + 0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446, + 0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb, + 0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed, + 0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418, + 0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95, + 0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc, + 0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946, + 0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f, + 0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233, + 0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6, + 0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0, + 0x3e721277}, + {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb, + 0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9, + 0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11, + 0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d, + 0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9, + 0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c, + 0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881, + 0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274, + 0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790, + 0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc, + 0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514, + 0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56, + 0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9, + 0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c, + 0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13, + 0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6, + 0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c, + 0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e, + 0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386, + 0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376, + 0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692, + 0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67, + 0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416, + 0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3, + 0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07, + 0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd, + 0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15, + 0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457, + 0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd, + 0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28, + 0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337, + 0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2, + 0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594, + 0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6, + 0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e, + 0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52, + 0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6, + 0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143, + 0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17, + 0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2, + 0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306, + 0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a, + 0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182, + 0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0, + 0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496, + 0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63, + 0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c, + 0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89, + 0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903, + 0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041, + 0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9, + 0x1c65ace7}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000, + 0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000, + 0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000, + 0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000, + 0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000, + 0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000, + 0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000, + 0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000, + 0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000, + 0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000, + 0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000, + 0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000, + 0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000, + 0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000, + 0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000, + 0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000, + 0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000, + 0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000, + 0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000, + 0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000, + 0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000, + 0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000, + 0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000, + 0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000, + 0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000, + 0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000, + 0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000, + 0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000, + 0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000, + 0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000, + 0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000, + 0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000, + 0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000, + 0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000, + 0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000, + 0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000, + 0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000, + 0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000, + 0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000, + 0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000, + 0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000, + 0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000, + 0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000, + 0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000, + 0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000, + 0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000, + 0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000, + 0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000, + 0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000, + 0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000, + 0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000, + 0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000, + 0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000, + 0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000, + 0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000, + 0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000, + 0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000, + 0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000, + 0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000, + 0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000, + 0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000, + 0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000, + 0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000, + 0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000, + 0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000, + 0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000, + 0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000, + 0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000, + 0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000, + 0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000, + 0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000, + 0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000, + 0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000, + 0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000, + 0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000, + 0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000, + 0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000, + 0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000, + 0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000, + 0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000, + 0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000, + 0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000, + 0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000, + 0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000, + 0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000, + 0xe7ac651c00000000}, + {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000, + 0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000, + 0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000, + 0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000, + 0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000, + 0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000, + 0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000, + 0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000, + 0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000, + 0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000, + 0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000, + 0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000, + 0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000, + 0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000, + 0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000, + 0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000, + 0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000, + 0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000, + 0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000, + 0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000, + 0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000, + 0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000, + 0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000, + 0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000, + 0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000, + 0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000, + 0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000, + 0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000, + 0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000, + 0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000, + 0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000, + 0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000, + 0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000, + 0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000, + 0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000, + 0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000, + 0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000, + 0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000, + 0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000, + 0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000, + 0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000, + 0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000, + 0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000, + 0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000, + 0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000, + 0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000, + 0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000, + 0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000, + 0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000, + 0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000, + 0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000, + 0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000, + 0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000, + 0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000, + 0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000, + 0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000, + 0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000, + 0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000, + 0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000, + 0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000, + 0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000, + 0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000, + 0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000, + 0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000, + 0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000, + 0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000, + 0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000, + 0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000, + 0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000, + 0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000, + 0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000, + 0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000, + 0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000, + 0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000, + 0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000, + 0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000, + 0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000, + 0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000, + 0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000, + 0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000, + 0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000, + 0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000, + 0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000, + 0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000, + 0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000, + 0x7712723e00000000}, + {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000, + 0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000, + 0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000, + 0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000, + 0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000, + 0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000, + 0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000, + 0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000, + 0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000, + 0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000, + 0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000, + 0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000, + 0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000, + 0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000, + 0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000, + 0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000, + 0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000, + 0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000, + 0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000, + 0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000, + 0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000, + 0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000, + 0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000, + 0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000, + 0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000, + 0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000, + 0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000, + 0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000, + 0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000, + 0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000, + 0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000, + 0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000, + 0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000, + 0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000, + 0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000, + 0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000, + 0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000, + 0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000, + 0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000, + 0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000, + 0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000, + 0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000, + 0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000, + 0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000, + 0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000, + 0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000, + 0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000, + 0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000, + 0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000, + 0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000, + 0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000, + 0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000, + 0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000, + 0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000, + 0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000, + 0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000, + 0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000, + 0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000, + 0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000, + 0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000, + 0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000, + 0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000, + 0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000, + 0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000, + 0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000, + 0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000, + 0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000, + 0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000, + 0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000, + 0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000, + 0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000, + 0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000, + 0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000, + 0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000, + 0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000, + 0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000, + 0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000, + 0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000, + 0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000, + 0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000, + 0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000, + 0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000, + 0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000, + 0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000, + 0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000, + 0x8d965fce00000000}, + {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000, + 0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000, + 0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000, + 0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000, + 0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000, + 0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000, + 0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000, + 0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000, + 0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000, + 0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000, + 0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000, + 0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000, + 0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000, + 0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000, + 0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000, + 0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000, + 0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000, + 0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000, + 0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000, + 0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000, + 0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000, + 0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000, + 0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000, + 0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000, + 0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000, + 0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000, + 0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000, + 0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000, + 0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000, + 0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000, + 0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000, + 0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000, + 0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000, + 0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000, + 0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000, + 0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000, + 0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000, + 0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000, + 0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000, + 0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000, + 0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000, + 0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000, + 0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000, + 0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000, + 0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000, + 0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000, + 0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000, + 0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000, + 0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000, + 0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000, + 0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000, + 0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000, + 0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000, + 0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000, + 0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000, + 0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000, + 0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000, + 0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000, + 0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000, + 0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000, + 0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000, + 0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000, + 0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000, + 0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000, + 0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000, + 0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000, + 0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000, + 0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000, + 0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000, + 0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000, + 0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000, + 0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000, + 0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000, + 0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000, + 0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000, + 0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000, + 0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000, + 0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000, + 0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000, + 0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000, + 0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000, + 0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000, + 0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000, + 0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000, + 0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000, + 0x0ba0c79300000000}, + {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000, + 0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000, + 0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000, + 0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000, + 0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000, + 0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000, + 0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000, + 0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000, + 0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000, + 0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000, + 0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000, + 0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000, + 0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000, + 0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000, + 0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000, + 0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000, + 0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000, + 0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000, + 0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000, + 0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000, + 0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000, + 0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000, + 0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000, + 0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000, + 0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000, + 0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000, + 0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000, + 0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000, + 0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000, + 0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000, + 0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000, + 0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000, + 0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000, + 0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000, + 0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000, + 0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000, + 0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000, + 0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000, + 0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000, + 0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000, + 0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000, + 0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000, + 0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000, + 0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000, + 0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000, + 0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000, + 0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000, + 0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000, + 0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000, + 0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000, + 0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000, + 0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000, + 0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000, + 0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000, + 0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000, + 0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000, + 0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000, + 0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000, + 0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000, + 0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000, + 0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000, + 0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000, + 0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000, + 0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000, + 0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000, + 0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000, + 0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000, + 0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000, + 0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000, + 0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000, + 0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000, + 0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000, + 0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000, + 0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000, + 0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000, + 0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000, + 0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000, + 0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000, + 0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000, + 0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000, + 0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000, + 0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000, + 0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000, + 0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000, + 0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000, + 0x281e419700000000}, + {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000, + 0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000, + 0x304a428900000000, 0x38a922b500000000, 0x011e763800000000, + 0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000, + 0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000, + 0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000, + 0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000, + 0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000, + 0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000, + 0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000, + 0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000, + 0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000, + 0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000, + 0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000, + 0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000, + 0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000, + 0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000, + 0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000, + 0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000, + 0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000, + 0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000, + 0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000, + 0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000, + 0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000, + 0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000, + 0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000, + 0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000, + 0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000, + 0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000, + 0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000, + 0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000, + 0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000, + 0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000, + 0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000, + 0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000, + 0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000, + 0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000, + 0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000, + 0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000, + 0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000, + 0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000, + 0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000, + 0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000, + 0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000, + 0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000, + 0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000, + 0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000, + 0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000, + 0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000, + 0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000, + 0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000, + 0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000, + 0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000, + 0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000, + 0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000, + 0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000, + 0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000, + 0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000, + 0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000, + 0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000, + 0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000, + 0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000, + 0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000, + 0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000, + 0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000, + 0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000, + 0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000, + 0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000, + 0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000, + 0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000, + 0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000, + 0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000, + 0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000, + 0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000, + 0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000, + 0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000, + 0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000, + 0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000, + 0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000, + 0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000, + 0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000, + 0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000, + 0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000, + 0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000, + 0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000, + 0xe4e9223500000000}, + {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000, + 0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000, + 0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000, + 0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000, + 0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000, + 0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000, + 0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000, + 0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000, + 0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000, + 0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000, + 0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000, + 0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000, + 0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000, + 0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000, + 0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000, + 0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000, + 0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000, + 0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000, + 0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000, + 0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000, + 0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000, + 0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000, + 0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000, + 0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000, + 0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000, + 0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000, + 0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000, + 0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000, + 0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000, + 0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000, + 0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000, + 0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000, + 0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000, + 0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000, + 0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000, + 0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000, + 0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000, + 0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000, + 0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000, + 0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000, + 0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000, + 0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000, + 0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000, + 0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000, + 0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000, + 0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000, + 0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000, + 0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000, + 0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000, + 0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000, + 0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000, + 0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000, + 0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000, + 0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000, + 0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000, + 0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000, + 0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000, + 0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000, + 0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000, + 0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000, + 0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000, + 0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000, + 0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000, + 0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000, + 0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000, + 0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000, + 0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000, + 0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000, + 0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000, + 0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000, + 0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000, + 0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000, + 0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000, + 0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000, + 0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000, + 0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000, + 0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000, + 0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000, + 0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000, + 0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000, + 0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000, + 0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000, + 0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000, + 0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000, + 0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000, + 0x880452a700000000}, + {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000, + 0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000, + 0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000, + 0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000, + 0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000, + 0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000, + 0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000, + 0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000, + 0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000, + 0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000, + 0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000, + 0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000, + 0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000, + 0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000, + 0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000, + 0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000, + 0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000, + 0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000, + 0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000, + 0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000, + 0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000, + 0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000, + 0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000, + 0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000, + 0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000, + 0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000, + 0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000, + 0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000, + 0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000, + 0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000, + 0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000, + 0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000, + 0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000, + 0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000, + 0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000, + 0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000, + 0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000, + 0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000, + 0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000, + 0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000, + 0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000, + 0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000, + 0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000, + 0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000, + 0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000, + 0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000, + 0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000, + 0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000, + 0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000, + 0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000, + 0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000, + 0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000, + 0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000, + 0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000, + 0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000, + 0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000, + 0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000, + 0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000, + 0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000, + 0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000, + 0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000, + 0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000, + 0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000, + 0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000, + 0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000, + 0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000, + 0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000, + 0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000, + 0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000, + 0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000, + 0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000, + 0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000, + 0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000, + 0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000, + 0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000, + 0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000, + 0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000, + 0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000, + 0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000, + 0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000, + 0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000, + 0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000, + 0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000, + 0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000, + 0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000, + 0x1659c4e300000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0, + 0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587, + 0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa, + 0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09, + 0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee, + 0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3, + 0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3, + 0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce, + 0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429, + 0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda, + 0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7, + 0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0, + 0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd, + 0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0, + 0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287, + 0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a, + 0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9, + 0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e, + 0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3, + 0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3, + 0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054, + 0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49, + 0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da, + 0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7, + 0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20, + 0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d, + 0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00, + 0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347, + 0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14, + 0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209, + 0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e, + 0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33, + 0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3, + 0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194, + 0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9, + 0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a, + 0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd, + 0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0, + 0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d, + 0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460, + 0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87, + 0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674, + 0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509, + 0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e, + 0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae, + 0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3, + 0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694, + 0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989, + 0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da, + 0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d, + 0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0, + 0xa68cee3d}, + {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19, + 0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae, + 0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb, + 0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a, + 0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55, + 0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1, + 0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c, + 0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8, + 0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7, + 0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936, + 0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453, + 0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4, + 0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941, + 0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5, + 0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93, + 0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17, + 0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e, + 0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89, + 0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec, + 0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0, + 0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf, + 0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b, + 0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b, + 0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f, + 0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0, + 0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e, + 0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b, + 0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc, + 0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5, + 0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261, + 0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637, + 0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3, + 0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57, + 0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0, + 0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85, + 0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454, + 0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b, + 0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f, + 0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423, + 0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7, + 0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8, + 0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739, + 0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c, + 0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb, + 0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f, + 0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b, + 0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd, + 0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59, + 0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070, + 0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7, + 0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2, + 0x51e8883f}, + {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a, + 0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276, + 0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed, + 0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55, + 0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b, + 0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8, + 0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320, + 0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413, + 0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd, + 0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75, + 0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee, + 0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312, + 0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca, + 0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9, + 0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad, + 0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e, + 0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504, + 0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8, + 0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63, + 0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353, + 0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d, + 0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be, + 0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae, + 0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d, + 0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943, + 0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7, + 0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c, + 0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390, + 0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a, + 0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239, + 0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d, + 0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e, + 0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c, + 0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0, + 0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b, + 0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93, + 0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d, + 0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e, + 0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c, + 0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f, + 0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1, + 0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579, + 0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2, + 0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e, + 0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c, + 0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f, + 0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b, + 0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158, + 0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2, + 0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e, + 0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5, + 0x8ae9531c}, + {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4, + 0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd, + 0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220, + 0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf, + 0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495, + 0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def, + 0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90, + 0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea, + 0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0, + 0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f, + 0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2, + 0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab, + 0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e, + 0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754, + 0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda, + 0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0, + 0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c, + 0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215, + 0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8, + 0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910, + 0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a, + 0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30, + 0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658, + 0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22, + 0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478, + 0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2, + 0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f, + 0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606, + 0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba, + 0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0, + 0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e, + 0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034, + 0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f, + 0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996, + 0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b, + 0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84, + 0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de, + 0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4, + 0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5, + 0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f, + 0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5, + 0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a, + 0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7, + 0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce, + 0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65, + 0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f, + 0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91, + 0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb, + 0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57, + 0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e, + 0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3, + 0xd739710d}}; + +#endif + +#endif + +#if N == 5 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df, + 0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8, + 0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef, + 0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376, + 0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201, + 0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399, + 0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372, + 0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea, + 0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d, + 0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004, + 0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353, + 0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334, + 0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a, + 0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2, + 0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a, + 0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2, + 0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b, + 0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c, + 0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b, + 0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f, + 0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338, + 0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0, + 0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6, + 0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e, + 0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319, + 0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3, + 0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4, + 0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783, + 0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a, + 0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492, + 0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a, + 0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2, + 0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496, + 0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1, + 0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6, + 0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f, + 0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548, + 0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0, + 0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741, + 0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9, + 0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae, + 0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437, + 0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760, + 0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707, + 0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433, + 0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab, + 0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703, + 0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b, + 0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412, + 0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475, + 0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722, + 0xe9947565}, + {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5, + 0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22, + 0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c, + 0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed, + 0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d, + 0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1, + 0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e, + 0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32, + 0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142, + 0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93, + 0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d, + 0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a, + 0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58, + 0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14, + 0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81, + 0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd, + 0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab, + 0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c, + 0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72, + 0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f, + 0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff, + 0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3, + 0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30, + 0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c, + 0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c, + 0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558, + 0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146, + 0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581, + 0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7, + 0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab, + 0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e, + 0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272, + 0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838, + 0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff, + 0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1, + 0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330, + 0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840, + 0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c, + 0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb, + 0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7, + 0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7, + 0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616, + 0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208, + 0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf, + 0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85, + 0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9, + 0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c, + 0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10, + 0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76, + 0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1, + 0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf, + 0xf7d05006}, + {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b, + 0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774, + 0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58, + 0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a, + 0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb, + 0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952, + 0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e, + 0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7, + 0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746, + 0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14, + 0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338, + 0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907, + 0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777, + 0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de, + 0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064, + 0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd, + 0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951, + 0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e, + 0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42, + 0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b, + 0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a, + 0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3, + 0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904, + 0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad, + 0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c, + 0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d, + 0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861, + 0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e, + 0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2, + 0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b, + 0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1, + 0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78, + 0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f, + 0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40, + 0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c, + 0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e, + 0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf, + 0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166, + 0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d, + 0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4, + 0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805, + 0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157, + 0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b, + 0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644, + 0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43, + 0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea, + 0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850, + 0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9, + 0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165, + 0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a, + 0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676, + 0xb2075b94}, + {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf, + 0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61, + 0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be, + 0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd, + 0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3, + 0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063, + 0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105, + 0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5, + 0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb, + 0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8, + 0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07, + 0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9, + 0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5, + 0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515, + 0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4, + 0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014, + 0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7, + 0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269, + 0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6, + 0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af, + 0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1, + 0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111, + 0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d, + 0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad, + 0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3, + 0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75, + 0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa, + 0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74, + 0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7, + 0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477, + 0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6, + 0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176, + 0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af, + 0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71, + 0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae, + 0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd, + 0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3, + 0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073, + 0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0, + 0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400, + 0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e, + 0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d, + 0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2, + 0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c, + 0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5, + 0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505, + 0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4, + 0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004, + 0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7, + 0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279, + 0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6, + 0xba50bcb9}, + {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897, + 0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb, + 0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2, + 0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2, + 0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372, + 0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70, + 0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92, + 0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190, + 0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40, + 0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430, + 0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759, + 0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75, + 0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2, + 0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0, + 0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7, + 0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5, + 0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39, + 0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215, + 0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c, + 0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5, + 0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625, + 0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27, + 0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c, + 0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e, + 0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee, + 0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71, + 0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18, + 0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134, + 0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8, + 0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba, + 0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd, + 0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff, + 0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a, + 0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6, + 0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf, + 0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf, + 0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f, + 0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d, + 0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d, + 0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f, + 0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af, + 0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df, + 0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6, + 0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a, + 0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef, + 0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed, + 0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa, + 0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8, + 0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624, + 0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08, + 0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861, + 0x808abcf4}, + {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2, + 0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd, + 0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76, + 0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52, + 0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e, + 0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124, + 0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147, + 0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d, + 0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31, + 0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15, + 0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae, + 0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1, + 0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d, + 0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307, + 0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9, + 0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3, + 0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084, + 0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb, + 0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850, + 0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2, + 0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe, + 0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94, + 0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261, + 0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b, + 0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917, + 0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53, + 0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8, + 0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787, + 0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0, + 0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba, + 0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404, + 0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e, + 0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af, + 0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0, + 0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b, + 0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f, + 0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543, + 0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129, + 0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627, + 0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d, + 0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51, + 0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75, + 0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce, + 0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1, + 0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760, + 0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a, + 0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4, + 0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde, + 0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089, + 0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6, + 0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d, + 0xefdb3f95}, + {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8, + 0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7, + 0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945, + 0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9, + 0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652, + 0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc, + 0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a, + 0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4, + 0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f, + 0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3, + 0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51, + 0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e, + 0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c, + 0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362, + 0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11, + 0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff, + 0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7, + 0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8, + 0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a, + 0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690, + 0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b, + 0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5, + 0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05, + 0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb, + 0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740, + 0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f, + 0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded, + 0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2, + 0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa, + 0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714, + 0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67, + 0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89, + 0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7, + 0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8, + 0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a, + 0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6, + 0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d, + 0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3, + 0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9, + 0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57, + 0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc, + 0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540, + 0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2, + 0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd, + 0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93, + 0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d, + 0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e, + 0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0, + 0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8, + 0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7, + 0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75, + 0x0e2fbf43}, + {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc, + 0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a, + 0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3, + 0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7, + 0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b, + 0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154, + 0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3, + 0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc, + 0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330, + 0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264, + 0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd, + 0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b, + 0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a, + 0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175, + 0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275, + 0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a, + 0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234, + 0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2, + 0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b, + 0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a, + 0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6, + 0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189, + 0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b, + 0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204, + 0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8, + 0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226, + 0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff, + 0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219, + 0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167, + 0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258, + 0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158, + 0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267, + 0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c, + 0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da, + 0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003, + 0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157, + 0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b, + 0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4, + 0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179, + 0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246, + 0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a, + 0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de, + 0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107, + 0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1, + 0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba, + 0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285, + 0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185, + 0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba, + 0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4, + 0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322, + 0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb, + 0xf4377108}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000, + 0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000, + 0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000, + 0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000, + 0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000, + 0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000, + 0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000, + 0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000, + 0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000, + 0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000, + 0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000, + 0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000, + 0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000, + 0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000, + 0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000, + 0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000, + 0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000, + 0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000, + 0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000, + 0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000, + 0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000, + 0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000, + 0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000, + 0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000, + 0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000, + 0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000, + 0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000, + 0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000, + 0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000, + 0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000, + 0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000, + 0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000, + 0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000, + 0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000, + 0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000, + 0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000, + 0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000, + 0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000, + 0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000, + 0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000, + 0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000, + 0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000, + 0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000, + 0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000, + 0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000, + 0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000, + 0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000, + 0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000, + 0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000, + 0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000, + 0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000, + 0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000, + 0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000, + 0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000, + 0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000, + 0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000, + 0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000, + 0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000, + 0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000, + 0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000, + 0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000, + 0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000, + 0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000, + 0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000, + 0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000, + 0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000, + 0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000, + 0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000, + 0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000, + 0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000, + 0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000, + 0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000, + 0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000, + 0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000, + 0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000, + 0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000, + 0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000, + 0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000, + 0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000, + 0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000, + 0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000, + 0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000, + 0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000, + 0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000, + 0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000, + 0x087137f400000000}, + {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000, + 0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000, + 0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000, + 0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000, + 0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000, + 0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000, + 0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000, + 0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000, + 0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000, + 0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000, + 0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000, + 0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000, + 0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000, + 0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000, + 0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000, + 0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000, + 0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000, + 0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000, + 0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000, + 0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000, + 0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000, + 0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000, + 0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000, + 0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000, + 0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000, + 0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000, + 0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000, + 0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000, + 0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000, + 0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000, + 0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000, + 0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000, + 0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000, + 0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000, + 0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000, + 0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000, + 0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000, + 0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000, + 0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000, + 0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000, + 0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000, + 0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000, + 0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000, + 0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000, + 0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000, + 0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000, + 0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000, + 0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000, + 0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000, + 0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000, + 0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000, + 0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000, + 0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000, + 0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000, + 0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000, + 0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000, + 0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000, + 0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000, + 0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000, + 0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000, + 0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000, + 0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000, + 0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000, + 0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000, + 0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000, + 0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000, + 0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000, + 0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000, + 0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000, + 0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000, + 0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000, + 0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000, + 0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000, + 0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000, + 0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000, + 0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000, + 0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000, + 0x1129fad400000000, 0x621116d400000000, 0x544094f000000000, + 0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000, + 0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000, + 0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000, + 0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000, + 0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000, + 0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000, + 0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000, + 0x43bf2f0e00000000}, + {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000, + 0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000, + 0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000, + 0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000, + 0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000, + 0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000, + 0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000, + 0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000, + 0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000, + 0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000, + 0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000, + 0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000, + 0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000, + 0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000, + 0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000, + 0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000, + 0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000, + 0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000, + 0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000, + 0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000, + 0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000, + 0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000, + 0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000, + 0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000, + 0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000, + 0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000, + 0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000, + 0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000, + 0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000, + 0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000, + 0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000, + 0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000, + 0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000, + 0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000, + 0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000, + 0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000, + 0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000, + 0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000, + 0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000, + 0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000, + 0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000, + 0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000, + 0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000, + 0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000, + 0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000, + 0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000, + 0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000, + 0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000, + 0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000, + 0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000, + 0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000, + 0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000, + 0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000, + 0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000, + 0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000, + 0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000, + 0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000, + 0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000, + 0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000, + 0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000, + 0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000, + 0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000, + 0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000, + 0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000, + 0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000, + 0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000, + 0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000, + 0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000, + 0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000, + 0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000, + 0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000, + 0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000, + 0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000, + 0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000, + 0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000, + 0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000, + 0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000, + 0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000, + 0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000, + 0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000, + 0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000, + 0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000, + 0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000, + 0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000, + 0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000, + 0x953fdbef00000000}, + {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000, + 0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000, + 0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000, + 0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000, + 0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000, + 0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000, + 0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000, + 0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000, + 0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000, + 0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000, + 0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000, + 0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000, + 0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000, + 0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000, + 0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000, + 0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000, + 0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000, + 0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000, + 0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000, + 0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000, + 0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000, + 0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000, + 0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000, + 0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000, + 0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000, + 0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000, + 0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000, + 0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000, + 0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000, + 0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000, + 0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000, + 0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000, + 0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000, + 0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000, + 0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000, + 0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000, + 0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000, + 0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000, + 0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000, + 0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000, + 0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000, + 0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000, + 0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000, + 0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000, + 0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000, + 0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000, + 0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000, + 0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000, + 0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000, + 0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000, + 0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000, + 0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000, + 0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000, + 0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000, + 0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000, + 0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000, + 0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000, + 0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000, + 0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000, + 0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000, + 0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000, + 0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000, + 0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000, + 0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000, + 0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000, + 0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000, + 0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000, + 0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000, + 0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000, + 0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000, + 0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000, + 0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000, + 0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000, + 0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000, + 0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000, + 0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000, + 0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000, + 0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000, + 0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000, + 0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000, + 0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000, + 0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000, + 0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000, + 0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000, + 0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000, + 0xf4bc8a8000000000}, + {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000, + 0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000, + 0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000, + 0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000, + 0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000, + 0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000, + 0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000, + 0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000, + 0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000, + 0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000, + 0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000, + 0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000, + 0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000, + 0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000, + 0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000, + 0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000, + 0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000, + 0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000, + 0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000, + 0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000, + 0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000, + 0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000, + 0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000, + 0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000, + 0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000, + 0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000, + 0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000, + 0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000, + 0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000, + 0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000, + 0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000, + 0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000, + 0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000, + 0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000, + 0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000, + 0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000, + 0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000, + 0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000, + 0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000, + 0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000, + 0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000, + 0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000, + 0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000, + 0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000, + 0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000, + 0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000, + 0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000, + 0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000, + 0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000, + 0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000, + 0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000, + 0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000, + 0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000, + 0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000, + 0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000, + 0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000, + 0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000, + 0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000, + 0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000, + 0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000, + 0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000, + 0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000, + 0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000, + 0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000, + 0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000, + 0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000, + 0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000, + 0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000, + 0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000, + 0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000, + 0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000, + 0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000, + 0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000, + 0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000, + 0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000, + 0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000, + 0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000, + 0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000, + 0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000, + 0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000, + 0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000, + 0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000, + 0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000, + 0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000, + 0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000, + 0xb9bc50ba00000000}, + {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000, + 0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000, + 0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000, + 0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000, + 0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000, + 0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000, + 0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000, + 0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000, + 0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000, + 0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000, + 0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000, + 0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000, + 0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000, + 0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000, + 0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000, + 0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000, + 0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000, + 0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000, + 0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000, + 0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000, + 0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000, + 0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000, + 0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000, + 0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000, + 0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000, + 0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000, + 0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000, + 0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000, + 0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000, + 0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000, + 0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000, + 0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000, + 0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000, + 0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000, + 0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000, + 0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000, + 0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000, + 0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000, + 0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000, + 0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000, + 0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000, + 0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000, + 0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000, + 0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000, + 0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000, + 0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000, + 0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000, + 0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000, + 0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000, + 0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000, + 0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000, + 0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000, + 0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000, + 0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000, + 0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000, + 0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000, + 0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000, + 0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000, + 0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000, + 0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000, + 0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000, + 0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000, + 0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000, + 0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000, + 0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000, + 0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000, + 0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000, + 0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000, + 0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000, + 0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000, + 0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000, + 0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000, + 0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000, + 0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000, + 0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000, + 0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000, + 0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000, + 0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000, + 0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000, + 0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000, + 0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000, + 0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000, + 0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000, + 0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000, + 0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000, + 0x945b07b200000000}, + {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000, + 0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000, + 0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000, + 0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000, + 0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000, + 0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000, + 0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000, + 0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000, + 0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000, + 0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000, + 0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000, + 0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000, + 0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000, + 0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000, + 0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000, + 0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000, + 0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000, + 0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000, + 0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000, + 0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000, + 0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000, + 0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000, + 0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000, + 0x149f066100000000, 0xef839db200000000, 0x468814fc00000000, + 0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000, + 0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000, + 0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000, + 0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000, + 0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000, + 0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000, + 0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000, + 0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000, + 0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000, + 0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000, + 0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000, + 0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000, + 0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000, + 0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000, + 0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000, + 0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000, + 0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000, + 0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000, + 0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000, + 0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000, + 0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000, + 0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000, + 0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000, + 0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000, + 0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000, + 0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000, + 0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000, + 0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000, + 0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000, + 0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000, + 0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000, + 0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000, + 0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000, + 0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000, + 0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000, + 0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000, + 0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000, + 0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000, + 0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000, + 0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000, + 0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000, + 0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000, + 0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000, + 0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000, + 0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000, + 0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000, + 0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000, + 0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000, + 0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000, + 0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000, + 0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000, + 0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000, + 0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000, + 0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000, + 0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000, + 0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000, + 0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000, + 0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000, + 0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000, + 0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000, + 0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000, + 0x0650d0f700000000}, + {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000, + 0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000, + 0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000, + 0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000, + 0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000, + 0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000, + 0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000, + 0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000, + 0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000, + 0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000, + 0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000, + 0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000, + 0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000, + 0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000, + 0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000, + 0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000, + 0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000, + 0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000, + 0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000, + 0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000, + 0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000, + 0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000, + 0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000, + 0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000, + 0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000, + 0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000, + 0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000, + 0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000, + 0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000, + 0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000, + 0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000, + 0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000, + 0xc702c15700000000, 0x809085f800000000, 0x082039d200000000, + 0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000, + 0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000, + 0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000, + 0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000, + 0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000, + 0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000, + 0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000, + 0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000, + 0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000, + 0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000, + 0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000, + 0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000, + 0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000, + 0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000, + 0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000, + 0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000, + 0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000, + 0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000, + 0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000, + 0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000, + 0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000, + 0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000, + 0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000, + 0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000, + 0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000, + 0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000, + 0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000, + 0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000, + 0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000, + 0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000, + 0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000, + 0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000, + 0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000, + 0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000, + 0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000, + 0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000, + 0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000, + 0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000, + 0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000, + 0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000, + 0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000, + 0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000, + 0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000, + 0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000, + 0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000, + 0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000, + 0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000, + 0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000, + 0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000, + 0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000, + 0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000, + 0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000, + 0x657594e900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873, + 0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661, + 0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441, + 0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44, + 0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1, + 0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05, + 0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa, + 0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e, + 0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb, + 0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be, + 0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e, + 0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c, + 0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d, + 0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9, + 0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f, + 0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b, + 0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39, + 0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b, + 0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b, + 0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20, + 0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595, + 0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61, + 0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0, + 0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644, + 0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1, + 0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d, + 0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d, + 0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f, + 0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad, + 0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359, + 0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f, + 0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b, + 0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7, + 0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5, + 0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5, + 0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0, + 0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65, + 0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091, + 0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633, + 0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7, + 0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272, + 0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77, + 0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57, + 0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145, + 0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9, + 0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d, + 0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb, + 0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f, + 0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad, + 0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf, + 0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f, + 0x4e36ba18}, + {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b, + 0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8, + 0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19, + 0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4, + 0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239, + 0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd, + 0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258, + 0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc, + 0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41, + 0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c, + 0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d, + 0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e, + 0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba, + 0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e, + 0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8, + 0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c, + 0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f, + 0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c, + 0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d, + 0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d, + 0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0, + 0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014, + 0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc, + 0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628, + 0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5, + 0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941, + 0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0, + 0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53, + 0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880, + 0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264, + 0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92, + 0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776, + 0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8, + 0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b, + 0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea, + 0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837, + 0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca, + 0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e, + 0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211, + 0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5, + 0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08, + 0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5, + 0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934, + 0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7, + 0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049, + 0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad, + 0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b, + 0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf, + 0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c, + 0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f, + 0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e, + 0xa1d67c91}, + {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9, + 0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de, + 0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94, + 0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0, + 0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a, + 0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924, + 0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052, + 0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c, + 0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6, + 0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2, + 0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8, + 0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f, + 0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d, + 0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273, + 0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30, + 0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e, + 0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7, + 0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980, + 0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca, + 0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8, + 0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62, + 0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c, + 0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c, + 0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032, + 0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798, + 0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d, + 0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07, + 0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630, + 0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389, + 0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7, + 0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4, + 0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca, + 0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55, + 0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662, + 0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828, + 0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c, + 0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6, + 0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98, + 0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3, + 0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d, + 0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037, + 0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913, + 0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759, + 0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e, + 0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1, + 0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf, + 0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c, + 0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2, + 0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b, + 0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c, + 0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276, + 0xa8ef40a1}, + {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e, + 0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8, + 0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819, + 0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f, + 0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d, + 0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756, + 0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0, + 0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb, + 0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9, + 0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f, + 0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e, + 0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8, + 0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835, + 0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e, + 0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62, + 0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749, + 0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b, + 0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d, + 0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc, + 0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80, + 0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2, + 0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599, + 0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05, + 0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e, + 0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c, + 0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e, + 0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef, + 0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359, + 0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b, + 0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0, + 0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc, + 0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7, + 0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f, + 0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189, + 0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568, + 0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e, + 0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c, + 0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27, + 0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794, + 0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf, + 0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d, + 0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db, + 0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a, + 0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c, + 0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544, + 0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f, + 0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013, + 0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38, + 0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea, + 0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c, + 0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd, + 0x356bacd8}}; + +#endif + +#endif + +#if N == 6 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370, + 0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d, + 0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69, + 0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426, + 0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3, + 0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f, + 0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c, + 0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490, + 0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155, + 0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a, + 0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e, + 0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603, + 0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349, + 0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5, + 0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50, + 0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc, + 0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b, + 0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76, + 0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862, + 0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9, + 0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c, + 0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0, + 0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937, + 0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b, + 0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e, + 0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e, + 0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a, + 0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357, + 0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0, + 0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c, + 0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9, + 0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165, + 0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766, + 0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b, + 0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f, + 0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030, + 0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5, + 0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59, + 0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63, + 0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf, + 0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a, + 0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845, + 0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51, + 0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c, + 0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f, + 0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3, + 0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46, + 0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea, + 0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d, + 0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60, + 0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74, + 0x8568a0a8}, + {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5, + 0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf, + 0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5, + 0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba, + 0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf, + 0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f, + 0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0, + 0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450, + 0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55, + 0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a, + 0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620, + 0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a, + 0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454, + 0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4, + 0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534, + 0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584, + 0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694, + 0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e, + 0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4, + 0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1, + 0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4, + 0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164, + 0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1, + 0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911, + 0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314, + 0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c, + 0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6, + 0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec, + 0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc, + 0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c, + 0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c, + 0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c, + 0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716, + 0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c, + 0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676, + 0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879, + 0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c, + 0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc, + 0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77, + 0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7, + 0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2, + 0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd, + 0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7, + 0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad, + 0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897, + 0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827, + 0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7, + 0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947, + 0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57, + 0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d, + 0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37, + 0x0d907052}, + {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d, + 0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89, + 0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31, + 0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81, + 0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e, + 0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0, + 0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f, + 0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291, + 0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e, + 0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e, + 0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936, + 0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2, + 0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13, + 0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d, + 0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f, + 0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1, + 0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a, + 0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae, + 0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516, + 0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f, + 0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20, + 0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe, + 0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28, + 0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6, + 0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419, + 0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5, + 0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d, + 0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889, + 0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412, + 0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c, + 0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e, + 0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0, + 0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02, + 0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986, + 0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e, + 0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e, + 0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221, + 0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf, + 0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913, + 0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d, + 0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622, + 0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592, + 0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a, + 0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae, + 0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c, + 0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82, + 0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20, + 0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe, + 0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025, + 0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1, + 0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719, + 0xfd1a6c8a}, + {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3, + 0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb, + 0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d, + 0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb, + 0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9, + 0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156, + 0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045, + 0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa, + 0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8, + 0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e, + 0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8, + 0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0, + 0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38, + 0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87, + 0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46, + 0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9, + 0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585, + 0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d, + 0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb, + 0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531, + 0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03, + 0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc, + 0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33, + 0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c, + 0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be, + 0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d, + 0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b, + 0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303, + 0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f, + 0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0, + 0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801, + 0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe, + 0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e, + 0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346, + 0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620, + 0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776, + 0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844, + 0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb, + 0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0, + 0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f, + 0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d, + 0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b, + 0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d, + 0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75, + 0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795, + 0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a, + 0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb, + 0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354, + 0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28, + 0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30, + 0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856, + 0x7895f01a}, + {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188, + 0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33, + 0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d, + 0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445, + 0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2, + 0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058, + 0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43, + 0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9, + 0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e, + 0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06, + 0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228, + 0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93, + 0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e, + 0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4, + 0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b, + 0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371, + 0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265, + 0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede, + 0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0, + 0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f, + 0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8, + 0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32, + 0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae, + 0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544, + 0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3, + 0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f, + 0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911, + 0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa, + 0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be, + 0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54, + 0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b, + 0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1, + 0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652, + 0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9, + 0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7, + 0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f, + 0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68, + 0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782, + 0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797, + 0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d, + 0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a, + 0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2, + 0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc, + 0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647, + 0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4, + 0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e, + 0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41, + 0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab, + 0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf, + 0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904, + 0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a, + 0x9239b848}, + {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad, + 0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0, + 0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40, + 0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b, + 0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d, + 0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b, + 0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb, + 0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d, + 0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b, + 0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0, + 0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840, + 0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d, + 0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b, + 0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d, + 0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6, + 0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0, + 0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580, + 0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd, + 0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d, + 0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b, + 0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d, + 0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b, + 0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6, + 0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0, + 0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6, + 0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c, + 0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c, + 0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461, + 0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841, + 0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317, + 0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac, + 0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa, + 0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7, + 0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba, + 0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a, + 0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161, + 0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777, + 0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21, + 0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a, + 0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc, + 0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da, + 0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1, + 0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01, + 0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c, + 0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241, + 0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917, + 0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac, + 0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa, + 0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da, + 0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397, + 0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537, + 0xeb36d3cc}, + {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b, + 0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059, + 0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251, + 0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d, + 0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9, + 0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c, + 0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41, + 0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4, + 0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10, + 0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c, + 0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54, + 0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476, + 0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8, + 0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d, + 0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92, + 0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307, + 0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad, + 0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f, + 0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87, + 0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17, + 0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3, + 0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46, + 0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197, + 0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02, + 0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6, + 0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e, + 0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96, + 0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4, + 0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e, + 0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b, + 0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934, + 0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1, + 0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7, + 0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5, + 0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd, + 0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1, + 0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475, + 0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0, + 0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155, + 0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0, + 0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304, + 0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348, + 0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140, + 0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862, + 0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14, + 0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181, + 0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e, + 0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab, + 0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01, + 0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523, + 0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b, + 0x38e5f3c5}, + {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06, + 0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad, + 0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509, + 0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba, + 0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414, + 0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3, + 0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733, + 0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994, + 0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a, + 0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889, + 0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d, + 0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386, + 0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621, + 0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886, + 0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e, + 0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389, + 0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f, + 0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294, + 0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30, + 0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3, + 0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d, + 0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba, + 0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a, + 0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad, + 0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03, + 0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2, + 0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306, + 0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad, + 0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b, + 0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc, + 0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914, + 0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3, + 0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435, + 0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e, + 0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a, + 0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589, + 0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27, + 0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080, + 0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21, + 0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586, + 0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28, + 0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b, + 0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f, + 0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94, + 0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12, + 0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5, + 0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d, + 0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba, + 0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c, + 0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7, + 0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103, + 0x3d3101a2}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000, + 0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000, + 0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000, + 0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000, + 0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000, + 0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000, + 0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000, + 0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000, + 0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000, + 0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000, + 0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000, + 0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000, + 0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000, + 0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000, + 0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000, + 0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000, + 0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000, + 0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000, + 0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000, + 0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000, + 0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000, + 0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000, + 0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000, + 0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000, + 0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000, + 0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000, + 0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000, + 0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000, + 0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000, + 0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000, + 0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000, + 0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000, + 0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000, + 0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000, + 0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000, + 0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000, + 0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000, + 0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000, + 0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000, + 0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000, + 0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000, + 0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000, + 0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000, + 0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000, + 0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000, + 0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000, + 0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000, + 0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000, + 0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000, + 0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000, + 0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000, + 0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000, + 0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000, + 0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000, + 0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000, + 0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000, + 0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000, + 0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000, + 0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000, + 0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000, + 0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000, + 0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000, + 0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000, + 0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000, + 0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000, + 0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000, + 0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000, + 0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000, + 0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000, + 0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000, + 0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000, + 0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000, + 0x3688267d00000000, 0x9718319500000000, 0x35af787600000000, + 0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000, + 0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000, + 0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000, + 0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000, + 0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000, + 0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000, + 0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000, + 0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000, + 0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000, + 0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000, + 0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000, + 0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000, + 0xa201313d00000000}, + {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000, + 0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000, + 0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000, + 0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000, + 0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000, + 0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000, + 0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000, + 0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000, + 0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000, + 0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000, + 0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000, + 0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000, + 0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000, + 0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000, + 0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000, + 0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000, + 0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000, + 0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000, + 0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000, + 0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000, + 0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000, + 0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000, + 0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000, + 0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000, + 0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000, + 0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000, + 0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000, + 0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000, + 0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000, + 0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000, + 0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000, + 0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000, + 0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000, + 0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000, + 0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000, + 0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000, + 0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000, + 0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000, + 0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000, + 0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000, + 0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000, + 0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000, + 0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000, + 0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000, + 0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000, + 0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000, + 0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000, + 0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000, + 0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000, + 0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000, + 0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000, + 0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000, + 0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000, + 0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000, + 0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000, + 0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000, + 0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000, + 0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000, + 0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000, + 0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000, + 0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000, + 0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000, + 0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000, + 0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000, + 0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000, + 0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000, + 0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000, + 0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000, + 0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000, + 0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000, + 0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000, + 0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000, + 0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000, + 0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000, + 0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000, + 0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000, + 0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000, + 0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000, + 0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000, + 0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000, + 0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000, + 0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000, + 0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000, + 0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000, + 0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000, + 0xc5f3e53800000000}, + {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000, + 0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000, + 0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000, + 0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000, + 0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000, + 0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000, + 0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000, + 0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000, + 0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000, + 0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000, + 0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000, + 0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000, + 0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000, + 0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000, + 0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000, + 0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000, + 0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000, + 0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000, + 0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000, + 0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000, + 0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000, + 0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000, + 0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000, + 0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000, + 0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000, + 0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000, + 0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000, + 0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000, + 0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000, + 0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000, + 0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000, + 0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000, + 0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000, + 0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000, + 0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000, + 0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000, + 0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000, + 0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000, + 0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000, + 0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000, + 0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000, + 0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000, + 0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000, + 0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000, + 0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000, + 0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000, + 0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000, + 0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000, + 0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000, + 0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000, + 0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000, + 0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000, + 0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000, + 0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000, + 0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000, + 0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000, + 0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000, + 0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000, + 0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000, + 0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000, + 0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000, + 0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000, + 0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000, + 0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000, + 0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000, + 0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000, + 0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000, + 0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000, + 0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000, + 0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000, + 0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000, + 0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000, + 0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000, + 0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000, + 0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000, + 0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000, + 0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000, + 0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000, + 0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000, + 0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000, + 0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000, + 0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000, + 0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000, + 0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000, + 0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000, + 0xccd336eb00000000}, + {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000, + 0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000, + 0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000, + 0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000, + 0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000, + 0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000, + 0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000, + 0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000, + 0xb249204500000000, 0xd071086f00000000, 0x7639701100000000, + 0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000, + 0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000, + 0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000, + 0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000, + 0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000, + 0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000, + 0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000, + 0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000, + 0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000, + 0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000, + 0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000, + 0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000, + 0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000, + 0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000, + 0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000, + 0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000, + 0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000, + 0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000, + 0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000, + 0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000, + 0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000, + 0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000, + 0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000, + 0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000, + 0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000, + 0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000, + 0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000, + 0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000, + 0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000, + 0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000, + 0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000, + 0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000, + 0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000, + 0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000, + 0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000, + 0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000, + 0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000, + 0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000, + 0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000, + 0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000, + 0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000, + 0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000, + 0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000, + 0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000, + 0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000, + 0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000, + 0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000, + 0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000, + 0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000, + 0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000, + 0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000, + 0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000, + 0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000, + 0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000, + 0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000, + 0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000, + 0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000, + 0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000, + 0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000, + 0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000, + 0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000, + 0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000, + 0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000, + 0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000, + 0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000, + 0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000, + 0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000, + 0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000, + 0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000, + 0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000, + 0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000, + 0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000, + 0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000, + 0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000, + 0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000, + 0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000, + 0x48b8399200000000}, + {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000, + 0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000, + 0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000, + 0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000, + 0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000, + 0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000, + 0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000, + 0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000, + 0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000, + 0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000, + 0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000, + 0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000, + 0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000, + 0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000, + 0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000, + 0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000, + 0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000, + 0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000, + 0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000, + 0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000, + 0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000, + 0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000, + 0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000, + 0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000, + 0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000, + 0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000, + 0xb521428400000000, 0xf909d42700000000, 0x762efede00000000, + 0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000, + 0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000, + 0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000, + 0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000, + 0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000, + 0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000, + 0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000, + 0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000, + 0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000, + 0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000, + 0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000, + 0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000, + 0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000, + 0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000, + 0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000, + 0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000, + 0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000, + 0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000, + 0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000, + 0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000, + 0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000, + 0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000, + 0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000, + 0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000, + 0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000, + 0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000, + 0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000, + 0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000, + 0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000, + 0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000, + 0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000, + 0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000, + 0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000, + 0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000, + 0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000, + 0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000, + 0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000, + 0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000, + 0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000, + 0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000, + 0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000, + 0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000, + 0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000, + 0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000, + 0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000, + 0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000, + 0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000, + 0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000, + 0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000, + 0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000, + 0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000, + 0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000, + 0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000, + 0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000, + 0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000, + 0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000, + 0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000, + 0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000, + 0x1af0957800000000}, + {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000, + 0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000, + 0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000, + 0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000, + 0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000, + 0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000, + 0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000, + 0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000, + 0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000, + 0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000, + 0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000, + 0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000, + 0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000, + 0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000, + 0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000, + 0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000, + 0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000, + 0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000, + 0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000, + 0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000, + 0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000, + 0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000, + 0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000, + 0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000, + 0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000, + 0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000, + 0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000, + 0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000, + 0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000, + 0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000, + 0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000, + 0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000, + 0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000, + 0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000, + 0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000, + 0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000, + 0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000, + 0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000, + 0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000, + 0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000, + 0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000, + 0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000, + 0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000, + 0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000, + 0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000, + 0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000, + 0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000, + 0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000, + 0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000, + 0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000, + 0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000, + 0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000, + 0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000, + 0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000, + 0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000, + 0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000, + 0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000, + 0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000, + 0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000, + 0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000, + 0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000, + 0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000, + 0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000, + 0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000, + 0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000, + 0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000, + 0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000, + 0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000, + 0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000, + 0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000, + 0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000, + 0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000, + 0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000, + 0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000, + 0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000, + 0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000, + 0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000, + 0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000, + 0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000, + 0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000, + 0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000, + 0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000, + 0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000, + 0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000, + 0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000, + 0x8a6c1afd00000000}, + {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000, + 0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000, + 0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000, + 0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000, + 0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000, + 0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000, + 0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000, + 0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000, + 0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000, + 0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000, + 0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000, + 0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000, + 0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000, + 0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000, + 0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000, + 0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000, + 0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000, + 0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000, + 0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000, + 0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000, + 0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000, + 0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000, + 0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000, + 0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000, + 0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000, + 0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000, + 0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000, + 0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000, + 0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000, + 0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000, + 0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000, + 0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000, + 0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000, + 0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000, + 0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000, + 0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000, + 0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000, + 0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000, + 0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000, + 0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000, + 0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000, + 0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000, + 0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000, + 0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000, + 0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000, + 0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000, + 0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000, + 0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000, + 0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000, + 0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000, + 0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000, + 0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000, + 0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000, + 0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000, + 0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000, + 0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000, + 0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000, + 0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000, + 0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000, + 0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000, + 0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000, + 0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000, + 0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000, + 0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000, + 0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000, + 0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000, + 0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000, + 0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000, + 0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000, + 0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000, + 0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000, + 0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000, + 0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000, + 0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000, + 0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000, + 0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000, + 0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000, + 0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000, + 0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000, + 0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000, + 0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000, + 0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000, + 0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000, + 0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000, + 0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000, + 0x5270900d00000000}, + {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000, + 0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000, + 0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000, + 0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000, + 0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000, + 0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000, + 0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000, + 0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000, + 0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000, + 0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000, + 0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000, + 0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000, + 0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000, + 0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000, + 0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000, + 0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000, + 0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000, + 0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000, + 0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000, + 0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000, + 0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000, + 0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000, + 0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000, + 0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000, + 0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000, + 0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000, + 0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000, + 0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000, + 0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000, + 0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000, + 0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000, + 0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000, + 0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000, + 0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000, + 0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000, + 0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000, + 0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000, + 0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000, + 0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000, + 0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000, + 0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000, + 0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000, + 0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000, + 0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000, + 0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000, + 0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000, + 0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000, + 0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000, + 0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000, + 0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000, + 0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000, + 0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000, + 0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000, + 0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000, + 0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000, + 0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000, + 0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000, + 0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000, + 0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000, + 0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000, + 0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000, + 0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000, + 0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000, + 0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000, + 0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000, + 0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000, + 0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000, + 0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000, + 0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000, + 0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000, + 0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000, + 0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000, + 0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000, + 0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000, + 0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000, + 0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000, + 0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000, + 0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000, + 0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000, + 0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000, + 0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000, + 0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000, + 0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000, + 0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000, + 0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000, + 0xa8a0688500000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912, + 0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba, + 0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3, + 0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30, + 0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e, + 0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3, + 0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73, + 0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe, + 0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0, + 0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643, + 0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a, + 0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082, + 0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4, + 0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279, + 0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735, + 0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8, + 0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad, + 0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05, + 0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c, + 0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718, + 0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46, + 0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb, + 0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc, + 0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41, + 0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f, + 0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad, + 0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4, + 0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c, + 0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779, + 0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4, + 0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8, + 0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235, + 0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7, + 0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f, + 0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476, + 0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195, + 0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb, + 0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46, + 0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622, + 0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af, + 0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1, + 0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12, + 0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b, + 0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3, + 0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51, + 0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc, + 0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90, + 0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d, + 0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708, + 0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0, + 0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9, + 0x48686b56}, + {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c, + 0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae, + 0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb, + 0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90, + 0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410, + 0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b, + 0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6, + 0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed, + 0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d, + 0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036, + 0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953, + 0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1, + 0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca, + 0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781, + 0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d, + 0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416, + 0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f, + 0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd, + 0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8, + 0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b, + 0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb, + 0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0, + 0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5, + 0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e, + 0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e, + 0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558, + 0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d, + 0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf, + 0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6, + 0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad, + 0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971, + 0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a, + 0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b, + 0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969, + 0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c, + 0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57, + 0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7, + 0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c, + 0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab, + 0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0, + 0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160, + 0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b, + 0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e, + 0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac, + 0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d, + 0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546, + 0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a, + 0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1, + 0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8, + 0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a, + 0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f, + 0xcaa25178}, + {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00, + 0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b, + 0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed, + 0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777, + 0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01, + 0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a, + 0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef, + 0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74, + 0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002, + 0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498, + 0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee, + 0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75, + 0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05, + 0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e, + 0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8, + 0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73, + 0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404, + 0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f, + 0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9, + 0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71, + 0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607, + 0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c, + 0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb, + 0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470, + 0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806, + 0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790, + 0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6, + 0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d, + 0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a, + 0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991, + 0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7, + 0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c, + 0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09, + 0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92, + 0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4, + 0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e, + 0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08, + 0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593, + 0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3, + 0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778, + 0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e, + 0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94, + 0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2, + 0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079, + 0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c, + 0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497, + 0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1, + 0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a, + 0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d, + 0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396, + 0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0, + 0x0c7ac97b}, + {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669, + 0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853, + 0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062, + 0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527, + 0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad, + 0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545, + 0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27, + 0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf, + 0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45, + 0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800, + 0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031, + 0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b, + 0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26, + 0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce, + 0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d, + 0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5, + 0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130, + 0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a, + 0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b, + 0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480, + 0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a, + 0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2, + 0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e, + 0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996, + 0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c, + 0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc, + 0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd, + 0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7, + 0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232, + 0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da, + 0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439, + 0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1, + 0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da, + 0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0, + 0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1, + 0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94, + 0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e, + 0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6, + 0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2, + 0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a, + 0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0, + 0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95, + 0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4, + 0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e, + 0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395, + 0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d, + 0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e, + 0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676, + 0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83, + 0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9, + 0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888, + 0x5185cd09}}; + +#endif + +#endif + +#endif + +local const z_crc_t FAR x2n_table[] = { + 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, + 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, + 0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, + 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169, + 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, + 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a, + 0xc40ba6d0, 0xc4e22c3c}; diff --git a/src/dependencies/zlib-1.2.11/deflate.c b/src/dependencies/zlib-1.2.13/deflate.c similarity index 87% rename from src/dependencies/zlib-1.2.11/deflate.c rename to src/dependencies/zlib-1.2.13/deflate.c index 1ec7614..4a689db 100644 --- a/src/dependencies/zlib-1.2.11/deflate.c +++ b/src/dependencies/zlib-1.2.13/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -87,13 +87,7 @@ local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV -# pragma message("Assembler code may have bugs -- use at your own risk") - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif #ifdef ZLIB_DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, @@ -160,7 +154,7 @@ local const config configuration_table[10] = { * characters, so that a running hash key can be computed from the previous * key instead of complete recalculation each time. */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) +#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== @@ -190,8 +184,11 @@ local const config configuration_table[10] = { * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + do { \ + s->head[s->hash_size - 1] = NIL; \ + zmemzero((Bytef *)s->head, \ + (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \ + } while (0) /* =========================================================================== * Slide the hash table when sliding the window down (could be avoided with 32 @@ -252,11 +249,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, int wrap = 1; static const char my_version[] = ZLIB_VERSION; - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; @@ -287,6 +279,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; + if (windowBits < -15) + return Z_STREAM_ERROR; windowBits = -windowBits; } #ifdef GZIP @@ -316,7 +310,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); @@ -326,9 +320,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n - 2) bits have been written, just + * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1 + * symbols are written.) The closest the writing gets to what is unread is + * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { @@ -337,8 +369,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s->sym_buf = s->pending_buf + s->lit_bufsize; + s->sym_end = (s->lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ s->level = level; s->strategy = strategy; @@ -350,7 +386,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ -local int deflateStateCheck (strm) +local int deflateStateCheck(strm) z_streamp strm; { deflate_state *s; @@ -373,7 +409,7 @@ local int deflateStateCheck (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) +int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; @@ -442,7 +478,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) +int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) z_streamp strm; Bytef *dictionary; uInt *dictLength; @@ -464,7 +500,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateResetKeep (strm) +int ZEXPORT deflateResetKeep(strm) z_streamp strm; { deflate_state *s; @@ -488,13 +524,13 @@ int ZEXPORT deflateResetKeep (strm) #ifdef GZIP s->wrap == 2 ? GZIP_STATE : #endif - s->wrap ? INIT_STATE : BUSY_STATE; + INIT_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); @@ -502,7 +538,7 @@ int ZEXPORT deflateResetKeep (strm) } /* ========================================================================= */ -int ZEXPORT deflateReset (strm) +int ZEXPORT deflateReset(strm) z_streamp strm; { int ret; @@ -514,7 +550,7 @@ int ZEXPORT deflateReset (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) +int ZEXPORT deflateSetHeader(strm, head) z_streamp strm; gz_headerp head; { @@ -525,7 +561,7 @@ int ZEXPORT deflateSetHeader (strm, head) } /* ========================================================================= */ -int ZEXPORT deflatePending (strm, pending, bits) +int ZEXPORT deflatePending(strm, pending, bits) unsigned *pending; int *bits; z_streamp strm; @@ -539,7 +575,7 @@ int ZEXPORT deflatePending (strm, pending, bits) } /* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) +int ZEXPORT deflatePrime(strm, bits, value) z_streamp strm; int bits; int value; @@ -549,7 +585,8 @@ int ZEXPORT deflatePrime (strm, bits, value) if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + if (bits < 0 || bits > 16 || + s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; @@ -587,12 +624,12 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) return err; - if (strm->avail_out == 0) + if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) return Z_BUF_ERROR; } if (s->level != level) { @@ -633,36 +670,50 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) } /* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. + * For the default windowBits of 15 and memLevel of 8, this function returns a + * close to exact, as well as small, upper bound on the compressed size. This + * is an expansion of ~0.03%, plus a small constant. * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. + * For any setting other than those defaults for windowBits and memLevel, one + * of two worst case bounds is returned. This is at most an expansion of ~4% or + * ~13%, plus a small constant. * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. + * Both the 0.03% and 4% derive from the overhead of stored blocks. The first + * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second + * is for stored blocks of 127 bytes (the worst case memLevel == 1). The + * expansion results from five bytes of header for each stored block. + * + * The larger expansion of 13% results from a window size less than or equal to + * the symbols buffer size (windowBits <= memLevel + 7). In that case some of + * the data being compressed may have slid out of the sliding window, impeding + * a stored block from being emitted. Then the only choice is a fixed or + * dynamic block, where a fixed block limits the maximum expansion to 9 bits + * per 8-bit byte, plus 10 bits for every block. The smallest block size for + * which this can occur is 255 (memLevel == 2). + * + * Shifts are used to approximate divisions, for speed. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; - uLong complen, wraplen; + uLong fixedlen, storelen, wraplen; - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + /* upper bound for fixed blocks with 9-bit literals and length 255 + (memLevel == 2, which is the lowest that may not use stored blocks) -- + ~13% overhead plus a small constant */ + fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + + (sourceLen >> 9) + 4; - /* if can't get parameters, return conservative bound plus zlib wrapper */ + /* upper bound for stored blocks with length 127 (memLevel == 1) -- + ~4% overhead plus a small constant */ + storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + + (sourceLen >> 11) + 7; + + /* if can't get parameters, return larger bound plus a zlib wrapper */ if (deflateStateCheck(strm)) - return complen + 6; + return (fixedlen > storelen ? fixedlen : storelen) + 6; /* compute wrapper length */ s = strm->state; @@ -699,11 +750,12 @@ uLong ZEXPORT deflateBound(strm, sourceLen) wraplen = 6; } - /* if not default parameters, return conservative bound */ + /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; + return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; - /* default settings: return tight bound for that case */ + /* default settings: return tight bound for that case -- ~0.03% overhead + plus a small constant */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } @@ -713,7 +765,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ -local void putShortMSB (s, b) +local void putShortMSB(s, b) deflate_state *s; uInt b; { @@ -760,7 +812,7 @@ local void flush_pending(strm) } while (0) /* ========================================================================= */ -int ZEXPORT deflate (strm, flush) +int ZEXPORT deflate(strm, flush) z_streamp strm; int flush; { @@ -811,9 +863,11 @@ int ZEXPORT deflate (strm, flush) } /* Write the header */ + if (s->status == INIT_STATE && s->wrap == 0) + s->status = BUSY_STATE; if (s->status == INIT_STATE) { /* zlib header */ - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) @@ -1073,7 +1127,7 @@ int ZEXPORT deflate (strm, flush) } /* ========================================================================= */ -int ZEXPORT deflateEnd (strm) +int ZEXPORT deflateEnd(strm) z_streamp strm; { int status; @@ -1099,7 +1153,7 @@ int ZEXPORT deflateEnd (strm) * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ -int ZEXPORT deflateCopy (dest, source) +int ZEXPORT deflateCopy(dest, source) z_streamp dest; z_streamp source; { @@ -1108,7 +1162,6 @@ int ZEXPORT deflateCopy (dest, source) #else deflate_state *ds; deflate_state *ss; - ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { @@ -1128,8 +1181,7 @@ int ZEXPORT deflateCopy (dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1143,8 +1195,7 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + ds->sym_buf = ds->pending_buf + ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1191,7 +1242,7 @@ local unsigned read_buf(strm, buf, size) /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ -local void lm_init (s) +local void lm_init(s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; @@ -1212,11 +1263,6 @@ local void lm_init (s) s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif } #ifndef FASTEST @@ -1229,10 +1275,6 @@ local void lm_init (s) * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ @@ -1257,10 +1299,10 @@ local uInt longest_match(s, cur_match) */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); + register ush scan_end = *(ushf*)(scan + best_len - 1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end1 = scan[best_len - 1]; register Byte scan_end = scan[best_len]; #endif @@ -1278,7 +1320,8 @@ local uInt longest_match(s, cur_match) */ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); @@ -1296,43 +1339,44 @@ local uInt longest_match(s, cur_match) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ - if (*(ushf*)(match+best_len-1) != scan_end || + if (*(ushf*)(match + best_len - 1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient + * strstart + 3, + 5, up to strstart + 257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + /* Here, scan <= window + strstart + 257 */ + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); if (*scan == *match) scan++; - len = (MAX_MATCH - 1) - (int)(strend-scan); + len = (MAX_MATCH - 1) - (int)(strend - scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; + if (match[best_len] != scan_end || + match[best_len - 1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1342,7 +1386,7 @@ local uInt longest_match(s, cur_match) Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1351,7 +1395,8 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; @@ -1363,9 +1408,9 @@ local uInt longest_match(s, cur_match) best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); + scan_end = *(ushf*)(scan + best_len - 1); #else - scan_end1 = scan[best_len-1]; + scan_end1 = scan[best_len - 1]; scan_end = scan[best_len]; #endif } @@ -1375,7 +1420,6 @@ local uInt longest_match(s, cur_match) if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } -#endif /* ASMV */ #else /* FASTEST */ @@ -1396,7 +1440,8 @@ local uInt longest_match(s, cur_match) */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); Assert(cur_match < s->strstart, "no future"); @@ -1406,7 +1451,7 @@ local uInt longest_match(s, cur_match) */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1416,7 +1461,7 @@ local uInt longest_match(s, cur_match) Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1425,7 +1470,7 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); @@ -1461,7 +1506,7 @@ local void check_match(s, start, match, length) z_error("invalid match"); } if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); + fprintf(stderr,"\\[%d,%d]", start - match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } @@ -1507,12 +1552,14 @@ local void fill_window(s) /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ - if (s->strstart >= wsize+MAX_DIST(s)) { + if (s->strstart >= wsize + MAX_DIST(s)) { - zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; slide_hash(s); more += wsize; } @@ -1638,7 +1685,7 @@ local void fill_window(s) * * deflate_stored() is written to minimize the number of times an input byte is * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. + * maximizes the opportunities to have a single copy from next_in to next_out. */ local block_state deflate_stored(s, flush) deflate_state *s; @@ -1742,6 +1789,7 @@ local block_state deflate_stored(s, flush) s->matches = 2; /* clear hash */ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; + s->insert = s->strstart; } else { if (s->window_size - s->strstart <= used) { @@ -1750,12 +1798,14 @@ local block_state deflate_stored(s, flush) zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ + if (s->insert > s->strstart) + s->insert = s->strstart; } zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; + s->insert += MIN(used, s->w_size - s->insert); } s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1770,7 +1820,7 @@ local block_state deflate_stored(s, flush) return block_done; /* Fill the window with any remaining input. */ - have = s->window_size - s->strstart - 1; + have = s->window_size - s->strstart; if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size; @@ -1779,12 +1829,15 @@ local block_state deflate_stored(s, flush) if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ + if (s->insert > s->strstart) + s->insert = s->strstart; } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; + s->insert += MIN(have, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1842,7 +1895,7 @@ local block_state deflate_fast(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1890,7 +1943,7 @@ local block_state deflate_fast(s, flush) s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif @@ -1901,7 +1954,7 @@ local block_state deflate_fast(s, flush) } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -1912,7 +1965,7 @@ local block_state deflate_fast(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -1945,7 +1998,7 @@ local block_state deflate_slow(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1987,17 +2040,17 @@ 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); + check_match(s, s->strstart - 1, s->prev_match, s->prev_length); - _tr_tally_dist(s, s->strstart -1 - s->prev_match, + _tr_tally_dist(s, s->strstart - 1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not + * strstart - 1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ - s->lookahead -= s->prev_length-1; + s->lookahead -= s->prev_length - 1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { @@ -2015,8 +2068,8 @@ local block_state deflate_slow(s, flush) * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } @@ -2034,8 +2087,8 @@ local block_state deflate_slow(s, flush) } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; @@ -2043,7 +2096,7 @@ local block_state deflate_slow(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2092,7 +2145,8 @@ local block_state deflate_rle(s, flush) if (s->match_length > s->lookahead) s->match_length = s->lookahead; } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (uInt)(s->window_size - 1), + "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -2107,7 +2161,7 @@ local block_state deflate_rle(s, flush) } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -2118,7 +2172,7 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2147,7 +2201,7 @@ local block_state deflate_huff(s, flush) /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); @@ -2157,7 +2211,7 @@ local block_state deflate_huff(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } diff --git a/src/dependencies/zlib-1.2.11/deflate.h b/src/dependencies/zlib-1.2.13/deflate.h similarity index 95% rename from src/dependencies/zlib-1.2.11/deflate.h rename to src/dependencies/zlib-1.2.13/deflate.h index 23ecdd3..1a06cd5 100644 --- a/src/dependencies/zlib-1.2.11/deflate.h +++ b/src/dependencies/zlib-1.2.13/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2016 Jean-loup Gailly + * Copyright (C) 1995-2018 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -217,7 +217,7 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - uchf *l_buf; /* buffer for literals or lengths */ + uchf *sym_buf; /* buffer for distances and literals/lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,13 +239,8 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + uInt sym_next; /* running index in sym_buf */ + uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ @@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = cc; \ s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ + s->sym_buf[s->sym_next++] = (uch)dist; \ + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \ + s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) diff --git a/src/dependencies/zlib-1.2.11/doc/algorithm.txt b/src/dependencies/zlib-1.2.13/doc/algorithm.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/doc/algorithm.txt rename to src/dependencies/zlib-1.2.13/doc/algorithm.txt diff --git a/src/dependencies/zlib-1.2.13/doc/crc-doc.1.0.pdf b/src/dependencies/zlib-1.2.13/doc/crc-doc.1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6942ecc09a3f8b2d7e4b6fbecc5955121e8e7cf GIT binary patch literal 776142 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 z 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%0A!*@!_1l*%gn{T*uEUOk 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

    TW z_IDONo{|>HAW1G>TyRtpbmwk{?E;Qe^keeoFsDM3S=2db6)SXNcKE5%&&Ar#_N zpb@o8hS`1wgDDbLa&s+bs8dLKx3^4*zmN|i^7+?GCYx*0-1L2GVTM3%-hPWrrhz0e zbXNHB3HfPmGwCS)c;aGu`*;sb-s8nk=U{GPS59ihrvy=D!4Vx`q}533<6z$ck`Pyq z#Wp|O#O4)elSw*QD!!Er{iJ0~8m2>w=uzx@uM&gU0r$C!=YYmjU1aUBHf`trIflpm zFq{>9Y%Ab4N$mgk2oo{wij86SPzFIw|MoSMh>+=?vK%06Ri5?N6y32 zPWFhl#BhsY+gB&zX;_uy28Xzn@#4NH&UCg_=suUja2QPKb-V!m%U6KxcfYDXI(>KVeZLk1dpU8 zJ(yC4l)g7U9lQo+6a{OuE#k*r-jT#E>0I?o6F>I7yPufUqKPKv}ds~3-?2-x{@=kJ>}nO93O zI3+2XM938mPr#0cVU!2=Wwm_oC}TP=y|_@ywlY%`>@9xa$lSI=tkviJnbecM0g6D; z#gnR7xopbk>jjl(OpGP8cT&dDJ^}*|cYn&W;+mV3&0>yf)w#>nwHu1yokd8ym zQAEeQj_R{r_lrFHT8M}S83BAw2~OKeB5i}Q1uX)2R?d&}r0rzF4H>KEf;v|b}({Pj53@@LXZ!rbM&_B91^_?a$7^_jgH z_D&VwOkJ-?ckMq0-)0KKW|}6YyN3ro2heX%gbj1Kpnk|b734y1tAZb=i8QY5bMHOC zbUYV^l|Rp`f6{L!GWTHZr zoJeOTZ>=xYHk|0I*rr{Y?@X3*1y^kuJ3YGuir-S?3uMz24JJ&d@LXC^AIqx2430Mw zxhP8Ewks}5ddx7a%H&Pkvbe{q+$Hm?zRF9aZnQP@uchGsl#Cc}$!-uw4xA^8 zJTo>TdPw1Sw;2$~;fGv{;q(+?rngoV%qxM9sMp!{!D53t zHYX@;Z65KdeOE|7NY41K;ryCh*ITJZc-|E5k=47tbg`vkV>v}>cYd6|SMWCm>(jj> z(Y-IP3MMF`@7?wsDi;HW<_vO~T(l=k={JY>LsPax4pbFHZ{$NzksGQkw&_C{BRM

    ?-Y#xg4rj7}S3taUTj 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 +#include +#include +#include +#include +#include + +#define local static + +// Special data types. +typedef uintmax_t big_t; // type for code counting +#define PRIbig "ju" // printf format for big_t +typedef uintmax_t code_t; // type for bit pattern counting +struct tab { // type for been-here check + size_t len; // allocated length of bit vector in octets + char *vec; // allocated bit vector +}; + +/* The array for saving results, num[], is indexed with this triplet: + + syms: number of symbols remaining to code + left: number of available bit patterns at length len + len: number of bits in the codes currently being assigned + + Those indices are constrained thusly when saving results: + + syms: 3..totsym (totsym == total symbols to code) + left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) + len: 1..max - 1 (max == maximum code length in bits) + + syms == 2 is not saved since that immediately leads to a single code. left + must be even, since it represents the number of available bit patterns at + the current length, which is double the number at the previous length. left + ends at syms-1 since left == syms immediately results in a single code. + (left > sym is not allowed since that would result in an incomplete code.) + len is less than max, since the code completes immediately when len == max. + + The offset into the array is calculated for the three indices with the first + one (syms) being outermost, and the last one (len) being innermost. We build + the array with length max-1 lists for the len index, with syms-3 of those + for each symbol. There are totsym-2 of those, with each one varying in + length as a function of sym. See the calculation of index in map() for the + index, and the calculation of size in main() for the size of the array. + + For the deflate example of 286 symbols limited to 15-bit codes, the array + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than half + of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid prefix codes. + */ + +/* The array for tracking visited states, done[], is itself indexed identically + to the num[] array as described above for the (syms, left, len) triplet. + Each element in the array is further indexed by the (mem, rem) doublet, + where mem is the amount of inflate table space used so far, and rem is the + remaining unused entries in the current inflate sub-table. Each indexed + element is simply one bit indicating whether the state has been visited or + not. Since the ranges for mem and rem are not known a priori, each bit + vector is of a variable size, and grows as needed to accommodate the visited + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about + ten times larger than the range of rem, the array is skewed to reduce the + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in been_here() for the details. + + For the deflate example of 286 symbols limited to 15-bit codes, the bit + vectors grow to total 5.5 MB, in addition to the 4.3 MB done array itself. + */ + +// Type for a variable-length, allocated string. +typedef struct { + char *str; // pointer to allocated string + size_t size; // size of allocation + size_t len; // length of string, not including terminating zero +} string_t; + +// Clear a string_t. +local void string_clear(string_t *s) { + s->str[0] = 0; + s->len = 0; +} + +// Initialize a string_t. +local void string_init(string_t *s) { + s->size = 16; + s->str = malloc(s->size); + assert(s->str != NULL && "out of memory"); + string_clear(s); +} + +// Release the allocation of a string_t. +local void string_free(string_t *s) { + free(s->str); + s->str = NULL; + s->size = 0; + s->len = 0; +} + +// Save the results of printf with fmt and the subsequent argument list to s. +// Each call appends to s. The allocated space for s is increased as needed. +local void string_printf(string_t *s, char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + size_t len = s->len; + int ret = vsnprintf(s->str + len, s->size - len, fmt, ap); + assert(ret >= 0 && "out of memory"); + s->len += ret; + if (s->size < s->len + 1) { + do { + s->size <<= 1; + assert(s->size != 0 && "overflow"); + } while (s->size < s->len + 1); + s->str = realloc(s->str, s->size); + assert(s->str != NULL && "out of memory"); + vsnprintf(s->str + len, s->size - len, fmt, ap); + } + va_end(ap); +} + +// Globals to avoid propagating constants or constant pointers recursively. +struct { + int max; // maximum allowed bit length for the codes + int root; // size of base code table in bits + int large; // largest code table so far + size_t size; // number of elements in num and done + big_t tot; // total number of codes with maximum tables size + string_t out; // display of subcodes for maximum tables size + int *code; // number of symbols assigned to each bit length + big_t *num; // saved results array for code counting + struct tab *done; // states already evaluated array +} g; + +// Index function for num[] and done[]. +local inline size_t map(int syms, int left, int len) { + return ((size_t)((syms - 1) >> 1) * ((syms - 2) >> 1) + + (left >> 1) - 1) * (g.max - 1) + + len - 1; +} + +// Free allocated space in globals. +local void cleanup(void) { + if (g.done != NULL) { + for (size_t n = 0; n < g.size; n++) + if (g.done[n].len) + free(g.done[n].vec); + g.size = 0; + free(g.done); g.done = NULL; + } + free(g.num); g.num = NULL; + free(g.code); g.code = NULL; + string_free(&g.out); +} + +// Return the number of possible prefix codes using bit patterns of lengths len +// through max inclusive, coding syms symbols, with left bit patterns of length +// len unused -- return -1 if there is an overflow in the counting. Keep a +// record of previous results in num to prevent repeating the same calculation. +local big_t count(int syms, int left, int len) { + // see if only one possible code + if (syms == left) + return 1; + + // note and verify the expected state + assert(syms > left && left > 0 && len < g.max); + + // see if we've done this one already + size_t index = map(syms, left, len); + big_t got = g.num[index]; + if (got) + return got; // we have -- return the saved result + + // we need to use at least this many bit patterns so that the code won't be + // incomplete at the next length (more bit patterns than symbols) + int least = (left << 1) - syms; + if (least < 0) + least = 0; + + // we can use at most this many bit patterns, lest there not be enough + // available for the remaining symbols at the maximum length (if there were + // no limit to the code length, this would become: most = left - 1) + int most = (((code_t)left << (g.max - len)) - syms) / + (((code_t)1 << (g.max - len)) - 1); + + // count all possible codes from this juncture and add them up + big_t sum = 0; + for (int use = least; use <= most; use++) { + got = count(syms - use, (left - use) << 1, len + 1); + sum += got; + if (got == (big_t)-1 || sum < got) // overflow + return (big_t)-1; + } + + // verify that all recursive calls are productive + assert(sum != 0); + + // save the result and return it + g.num[index] = sum; + return sum; +} + +// Return true if we've been here before, set to true if not. Set a bit in a +// bit vector to indicate visiting this state. Each (syms,len,left) state has a +// variable size bit vector indexed by (mem,rem). The bit vector is lengthened +// as needed to allow setting the (mem,rem) bit. +local int been_here(int syms, int left, int len, int mem, int rem) { + // point to vector for (syms,left,len), bit in vector for (mem,rem) + size_t index = map(syms, left, len); + mem -= 1 << g.root; // mem always includes the root table + mem >>= 1; // mem and rem are always even + rem >>= 1; + size_t offset = (mem >> 3) + rem; + offset = ((offset * (offset + 1)) >> 1) + rem; + int bit = 1 << (mem & 7); + + // see if we've been here + size_t length = g.done[index].len; + if (offset < length && (g.done[index].vec[offset] & bit) != 0) + return 1; // done this! + + // we haven't been here before -- set the bit to show we have now + + // see if we need to lengthen the vector in order to set the bit + if (length <= offset) { + // if we have one already, enlarge it, zero out the appended space + char *vector; + if (length) { + do { + length <<= 1; + } while (length <= offset); + vector = realloc(g.done[index].vec, length); + assert(vector != NULL && "out of memory"); + memset(vector + g.done[index].len, 0, length - g.done[index].len); + } + + // otherwise we need to make a new vector and zero it out + else { + length = 16; + while (length <= offset) + length <<= 1; + vector = calloc(length, 1); + assert(vector != NULL && "out of memory"); + } + + // install the new vector + g.done[index].len = length; + g.done[index].vec = vector; + } + + // set the bit + g.done[index].vec[offset] |= bit; + return 0; +} + +// Examine all possible codes from the given node (syms, len, left). Compute +// the amount of memory required to build inflate's decoding tables, where the +// number of code structures used so far is mem, and the number remaining in +// the current sub-table is rem. +local void examine(int syms, int left, int len, int mem, int rem) { + // see if we have a complete code + if (syms == left) { + // set the last code entry + g.code[len] = left; + + // complete computation of memory used by this code + while (rem < left) { + left -= rem; + rem = 1 << (len - g.root); + mem += rem; + } + assert(rem == left); + + // if this is at the maximum, show the sub-code + if (mem >= g.large) { + // if this is a new maximum, update the maximum and clear out the + // printed sub-codes from the previous maximum + if (mem > g.large) { + g.large = mem; + string_clear(&g.out); + } + + // compute the starting state for this sub-code + syms = 0; + left = 1 << g.max; + for (int bits = g.max; bits > g.root; bits--) { + syms += g.code[bits]; + left -= g.code[bits]; + assert((left & 1) == 0); + left >>= 1; + } + + // print the starting state and the resulting sub-code to g.out + string_printf(&g.out, "<%u, %u, %u>:", + syms, g.root + 1, ((1 << g.root) - left) << 1); + for (int bits = g.root + 1; bits <= g.max; bits++) + if (g.code[bits]) + string_printf(&g.out, " %d[%d]", g.code[bits], bits); + string_printf(&g.out, "\n"); + } + + // remove entries as we drop back down in the recursion + g.code[len] = 0; + return; + } + + // prune the tree if we can + if (been_here(syms, left, len, mem, rem)) + return; + + // we need to use at least this many bit patterns so that the code won't be + // incomplete at the next length (more bit patterns than symbols) + int least = (left << 1) - syms; + if (least < 0) + least = 0; + + // we can use at most this many bit patterns, lest there not be enough + // available for the remaining symbols at the maximum length (if there were + // no limit to the code length, this would become: most = left - 1) + int most = (((code_t)left << (g.max - len)) - syms) / + (((code_t)1 << (g.max - len)) - 1); + + // occupy least table spaces, creating new sub-tables as needed + int use = least; + while (rem < use) { + use -= rem; + rem = 1 << (len - g.root); + mem += rem; + } + rem -= use; + + // examine codes from here, updating table space as we go + for (use = least; use <= most; use++) { + g.code[len] = use; + examine(syms - use, (left - use) << 1, len + 1, + mem + (rem ? 1 << (len - g.root) : 0), rem << 1); + if (rem == 0) { + rem = 1 << (len - g.root); + mem += rem; + } + rem--; + } + + // remove entries as we drop back down in the recursion + g.code[len] = 0; +} + +// Look at all sub-codes starting with root + 1 bits. Look at only the valid +// intermediate code states (syms, left, len). For each completed code, +// calculate the amount of memory required by inflate to build the decoding +// tables. Find the maximum amount of memory required and show the codes that +// require that maximum. +local void enough(int syms) { + // clear code + for (int n = 0; n <= g.max; n++) + g.code[n] = 0; + + // look at all (root + 1) bit and longer codes + string_clear(&g.out); // empty saved results + g.large = 1 << g.root; // base table + if (g.root < g.max) // otherwise, there's only a base table + for (int n = 3; n <= syms; n++) + for (int left = 2; left < n; left += 2) { + // look at all reachable (root + 1) bit nodes, and the + // resulting codes (complete at root + 2 or more) + size_t index = map(n, left, g.root + 1); + if (g.root + 1 < g.max && g.num[index]) // reachable node + examine(n, left, g.root + 1, 1 << g.root, 0); + + // also look at root bit codes with completions at root + 1 + // bits (not saved in num, since complete), just in case + if (g.num[index - 1] && n <= left << 1) + examine((n - left) << 1, (n - left) << 1, g.root + 1, + 1 << g.root, 0); + } + + // done + printf("maximum of %d table entries for root = %d\n", g.large, g.root); + fputs(g.out.str, stdout); +} + +// Examine and show the total number of possible prefix codes for a given +// maximum number of symbols, initial root table size, and maximum code length +// in bits -- those are the command arguments in that order. The default values +// are 286, 9, and 15 respectively, for the deflate literal/length code. The +// possible codes are counted for each number of coded symbols from two to the +// maximum. The counts for each of those and the total number of codes are +// shown. The maximum number of inflate table entries is then calculated across +// all possible codes. Each new maximum number of table entries and the +// associated sub-code (starting at root + 1 == 10 bits) is shown. +// +// To count and examine prefix codes that are not length-limited, provide a +// maximum length equal to the number of symbols minus one. +// +// For the deflate literal/length code, use "enough". For the deflate distance +// code, use "enough 30 6". +int main(int argc, char **argv) { + // set up globals for cleanup() + g.code = NULL; + g.num = NULL; + g.done = NULL; + string_init(&g.out); + + // get arguments -- default to the deflate literal/length code + int syms = 286; + g.root = 9; + g.max = 15; + if (argc > 1) { + syms = atoi(argv[1]); + if (argc > 2) { + g.root = atoi(argv[2]); + if (argc > 3) + g.max = atoi(argv[3]); + } + } + if (argc > 4 || syms < 2 || g.root < 1 || g.max < 1) { + fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", + stderr); + return 1; + } + + // if not restricting the code length, the longest is syms - 1 + if (g.max > syms - 1) + g.max = syms - 1; + + // determine the number of bits in a code_t + int bits = 0; + for (code_t word = 1; word; word <<= 1) + bits++; + + // make sure that the calculation of most will not overflow + if (g.max > bits || (code_t)(syms - 2) >= ((code_t)-1 >> (g.max - 1))) { + fputs("abort: code length too long for internal types\n", stderr); + return 1; + } + + // reject impossible code requests + if ((code_t)(syms - 1) > ((code_t)1 << g.max) - 1) { + fprintf(stderr, "%d symbols cannot be coded in %d bits\n", + syms, g.max); + return 1; + } + + // allocate code vector + g.code = calloc(g.max + 1, sizeof(int)); + assert(g.code != NULL && "out of memory"); + + // determine size of saved results array, checking for overflows, + // allocate and clear the array (set all to zero with calloc()) + if (syms == 2) // iff max == 1 + g.num = NULL; // won't be saving any results + else { + g.size = syms >> 1; + int n = (syms - 1) >> 1; + assert(g.size <= (size_t)-1 / n && "overflow"); + g.size *= n; + n = g.max - 1; + assert(g.size <= (size_t)-1 / n && "overflow"); + g.size *= n; + g.num = calloc(g.size, sizeof(big_t)); + assert(g.num != NULL && "out of memory"); + } + + // count possible codes for all numbers of symbols, add up counts + big_t sum = 0; + for (int n = 2; n <= syms; n++) { + big_t got = count(n, 2, 1); + sum += got; + assert(got != (big_t)-1 && sum >= got && "overflow"); + } + printf("%"PRIbig" total codes for 2 to %d symbols", sum, syms); + if (g.max < syms - 1) + printf(" (%d-bit length limit)\n", g.max); + else + puts(" (no length limit)"); + + // allocate and clear done array for been_here() + if (syms == 2) + g.done = NULL; + else { + g.done = calloc(g.size, sizeof(struct tab)); + assert(g.done != NULL && "out of memory"); + } + + // find and show maximum inflate table usage + if (g.root > g.max) // reduce root to max length + g.root = g.max; + if ((code_t)syms < ((code_t)1 << (g.root + 1))) + enough(syms); + else + fputs("cannot handle minimum code lengths > root", stderr); + + // done + cleanup(); + return 0; +} diff --git a/src/dependencies/zlib-1.2.11/examples/fitblk.c b/src/dependencies/zlib-1.2.13/examples/fitblk.c similarity index 98% rename from src/dependencies/zlib-1.2.11/examples/fitblk.c rename to src/dependencies/zlib-1.2.13/examples/fitblk.c index c61de5c..68f5680 100644 --- a/src/dependencies/zlib-1.2.11/examples/fitblk.c +++ b/src/dependencies/zlib-1.2.13/examples/fitblk.c @@ -17,7 +17,7 @@ data in order to determine how much of that input will compress to nearly the requested output block size. The first pass generates enough deflate blocks to produce output to fill the requested - output size plus a specfied excess amount (see the EXCESS define + output size plus a specified excess amount (see the EXCESS define below). The last deflate block may go quite a bit past that, but is discarded. The second pass decompresses and recompresses just the compressed data that fit in the requested plus excess sized @@ -109,7 +109,7 @@ local int recompress(z_streamp inf, z_streamp def) if (ret == Z_MEM_ERROR) return ret; - /* compress what was decompresed until done or no room */ + /* compress what was decompressed until done or no room */ def->avail_in = RAWLEN - inf->avail_out; def->next_in = raw; if (inf->avail_out != 0) diff --git a/src/dependencies/zlib-1.2.11/examples/gun.c b/src/dependencies/zlib-1.2.13/examples/gun.c similarity index 99% rename from src/dependencies/zlib-1.2.11/examples/gun.c rename to src/dependencies/zlib-1.2.13/examples/gun.c index be44fa5..bea5497 100644 --- a/src/dependencies/zlib-1.2.11/examples/gun.c +++ b/src/dependencies/zlib-1.2.13/examples/gun.c @@ -43,7 +43,7 @@ gun will also decompress files made by Unix compress, which uses LZW compression. These files are automatically detected by virtue of their magic header bytes. Since the end of Unix compress stream is marked by the - end-of-file, they cannot be concantenated. If a Unix compress stream is + end-of-file, they cannot be concatenated. If a Unix compress stream is encountered in an input file, it is the last stream in that file. Like gunzip and uncompress, the file attributes of the original compressed diff --git a/src/dependencies/zlib-1.2.11/examples/gzappend.c b/src/dependencies/zlib-1.2.13/examples/gzappend.c similarity index 98% rename from src/dependencies/zlib-1.2.11/examples/gzappend.c rename to src/dependencies/zlib-1.2.13/examples/gzappend.c index 662dec3..23e93cf 100644 --- a/src/dependencies/zlib-1.2.11/examples/gzappend.c +++ b/src/dependencies/zlib-1.2.13/examples/gzappend.c @@ -33,7 +33,7 @@ * - Add L to constants in lseek() calls * - Remove some debugging information in error messages * - Use new data_type definition for zlib 1.2.1 - * - Simplfy and unify file operations + * - Simplify and unify file operations * - Finish off gzip file in gztack() * - Use deflatePrime() instead of adding empty blocks * - Keep gzip file clean on appended file read errors @@ -54,7 +54,7 @@ block boundary to facilitate locating and modifying the last block bit at the start of the final deflate block. Also whether using Z_BLOCK or not, another required feature of zlib 1.2.x is that inflate() now provides the - number of unusued bits in the last input byte used. gzappend will not work + number of unused bits in the last input byte used. gzappend will not work with versions of zlib earlier than 1.2.1. gzappend first decompresses the gzip file internally, discarding all but @@ -137,7 +137,7 @@ local void rotate(unsigned char *list, unsigned len, unsigned rot) /* do simple left shift by one */ if (rot == 1) { tmp = *list; - memcpy(list, list + 1, len - 1); + memmove(list, list + 1, len - 1); *last = tmp; return; } diff --git a/src/dependencies/zlib-1.2.11/examples/gzjoin.c b/src/dependencies/zlib-1.2.13/examples/gzjoin.c similarity index 100% rename from src/dependencies/zlib-1.2.11/examples/gzjoin.c rename to src/dependencies/zlib-1.2.13/examples/gzjoin.c diff --git a/src/dependencies/zlib-1.2.11/examples/gzlog.c b/src/dependencies/zlib-1.2.13/examples/gzlog.c similarity index 99% rename from src/dependencies/zlib-1.2.11/examples/gzlog.c rename to src/dependencies/zlib-1.2.13/examples/gzlog.c index b8c2927..b977802 100644 --- a/src/dependencies/zlib-1.2.11/examples/gzlog.c +++ b/src/dependencies/zlib-1.2.13/examples/gzlog.c @@ -1,8 +1,8 @@ /* * gzlog.c - * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved + * Copyright (C) 2004, 2008, 2012, 2016, 2019 Mark Adler, all rights reserved * For conditions of distribution and use, see copyright notice in gzlog.h - * version 2.2, 14 Aug 2012 + * version 2.3, 25 May 2019 */ /* @@ -756,12 +756,14 @@ local int log_recover(struct log *log, int op) return -2; } if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + free(data); log_log(log, op, ".add file read failure"); return -1; } ret = (size_t)read(fd, data, len) != len; close(fd); if (ret) { + free(data); log_log(log, op, ".add file read failure"); return -1; } diff --git a/src/dependencies/zlib-1.2.11/examples/gzlog.h b/src/dependencies/zlib-1.2.13/examples/gzlog.h similarity index 98% rename from src/dependencies/zlib-1.2.11/examples/gzlog.h rename to src/dependencies/zlib-1.2.13/examples/gzlog.h index 86f0cec..4f05109 100644 --- a/src/dependencies/zlib-1.2.11/examples/gzlog.h +++ b/src/dependencies/zlib-1.2.13/examples/gzlog.h @@ -40,7 +40,7 @@ its new size at that time. After each write operation, the log file is a valid gzip file that can decompressed to recover what was written. - The gzlog operations can be interupted at any point due to an application or + The gzlog operations can be interrupted at any point due to an application or system crash, and the log file will be recovered the next time the log is opened with gzlog_open(). */ diff --git a/src/dependencies/zlib-1.2.13/examples/gznorm.c b/src/dependencies/zlib-1.2.13/examples/gznorm.c new file mode 100644 index 0000000..68e0a0f --- /dev/null +++ b/src/dependencies/zlib-1.2.13/examples/gznorm.c @@ -0,0 +1,470 @@ +/* gznorm.c -- normalize a gzip stream + * Copyright (C) 2018 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * Version 1.0 7 Oct 2018 Mark Adler */ + +// gznorm takes a gzip stream, potentially containing multiple members, and +// converts it to a gzip stream with a single member. In addition the gzip +// header is normalized, removing the file name and time stamp, and setting the +// other header contents (XFL, OS) to fixed values. gznorm does not recompress +// the data, so it is fast, but no advantage is gained from the history that +// could be available across member boundaries. + +#include // fread, fwrite, putc, fflush, ferror, fprintf, + // vsnprintf, stdout, stderr, NULL, FILE +#include // malloc, free +#include // strerror +#include // errno +#include // va_list, va_start, va_end +#include "zlib.h" // inflateInit2, inflate, inflateReset, inflateEnd, + // z_stream, z_off_t, crc32_combine, Z_NULL, Z_BLOCK, + // Z_OK, Z_STREAM_END, Z_BUF_ERROR, Z_DATA_ERROR, + // Z_MEM_ERROR + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +// printf to an allocated string. Return the string, or NULL if the printf or +// allocation fails. +local char *aprintf(char *fmt, ...) { + // Get the length of the result of the printf. + va_list args; + va_start(args, fmt); + int len = vsnprintf(NULL, 0, fmt, args); + va_end(args); + if (len < 0) + return NULL; + + // Allocate the required space and printf to it. + char *str = malloc(len + 1); + if (str == NULL) + return NULL; + va_start(args, fmt); + vsnprintf(str, len + 1, fmt, args); + va_end(args); + return str; +} + +// Return with an error, putting an allocated error message in *err. Doing an +// inflateEnd() on an already ended state, or one with state set to Z_NULL, is +// permitted. +#define BYE(...) \ + do { \ + inflateEnd(&strm); \ + *err = aprintf(__VA_ARGS__); \ + return 1; \ + } while (0) + +// Chunk size for buffered reads and for decompression. Twice this many bytes +// will be allocated on the stack by gzip_normalize(). Must fit in an unsigned. +#define CHUNK 16384 + +// Read a gzip stream from in and write an equivalent normalized gzip stream to +// out. If given no input, an empty gzip stream will be written. If successful, +// 0 is returned, and *err is set to NULL. On error, 1 is returned, where the +// details of the error are returned in *err, a pointer to an allocated string. +// +// The input may be a stream with multiple gzip members, which is converted to +// a single gzip member on the output. Each gzip member is decompressed at the +// level of deflate blocks. This enables clearing the last-block bit, shifting +// the compressed data to concatenate to the previous member's compressed data, +// which can end at an arbitrary bit boundary, and identifying stored blocks in +// order to resynchronize those to byte boundaries. The deflate compressed data +// is terminated with a 10-bit empty fixed block. If any members on the input +// end with a 10-bit empty fixed block, then that block is excised from the +// stream. This avoids appending empty fixed blocks for every normalization, +// and assures that gzip_normalize applied a second time will not change the +// input. The pad bits after stored block headers and after the final deflate +// block are all forced to zeros. +local int gzip_normalize(FILE *in, FILE *out, char **err) { + // initialize the inflate engine to process a gzip member + z_stream strm; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + if (inflateInit2(&strm, 15 + 16) != Z_OK) + BYE("out of memory"); + + // State while processing the input gzip stream. + enum { // BETWEEN -> HEAD -> BLOCK -> TAIL -> BETWEEN -> ... + BETWEEN, // between gzip members (must end in this state) + HEAD, // reading a gzip header + BLOCK, // reading deflate blocks + TAIL // reading a gzip trailer + } state = BETWEEN; // current component being processed + unsigned long crc = 0; // accumulated CRC of uncompressed data + unsigned long len = 0; // accumulated length of uncompressed data + unsigned long buf = 0; // deflate stream bit buffer of num bits + int num = 0; // number of bits in buf (at bottom) + + // Write a canonical gzip header (no mod time, file name, comment, extra + // block, or extra flags, and OS is marked as unknown). + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + + // Process the gzip stream from in until reaching the end of the input, + // encountering invalid input, or experiencing an i/o error. + int more; // true if not at the end of the input + do { + // State inside this loop. + unsigned char *put; // next input buffer location to process + int prev; // number of bits from previous block in + // the bit buffer, or -1 if not at the + // start of a block + unsigned long long memb; // uncompressed length of member + size_t tail; // number of trailer bytes read (0..8) + unsigned long part; // accumulated trailer component + + // Get the next chunk of input from in. + unsigned char dat[CHUNK]; + strm.avail_in = fread(dat, 1, CHUNK, in); + if (strm.avail_in == 0) + break; + more = strm.avail_in == CHUNK; + strm.next_in = put = dat; + + // Run that chunk of input through the inflate engine to exhaustion. + do { + // At this point it is assured that strm.avail_in > 0. + + // Inflate until the end of a gzip component (header, deflate + // block, trailer) is reached, or until all of the chunk is + // consumed. The resulting decompressed data is discarded, though + // the total size of the decompressed data in each member is + // tracked, for the calculation of the total CRC. + do { + // inflate and handle any errors + unsigned char scrap[CHUNK]; + strm.avail_out = CHUNK; + strm.next_out = scrap; + int ret = inflate(&strm, Z_BLOCK); + if (ret == Z_MEM_ERROR) + BYE("out of memory"); + if (ret == Z_DATA_ERROR) + BYE("input invalid: %s", strm.msg); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_STREAM_END) + BYE("internal error"); + + // Update the number of uncompressed bytes generated in this + // member. The actual count (not modulo 2^32) is required to + // correctly compute the total CRC. + unsigned got = CHUNK - strm.avail_out; + memb += got; + if (memb < got) + BYE("overflow error"); + + // Continue to process this chunk until it is consumed, or + // until the end of a component (header, deflate block, or + // trailer) is reached. + } while (strm.avail_out == 0 && (strm.data_type & 0x80) == 0); + + // Since strm.avail_in was > 0 for the inflate call, some input was + // just consumed. It is therefore assured that put < strm.next_in. + + // Disposition the consumed component or part of a component. + switch (state) { + case BETWEEN: + state = HEAD; + // Fall through to HEAD when some or all of the header is + // processed. + + case HEAD: + // Discard the header. + if (strm.data_type & 0x80) { + // End of header reached -- deflate blocks follow. + put = strm.next_in; + prev = num; + memb = 0; + state = BLOCK; + } + break; + + case BLOCK: + // Copy the deflate stream to the output, but with the + // last-block-bit cleared. Re-synchronize stored block + // headers to the output byte boundaries. The bytes at + // put..strm.next_in-1 is the compressed data that has been + // processed and is ready to be copied to the output. + + // At this point, it is assured that new compressed data is + // available, i.e., put < strm.next_in. If prev is -1, then + // that compressed data starts in the middle of a deflate + // block. If prev is not -1, then the bits in the bit + // buffer, possibly combined with the bits in *put, contain + // the three-bit header of the new deflate block. In that + // case, prev is the number of bits from the previous block + // that remain in the bit buffer. Since num is the number + // of bits in the bit buffer, we have that num - prev is + // the number of bits from the new block currently in the + // bit buffer. + + // If strm.data_type & 0xc0 is 0x80, then the last byte of + // the available compressed data includes the last bits of + // the end of a deflate block. In that case, that last byte + // also has strm.data_type & 0x1f bits of the next deflate + // block, in the range 0..7. If strm.data_type & 0xc0 is + // 0xc0, then the last byte of the compressed data is the + // end of the deflate stream, followed by strm.data_type & + // 0x1f pad bits, also in the range 0..7. + + // Set bits to the number of bits not yet consumed from the + // last byte. If we are at the end of the block, bits is + // either the number of bits in the last byte belonging to + // the next block, or the number of pad bits after the + // final block. In either of those cases, bits is in the + // range 0..7. + ; // (required due to C syntax oddity) + int bits = strm.data_type & 0x1f; + + if (prev != -1) { + // We are at the start of a new block. Clear the last + // block bit, and check for special cases. If it is a + // stored block, then emit the header and pad to the + // next byte boundary. If it is a final, empty fixed + // block, then excise it. + + // Some or all of the three header bits for this block + // may already be in the bit buffer. Load any remaining + // header bits into the bit buffer. + if (num - prev < 3) { + buf += (unsigned long)*put++ << num; + num += 8; + } + + // Set last to have a 1 in the position of the last + // block bit in the bit buffer. + unsigned long last = (unsigned long)1 << prev; + + if (((buf >> prev) & 7) == 3) { + // This is a final fixed block. Load at least ten + // bits from this block, including the header, into + // the bit buffer. We already have at least three, + // so at most one more byte needs to be loaded. + if (num - prev < 10) { + if (put == strm.next_in) + // Need to go get and process more input. + // We'll end up back here to finish this. + break; + buf += (unsigned long)*put++ << num; + num += 8; + } + if (((buf >> prev) & 0x3ff) == 3) { + // That final fixed block is empty. Delete it + // to avoid adding an empty block every time a + // gzip stream is normalized. + num = prev; + buf &= last - 1; // zero the pad bits + } + } + else if (((buf >> prev) & 6) == 0) { + // This is a stored block. Flush to the next + // byte boundary after the three-bit header. + num = (prev + 10) & ~7; + buf &= last - 1; // zero the pad bits + } + + // Clear the last block bit. + buf &= ~last; + + // Write out complete bytes in the bit buffer. + while (num >= 8) { + putc(buf, out); + buf >>= 8; + num -= 8; + } + + // If no more bytes left to process, then we have + // consumed the byte that had bits from the next block. + if (put == strm.next_in) + bits = 0; + } + + // We are done handling the deflate block header. Now copy + // all or almost all of the remaining compressed data that + // has been processed so far. Don't copy one byte at the + // end if it contains bits from the next deflate block or + // pad bits at the end of a deflate block. + + // mix is 1 if we are at the end of a deflate block, and if + // some of the bits in the last byte follow this block. mix + // is 0 if we are in the middle of a deflate block, if the + // deflate block ended on a byte boundary, or if all of the + // compressed data processed so far has been consumed. + int mix = (strm.data_type & 0x80) && bits; + + // Copy all of the processed compressed data to the output, + // except for the last byte if it contains bits from the + // next deflate block or pad bits at the end of the deflate + // stream. Copy the data after shifting in num bits from + // buf in front of it, leaving num bits from the end of the + // compressed data in buf when done. + unsigned char *end = strm.next_in - mix; + if (put < end) { + if (num) + // Insert num bits from buf before the data being + // copied. + do { + buf += (unsigned)(*put++) << num; + putc(buf, out); + buf >>= 8; + } while (put < end); + else { + // No shifting needed -- write directly. + fwrite(put, 1, end - put, out); + put = end; + } + } + + // Process the last processed byte if it wasn't written. + if (mix) { + // Load the last byte into the bit buffer. + buf += (unsigned)(*put++) << num; + num += 8; + + if (strm.data_type & 0x40) { + // We are at the end of the deflate stream and + // there are bits pad bits. Discard the pad bits + // and write a byte to the output, if available. + // Leave the num bits left over in buf to prepend + // to the next deflate stream. + num -= bits; + if (num >= 8) { + putc(buf, out); + num -= 8; + buf >>= 8; + } + + // Force the pad bits in the bit buffer to zeros. + buf &= ((unsigned long)1 << num) - 1; + + // Don't need to set prev here since going to TAIL. + } + else + // At the end of an internal deflate block. Leave + // the last byte in the bit buffer to examine on + // the next entry to BLOCK, when more bits from the + // next block will be available. + prev = num - bits; // number of bits in buffer + // from current block + } + + // Don't have a byte left over, so we are in the middle of + // a deflate block, or the deflate block ended on a byte + // boundary. Set prev appropriately for the next entry into + // BLOCK. + else if (strm.data_type & 0x80) + // The block ended on a byte boundary, so no header + // bits are in the bit buffer. + prev = num; + else + // In the middle of a deflate block, so no header here. + prev = -1; + + // Check for the end of the deflate stream. + if ((strm.data_type & 0xc0) == 0xc0) { + // That ends the deflate stream on the input side, the + // pad bits were discarded, and any remaining bits from + // the last block in the stream are saved in the bit + // buffer to prepend to the next stream. Process the + // gzip trailer next. + tail = 0; + part = 0; + state = TAIL; + } + break; + + case TAIL: + // Accumulate available trailer bytes to update the total + // CRC and the total uncompressed length. + do { + part = (part >> 8) + ((unsigned long)(*put++) << 24); + tail++; + if (tail == 4) { + // Update the total CRC. + z_off_t len2 = memb; + if (len2 < 0 || (unsigned long long)len2 != memb) + BYE("overflow error"); + crc = crc ? crc32_combine(crc, part, len2) : part; + part = 0; + } + else if (tail == 8) { + // Update the total uncompressed length. (It's ok + // if this sum is done modulo 2^32.) + len += part; + + // At the end of a member. Set up to inflate an + // immediately following gzip member. (If we made + // it this far, then the trailer was valid.) + if (inflateReset(&strm) != Z_OK) + BYE("internal error"); + state = BETWEEN; + break; + } + } while (put < strm.next_in); + break; + } + + // Process the input buffer until completely consumed. + } while (strm.avail_in > 0); + + // Process input until end of file, invalid input, or i/o error. + } while (more); + + // Done with the inflate engine. + inflateEnd(&strm); + + // Verify the validity of the input. + if (state != BETWEEN) + BYE("input invalid: incomplete gzip stream"); + + // Write the remaining deflate stream bits, followed by a terminating + // deflate fixed block. + buf += (unsigned long)3 << num; + putc(buf, out); + putc(buf >> 8, out); + if (num > 6) + putc(0, out); + + // Write the gzip trailer, which is the CRC and the uncompressed length + // modulo 2^32, both in little-endian order. + putc(crc, out); + putc(crc >> 8, out); + putc(crc >> 16, out); + putc(crc >> 24, out); + putc(len, out); + putc(len >> 8, out); + putc(len >> 16, out); + putc(len >> 24, out); + fflush(out); + + // Check for any i/o errors. + if (ferror(in) || ferror(out)) + BYE("i/o error: %s", strerror(errno)); + + // All good! + *err = NULL; + return 0; +} + +// Normalize the gzip stream on stdin, writing the result to stdout. +int main(void) { + // Avoid end-of-line conversions on evil operating systems. + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + // Normalize from stdin to stdout, returning 1 on error, 0 if ok. + char *err; + int ret = gzip_normalize(stdin, stdout, &err); + if (ret) + fprintf(stderr, "gznorm error: %s\n", err); + free(err); + return ret; +} diff --git a/src/dependencies/zlib-1.2.11/examples/zlib_how.html b/src/dependencies/zlib-1.2.13/examples/zlib_how.html similarity index 100% rename from src/dependencies/zlib-1.2.11/examples/zlib_how.html rename to src/dependencies/zlib-1.2.13/examples/zlib_how.html diff --git a/src/dependencies/zlib-1.2.11/examples/zpipe.c b/src/dependencies/zlib-1.2.13/examples/zpipe.c similarity index 100% rename from src/dependencies/zlib-1.2.11/examples/zpipe.c rename to src/dependencies/zlib-1.2.13/examples/zpipe.c diff --git a/src/dependencies/zlib-1.2.11/examples/zran.c b/src/dependencies/zlib-1.2.13/examples/zran.c similarity index 60% rename from src/dependencies/zlib-1.2.11/examples/zran.c rename to src/dependencies/zlib-1.2.13/examples/zran.c index 4fec659..879c47c 100644 --- a/src/dependencies/zlib-1.2.11/examples/zran.c +++ b/src/dependencies/zlib-1.2.13/examples/zran.c @@ -1,11 +1,13 @@ /* zran.c -- example of zlib/gzip stream indexing and random access - * Copyright (C) 2005, 2012 Mark Adler + * Copyright (C) 2005, 2012, 2018 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h - Version 1.1 29 Sep 2012 Mark Adler */ + * Version 1.2 14 Oct 2018 Mark Adler */ /* Version History: 1.0 29 May 2005 First version 1.1 29 Sep 2012 Fix memory reallocation error + 1.2 14 Oct 2018 Handle gzip streams with multiple members + Add a header file to facilitate usage in applications */ /* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() @@ -19,12 +21,12 @@ An access point can be created at the start of any deflate block, by saving the starting file offset and bit of that block, and the 32K bytes of uncompressed data that precede that block. Also the uncompressed offset of - that block is saved to provide a referece for locating a desired starting - point in the uncompressed stream. build_index() works by decompressing the - input zlib or gzip stream a block at a time, and at the end of each block - deciding if enough uncompressed data has gone by to justify the creation of - a new access point. If so, that point is saved in a data structure that - grows as needed to accommodate the points. + that block is saved to provide a reference for locating a desired starting + point in the uncompressed stream. deflate_index_build() works by + decompressing the input zlib or gzip stream a block at a time, and at the + end of each block deciding if enough uncompressed data has gone by to + justify the creation of a new access point. If so, that point is saved in a + data structure that grows as needed to accommodate the points. To use the index, an offset in the uncompressed data is provided, for which the latest access point at or preceding that offset is located in the index. @@ -43,7 +45,8 @@ There is some fair bit of overhead to starting inflation for the random access, mainly copying the 32K byte dictionary. So if small pieces of the file are being accessed, it would make sense to implement a cache to hold - some lookahead and avoid many calls to extract() for small lengths. + some lookahead and avoid many calls to deflate_index_extract() for small + lengths. Another way to build an index would be to use inflateCopy(). That would not be constrained to have access points at block boundaries, but requires @@ -56,30 +59,21 @@ #include #include #include "zlib.h" +#include "zran.h" -#define local static - -#define SPAN 1048576L /* desired distance between access points */ #define WINSIZE 32768U /* sliding window size */ #define CHUNK 16384 /* file input buffer size */ -/* access point entry */ +/* Access point entry. */ struct point { off_t out; /* corresponding offset in uncompressed data */ off_t in; /* offset in input file of first full byte */ - int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + int bits; /* number of bits (1-7) from byte at in-1, or 0 */ unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ }; -/* access point list */ -struct access { - int have; /* number of list entries filled in */ - int size; /* number of list entries allocated */ - struct point *list; /* allocated list */ -}; - -/* Deallocate an index built by build_index() */ -local void free_index(struct access *index) +/* See comments in zran.h. */ +void deflate_index_free(struct deflate_index *index) { if (index != NULL) { free(index->list); @@ -87,39 +81,43 @@ local void free_index(struct access *index) } } -/* Add an entry to the access point list. If out of memory, deallocate the - existing list and return NULL. */ -local struct access *addpoint(struct access *index, int bits, - off_t in, off_t out, unsigned left, unsigned char *window) +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. index->gzip is the allocated size of the + index in point entries, until it is time for deflate_index_build() to + return, at which point gzip is set to indicate a gzip file or not. + */ +static struct deflate_index *addpoint(struct deflate_index *index, int bits, + off_t in, off_t out, unsigned left, + unsigned char *window) { struct point *next; /* if list is empty, create it (start with eight points) */ if (index == NULL) { - index = malloc(sizeof(struct access)); + index = malloc(sizeof(struct deflate_index)); if (index == NULL) return NULL; index->list = malloc(sizeof(struct point) << 3); if (index->list == NULL) { free(index); return NULL; } - index->size = 8; + index->gzip = 8; index->have = 0; } /* if list is full, make it bigger */ - else if (index->have == index->size) { - index->size <<= 1; - next = realloc(index->list, sizeof(struct point) * index->size); + else if (index->have == index->gzip) { + index->gzip <<= 1; + next = realloc(index->list, sizeof(struct point) * index->gzip); if (next == NULL) { - free_index(index); + deflate_index_free(index); return NULL; } index->list = next; } /* fill in entry and increment how many we have */ - next = index->list + index->have; + next = (struct point *)(index->list) + index->have; next->bits = bits; next->in = in; next->out = out; @@ -133,20 +131,14 @@ local struct access *addpoint(struct access *index, int bits, return index; } -/* Make one entire pass through the compressed stream and build an index, with - access points about every span bytes of uncompressed output -- span is - chosen to balance the speed of random access against the memory requirements - of the list, about 32K bytes per access point. Note that data after the end - of the first zlib or gzip stream in the file is ignored. build_index() - returns the number of access points on success (>= 1), Z_MEM_ERROR for out - of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a - file read error. On success, *built points to the resulting index. */ -local int build_index(FILE *in, off_t span, struct access **built) +/* See comments in zran.h. */ +int deflate_index_build(FILE *in, off_t span, struct deflate_index **built) { int ret; + int gzip = 0; /* true if reading a gzip file */ off_t totin, totout; /* our own total counters to avoid 4GB limit */ off_t last; /* totout value of last access point */ - struct access *index; /* access points being generated */ + struct deflate_index *index; /* access points being generated */ z_stream strm; unsigned char input[CHUNK]; unsigned char window[WINSIZE]; @@ -163,7 +155,7 @@ local int build_index(FILE *in, off_t span, struct access **built) /* inflate the input, maintain a sliding window, and build an index -- this also validates the integrity of the compressed data using the check - information at the end of the gzip or zlib stream */ + information in the gzip or zlib stream */ totin = totout = last = 0; index = NULL; /* will be allocated by first addpoint() */ strm.avail_out = 0; @@ -172,14 +164,19 @@ local int build_index(FILE *in, off_t span, struct access **built) strm.avail_in = fread(input, 1, CHUNK, in); if (ferror(in)) { ret = Z_ERRNO; - goto build_index_error; + goto deflate_index_build_error; } if (strm.avail_in == 0) { ret = Z_DATA_ERROR; - goto build_index_error; + goto deflate_index_build_error; } strm.next_in = input; + /* check for a gzip stream */ + if (totin == 0 && strm.avail_in >= 3 && + input[0] == 31 && input[1] == 139 && input[2] == 8) + gzip = 1; + /* process all of that, or until end of stream */ do { /* reset sliding window if necessary */ @@ -198,9 +195,17 @@ local int build_index(FILE *in, off_t span, struct access **built) if (ret == Z_NEED_DICT) ret = Z_DATA_ERROR; if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) - goto build_index_error; - if (ret == Z_STREAM_END) + goto deflate_index_build_error; + if (ret == Z_STREAM_END) { + if (gzip && + (strm.avail_in || ungetc(getc(in), in) != EOF)) { + ret = inflateReset(&strm); + if (ret != Z_OK) + goto deflate_index_build_error; + continue; + } break; + } /* if at end of block, consider adding an index entry (note that if data_type indicates an end-of-block, then all of the @@ -217,7 +222,7 @@ local int build_index(FILE *in, off_t span, struct access **built) totout, strm.avail_out, window); if (index == NULL) { ret = Z_MEM_ERROR; - goto build_index_error; + goto deflate_index_build_error; } last = totout; } @@ -227,27 +232,21 @@ local int build_index(FILE *in, off_t span, struct access **built) /* clean up and return index (release unused entries in list) */ (void)inflateEnd(&strm); index->list = realloc(index->list, sizeof(struct point) * index->have); - index->size = index->have; + index->gzip = gzip; + index->length = totout; *built = index; - return index->size; + return index->have; /* return error */ - build_index_error: + deflate_index_build_error: (void)inflateEnd(&strm); - if (index != NULL) - free_index(index); + deflate_index_free(index); return ret; } -/* Use the index to read len bytes from offset into buf, return bytes read or - negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past - the end of the uncompressed data, then extract() will return a value less - than len, indicating how much as actually read into buf. This function - should not return a data error unless the file was modified since the index - was generated. extract() may also return Z_ERRNO if there is an error on - reading or seeking the input file. */ -local int extract(FILE *in, struct access *index, off_t offset, - unsigned char *buf, int len) +/* See comments in zran.h. */ +int deflate_index_extract(FILE *in, struct deflate_index *index, off_t offset, + unsigned char *buf, int len) { int ret, skip; z_stream strm; @@ -276,12 +275,12 @@ local int extract(FILE *in, struct access *index, off_t offset, return ret; ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); if (ret == -1) - goto extract_ret; + goto deflate_index_extract_ret; if (here->bits) { ret = getc(in); if (ret == -1) { ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; - goto extract_ret; + goto deflate_index_extract_ret; } (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); } @@ -293,21 +292,21 @@ local int extract(FILE *in, struct access *index, off_t offset, skip = 1; /* while skipping to offset */ do { /* define where to put uncompressed data, and how much */ - if (offset == 0 && skip) { /* at offset now */ - strm.avail_out = len; - strm.next_out = buf; - skip = 0; /* only do this once */ - } if (offset > WINSIZE) { /* skip WINSIZE bytes */ strm.avail_out = WINSIZE; strm.next_out = discard; offset -= WINSIZE; } - else if (offset != 0) { /* last skip */ + else if (offset > 0) { /* last skip */ strm.avail_out = (unsigned)offset; strm.next_out = discard; offset = 0; } + else if (skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } /* uncompress until avail_out filled, or end of stream */ do { @@ -315,11 +314,11 @@ local int extract(FILE *in, struct access *index, off_t offset, strm.avail_in = fread(input, 1, CHUNK, in); if (ferror(in)) { ret = Z_ERRNO; - goto extract_ret; + goto deflate_index_extract_ret; } if (strm.avail_in == 0) { ret = Z_DATA_ERROR; - goto extract_ret; + goto deflate_index_extract_ret; } strm.next_in = input; } @@ -327,41 +326,99 @@ local int extract(FILE *in, struct access *index, off_t offset, if (ret == Z_NEED_DICT) ret = Z_DATA_ERROR; if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) - goto extract_ret; - if (ret == Z_STREAM_END) - break; + goto deflate_index_extract_ret; + if (ret == Z_STREAM_END) { + /* the raw deflate stream has ended */ + if (index->gzip == 0) + /* this is a zlib stream that has ended -- done */ + break; + + /* near the end of a gzip member, which might be followed by + another gzip member -- skip the gzip trailer and see if + there is more input after it */ + if (strm.avail_in < 8) { + fseeko(in, 8 - strm.avail_in, SEEK_CUR); + strm.avail_in = 0; + } + else { + strm.avail_in -= 8; + strm.next_in += 8; + } + if (strm.avail_in == 0 && ungetc(getc(in), in) == EOF) + /* the input ended after the gzip trailer -- done */ + break; + + /* there is more input, so another gzip member should follow -- + validate and skip the gzip header */ + ret = inflateReset2(&strm, 31); + if (ret != Z_OK) + goto deflate_index_extract_ret; + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto deflate_index_extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto deflate_index_extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_BLOCK); + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto deflate_index_extract_ret; + } while ((strm.data_type & 128) == 0); + + /* set up to continue decompression of the raw deflate stream + that follows the gzip header */ + ret = inflateReset2(&strm, -15); + if (ret != Z_OK) + goto deflate_index_extract_ret; + } + + /* continue to process the available input before reading more */ } while (strm.avail_out != 0); - /* if reach end of stream, then don't keep trying to get more */ if (ret == Z_STREAM_END) + /* reached the end of the compressed data -- return the data that + was available, possibly less than requested */ break; - /* do until offset reached and requested data read, or stream ends */ + /* do until offset reached and requested data read */ } while (skip); - /* compute number of uncompressed bytes read after offset */ + /* compute the number of uncompressed bytes read after the offset */ ret = skip ? 0 : len - strm.avail_out; - /* clean up and return bytes read or error */ - extract_ret: + /* clean up and return the bytes read, or the negative error */ + deflate_index_extract_ret: (void)inflateEnd(&strm); return ret; } -/* Demonstrate the use of build_index() and extract() by processing the file - provided on the command line, and the extracting 16K from about 2/3rds of - the way through the uncompressed output, and writing that to stdout. */ +#ifdef TEST + +#define SPAN 1048576L /* desired distance between access points */ +#define LEN 16384 /* number of bytes to extract */ + +/* Demonstrate the use of deflate_index_build() and deflate_index_extract() by + processing the file provided on the command line, and extracting LEN bytes + from 2/3rds of the way through the uncompressed output, writing that to + stdout. An offset can be provided as the second argument, in which case the + data is extracted from there instead. */ int main(int argc, char **argv) { int len; - off_t offset; + off_t offset = -1; FILE *in; - struct access *index = NULL; - unsigned char buf[CHUNK]; + struct deflate_index *index = NULL; + unsigned char buf[LEN]; /* open input file */ - if (argc != 2) { - fprintf(stderr, "usage: zran file.gz\n"); + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: zran file.gz [offset]\n"); return 1; } in = fopen(argv[1], "rb"); @@ -370,8 +427,18 @@ int main(int argc, char **argv) return 1; } + /* get optional offset */ + if (argc == 3) { + char *end; + offset = strtoll(argv[2], &end, 10); + if (*end || offset < 0) { + fprintf(stderr, "zran: %s is not a valid offset\n", argv[2]); + return 1; + } + } + /* build index */ - len = build_index(in, SPAN, &index); + len = deflate_index_build(in, SPAN, &index); if (len < 0) { fclose(in); switch (len) { @@ -392,8 +459,9 @@ int main(int argc, char **argv) fprintf(stderr, "zran: built index with %d access points\n", len); /* use index by reading some bytes from an arbitrary offset */ - offset = (index->list[index->have - 1].out << 1) / 3; - len = extract(in, index, offset, buf, CHUNK); + if (offset == -1) + offset = (index->length << 1) / 3; + len = deflate_index_extract(in, index, offset, buf, LEN); if (len < 0) fprintf(stderr, "zran: extraction failed: %s error\n", len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); @@ -403,7 +471,9 @@ int main(int argc, char **argv) } /* clean up and exit */ - free_index(index); + deflate_index_free(index); fclose(in); return 0; } + +#endif diff --git a/src/dependencies/zlib-1.2.13/examples/zran.h b/src/dependencies/zlib-1.2.13/examples/zran.h new file mode 100644 index 0000000..2314125 --- /dev/null +++ b/src/dependencies/zlib-1.2.13/examples/zran.h @@ -0,0 +1,40 @@ +/* zran.h -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005, 2012, 2018 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * Version 1.2 14 Oct 2018 Mark Adler */ + +#include +#include "zlib.h" + +/* Access point list. */ +struct deflate_index { + int have; /* number of list entries */ + int gzip; /* 1 if the index is of a gzip file, 0 if it is of a + zlib stream */ + off_t length; /* total length of uncompressed data */ + void *list; /* allocated list of entries */ +}; + +/* Make one entire pass through a zlib or gzip compressed stream and build an + index, with access points about every span bytes of uncompressed output. + gzip files with multiple members are indexed in their entirety. span should + be chosen to balance the speed of random access against the memory + requirements of the list, about 32K bytes per access point. The return value + is the number of access points on success (>= 1), Z_MEM_ERROR for out of + memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a file + read error. On success, *built points to the resulting index. */ +int deflate_index_build(FILE *in, off_t span, struct deflate_index **built); + +/* Deallocate an index built by deflate_index_build() */ +void deflate_index_free(struct deflate_index *index); + +/* Use the index to read len bytes from offset into buf. Return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then deflate_index_extract() will return a + value less than len, indicating how much was actually read into buf. This + function should not return a data error unless the file was modified since + the index was generated, since deflate_index_build() validated all of the + input. deflate_index_extract() will return Z_ERRNO if there is an error on + reading or seeking the input file. */ +int deflate_index_extract(FILE *in, struct deflate_index *index, off_t offset, + unsigned char *buf, int len); diff --git a/src/dependencies/zlib-1.2.11/gzclose.c b/src/dependencies/zlib-1.2.13/gzclose.c similarity index 100% rename from src/dependencies/zlib-1.2.11/gzclose.c rename to src/dependencies/zlib-1.2.13/gzclose.c diff --git a/src/dependencies/zlib-1.2.11/gzguts.h b/src/dependencies/zlib-1.2.13/gzguts.h similarity index 98% rename from src/dependencies/zlib-1.2.11/gzguts.h rename to src/dependencies/zlib-1.2.13/gzguts.h index 990a4d2..57faf37 100644 --- a/src/dependencies/zlib-1.2.11/gzguts.h +++ b/src/dependencies/zlib-1.2.13/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -39,7 +39,7 @@ # include #endif -#if defined(_WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) # define WIDECHAR #endif @@ -190,6 +190,7 @@ typedef struct { /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ diff --git a/src/dependencies/zlib-1.2.11/gzlib.c b/src/dependencies/zlib-1.2.13/gzlib.c similarity index 98% rename from src/dependencies/zlib-1.2.11/gzlib.c rename to src/dependencies/zlib-1.2.13/gzlib.c index 4105e6a..55da46a 100644 --- a/src/dependencies/zlib-1.2.11/gzlib.c +++ b/src/dependencies/zlib-1.2.13/gzlib.c @@ -1,11 +1,11 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +#if defined(_WIN32) && !defined(__BORLANDC__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -30,7 +30,7 @@ local gzFile gz_open OF((const void *, int, const char *)); The gz_strwinerror function does not change the current setting of GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror (error) +char ZLIB_INTERNAL *gz_strwinerror(error) DWORD error; { static char buf[1024]; @@ -81,6 +81,8 @@ local void gz_reset(state) state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } + else /* for writing ... */ + state->reset = 0; /* no deflateReset pending */ state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ @@ -397,7 +399,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; diff --git a/src/dependencies/zlib-1.2.11/gzread.c b/src/dependencies/zlib-1.2.13/gzread.c similarity index 98% rename from src/dependencies/zlib-1.2.11/gzread.c rename to src/dependencies/zlib-1.2.13/gzread.c index 956b91e..dd77381 100644 --- a/src/dependencies/zlib-1.2.11/gzread.c +++ b/src/dependencies/zlib-1.2.13/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -157,11 +157,9 @@ local int gz_look(state) the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->x.next = state->out; - if (strm->avail_in) { - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - } + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; state->how = COPY; state->direct = 1; return 0; @@ -314,9 +312,9 @@ local z_size_t gz_read(state, buf, len) got = 0; do { /* set n to the maximum amount of len that fits in an unsigned int */ - n = -1; + n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; /* first just try copying data from the output buffer */ if (state->x.have) { @@ -397,7 +395,7 @@ int ZEXPORT gzread(file, buf, len) } /* read len or fewer bytes to buf */ - len = gz_read(state, buf, len); + len = (unsigned)gz_read(state, buf, len); /* check for an error */ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) @@ -447,7 +445,6 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) int ZEXPORT gzgetc(file) gzFile file; { - int ret; unsigned char buf[1]; gz_statep state; @@ -469,8 +466,7 @@ int ZEXPORT gzgetc(file) } /* nothing there -- try gz_read() */ - ret = gz_read(state, buf, 1); - return ret < 1 ? -1 : buf[0]; + return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } int ZEXPORT gzgetc_(file) diff --git a/src/dependencies/zlib-1.2.11/gzwrite.c b/src/dependencies/zlib-1.2.13/gzwrite.c similarity index 95% rename from src/dependencies/zlib-1.2.11/gzwrite.c rename to src/dependencies/zlib-1.2.13/gzwrite.c index c7b5651..eb8a0e5 100644 --- a/src/dependencies/zlib-1.2.11/gzwrite.c +++ b/src/dependencies/zlib-1.2.13/gzwrite.c @@ -1,5 +1,5 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -97,6 +97,15 @@ local int gz_comp(state, flush) return 0; } + /* check for a pending reset */ + if (state->reset) { + /* don't start a new gzip member unless there is data to write */ + if (strm->avail_in == 0) + return 0; + deflateReset(strm); + state->reset = 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -134,7 +143,7 @@ local int gz_comp(state, flush) /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) - deflateReset(strm); + state->reset = 1; /* all done, no errors */ return 0; @@ -209,7 +218,7 @@ local z_size_t gz_write(state, buf, len) state->in); copy = state->size - have; if (copy > len) - copy = len; + copy = (unsigned)len; memcpy(state->in + have, buf, copy); state->strm.avail_in += copy; state->x.pos += copy; @@ -229,7 +238,7 @@ local z_size_t gz_write(state, buf, len) do { unsigned n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; state->strm.avail_in = n; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) @@ -349,12 +358,11 @@ int ZEXPORT gzputc(file, c) } /* -- see zlib.h -- */ -int ZEXPORT gzputs(file, str) +int ZEXPORT gzputs(file, s) gzFile file; - const char *str; + const char *s; { - int ret; - z_size_t len; + z_size_t len, put; gz_statep state; /* get internal structure */ @@ -367,9 +375,13 @@ int ZEXPORT gzputs(file, str) return -1; /* write string */ - len = strlen(str); - ret = gz_write(state, str, len); - return ret == 0 && len != 0 ? -1 : ret; + len = strlen(s); + if ((int)len < 0 || (unsigned)len != len) { + gz_error(state, Z_STREAM_ERROR, "string length does not fit in int"); + return -1; + } + put = gz_write(state, s, len); + return put < len ? -1 : (int)len; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) @@ -441,7 +453,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } @@ -462,7 +474,7 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, +int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; @@ -540,7 +552,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } diff --git a/src/dependencies/zlib-1.2.11/infback.c b/src/dependencies/zlib-1.2.13/infback.c similarity index 98% rename from src/dependencies/zlib-1.2.11/infback.c rename to src/dependencies/zlib-1.2.13/infback.c index 59679ec..babeaf1 100644 --- a/src/dependencies/zlib-1.2.11/infback.c +++ b/src/dependencies/zlib-1.2.13/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -66,6 +66,7 @@ int stream_size; state->window = window; state->wnext = 0; state->whave = 0; + state->sane = 1; return Z_OK; } @@ -477,6 +478,7 @@ void FAR *out_desc; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; + /* fallthrough */ case LEN: /* use inflate_fast() if we have enough input and output */ @@ -604,25 +606,27 @@ void FAR *out_desc; break; case DONE: - /* inflate stream terminated properly -- write leftover output */ + /* inflate stream terminated properly */ ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; - default: /* can't happen, but makes compilers happy */ + default: + /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } - /* Return unused input */ + /* Write leftover output and return unused input */ inf_leave: + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left) && + ret == Z_STREAM_END) + ret = Z_BUF_ERROR; + } strm->next_in = next; strm->avail_in = have; return ret; diff --git a/src/dependencies/zlib-1.2.11/inffast.c b/src/dependencies/zlib-1.2.13/inffast.c similarity index 94% rename from src/dependencies/zlib-1.2.11/inffast.c rename to src/dependencies/zlib-1.2.13/inffast.c index 0dbd1db..1fec7f3 100644 --- a/src/dependencies/zlib-1.2.11/inffast.c +++ b/src/dependencies/zlib-1.2.13/inffast.c @@ -70,7 +70,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ + code const *here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -107,20 +107,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = lcode[hold & lmask]; + here = lcode + (hold & lmask); dolen: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - *out++ = (unsigned char)(here.val); + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); } else if (op & 16) { /* length base */ - len = (unsigned)(here.val); + len = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -138,14 +138,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = dcode[hold & dmask]; + here = dcode + (hold & dmask); dodist: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); + dist = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(*in++) << bits; @@ -264,7 +264,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; + here = dcode + here->val + (hold & ((1U << op) - 1)); goto dodist; } else { @@ -274,7 +274,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; + here = lcode + here->val + (hold & ((1U << op) - 1)); goto dolen; } else if (op & 32) { /* end-of-block */ diff --git a/src/dependencies/zlib-1.2.11/inffast.h b/src/dependencies/zlib-1.2.13/inffast.h similarity index 100% rename from src/dependencies/zlib-1.2.11/inffast.h rename to src/dependencies/zlib-1.2.13/inffast.h diff --git a/src/dependencies/zlib-1.2.11/inffixed.h b/src/dependencies/zlib-1.2.13/inffixed.h similarity index 100% rename from src/dependencies/zlib-1.2.11/inffixed.h rename to src/dependencies/zlib-1.2.13/inffixed.h diff --git a/src/dependencies/zlib-1.2.11/inflate.c b/src/dependencies/zlib-1.2.13/inflate.c similarity index 96% rename from src/dependencies/zlib-1.2.11/inflate.c rename to src/dependencies/zlib-1.2.13/inflate.c index ac333e8..8acbef4 100644 --- a/src/dependencies/zlib-1.2.11/inflate.c +++ b/src/dependencies/zlib-1.2.13/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -130,6 +130,7 @@ z_streamp strm; state->mode = HEAD; state->last = 0; state->havedict = 0; + state->flags = -1; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; @@ -167,6 +168,8 @@ int windowBits; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; wrap = 0; windowBits = -windowBits; } @@ -447,10 +450,10 @@ unsigned copy; /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP -# define UPDATE(check, buf, len) \ +# define UPDATE_CHECK(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else -# define UPDATE(check, buf, len) adler32(check, buf, len) +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ @@ -670,7 +673,6 @@ int flush; state->mode = FLAGS; break; } - state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ @@ -697,6 +699,7 @@ int flush; break; } state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; @@ -722,6 +725,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = TIME; + /* fallthrough */ case TIME: NEEDBITS(32); if (state->head != Z_NULL) @@ -730,6 +734,7 @@ int flush; CRC4(state->check, hold); INITBITS(); state->mode = OS; + /* fallthrough */ case OS: NEEDBITS(16); if (state->head != Z_NULL) { @@ -740,6 +745,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; + /* fallthrough */ case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); @@ -753,14 +759,16 @@ int flush; else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; + /* fallthrough */ case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); @@ -775,6 +783,7 @@ int flush; } state->length = 0; state->mode = NAME; + /* fallthrough */ case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; @@ -796,6 +805,7 @@ int flush; state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; + /* fallthrough */ case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; @@ -816,6 +826,7 @@ int flush; else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; + /* fallthrough */ case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); @@ -839,6 +850,7 @@ int flush; strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; + /* fallthrough */ case DICT: if (state->havedict == 0) { RESTORE(); @@ -846,8 +858,10 @@ int flush; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; + /* fallthrough */ case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ case TYPEDO: if (state->last) { BYTEBITS(); @@ -898,8 +912,10 @@ int flush; INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case COPY_: state->mode = COPY; + /* fallthrough */ case COPY: copy = state->length; if (copy) { @@ -935,6 +951,7 @@ int flush; Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; + /* fallthrough */ case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); @@ -956,6 +973,7 @@ int flush; Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; + /* fallthrough */ case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { @@ -1039,8 +1057,10 @@ int flush; Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case LEN_: state->mode = LEN; + /* fallthrough */ case LEN: if (have >= 6 && left >= 258) { RESTORE(); @@ -1090,6 +1110,7 @@ int flush; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; + /* fallthrough */ case LENEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1100,6 +1121,7 @@ int flush; Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; + /* fallthrough */ case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; @@ -1127,6 +1149,7 @@ int flush; state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; + /* fallthrough */ case DISTEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1143,6 +1166,7 @@ int flush; #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; + /* fallthrough */ case MATCH: if (left == 0) goto inf_leave; copy = out - left; @@ -1202,7 +1226,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, put - out, out); + UPDATE_CHECK(state->check, put - out, out); out = left; if ((state->wrap & 4) && ( #ifdef GUNZIP @@ -1218,10 +1242,11 @@ int flush; } #ifdef GUNZIP state->mode = LENGTH; + /* fallthrough */ case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; @@ -1231,6 +1256,7 @@ int flush; } #endif state->mode = DONE; + /* fallthrough */ case DONE: ret = Z_STREAM_END; goto inf_leave; @@ -1240,6 +1266,7 @@ int flush; case MEM: return Z_MEM_ERROR; case SYNC: + /* fallthrough */ default: return Z_STREAM_ERROR; } @@ -1265,7 +1292,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); + UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); @@ -1401,6 +1428,7 @@ int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; @@ -1433,9 +1461,15 @@ z_streamp strm; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; + state->flags = flags; state->mode = TYPE; return Z_OK; } @@ -1531,7 +1565,7 @@ int check; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (check) + if (check && state->wrap) state->wrap |= 4; else state->wrap &= ~4; diff --git a/src/dependencies/zlib-1.2.11/inflate.h b/src/dependencies/zlib-1.2.13/inflate.h similarity index 97% rename from src/dependencies/zlib-1.2.11/inflate.h rename to src/dependencies/zlib-1.2.13/inflate.h index a46cce6..f127b6b 100644 --- a/src/dependencies/zlib-1.2.11/inflate.h +++ b/src/dependencies/zlib-1.2.13/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -86,7 +86,8 @@ struct inflate_state { int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ diff --git a/src/dependencies/zlib-1.2.11/inftrees.c b/src/dependencies/zlib-1.2.13/inftrees.c similarity index 98% rename from src/dependencies/zlib-1.2.11/inftrees.c rename to src/dependencies/zlib-1.2.13/inftrees.c index 2ea08fc..57d2793 100644 --- a/src/dependencies/zlib-1.2.11/inftrees.c +++ b/src/dependencies/zlib-1.2.13/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; + " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/src/dependencies/zlib-1.2.11/inftrees.h b/src/dependencies/zlib-1.2.13/inftrees.h similarity index 97% rename from src/dependencies/zlib-1.2.11/inftrees.h rename to src/dependencies/zlib-1.2.13/inftrees.h index baa53a0..f536653 100644 --- a/src/dependencies/zlib-1.2.11/inftrees.h +++ b/src/dependencies/zlib-1.2.13/inftrees.h @@ -38,7 +38,7 @@ typedef struct { /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that + examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes returns returns 852, and "enough 30 6 15" for distance codes returns 592. diff --git a/src/dependencies/zlib-1.2.11/make_vms.com b/src/dependencies/zlib-1.2.13/make_vms.com similarity index 99% rename from src/dependencies/zlib-1.2.11/make_vms.com rename to src/dependencies/zlib-1.2.13/make_vms.com index 65e9d0c..4dc8a89 100644 --- a/src/dependencies/zlib-1.2.11/make_vms.com +++ b/src/dependencies/zlib-1.2.13/make_vms.com @@ -14,9 +14,9 @@ $! 0.02 20061008 Adapt to new Makefile.in $! 0.03 20091224 Add support for large file check $! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite $! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in -$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new examples $! subdir path, update module search in makefile.in -$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completely redesigned $! shared image creation $! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared $! image diff --git a/src/dependencies/zlib-1.2.11/msdos/Makefile.bor b/src/dependencies/zlib-1.2.13/msdos/Makefile.bor similarity index 100% rename from src/dependencies/zlib-1.2.11/msdos/Makefile.bor rename to src/dependencies/zlib-1.2.13/msdos/Makefile.bor diff --git a/src/dependencies/zlib-1.2.11/msdos/Makefile.dj2 b/src/dependencies/zlib-1.2.13/msdos/Makefile.dj2 similarity index 100% rename from src/dependencies/zlib-1.2.11/msdos/Makefile.dj2 rename to src/dependencies/zlib-1.2.13/msdos/Makefile.dj2 diff --git a/src/dependencies/zlib-1.2.11/msdos/Makefile.emx b/src/dependencies/zlib-1.2.13/msdos/Makefile.emx similarity index 100% rename from src/dependencies/zlib-1.2.11/msdos/Makefile.emx rename to src/dependencies/zlib-1.2.13/msdos/Makefile.emx diff --git a/src/dependencies/zlib-1.2.11/msdos/Makefile.msc b/src/dependencies/zlib-1.2.13/msdos/Makefile.msc similarity index 100% rename from src/dependencies/zlib-1.2.11/msdos/Makefile.msc rename to src/dependencies/zlib-1.2.13/msdos/Makefile.msc diff --git a/src/dependencies/zlib-1.2.11/msdos/Makefile.tc b/src/dependencies/zlib-1.2.13/msdos/Makefile.tc similarity index 100% rename from src/dependencies/zlib-1.2.11/msdos/Makefile.tc rename to src/dependencies/zlib-1.2.13/msdos/Makefile.tc diff --git a/src/dependencies/zlib-1.2.11/nintendods/Makefile b/src/dependencies/zlib-1.2.13/nintendods/Makefile similarity index 100% rename from src/dependencies/zlib-1.2.11/nintendods/Makefile rename to src/dependencies/zlib-1.2.13/nintendods/Makefile diff --git a/src/dependencies/zlib-1.2.11/nintendods/README b/src/dependencies/zlib-1.2.13/nintendods/README similarity index 100% rename from src/dependencies/zlib-1.2.11/nintendods/README rename to src/dependencies/zlib-1.2.13/nintendods/README diff --git a/src/dependencies/zlib-1.2.11/old/Makefile.emx b/src/dependencies/zlib-1.2.13/old/Makefile.emx similarity index 100% rename from src/dependencies/zlib-1.2.11/old/Makefile.emx rename to src/dependencies/zlib-1.2.13/old/Makefile.emx diff --git a/src/dependencies/zlib-1.2.11/old/Makefile.riscos b/src/dependencies/zlib-1.2.13/old/Makefile.riscos similarity index 100% rename from src/dependencies/zlib-1.2.11/old/Makefile.riscos rename to src/dependencies/zlib-1.2.13/old/Makefile.riscos diff --git a/src/dependencies/zlib-1.2.11/old/README b/src/dependencies/zlib-1.2.13/old/README similarity index 100% rename from src/dependencies/zlib-1.2.11/old/README rename to src/dependencies/zlib-1.2.13/old/README diff --git a/src/dependencies/zlib-1.2.11/old/descrip.mms b/src/dependencies/zlib-1.2.13/old/descrip.mms similarity index 100% rename from src/dependencies/zlib-1.2.11/old/descrip.mms rename to src/dependencies/zlib-1.2.13/old/descrip.mms diff --git a/src/dependencies/zlib-1.2.11/old/os2/Makefile.os2 b/src/dependencies/zlib-1.2.13/old/os2/Makefile.os2 similarity index 100% rename from src/dependencies/zlib-1.2.11/old/os2/Makefile.os2 rename to src/dependencies/zlib-1.2.13/old/os2/Makefile.os2 diff --git a/src/dependencies/zlib-1.2.11/old/os2/zlib.def b/src/dependencies/zlib-1.2.13/old/os2/zlib.def similarity index 100% rename from src/dependencies/zlib-1.2.11/old/os2/zlib.def rename to src/dependencies/zlib-1.2.13/old/os2/zlib.def diff --git a/src/dependencies/zlib-1.2.11/old/visual-basic.txt b/src/dependencies/zlib-1.2.13/old/visual-basic.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/old/visual-basic.txt rename to src/dependencies/zlib-1.2.13/old/visual-basic.txt diff --git a/src/dependencies/zlib-1.2.11/os400/README400 b/src/dependencies/zlib-1.2.13/os400/README400 similarity index 92% rename from src/dependencies/zlib-1.2.11/os400/README400 rename to src/dependencies/zlib-1.2.13/os400/README400 index 4f98334..c06fa84 100644 --- a/src/dependencies/zlib-1.2.11/os400/README400 +++ b/src/dependencies/zlib-1.2.13/os400/README400 @@ -1,9 +1,9 @@ - ZLIB version 1.2.11 for OS/400 installation instructions + ZLIB version 1.2.13 for OS/400 installation instructions 1) Download and unpack the zlib tarball to some IFS directory. (i.e.: /path/to/the/zlib/ifs/source/directory) - If the installed IFS command suppors gzip format, this is straightforward, + If the installed IFS command supports gzip format, this is straightforward, else you have to unpack first to some directory on a system supporting it, then move the whole directory to the IFS via the network (via SMB or FTP). @@ -43,6 +43,6 @@ Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB Remember that most foreign textual data are ASCII coded: this implementation does not handle conversion from/to ASCII, so - text data code conversions must be done explicitely. + text data code conversions must be done explicitly. Mainly for the reason above, always open zipped files in binary mode. diff --git a/src/dependencies/zlib-1.2.11/os400/bndsrc b/src/dependencies/zlib-1.2.13/os400/bndsrc similarity index 92% rename from src/dependencies/zlib-1.2.11/os400/bndsrc rename to src/dependencies/zlib-1.2.13/os400/bndsrc index 5e6e0a2..9f92bb1 100644 --- a/src/dependencies/zlib-1.2.11/os400/bndsrc +++ b/src/dependencies/zlib-1.2.13/os400/bndsrc @@ -116,4 +116,12 @@ STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') EXPORT SYMBOL("inflateValidate") EXPORT SYMBOL("uncompress2") +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.12 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("crc32_combine_gen64") + EXPORT SYMBOL("crc32_combine_gen") + EXPORT SYMBOL("crc32_combine_op") + ENDPGMEXP diff --git a/src/dependencies/zlib-1.2.11/os400/make.sh b/src/dependencies/zlib-1.2.13/os400/make.sh similarity index 100% rename from src/dependencies/zlib-1.2.11/os400/make.sh rename to src/dependencies/zlib-1.2.13/os400/make.sh diff --git a/src/dependencies/zlib-1.2.11/os400/zlib.inc b/src/dependencies/zlib-1.2.13/os400/zlib.inc similarity index 99% rename from src/dependencies/zlib-1.2.11/os400/zlib.inc rename to src/dependencies/zlib-1.2.13/os400/zlib.inc index c6aca2c..c273c86 100644 --- a/src/dependencies/zlib-1.2.11/os400/zlib.inc +++ b/src/dependencies/zlib-1.2.13/os400/zlib.inc @@ -1,7 +1,7 @@ * ZLIB.INC - Interface to the general purpose compression library * * ILE RPG400 version by Patrick Monnerat, DATASPHERE. - * Version 1.2.11 + * Version 1.2.13 * * * WARNING: @@ -22,12 +22,12 @@ * * Versioning information. * - D ZLIB_VERSION C '1.2.11' + D ZLIB_VERSION C '1.2.13' D ZLIB_VERNUM C X'12a0' D ZLIB_VER_MAJOR C 1 D ZLIB_VER_MINOR C 2 D ZLIB_VER_REVISION... - D C 11 + D C 13 D ZLIB_VER_SUBREVISION... D C 0 * diff --git a/src/dependencies/zlib-1.2.11/qnx/package.qpg b/src/dependencies/zlib-1.2.13/qnx/package.qpg similarity index 95% rename from src/dependencies/zlib-1.2.11/qnx/package.qpg rename to src/dependencies/zlib-1.2.13/qnx/package.qpg index 31e8e90..ba2f1a2 100644 --- a/src/dependencies/zlib-1.2.11/qnx/package.qpg +++ b/src/dependencies/zlib-1.2.13/qnx/package.qpg @@ -25,10 +25,10 @@ - - - - + + + + @@ -63,7 +63,7 @@ - 1.2.11 + 1.2.13 Medium Stable diff --git a/src/dependencies/zlib-1.2.11/test/example.c b/src/dependencies/zlib-1.2.13/test/example.c similarity index 98% rename from src/dependencies/zlib-1.2.11/test/example.c rename to src/dependencies/zlib-1.2.13/test/example.c index eee17ce..1470bc8 100644 --- a/src/dependencies/zlib-1.2.11/test/example.c +++ b/src/dependencies/zlib-1.2.13/test/example.c @@ -440,9 +440,8 @@ void test_sync(compr, comprLen, uncompr, uncomprLen) CHECK_ERR(err, "inflateSync"); err = inflate(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ + if (err != Z_STREAM_END) { + fprintf(stderr, "inflate should report Z_STREAM_END\n"); exit(1); } err = inflateEnd(&d_stream); @@ -556,7 +555,8 @@ int main(argc, argv) exit(1); } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { - fprintf(stderr, "warning: different zlib version\n"); + fprintf(stderr, "warning: different zlib version linked: %s\n", + zlibVersion()); } printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", diff --git a/src/dependencies/zlib-1.2.11/test/infcover.c b/src/dependencies/zlib-1.2.13/test/infcover.c similarity index 100% rename from src/dependencies/zlib-1.2.11/test/infcover.c rename to src/dependencies/zlib-1.2.13/test/infcover.c diff --git a/src/dependencies/zlib-1.2.11/test/minigzip.c b/src/dependencies/zlib-1.2.13/test/minigzip.c similarity index 99% rename from src/dependencies/zlib-1.2.11/test/minigzip.c rename to src/dependencies/zlib-1.2.13/test/minigzip.c index e22fb08..a649d2b 100644 --- a/src/dependencies/zlib-1.2.11/test/minigzip.c +++ b/src/dependencies/zlib-1.2.13/test/minigzip.c @@ -500,7 +500,7 @@ void file_uncompress(file) char *infile, *outfile; FILE *out; gzFile in; - unsigned len = strlen(file); + z_size_t len = strlen(file); if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { fprintf(stderr, "%s: filename too long\n", prog); diff --git a/src/dependencies/zlib-1.2.11/treebuild.xml b/src/dependencies/zlib-1.2.13/treebuild.xml similarity index 96% rename from src/dependencies/zlib-1.2.11/treebuild.xml rename to src/dependencies/zlib-1.2.13/treebuild.xml index fd75525..0017a45 100644 --- a/src/dependencies/zlib-1.2.11/treebuild.xml +++ b/src/dependencies/zlib-1.2.13/treebuild.xml @@ -1,6 +1,6 @@ - - + + zip compression library diff --git a/src/dependencies/zlib-1.2.11/trees.c b/src/dependencies/zlib-1.2.13/trees.c similarity index 88% rename from src/dependencies/zlib-1.2.11/trees.c rename to src/dependencies/zlib-1.2.13/trees.c index 50cf4b4..5f305c4 100644 --- a/src/dependencies/zlib-1.2.11/trees.c +++ b/src/dependencies/zlib-1.2.13/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2017 Jean-loup Gailly + * Copyright (C) 1995-2021 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -149,7 +149,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, local void compress_block OF((deflate_state *s, const ct_data *ltree, const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); +local unsigned bi_reverse OF((unsigned code, int len)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -193,7 +193,7 @@ local void send_bits(s, value, length) s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { @@ -256,7 +256,7 @@ local void tr_static_init() length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { _dist_code[256 + dist++] = (uch)code; } } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); + Assert (dist == 256, "tr_static_init: 256 + dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; @@ -312,7 +312,7 @@ local void tr_static_init() } /* =========================================================================== - * Genererate the file trees.h describing the static trees. + * Generate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef ZLIB_DEBUG @@ -321,7 +321,7 @@ local void tr_static_init() # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) + ((i) % (width) == (width) - 1 ? ",\n" : ", ")) void gen_trees_header() { @@ -416,7 +416,7 @@ local void init_block(s) s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; + s->sym_next = s->matches = 0; } #define SMALLEST 1 @@ -458,7 +458,7 @@ local void pqdownheap(s, tree, k) while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ @@ -507,7 +507,7 @@ local void gen_bitlen(s, desc) */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; @@ -518,7 +518,7 @@ local void gen_bitlen(s, desc) s->bl_count[bits]++; xbits = 0; - if (n >= base) xbits = extra[n-base]; + if (n >= base) xbits = extra[n - base]; f = tree[n].Freq; s->opt_len += (ulg)f * (unsigned)(bits + xbits); if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); @@ -530,10 +530,10 @@ local void gen_bitlen(s, desc) /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -569,7 +569,7 @@ local void gen_bitlen(s, desc) * OUT assertion: the field code is set for all tree elements of non * zero code length. */ -local void gen_codes (tree, max_code, bl_count) +local void gen_codes(tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ @@ -583,13 +583,13 @@ local void gen_codes (tree, max_code, bl_count) * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits-1]) << 1; + code = (code + bl_count[bits - 1]) << 1; next_code[bits] = (ush)code; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ - Assert (code + bl_count[MAX_BITS]-1 == (1<heap_len = 0, s->heap_max = HEAP_SIZE; @@ -652,7 +652,7 @@ local void build_tree(s, desc) } desc->max_code = max_code; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); @@ -700,7 +700,7 @@ local void build_tree(s, desc) * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ -local void scan_tree (s, tree, max_code) +local void scan_tree(s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ @@ -714,10 +714,10 @@ local void scan_tree (s, tree, max_code) int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ + tree[max_code + 1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -745,7 +745,7 @@ local void scan_tree (s, tree, max_code) * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -local void send_tree (s, tree, max_code) +local void send_tree(s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ @@ -758,11 +758,11 @@ local void send_tree (s, tree, max_code) int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ - /* tree[max_code+1].Len = -1; */ /* guard already set */ + /* tree[max_code + 1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -773,13 +773,13 @@ local void send_tree (s, tree, max_code) send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2); } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3); } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { @@ -807,8 +807,8 @@ local int build_bl_tree(s) /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + /* opt_len now includes the length of the tree representations, except the + * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format @@ -819,7 +819,7 @@ local int build_bl_tree(s) if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -841,19 +841,19 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } @@ -866,17 +866,18 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); - zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + if (stored_len) + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); s->pending += stored_len; #ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; s->bits_sent += 2*16; - s->bits_sent += stored_len<<3; + s->bits_sent += stored_len << 3; #endif } @@ -942,14 +943,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; + opt_lenb = (s->opt_len + 3 + 7) >> 3; + static_lenb = (s->static_len + 3 + 7) >> 3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); + s->sym_next / 3)); - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +#ifndef FORCE_STATIC + if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) +#endif + opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); @@ -959,7 +963,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { + if (stored_len + 4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. @@ -970,21 +974,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) */ _tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); + } else if (static_lenb == opt_lenb) { + send_bits(s, (STATIC_TREES<<1) + last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); + send_bits(s, (DYN_TREES<<1) + last, 3); + send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1, + max_blindex + 1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef ZLIB_DEBUG @@ -1003,21 +1003,22 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) s->compressed_len += 7; /* align on byte boundary */ #endif } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3, + s->compressed_len - 7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) +int ZLIB_INTERNAL _tr_tally(s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */ { - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; + s->sym_buf[s->sym_next++] = (uch)dist; + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); + s->sym_buf[s->sym_next++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1029,33 +1030,10 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ + return (s->sym_next == s->sym_end); } /* =========================================================================== @@ -1068,20 +1046,21 @@ local void compress_block(s, ltree, dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ + unsigned sx = 0; /* running index in sym_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; + if (s->sym_next != 0) do { + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ + send_code(s, code + LITERALS + 1, ltree); /* send length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; @@ -1099,11 +1078,10 @@ local void compress_block(s, ltree, dtree) } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); + /* Check that the overlay between pending_buf and sym_buf is ok: */ + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - } while (lx < s->last_lit); + } while (sx < s->sym_next); send_code(s, END_BLOCK, ltree); } @@ -1112,9 +1090,9 @@ local void compress_block(s, ltree, dtree) * Check if the data type is TEXT or BINARY, using the following algorithm: * - TEXT if the two conditions below are satisfied: * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). + * "block list" (0..6, 14..25, 28..31). * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). * - BINARY otherwise. * - The following partially-portable control characters form a * "gray list" that is ignored in this detection algorithm: @@ -1124,19 +1102,19 @@ local void compress_block(s, ltree, dtree) local int detect_data_type(s) deflate_state *s; { - /* black_mask is the bit mask of black-listed bytes + /* block_mask is the bit mask of block-listed bytes * set bits 0..6, 14..25, and 28..31 * 0xf3ffc07f = binary 11110011111111111100000001111111 */ - unsigned long black_mask = 0xf3ffc07fUL; + unsigned long block_mask = 0xf3ffc07fUL; int n; - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) return Z_BINARY; - /* Check for textual ("white-listed") bytes. */ + /* Check for textual ("allow-listed") bytes. */ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 || s->dyn_ltree[13].Freq != 0) return Z_TEXT; @@ -1144,7 +1122,7 @@ local int detect_data_type(s) if (s->dyn_ltree[n].Freq != 0) return Z_TEXT; - /* There are no "black-listed" or "white-listed" bytes: + /* There are no "block-listed" or "allow-listed" bytes: * this stream either is empty or has tolerated ("gray-listed") bytes only. */ return Z_BINARY; @@ -1198,6 +1176,6 @@ local void bi_windup(s) s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; + s->bits_sent = (s->bits_sent + 7) & ~7; #endif } diff --git a/src/dependencies/zlib-1.2.11/trees.h b/src/dependencies/zlib-1.2.13/trees.h similarity index 100% rename from src/dependencies/zlib-1.2.11/trees.h rename to src/dependencies/zlib-1.2.13/trees.h diff --git a/src/dependencies/zlib-1.2.11/uncompr.c b/src/dependencies/zlib-1.2.13/uncompr.c similarity index 96% rename from src/dependencies/zlib-1.2.11/uncompr.c rename to src/dependencies/zlib-1.2.13/uncompr.c index f03a1a8..f9532f4 100644 --- a/src/dependencies/zlib-1.2.11/uncompr.c +++ b/src/dependencies/zlib-1.2.13/uncompr.c @@ -24,7 +24,7 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) +int ZEXPORT uncompress2(dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; @@ -83,7 +83,7 @@ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) err; } -int ZEXPORT uncompress (dest, destLen, source, sourceLen) +int ZEXPORT uncompress(dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; diff --git a/src/dependencies/zlib-1.2.11/watcom/watcom_f.mak b/src/dependencies/zlib-1.2.13/watcom/watcom_f.mak similarity index 100% rename from src/dependencies/zlib-1.2.11/watcom/watcom_f.mak rename to src/dependencies/zlib-1.2.13/watcom/watcom_f.mak diff --git a/src/dependencies/zlib-1.2.11/watcom/watcom_l.mak b/src/dependencies/zlib-1.2.13/watcom/watcom_l.mak similarity index 100% rename from src/dependencies/zlib-1.2.11/watcom/watcom_l.mak rename to src/dependencies/zlib-1.2.13/watcom/watcom_l.mak diff --git a/src/dependencies/zlib-1.2.11/win32/DLL_FAQ.txt b/src/dependencies/zlib-1.2.13/win32/DLL_FAQ.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/win32/DLL_FAQ.txt rename to src/dependencies/zlib-1.2.13/win32/DLL_FAQ.txt diff --git a/src/dependencies/zlib-1.2.11/win32/Makefile.bor b/src/dependencies/zlib-1.2.13/win32/Makefile.bor similarity index 96% rename from src/dependencies/zlib-1.2.11/win32/Makefile.bor rename to src/dependencies/zlib-1.2.13/win32/Makefile.bor index d152bbb..4495353 100644 --- a/src/dependencies/zlib-1.2.11/win32/Makefile.bor +++ b/src/dependencies/zlib-1.2.13/win32/Makefile.bor @@ -3,7 +3,6 @@ # # Usage: # make -f win32/Makefile.bor -# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj # ------------ Borland C++ ------------ diff --git a/src/dependencies/zlib-1.2.11/win32/Makefile.gcc b/src/dependencies/zlib-1.2.13/win32/Makefile.gcc similarity index 97% rename from src/dependencies/zlib-1.2.11/win32/Makefile.gcc rename to src/dependencies/zlib-1.2.13/win32/Makefile.gcc index 305be50..081e391 100644 --- a/src/dependencies/zlib-1.2.11/win32/Makefile.gcc +++ b/src/dependencies/zlib-1.2.13/win32/Makefile.gcc @@ -11,10 +11,6 @@ # # make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc # -# To use the asm code, type: -# cp contrib/asm?86/match.S ./match.S -# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc -# # To install libz.a, zconf.h and zlib.h in the system directories, type: # # make install -fwin32/Makefile.gcc @@ -38,7 +34,6 @@ IMPLIB = libz.dll.a # SHARED_MODE=0 -#LOC = -DASMV #LOC = -DZLIB_DEBUG -g PREFIX = diff --git a/src/dependencies/zlib-1.2.11/win32/Makefile.msc b/src/dependencies/zlib-1.2.13/win32/Makefile.msc similarity index 94% rename from src/dependencies/zlib-1.2.11/win32/Makefile.msc rename to src/dependencies/zlib-1.2.13/win32/Makefile.msc index 6831882..9c65153 100644 --- a/src/dependencies/zlib-1.2.11/win32/Makefile.msc +++ b/src/dependencies/zlib-1.2.13/win32/Makefile.msc @@ -4,10 +4,6 @@ # Usage: # nmake -f win32/Makefile.msc (standard build) # nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) -# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ -# OBJA="inffas32.obj match686.obj" (use ASM code, x86) -# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ -# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64) # The toplevel directory of the source tree. # diff --git a/src/dependencies/zlib-1.2.11/win32/README-WIN32.txt b/src/dependencies/zlib-1.2.13/win32/README-WIN32.txt similarity index 97% rename from src/dependencies/zlib-1.2.11/win32/README-WIN32.txt rename to src/dependencies/zlib-1.2.13/win32/README-WIN32.txt index df7ab7f..050197d 100644 --- a/src/dependencies/zlib-1.2.11/win32/README-WIN32.txt +++ b/src/dependencies/zlib-1.2.13/win32/README-WIN32.txt @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.11 is a general purpose data compression library. All the code is +zlib 1.2.13 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) @@ -22,7 +22,7 @@ before asking for help. Manifest: -The package zlib-1.2.11-win32-x86.zip will contain the following files: +The package zlib-1.2.13-win32-x86.zip will contain the following files: README-WIN32.txt This document ChangeLog Changes since previous zlib packages diff --git a/src/dependencies/zlib-1.2.11/win32/VisualC.txt b/src/dependencies/zlib-1.2.13/win32/VisualC.txt similarity index 100% rename from src/dependencies/zlib-1.2.11/win32/VisualC.txt rename to src/dependencies/zlib-1.2.13/win32/VisualC.txt diff --git a/src/dependencies/zlib-1.2.11/win32/zlib.def b/src/dependencies/zlib-1.2.13/win32/zlib.def similarity index 90% rename from src/dependencies/zlib-1.2.11/win32/zlib.def rename to src/dependencies/zlib-1.2.13/win32/zlib.def index 784b138..53c8011 100644 --- a/src/dependencies/zlib-1.2.11/win32/zlib.def +++ b/src/dependencies/zlib-1.2.13/win32/zlib.def @@ -69,6 +69,7 @@ EXPORTS gzoffset64 adler32_combine64 crc32_combine64 + crc32_combine_gen64 ; checksum functions adler32 adler32_z @@ -76,6 +77,8 @@ EXPORTS crc32_z adler32_combine crc32_combine + crc32_combine_gen + crc32_combine_op ; various hacks, don't look :) deflateInit_ deflateInit2_ diff --git a/src/dependencies/zlib-1.2.11/win32/zlib1.rc b/src/dependencies/zlib-1.2.13/win32/zlib1.rc similarity index 94% rename from src/dependencies/zlib-1.2.11/win32/zlib1.rc rename to src/dependencies/zlib-1.2.13/win32/zlib1.rc index 234e641..ceb4ee5 100644 --- a/src/dependencies/zlib-1.2.11/win32/zlib1.rc +++ b/src/dependencies/zlib-1.2.13/win32/zlib1.rc @@ -26,7 +26,7 @@ BEGIN VALUE "FileDescription", "zlib data compression library\0" VALUE "FileVersion", ZLIB_VERSION "\0" VALUE "InternalName", "zlib1.dll\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" VALUE "OriginalFilename", "zlib1.dll\0" VALUE "ProductName", "zlib\0" VALUE "ProductVersion", ZLIB_VERSION "\0" diff --git a/src/dependencies/zlib-1.2.11/zconf.h.included b/src/dependencies/zlib-1.2.13/zconf.h similarity index 97% rename from src/dependencies/zlib-1.2.11/zconf.h.included rename to src/dependencies/zlib-1.2.13/zconf.h index 5e1d68a..bf977d3 100644 --- a/src/dependencies/zlib-1.2.11/zconf.h.included +++ b/src/dependencies/zlib-1.2.13/zconf.h @@ -38,6 +38,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -349,6 +352,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -467,11 +473,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ diff --git a/src/dependencies/zlib-1.2.11/zconf.h.cmakein b/src/dependencies/zlib-1.2.13/zconf.h.cmakein similarity index 97% rename from src/dependencies/zlib-1.2.11/zconf.h.cmakein rename to src/dependencies/zlib-1.2.13/zconf.h.cmakein index a7f24cc..247ba24 100644 --- a/src/dependencies/zlib-1.2.11/zconf.h.cmakein +++ b/src/dependencies/zlib-1.2.13/zconf.h.cmakein @@ -40,6 +40,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -351,6 +354,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -469,11 +475,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ diff --git a/src/dependencies/zlib-1.2.11/zconf.h.in b/src/dependencies/zlib-1.2.13/zconf.h.in similarity index 97% rename from src/dependencies/zlib-1.2.11/zconf.h.in rename to src/dependencies/zlib-1.2.13/zconf.h.in index 5e1d68a..bf977d3 100644 --- a/src/dependencies/zlib-1.2.11/zconf.h.in +++ b/src/dependencies/zlib-1.2.13/zconf.h.in @@ -38,6 +38,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -349,6 +352,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -467,11 +473,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ diff --git a/src/dependencies/zlib-1.2.11/zlib.3 b/src/dependencies/zlib-1.2.13/zlib.3 similarity index 97% rename from src/dependencies/zlib-1.2.11/zlib.3 rename to src/dependencies/zlib-1.2.13/zlib.3 index bda4eb0..6f6e914 100644 --- a/src/dependencies/zlib-1.2.11/zlib.3 +++ b/src/dependencies/zlib-1.2.13/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "15 Jan 2017" +.TH ZLIB 3 "13 Oct 2022" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,9 +105,9 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.2.11 +Version 1.2.13 .LP -Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler .LP This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/src/dependencies/zlib-1.2.13/zlib.3.pdf b/src/dependencies/zlib-1.2.13/zlib.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8132d840c861ea6823b8ec0b41ee5050ea56ff15 GIT binary patch literal 19366 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 Zj2jY$Kwc>oL`aYy3cQd@PF)`F{{hl>t`h(N literal 0 HcmV?d00001 diff --git a/src/dependencies/zlib-1.2.11/zlib.h b/src/dependencies/zlib-1.2.13/zlib.h similarity index 91% rename from src/dependencies/zlib-1.2.11/zlib.h rename to src/dependencies/zlib-1.2.13/zlib.h index f09cdaf..953cb50 100644 --- a/src/dependencies/zlib-1.2.11/zlib.h +++ b/src/dependencies/zlib-1.2.13/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.2.13, October 13th, 2022 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.2.13" +#define ZLIB_VERNUM 0x12d0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_REVISION 13 #define ZLIB_VER_SUBREVISION 0 /* @@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -543,8 +543,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int strategy)); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -661,7 +660,7 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -712,11 +711,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -865,9 +865,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -913,7 +915,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. @@ -1302,14 +1304,14 @@ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since @@ -1339,9 +1341,9 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1362,13 +1364,13 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1378,9 +1380,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, @@ -1389,7 +1391,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1420,11 +1422,11 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, gzFile file)); /* - 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 - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1435,26 +1437,24 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior is the same as the behavior of fread() implementations in common libraries, but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + file, resetting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written or 0 in case of error. */ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, z_size_t nitems, gzFile file)); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1467,22 +1467,22 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() + zlib was compiled with the insecure functions sprintf() or vsprintf(), because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. @@ -1490,11 +1490,12 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at @@ -1503,13 +1504,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 + Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file @@ -1518,8 +1519,8 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the @@ -1530,9 +1531,9 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1547,8 +1548,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. @@ -1565,18 +1566,18 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ @@ -1584,22 +1585,22 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file @@ -1608,7 +1609,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1629,8 +1630,8 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1654,10 +1655,10 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + errnum is set to zlib error number. If an error occurred in the file system + and not in the compression library, errnum is set to Z_ERRNO and the + application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1670,7 +1671,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1688,8 +1689,9 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1722,12 +1724,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,7 +1742,7 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, +ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)); /* Same as crc32(), but with a size_t length. @@ -1755,6 +1758,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); len2. */ +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. +*/ + /* various hacks, don't look :) */ @@ -1842,6 +1859,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t)); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1852,6 +1870,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # define gzopen gzopen64 # define gzseek gzseek64 @@ -1859,6 +1878,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); @@ -1867,6 +1887,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); # endif #else ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); @@ -1875,12 +1896,14 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); #endif #else /* Z_SOLO */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); #endif /* !Z_SOLO */ @@ -1890,10 +1913,10 @@ 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)); ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +#if defined(_WIN32) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif diff --git a/src/dependencies/zlib-1.2.11/zlib.map b/src/dependencies/zlib-1.2.13/zlib.map similarity index 87% rename from src/dependencies/zlib-1.2.11/zlib.map rename to src/dependencies/zlib-1.2.13/zlib.map index 40fa9db..b330b60 100644 --- a/src/dependencies/zlib-1.2.11/zlib.map +++ b/src/dependencies/zlib-1.2.13/zlib.map @@ -92,3 +92,9 @@ ZLIB_1.2.9 { adler32_z; crc32_z; } ZLIB_1.2.7.1; + +ZLIB_1.2.12 { + crc32_combine_gen; + crc32_combine_gen64; + crc32_combine_op; +} ZLIB_1.2.9; diff --git a/src/dependencies/zlib-1.2.11/zlib.pc.cmakein b/src/dependencies/zlib-1.2.13/zlib.pc.cmakein similarity index 100% rename from src/dependencies/zlib-1.2.11/zlib.pc.cmakein rename to src/dependencies/zlib-1.2.13/zlib.pc.cmakein diff --git a/src/dependencies/zlib-1.2.11/zlib.pc.in b/src/dependencies/zlib-1.2.13/zlib.pc.in similarity index 100% rename from src/dependencies/zlib-1.2.11/zlib.pc.in rename to src/dependencies/zlib-1.2.13/zlib.pc.in diff --git a/src/dependencies/zlib-1.2.11/zlib2ansi b/src/dependencies/zlib-1.2.13/zlib2ansi old mode 100644 new mode 100755 similarity index 97% rename from src/dependencies/zlib-1.2.11/zlib2ansi rename to src/dependencies/zlib-1.2.13/zlib2ansi index 15e3e16..23b2a1d --- a/src/dependencies/zlib-1.2.11/zlib2ansi +++ b/src/dependencies/zlib-1.2.13/zlib2ansi @@ -8,7 +8,7 @@ # TODO # -# Asumes no function pointer parameters. unless they are typedefed. +# Assumes no function pointer parameters. unless they are typedefed. # Assumes no literal strings that look like function definitions # Assumes functions start at the beginning of a line @@ -104,7 +104,7 @@ sub StripComments no warnings; - # Strip C & C++ coments + # Strip C & C++ comments # From the perlfaq $_[0] =~ diff --git a/src/dependencies/zlib-1.2.11/zutil.c b/src/dependencies/zlib-1.2.13/zutil.c similarity index 93% rename from src/dependencies/zlib-1.2.11/zutil.c rename to src/dependencies/zlib-1.2.13/zutil.c index a76c6b0..9543ae8 100644 --- a/src/dependencies/zlib-1.2.11/zutil.c +++ b/src/dependencies/zlib-1.2.13/zutil.c @@ -61,9 +61,11 @@ uLong ZEXPORT zlibCompileFlags() #ifdef ZLIB_DEBUG flags += 1 << 8; #endif + /* #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif + */ #ifdef ZLIB_WINAPI flags += 1 << 10; #endif @@ -119,7 +121,7 @@ uLong ZEXPORT zlibCompileFlags() # endif int ZLIB_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error (m) +void ZLIB_INTERNAL z_error(m) char *m; { fprintf(stderr, "%s\n", m); @@ -136,8 +138,8 @@ const char * ZEXPORT zError(err) return ERR_MSG(err); } -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ @@ -214,7 +216,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -240,7 +242,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; @@ -277,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); @@ -302,7 +304,7 @@ extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) +voidpf ZLIB_INTERNAL zcalloc(opaque, items, size) voidpf opaque; unsigned items; unsigned size; @@ -312,7 +314,7 @@ voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) (voidpf)calloc(items, size); } -void ZLIB_INTERNAL zcfree (opaque, ptr) +void ZLIB_INTERNAL zcfree(opaque, ptr) voidpf opaque; voidpf ptr; { diff --git a/src/dependencies/zlib-1.2.11/zutil.h b/src/dependencies/zlib-1.2.13/zutil.h similarity index 94% rename from src/dependencies/zlib-1.2.11/zutil.h rename to src/dependencies/zlib-1.2.13/zutil.h index b079ea6..0bc7f4e 100644 --- a/src/dependencies/zlib-1.2.11/zutil.h +++ b/src/dependencies/zlib-1.2.13/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -29,10 +29,6 @@ # include #endif -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - #ifndef local # define local static #endif @@ -46,6 +42,17 @@ typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; +#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC) +# include +# if (ULONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long +# elif (ULLONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long long +# elif (UINT_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned +# endif +#endif + extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ @@ -170,10 +177,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif @@ -190,6 +193,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); #endif /* common defaults */ diff --git a/src/dependencies/zstd-1.5.0/.github/workflows/generic-dev.yml b/src/dependencies/zstd-1.5.0/.github/workflows/generic-dev.yml deleted file mode 100644 index ae4ee7e..0000000 --- a/src/dependencies/zstd-1.5.0/.github/workflows/generic-dev.yml +++ /dev/null @@ -1,225 +0,0 @@ -name: generic-dev - -on: - pull_request: - branches: [ dev, release, actionsTest ] - -jobs: - -# Dev PR jobs that still have to be migrated from travis -# -# versionTag (only on release tags) -# valgrindTest (keeps failing for some reason. need investigation) -# staticAnalyze (need trusty so need self-hosted) -# pcc-fuzz: (need trusty so need self-hosted) -# min-decomp-macros (flakey) -# -# setting up self-hosted is pretty straightforward, but -# I need admins permissions to the repo for that it looks like -# So I'm tabling that for now -# -# The release branch exclusive jobs will be in a separate -# workflow file (the osx tests and meson build that is) - - benchmarking: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: make benchmarking - run: make benchmarking - - test: - runs-on: ubuntu-latest - env: - DEVNULLRIGHTS: 1 - READFROMBLOCKDEVICE: 1 - steps: - - uses: actions/checkout@v2 - - name: make test - run: make test - - check-32bit: # designed to catch https://github.com/facebook/zstd/issues/2428 - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: make check on 32-bit - run: | - sudo apt update - APT_PACKAGES="gcc-multilib" make apt-install - CFLAGS="-m32 -O1 -fstack-protector" make check V=1 - - gcc-7-libzstd: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: gcc-7 + libzstdmt compilation - run: | - make gcc7install - CC=gcc-7 CFLAGS=-Werror make -j all - make clean - LDFLAGS=-Wl,--no-undefined make -C lib libzstd-mt - - # candidate test (to check) : underlink test - # LDFLAGS=-Wl,--no-undefined : will make the linker fail if dll is underlinked - - gcc-8-asan-ubsan-testzstd: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: gcc-8 + ASan + UBSan + Test Zstd - run: | - make gcc8install - CC=gcc-8 CFLAGS="-Werror" make -j all - make clean - CC=gcc-8 make -j uasan-test-zstd zstd-src.tar.zst.sha256.sig && - appveyor PushArtifact zstd-src.tar.zst.sha256.sig && - cd ..\..\bin\ && - 7z a -tzip -mx9 zstd-win-release-%PLATFORM%.zip * && - appveyor PushArtifact zstd-win-release-%PLATFORM%.zip - ) - ) - - if [%HOST%]==[visual] ( - ECHO *** && - ECHO *** Building Visual Studio 2008 %PLATFORM%\%CONFIGURATION% in %APPVEYOR_BUILD_FOLDER% && - ECHO *** && - msbuild "build\VS2008\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v90 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2008\bin\%PLATFORM%\%CONFIGURATION%\*.exe && - MD5sum build/VS2008/bin/%PLATFORM%/%CONFIGURATION%/*.exe && - COPY build\VS2008\bin\%PLATFORM%\%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2008_%PLATFORM%_%CONFIGURATION%.exe && - ECHO *** && - ECHO *** Building Visual Studio 2010 %PLATFORM%\%CONFIGURATION% && - ECHO *** && - msbuild "build\VS2010\zstd.sln" %ADDITIONALPARAM% /m /verbosity:minimal /property:PlatformToolset=v100 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - msbuild "build\VS2010\zstd.sln" %ADDITIONALPARAM% /m /verbosity:minimal /property:PlatformToolset=v100 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2010_%PLATFORM%_%CONFIGURATION%.exe && - ECHO *** && - ECHO *** Building Visual Studio 2012 %PLATFORM%\%CONFIGURATION% && - ECHO *** && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2012_%PLATFORM%_%CONFIGURATION%.exe && - ECHO *** && - ECHO *** Building Visual Studio 2013 %PLATFORM%\%CONFIGURATION% && - ECHO *** && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v120 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v120 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2013_%PLATFORM%_%CONFIGURATION%.exe && - ECHO *** && - ECHO *** Building Visual Studio 2015 %PLATFORM%\%CONFIGURATION% && - ECHO *** && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2015_%PLATFORM%_%CONFIGURATION%.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe tests\ - ) - - if [%HOST%]==[cmake-visual] ( - ECHO *** && - ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% && - PUSHD build\cmake && - cmake -DBUILD_TESTING=ON . && - cmake --build . --config %CONFIGURATION% -j4 && - POPD && - ECHO *** - ) - - test_script: - - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION% - - SET "CC=gcc" - - SET "CXX=g++" - - if [%TEST%]==[cmake] ( - mkdir build\cmake\build && - cd build\cmake\build && - SET FUZZERTEST=-T2mn && - SET ZSTREAM_TESTTIME=-T2mn && - cmake -G "Visual Studio 14 2015 Win64" .. && - cd ..\..\.. && - make clean - ) - - SET "FUZZERTEST=-T30s" - - if [%HOST%]==[visual] if [%CONFIGURATION%]==[Release] ( - CD tests && - SET ZSTD_BIN=./zstd.exe&& - SET DATAGEN_BIN=./datagen.exe&& - sh -e playTests.sh --test-large-data && - fullbench.exe -i1 && - fullbench.exe -i1 -P0 && - fuzzer_VS2012_%PLATFORM%_Release.exe %FUZZERTEST% && - fuzzer_VS2013_%PLATFORM%_Release.exe %FUZZERTEST% && - fuzzer_VS2015_%PLATFORM%_Release.exe %FUZZERTEST% - ) - - -# The following tests are for regular pushes -# into `dev` or some feature branch -# There run less tests, for shorter feedback loop - -- - version: 1.0.{build} - environment: - matrix: - - COMPILER: "gcc" - HOST: "cygwin" - PLATFORM: "x64" - - COMPILER: "gcc" - HOST: "mingw" - PLATFORM: "x64" - SCRIPT: "CFLAGS=-Werror make -j allzstd DEBUGLEVEL=2" - - COMPILER: "gcc" - HOST: "mingw" - PLATFORM: "x86" - SCRIPT: "CFLAGS=-Werror make -j allzstd" - - COMPILER: "clang" - HOST: "mingw" - PLATFORM: "x64" - SCRIPT: "CFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion' make -j allzstd V=1" - - - COMPILER: "visual" - HOST: "visual" - PLATFORM: "x64" - CONFIGURATION: "Debug" - - COMPILER: "visual" - HOST: "visual" - PLATFORM: "Win32" - CONFIGURATION: "Debug" - - COMPILER: "visual" - HOST: "visual" - PLATFORM: "x64" - CONFIGURATION: "Release" - - COMPILER: "visual" - HOST: "visual" - PLATFORM: "Win32" - CONFIGURATION: "Release" - - - COMPILER: "clang-cl" - HOST: "cmake-visual" - PLATFORM: "x64" - CONFIGURATION: "Release" - CMAKE_GENERATOR: "Visual Studio 15 2017" - CMAKE_GENERATOR_PLATFORM: "x64" - CMAKE_GENERATOR_TOOLSET: "LLVM" - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" - - install: - - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION% - - SET PATH_ORIGINAL=%PATH% - - if [%HOST%]==[cygwin] ( - ECHO Installing Cygwin Packages && - C:\cygwin64\setup-x86_64.exe -qnNdO -R "C:\cygwin64" -g -P ^ - gcc,^ - cmake,^ - make - ) - - if [%HOST%]==[mingw] ( - SET "PATH_MINGW32=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin" && - SET "PATH_MINGW64=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin" && - COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\make.exe && - COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin\make.exe - ) - - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] ( - SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;" - ) - - build_script: - - ECHO Building %COMPILER% %PLATFORM% %CONFIGURATION% - - if [%HOST%]==[cygwin] ( - set CHERE_INVOKING=yes && - set CC=%COMPILER% && - C:\cygwin64\bin\bash --login -c " - set -e; - cd build/cmake; - CFLAGS='-Werror' cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_FUZZER_FLAGS=-T20s -DZSTD_ZSTREAM_FLAGS=-T20s -DZSTD_FULLBENCH_FLAGS=-i0 .; - make VERBOSE=1 -j; - ctest -V -L Medium; - " - ) - - if [%HOST%]==[mingw] ( - ( if [%PLATFORM%]==[x64] ( - SET "PATH=%PATH_MINGW64%;%PATH_ORIGINAL%" - ) else if [%PLATFORM%]==[x86] ( - SET "PATH=%PATH_MINGW32%;%PATH_ORIGINAL%" - ) ) && - make -v && - sh -c "%COMPILER% -v" && - set "CC=%COMPILER%" && - sh -c "%SCRIPT%" - ) - - if [%HOST%]==[visual] ( - ECHO *** && - ECHO *** Building Visual Studio 2015 %PLATFORM%\%CONFIGURATION% && - ECHO *** && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && - DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && - MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2015_%PLATFORM%_%CONFIGURATION%.exe && - COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe tests\ - ) - - if [%HOST%]==[cmake-visual] ( - ECHO *** && - ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% && - PUSHD build\cmake && - cmake -DBUILD_TESTING=ON . && - cmake --build . --config %CONFIGURATION% -j4 && - POPD && - ECHO *** - ) - - - test_script: - - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION% - - if [%HOST%]==[mingw] ( - set "CC=%COMPILER%" && - make clean && - make check - ) diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_decoder.sh b/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_decoder.sh deleted file mode 100755 index b5f5613..0000000 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_decoder.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# Where to find the sources -ZSTD_SRC_ROOT="../../lib" - -# Amalgamate the sources -echo "Amalgamating files... this can take a while" -./combine.sh -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c -# Did combining work? -if [ $? -ne 0 ]; then - echo "Combine script: FAILED" - exit 1 -fi -echo "Combine script: PASSED" diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_library.sh b/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_library.sh deleted file mode 100755 index 6f38526..0000000 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/create_single_file_library.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# Where to find the sources -ZSTD_SRC_ROOT="../../lib" - -# Amalgamate the sources -echo "Amalgamating files... this can take a while" -./combine.sh -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c -# Did combining work? -if [ $? -ne 0 ]; then - echo "Combine script: FAILED" - exit 1 -fi -echo "Combine script: PASSED" diff --git a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/README.md b/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/README.md deleted file mode 100644 index f29bcdf..0000000 --- a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/README.md +++ /dev/null @@ -1,25 +0,0 @@ -largeNbDicts -===================== - -`largeNbDicts` is a benchmark test tool -dedicated to the specific scenario of -dictionary decompression using a very large number of dictionaries. -When dictionaries are constantly changing, they are always "cold", -suffering from increased latency due to cache misses. - -The tool is created in a bid to investigate performance for this scenario, -and experiment mitigation techniques. - -Command line : -``` -largeNbDicts [Options] filename(s) - -Options : --r : recursively load all files in subdirectories (default: off) --B# : split input into blocks of size # (default: no split) --# : use compression level # (default: 3) --D # : use # as a dictionary (default: create one) --i# : nb benchmark rounds (default: 6) ---nbDicts=# : set nb of dictionaries to # (default: one per block) --h : help (this text) -``` diff --git a/src/dependencies/zstd-1.5.0/doc/images/zstd_logo86.png b/src/dependencies/zstd-1.5.0/doc/images/zstd_logo86.png deleted file mode 100644 index 216f228061c460c4e4725785486ebcff38804fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5963 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 diff --git a/src/dependencies/zstd-1.5.0/lib/common/error_private.h b/src/dependencies/zstd-1.5.0/lib/common/error_private.h deleted file mode 100644 index 6d8b9f7..0000000 --- a/src/dependencies/zstd-1.5.0/lib/common/error_private.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) Yann Collet, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -/* Note : this module is expected to remain private, do not expose it */ - -#ifndef ERROR_H_MODULE -#define ERROR_H_MODULE - -#if defined (__cplusplus) -extern "C" { -#endif - - -/* **************************************** -* Dependencies -******************************************/ -#include "../zstd_errors.h" /* enum list */ -#include "zstd_deps.h" /* size_t */ - - -/* **************************************** -* Compiler-specific -******************************************/ -#if defined(__GNUC__) -# define ERR_STATIC static __attribute__((unused)) -#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# define ERR_STATIC static inline -#elif defined(_MSC_VER) -# define ERR_STATIC static __inline -#else -# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ -#endif - - -/*-**************************************** -* Customization (error_public.h) -******************************************/ -typedef ZSTD_ErrorCode ERR_enum; -#define PREFIX(name) ZSTD_error_##name - - -/*-**************************************** -* Error codes handling -******************************************/ -#undef ERROR /* already defined on Visual Studio */ -#define ERROR(name) ZSTD_ERROR(name) -#define ZSTD_ERROR(name) ((size_t)-PREFIX(name)) - -ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } - -ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } - -/* check and forward error code */ -#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e -#define CHECK_F(f) { CHECK_V_F(_var_err__, f); } - - -/*-**************************************** -* Error Strings -******************************************/ - -const char* ERR_getErrorString(ERR_enum code); /* error_private.c */ - -ERR_STATIC const char* ERR_getErrorName(size_t code) -{ - return ERR_getErrorString(ERR_getErrorCode(code)); -} - -#if defined (__cplusplus) -} -#endif - -#endif /* ERROR_H_MODULE */ diff --git a/src/dependencies/zstd-1.5.0/lib/common/huf.h b/src/dependencies/zstd-1.5.0/lib/common/huf.h deleted file mode 100644 index 3d47ced..0000000 --- a/src/dependencies/zstd-1.5.0/lib/common/huf.h +++ /dev/null @@ -1,362 +0,0 @@ -/* ****************************************************************** - * huff0 huffman codec, - * part of Finite State Entropy library - * Copyright (c) Yann Collet, Facebook, Inc. - * - * You can contact the author at : - * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. -****************************************************************** */ - -#if defined (__cplusplus) -extern "C" { -#endif - -#ifndef HUF_H_298734234 -#define HUF_H_298734234 - -/* *** Dependencies *** */ -#include "zstd_deps.h" /* size_t */ - - -/* *** library symbols visibility *** */ -/* Note : when linking with -fvisibility=hidden on gcc, or by default on Visual, - * HUF symbols remain "private" (internal symbols for library only). - * Set macro FSE_DLL_EXPORT to 1 if you want HUF symbols visible on DLL interface */ -#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4) -# define HUF_PUBLIC_API __attribute__ ((visibility ("default"))) -#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */ -# define HUF_PUBLIC_API __declspec(dllexport) -#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1) -# define HUF_PUBLIC_API __declspec(dllimport) /* not required, just to generate faster code (saves a function pointer load from IAT and an indirect jump) */ -#else -# define HUF_PUBLIC_API -#endif - - -/* ========================== */ -/* *** simple functions *** */ -/* ========================== */ - -/** HUF_compress() : - * Compress content from buffer 'src', of size 'srcSize', into buffer 'dst'. - * 'dst' buffer must be already allocated. - * Compression runs faster if `dstCapacity` >= HUF_compressBound(srcSize). - * `srcSize` must be <= `HUF_BLOCKSIZE_MAX` == 128 KB. - * @return : size of compressed data (<= `dstCapacity`). - * Special values : if return == 0, srcData is not compressible => Nothing is stored within dst !!! - * if HUF_isError(return), compression failed (more details using HUF_getErrorName()) - */ -HUF_PUBLIC_API size_t HUF_compress(void* dst, size_t dstCapacity, - const void* src, size_t srcSize); - -/** HUF_decompress() : - * Decompress HUF data from buffer 'cSrc', of size 'cSrcSize', - * into already allocated buffer 'dst', of minimum size 'dstSize'. - * `originalSize` : **must** be the ***exact*** size of original (uncompressed) data. - * Note : in contrast with FSE, HUF_decompress can regenerate - * RLE (cSrcSize==1) and uncompressed (cSrcSize==dstSize) data, - * because it knows size to regenerate (originalSize). - * @return : size of regenerated data (== originalSize), - * or an error code, which can be tested using HUF_isError() - */ -HUF_PUBLIC_API size_t HUF_decompress(void* dst, size_t originalSize, - const void* cSrc, size_t cSrcSize); - - -/* *** Tool functions *** */ -#define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */ -HUF_PUBLIC_API size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */ - -/* Error Management */ -HUF_PUBLIC_API unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */ -HUF_PUBLIC_API const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */ - - -/* *** Advanced function *** */ - -/** HUF_compress2() : - * Same as HUF_compress(), but offers control over `maxSymbolValue` and `tableLog`. - * `maxSymbolValue` must be <= HUF_SYMBOLVALUE_MAX . - * `tableLog` must be `<= HUF_TABLELOG_MAX` . */ -HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned tableLog); - -/** HUF_compress4X_wksp() : - * Same as HUF_compress2(), but uses externally allocated `workSpace`. - * `workspace` must have minimum alignment of 4, and be at least as large as HUF_WORKSPACE_SIZE */ -#define HUF_WORKSPACE_SIZE ((6 << 10) + 256) -#define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32)) -HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned tableLog, - void* workSpace, size_t wkspSize); - -#endif /* HUF_H_298734234 */ - -/* ****************************************************************** - * WARNING !! - * The following section contains advanced and experimental definitions - * which shall never be used in the context of a dynamic library, - * because they are not guaranteed to remain stable in the future. - * Only consider them in association with static linking. - * *****************************************************************/ -#if defined(HUF_STATIC_LINKING_ONLY) && !defined(HUF_H_HUF_STATIC_LINKING_ONLY) -#define HUF_H_HUF_STATIC_LINKING_ONLY - -/* *** Dependencies *** */ -#include "mem.h" /* U32 */ -#define FSE_STATIC_LINKING_ONLY -#include "fse.h" - - -/* *** Constants *** */ -#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */ -#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */ -#define HUF_SYMBOLVALUE_MAX 255 - -#define HUF_TABLELOG_ABSOLUTEMAX 15 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ -#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX) -# error "HUF_TABLELOG_MAX is too large !" -#endif - - -/* **************************************** -* Static allocation -******************************************/ -/* HUF buffer bounds */ -#define HUF_CTABLEBOUND 129 -#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true when incompressible is pre-filtered with fast heuristic */ -#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ - -/* static allocation of HUF's Compression Table */ -/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */ -struct HUF_CElt_s { - U16 val; - BYTE nbBits; -}; /* typedef'd to HUF_CElt */ -typedef struct HUF_CElt_s HUF_CElt; /* consider it an incomplete type */ -#define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1) /* Use tables of U32, for proper alignment */ -#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32)) -#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ - HUF_CElt name[HUF_CTABLE_SIZE_U32(maxSymbolValue)] /* no final ; */ - -/* static allocation of HUF's DTable */ -typedef U32 HUF_DTable; -#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog))) -#define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \ - HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) } -#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \ - HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) } - - -/* **************************************** -* Advanced decompression functions -******************************************/ -size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */ -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */ -#endif - -size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< decodes RLE and uncompressed */ -size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< considers RLE and uncompressed as errors */ -size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< considers RLE and uncompressed as errors */ -size_t HUF_decompress4X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */ -size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */ -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */ -size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */ -#endif - - -/* **************************************** - * HUF detailed API - * ****************************************/ - -/*! HUF_compress() does the following: - * 1. count symbol occurrence from source[] into table count[] using FSE_count() (exposed within "fse.h") - * 2. (optional) refine tableLog using HUF_optimalTableLog() - * 3. build Huffman table from count using HUF_buildCTable() - * 4. save Huffman table to memory buffer using HUF_writeCTable() - * 5. encode the data stream using HUF_compress4X_usingCTable() - * - * The following API allows targeting specific sub-functions for advanced tasks. - * For example, it's possible to compress several blocks using the same 'CTable', - * or to save and regenerate 'CTable' using external methods. - */ -unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue); -size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue, unsigned maxNbBits); /* @return : maxNbBits; CTable and count can overlap. In which case, CTable will overwrite count content */ -size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog); -size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize); -size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable); -size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); -int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); - -typedef enum { - HUF_repeat_none, /**< Cannot use the previous table */ - HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1, 4}X_repeat */ - HUF_repeat_valid /**< Can use the previous table and it is assumed to be valid */ - } HUF_repeat; -/** HUF_compress4X_repeat() : - * Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. - * If it uses hufTable it does not modify hufTable or repeat. - * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. - * If preferRepeat then the old table will always be used if valid. */ -size_t HUF_compress4X_repeat(void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned tableLog, - void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2); - -/** HUF_buildCTable_wksp() : - * Same as HUF_buildCTable(), but using externally allocated scratch buffer. - * `workSpace` must be aligned on 4-bytes boundaries, and its size must be >= HUF_CTABLE_WORKSPACE_SIZE. - */ -#define HUF_CTABLE_WORKSPACE_SIZE_U32 (2*HUF_SYMBOLVALUE_MAX +1 +1) -#define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned)) -size_t HUF_buildCTable_wksp (HUF_CElt* tree, - const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, - void* workSpace, size_t wkspSize); - -/*! HUF_readStats() : - * Read compact Huffman tree, saved by HUF_writeCTable(). - * `huffWeight` is destination buffer. - * @return : size read from `src` , or an error Code . - * Note : Needed by HUF_readCTable() and HUF_readDTableXn() . */ -size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, - U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, - const void* src, size_t srcSize); - -/*! HUF_readStats_wksp() : - * Same as HUF_readStats() but takes an external workspace which must be - * 4-byte aligned and its size must be >= HUF_READ_STATS_WORKSPACE_SIZE. - * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. - */ -#define HUF_READ_STATS_WORKSPACE_SIZE_U32 FSE_DECOMPRESS_WKSP_SIZE_U32(6, HUF_TABLELOG_MAX-1) -#define HUF_READ_STATS_WORKSPACE_SIZE (HUF_READ_STATS_WORKSPACE_SIZE_U32 * sizeof(unsigned)) -size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, - U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, - const void* src, size_t srcSize, - void* workspace, size_t wkspSize, - int bmi2); - -/** HUF_readCTable() : - * Loading a CTable saved with HUF_writeCTable() */ -size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights); - -/** HUF_getNbBits() : - * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX - * Note 1 : is not inlined, as HUF_CElt definition is private - * Note 2 : const void* used, so that it can provide a statically allocated table as argument (which uses type U32) */ -U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue); - -/* - * HUF_decompress() does the following: - * 1. select the decompression algorithm (X1, X2) based on pre-computed heuristics - * 2. build Huffman table from save, using HUF_readDTableX?() - * 3. decode 1 or 4 segments in parallel using HUF_decompress?X?_usingDTable() - */ - -/** HUF_selectDecoder() : - * Tells which decoder is likely to decode faster, - * based on a set of pre-computed metrics. - * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . - * Assumption : 0 < dstSize <= 128 KB */ -U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize); - -/** - * The minimum workspace size for the `workSpace` used in - * HUF_readDTableX1_wksp() and HUF_readDTableX2_wksp(). - * - * The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when - * HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15. - * Buffer overflow errors may potentially occur if code modifications result in - * a required workspace size greater than that specified in the following - * macro. - */ -#define HUF_DECOMPRESS_WORKSPACE_SIZE ((2 << 10) + (1 << 9)) -#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32)) - -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_readDTableX1 (HUF_DTable* DTable, const void* src, size_t srcSize); -size_t HUF_readDTableX1_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize); -#endif -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_readDTableX2 (HUF_DTable* DTable, const void* src, size_t srcSize); -size_t HUF_readDTableX2_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize); -#endif - -size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress4X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); -#endif -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); -#endif - - -/* ====================== */ -/* single stream variants */ -/* ====================== */ - -size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog); -size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U32 unsigned */ -size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable); -/** HUF_compress1X_repeat() : - * Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. - * If it uses hufTable it does not modify hufTable or repeat. - * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. - * If preferRepeat then the old table will always be used if valid. */ -size_t HUF_compress1X_repeat(void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned tableLog, - void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2); - -size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */ -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */ -#endif - -size_t HUF_decompress1X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); -size_t HUF_decompress1X_DCtx_wksp (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress1X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */ -size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */ -#endif -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */ -size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */ -#endif - -size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); /**< automatic selection of sing or double symbol decoder, based on DTable */ -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress1X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); -#endif -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); -#endif - -/* BMI2 variants. - * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. - */ -size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2); -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2); -#endif -size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2); -size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2); -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2); -#endif - -#endif /* HUF_STATIC_LINKING_ONLY */ - -#if defined (__cplusplus) -} -#endif diff --git a/src/dependencies/zstd-1.5.0/lib/common/threading.c b/src/dependencies/zstd-1.5.0/lib/common/threading.c deleted file mode 100644 index 92cf57c..0000000 --- a/src/dependencies/zstd-1.5.0/lib/common/threading.c +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright (c) 2016 Tino Reichardt - * All rights reserved. - * - * You can contact the author at: - * - zstdmt source repository: https://github.com/mcmilk/zstdmt - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -/** - * This file will hold wrapper for systems, which do not support pthreads - */ - -#include "threading.h" - -/* create fake symbol to avoid empty translation unit warning */ -int g_ZSTD_threading_useless_symbol; - -#if defined(ZSTD_MULTITHREAD) && defined(_WIN32) - -/** - * Windows minimalist Pthread Wrapper, based on : - * http://www.cse.wustl.edu/~schmidt/win32-cv-1.html - */ - - -/* === Dependencies === */ -#include -#include - - -/* === Implementation === */ - -static unsigned __stdcall worker(void *arg) -{ - ZSTD_pthread_t* const thread = (ZSTD_pthread_t*) arg; - thread->arg = thread->start_routine(thread->arg); - return 0; -} - -int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, - void* (*start_routine) (void*), void* arg) -{ - (void)unused; - thread->arg = arg; - thread->start_routine = start_routine; - thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL); - - if (!thread->handle) - return errno; - else - return 0; -} - -int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr) -{ - DWORD result; - - if (!thread.handle) return 0; - - result = WaitForSingleObject(thread.handle, INFINITE); - switch (result) { - case WAIT_OBJECT_0: - if (value_ptr) *value_ptr = thread.arg; - return 0; - case WAIT_ABANDONED: - return EINVAL; - default: - return GetLastError(); - } -} - -#endif /* ZSTD_MULTITHREAD */ - -#if defined(ZSTD_MULTITHREAD) && DEBUGLEVEL >= 1 && !defined(_WIN32) - -#define ZSTD_DEPS_NEED_MALLOC -#include "zstd_deps.h" - -int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr) -{ - *mutex = (pthread_mutex_t*)ZSTD_malloc(sizeof(pthread_mutex_t)); - if (!*mutex) - return 1; - return pthread_mutex_init(*mutex, attr); -} - -int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex) -{ - if (!*mutex) - return 0; - { - int const ret = pthread_mutex_destroy(*mutex); - ZSTD_free(*mutex); - return ret; - } -} - -int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr) -{ - *cond = (pthread_cond_t*)ZSTD_malloc(sizeof(pthread_cond_t)); - if (!*cond) - return 1; - return pthread_cond_init(*cond, attr); -} - -int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond) -{ - if (!*cond) - return 0; - { - int const ret = pthread_cond_destroy(*cond); - ZSTD_free(*cond); - return ret; - } -} - -#endif diff --git a/src/dependencies/zstd-1.5.0/lib/common/xxhash.c b/src/dependencies/zstd-1.5.0/lib/common/xxhash.c deleted file mode 100644 index 926b336..0000000 --- a/src/dependencies/zstd-1.5.0/lib/common/xxhash.c +++ /dev/null @@ -1,824 +0,0 @@ -/* - * xxHash - Fast Hash algorithm - * Copyright (c) Yann Collet, Facebook, Inc. - * - * You can contact the author at : - * - xxHash homepage: http://www.xxhash.com - * - xxHash source repository : https://github.com/Cyan4973/xxHash - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. -*/ - - -/* ************************************* -* Tuning parameters -***************************************/ -/*!XXH_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method doesn't depend on compiler but violate C standard. - * It can generate buggy code on targets which do not support unaligned memory accesses. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://stackoverflow.com/a/32095106/646947 for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) || \ - defined(__ICCARM__) -# define XXH_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/*!XXH_ACCEPT_NULL_INPUT_POINTER : - * If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer. - * When this option is enabled, xxHash output for null input pointers will be the same as a null-length input. - * By default, this option is disabled. To enable it, uncomment below define : - */ -/* #define XXH_ACCEPT_NULL_INPUT_POINTER 1 */ - -/*!XXH_FORCE_NATIVE_FORMAT : - * By default, xxHash library provides endian-independent Hash values, based on little-endian convention. - * Results are therefore identical for little-endian and big-endian CPU. - * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format. - * Should endian-independence be of no importance for your application, you may set the #define below to 1, - * to improve speed for Big-endian CPU. - * This option has no impact on Little_Endian CPU. - */ -#ifndef XXH_FORCE_NATIVE_FORMAT /* can be defined externally */ -# define XXH_FORCE_NATIVE_FORMAT 0 -#endif - -/*!XXH_FORCE_ALIGN_CHECK : - * This is a minor performance trick, only useful with lots of very small keys. - * It means : check for aligned/unaligned input. - * The check costs one initial branch per hash; set to 0 when the input data - * is guaranteed to be aligned. - */ -#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ -# if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) -# define XXH_FORCE_ALIGN_CHECK 0 -# else -# define XXH_FORCE_ALIGN_CHECK 1 -# endif -#endif - - -/* ************************************* -* Includes & Memory related functions -***************************************/ -/* Modify the local functions below should you wish to use some other memory routines */ -/* for ZSTD_malloc(), ZSTD_free() */ -#define ZSTD_DEPS_NEED_MALLOC -#include "zstd_deps.h" /* size_t, ZSTD_malloc, ZSTD_free, ZSTD_memcpy */ -static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } -static void XXH_free (void* p) { ZSTD_free(p); } -static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } - -#ifndef XXH_STATIC_LINKING_ONLY -# define XXH_STATIC_LINKING_ONLY -#endif -#include "xxhash.h" - - -/* ************************************* -* Compiler Specific Options -***************************************/ -#include "compiler.h" - - -/* ************************************* -* Basic Types -***************************************/ -#include "mem.h" /* BYTE, U32, U64, size_t */ - -#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) - -/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; } -static U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; } - -#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign; - -static U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -static U64 XXH_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -#else - -/* portable and safe solution. Generally efficient. - * see : http://stackoverflow.com/a/32095106/646947 - */ - -static U32 XXH_read32(const void* memPtr) -{ - U32 val; - ZSTD_memcpy(&val, memPtr, sizeof(val)); - return val; -} - -static U64 XXH_read64(const void* memPtr) -{ - U64 val; - ZSTD_memcpy(&val, memPtr, sizeof(val)); - return val; -} - -#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ - - -/* **************************************** -* Compiler-specific Functions and Macros -******************************************/ -#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) - -/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */ -#if defined(_MSC_VER) -# define XXH_rotl32(x,r) _rotl(x,r) -# define XXH_rotl64(x,r) _rotl64(x,r) -#else -#if defined(__ICCARM__) -# include -# define XXH_rotl32(x,r) __ROR(x,(32 - r)) -#else -# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) -#endif -# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) -#endif - -#if defined(_MSC_VER) /* Visual Studio */ -# define XXH_swap32 _byteswap_ulong -# define XXH_swap64 _byteswap_uint64 -#elif GCC_VERSION >= 403 -# define XXH_swap32 __builtin_bswap32 -# define XXH_swap64 __builtin_bswap64 -#else -static U32 XXH_swap32 (U32 x) -{ - return ((x << 24) & 0xff000000 ) | - ((x << 8) & 0x00ff0000 ) | - ((x >> 8) & 0x0000ff00 ) | - ((x >> 24) & 0x000000ff ); -} -static U64 XXH_swap64 (U64 x) -{ - return ((x << 56) & 0xff00000000000000ULL) | - ((x << 40) & 0x00ff000000000000ULL) | - ((x << 24) & 0x0000ff0000000000ULL) | - ((x << 8) & 0x000000ff00000000ULL) | - ((x >> 8) & 0x00000000ff000000ULL) | - ((x >> 24) & 0x0000000000ff0000ULL) | - ((x >> 40) & 0x000000000000ff00ULL) | - ((x >> 56) & 0x00000000000000ffULL); -} -#endif - - -/* ************************************* -* Architecture Macros -***************************************/ -typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; - -/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */ -#ifndef XXH_CPU_LITTLE_ENDIAN - static const int g_one = 1; -# define XXH_CPU_LITTLE_ENDIAN (*(const char*)(&g_one)) -#endif - - -/* *************************** -* Memory reads -*****************************/ -typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; - -FORCE_INLINE_TEMPLATE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); - else - return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); -} - -FORCE_INLINE_TEMPLATE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE32_align(ptr, endian, XXH_unaligned); -} - -static U32 XXH_readBE32(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); -} - -FORCE_INLINE_TEMPLATE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); - else - return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); -} - -FORCE_INLINE_TEMPLATE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE64_align(ptr, endian, XXH_unaligned); -} - -static U64 XXH_readBE64(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); -} - - -/* ************************************* -* Macros -***************************************/ -#define XXH_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */ - - -/* ************************************* -* Constants -***************************************/ -static const U32 PRIME32_1 = 2654435761U; -static const U32 PRIME32_2 = 2246822519U; -static const U32 PRIME32_3 = 3266489917U; -static const U32 PRIME32_4 = 668265263U; -static const U32 PRIME32_5 = 374761393U; - -static const U64 PRIME64_1 = 11400714785074694791ULL; -static const U64 PRIME64_2 = 14029467366897019727ULL; -static const U64 PRIME64_3 = 1609587929392839161ULL; -static const U64 PRIME64_4 = 9650029242287828579ULL; -static const U64 PRIME64_5 = 2870177450012600261ULL; - -XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } - - -/* ************************** -* Utils -****************************/ -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dstState, const XXH32_state_t* restrict srcState) -{ - ZSTD_memcpy(dstState, srcState, sizeof(*dstState)); -} - -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dstState, const XXH64_state_t* restrict srcState) -{ - ZSTD_memcpy(dstState, srcState, sizeof(*dstState)); -} - - -/* *************************** -* Simple Hash Functions -*****************************/ - -static U32 XXH32_round(U32 seed, U32 input) -{ - seed += input * PRIME32_2; - seed = XXH_rotl32(seed, 13); - seed *= PRIME32_1; - return seed; -} - -FORCE_INLINE_TEMPLATE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* bEnd = p + len; - U32 h32; -#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)16; - } -#endif - - if (len>=16) { - const BYTE* const limit = bEnd - 16; - U32 v1 = seed + PRIME32_1 + PRIME32_2; - U32 v2 = seed + PRIME32_2; - U32 v3 = seed + 0; - U32 v4 = seed - PRIME32_1; - - do { - v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4; - v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4; - v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4; - v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4; - } while (p<=limit); - - h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); - } else { - h32 = seed + PRIME32_5; - } - - h32 += (U32) len; - - while (p+4<=bEnd) { - h32 += XXH_get32bits(p) * PRIME32_3; - h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; - p+=4; - } - - while (p> 15; - h32 *= PRIME32_2; - h32 ^= h32 >> 13; - h32 *= PRIME32_3; - h32 ^= h32 >> 16; - - return h32; -} - - -XXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH32_CREATESTATE_STATIC(state); - XXH32_reset(state, seed); - XXH32_update(state, input, len); - return XXH32_digest(state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - - -static U64 XXH64_round(U64 acc, U64 input) -{ - acc += input * PRIME64_2; - acc = XXH_rotl64(acc, 31); - acc *= PRIME64_1; - return acc; -} - -static U64 XXH64_mergeRound(U64 acc, U64 val) -{ - val = XXH64_round(0, val); - acc ^= val; - acc = acc * PRIME64_1 + PRIME64_4; - return acc; -} - -FORCE_INLINE_TEMPLATE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - U64 h64; -#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)32; - } -#endif - - if (len>=32) { - const BYTE* const limit = bEnd - 32; - U64 v1 = seed + PRIME64_1 + PRIME64_2; - U64 v2 = seed + PRIME64_2; - U64 v3 = seed + 0; - U64 v4 = seed - PRIME64_1; - - do { - v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8; - v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8; - v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8; - v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8; - } while (p<=limit); - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - - } else { - h64 = seed + PRIME64_5; - } - - h64 += (U64) len; - - while (p+8<=bEnd) { - U64 const k1 = XXH64_round(0, XXH_get64bits(p)); - h64 ^= k1; - h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; - p+=8; - } - - if (p+4<=bEnd) { - h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; - h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - p+=4; - } - - while (p> 33; - h64 *= PRIME64_2; - h64 ^= h64 >> 29; - h64 *= PRIME64_3; - h64 ^= h64 >> 32; - - return h64; -} - - -XXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH64_CREATESTATE_STATIC(state); - XXH64_reset(state, seed); - XXH64_update(state, input, len); - return XXH64_digest(state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - - -/* ************************************************** -* Advanced Hash Functions -****************************************************/ - -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) -{ - return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) -{ - return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - - -/*** Hash feed ***/ - -XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed) -{ - XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - ZSTD_memset(&state, 0, sizeof(state)-4); /* do not write into reserved, for future removal */ - state.v1 = seed + PRIME32_1 + PRIME32_2; - state.v2 = seed + PRIME32_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME32_1; - ZSTD_memcpy(statePtr, &state, sizeof(state)); - return XXH_OK; -} - - -XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed) -{ - XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - ZSTD_memset(&state, 0, sizeof(state)-8); /* do not write into reserved, for future removal */ - state.v1 = seed + PRIME64_1 + PRIME64_2; - state.v2 = seed + PRIME64_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME64_1; - ZSTD_memcpy(statePtr, &state, sizeof(state)); - return XXH_OK; -} - - -FORCE_INLINE_TEMPLATE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (input==NULL) return XXH_ERROR; -#endif - - state->total_len_32 += (unsigned)len; - state->large_len |= (len>=16) | (state->total_len_32>=16); - - if (state->memsize + len < 16) { /* fill in tmp buffer */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len); - state->memsize += (unsigned)len; - return XXH_OK; - } - - if (state->memsize) { /* some data left from previous update */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize); - { const U32* p32 = state->mem32; - state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++; - state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++; - state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++; - state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); p32++; - } - p += 16-state->memsize; - state->memsize = 0; - } - - if (p <= bEnd-16) { - const BYTE* const limit = bEnd - 16; - U32 v1 = state->v1; - U32 v2 = state->v2; - U32 v3 = state->v3; - U32 v4 = state->v4; - - do { - v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4; - v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4; - v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4; - v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - - return XXH_OK; -} - -XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH32_update_endian(state_in, input, len, XXH_bigEndian); -} - - - -FORCE_INLINE_TEMPLATE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) -{ - const BYTE * p = (const BYTE*)state->mem32; - const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize; - U32 h32; - - if (state->large_len) { - h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18); - } else { - h32 = state->v3 /* == seed */ + PRIME32_5; - } - - h32 += state->total_len_32; - - while (p+4<=bEnd) { - h32 += XXH_readLE32(p, endian) * PRIME32_3; - h32 = XXH_rotl32(h32, 17) * PRIME32_4; - p+=4; - } - - while (p> 15; - h32 *= PRIME32_2; - h32 ^= h32 >> 13; - h32 *= PRIME32_3; - h32 ^= h32 >> 16; - - return h32; -} - - -XXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_digest_endian(state_in, XXH_littleEndian); - else - return XXH32_digest_endian(state_in, XXH_bigEndian); -} - - - -/* **** XXH64 **** */ - -FORCE_INLINE_TEMPLATE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (input==NULL) return XXH_ERROR; -#endif - - state->total_len += len; - - if (state->memsize + len < 32) { /* fill in tmp buffer */ - if (input != NULL) { - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len); - } - state->memsize += (U32)len; - return XXH_OK; - } - - if (state->memsize) { /* tmp buffer is full */ - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize); - state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0, endian)); - state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1, endian)); - state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2, endian)); - state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3, endian)); - p += 32-state->memsize; - state->memsize = 0; - } - - if (p+32 <= bEnd) { - const BYTE* const limit = bEnd - 32; - U64 v1 = state->v1; - U64 v2 = state->v2; - U64 v3 = state->v3; - U64 v4 = state->v4; - - do { - v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8; - v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8; - v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8; - v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - - return XXH_OK; -} - -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH64_update_endian(state_in, input, len, XXH_bigEndian); -} - - - -FORCE_INLINE_TEMPLATE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) -{ - const BYTE * p = (const BYTE*)state->mem64; - const BYTE* const bEnd = (const BYTE*)state->mem64 + state->memsize; - U64 h64; - - if (state->total_len >= 32) { - U64 const v1 = state->v1; - U64 const v2 = state->v2; - U64 const v3 = state->v3; - U64 const v4 = state->v4; - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - } else { - h64 = state->v3 + PRIME64_5; - } - - h64 += (U64) state->total_len; - - while (p+8<=bEnd) { - U64 const k1 = XXH64_round(0, XXH_readLE64(p, endian)); - h64 ^= k1; - h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; - p+=8; - } - - if (p+4<=bEnd) { - h64 ^= (U64)(XXH_readLE32(p, endian)) * PRIME64_1; - h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - p+=4; - } - - while (p> 33; - h64 *= PRIME64_2; - h64 ^= h64 >> 29; - h64 *= PRIME64_3; - h64 ^= h64 >> 32; - - return h64; -} - - -XXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_digest_endian(state_in, XXH_littleEndian); - else - return XXH64_digest_endian(state_in, XXH_bigEndian); -} - - -/* ************************** -* Canonical representation -****************************/ - -/*! Default XXH result types are basic unsigned 32 and 64 bits. -* The canonical representation follows human-readable write convention, aka big-endian (large digits first). -* These functions allow transformation of hash result into and from its canonical format. -* This way, hash values can be written into a file or buffer, and remain comparable across different systems and programs. -*/ - -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); - ZSTD_memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); - ZSTD_memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) -{ - return XXH_readBE32(src); -} - -XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) -{ - return XXH_readBE64(src); -} diff --git a/src/dependencies/zstd-1.5.0/lib/common/xxhash.h b/src/dependencies/zstd-1.5.0/lib/common/xxhash.h deleted file mode 100644 index 16c1f16..0000000 --- a/src/dependencies/zstd-1.5.0/lib/common/xxhash.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - * xxHash - Extremely Fast Hash algorithm - * Header File - * Copyright (c) Yann Collet, Facebook, Inc. - * - * You can contact the author at : - * - xxHash source repository : https://github.com/Cyan4973/xxHash - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. -*/ - -/* Notice extracted from xxHash homepage : - -xxHash is an extremely fast Hash algorithm, running at RAM speed limits. -It also successfully passes all tests from the SMHasher suite. - -Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) - -Name Speed Q.Score Author -xxHash 5.4 GB/s 10 -CrapWow 3.2 GB/s 2 Andrew -MumurHash 3a 2.7 GB/s 10 Austin Appleby -SpookyHash 2.0 GB/s 10 Bob Jenkins -SBox 1.4 GB/s 9 Bret Mulvey -Lookup3 1.2 GB/s 9 Bob Jenkins -SuperFastHash 1.2 GB/s 1 Paul Hsieh -CityHash64 1.05 GB/s 10 Pike & Alakuijala -FNV 0.55 GB/s 5 Fowler, Noll, Vo -CRC32 0.43 GB/s 9 -MD5-32 0.33 GB/s 10 Ronald L. Rivest -SHA1-32 0.28 GB/s 10 - -Q.Score is a measure of quality of the hash function. -It depends on successfully passing SMHasher test set. -10 is a perfect score. - -A 64-bits version, named XXH64, is available since r35. -It offers much better speed, but for 64-bits applications only. -Name Speed on 64 bits Speed on 32 bits -XXH64 13.8 GB/s 1.9 GB/s -XXH32 6.8 GB/s 6.0 GB/s -*/ - -#if defined (__cplusplus) -extern "C" { -#endif - -#ifndef XXHASH_H_5627135585666179 -#define XXHASH_H_5627135585666179 1 - - -/* **************************** -* Definitions -******************************/ -#include "zstd_deps.h" -typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; - - -/* **************************** -* API modifier -******************************/ -/** XXH_PRIVATE_API -* This is useful if you want to include xxhash functions in `static` mode -* in order to inline them, and remove their symbol from the public list. -* Methodology : -* #define XXH_PRIVATE_API -* #include "xxhash.h" -* `xxhash.c` is automatically included. -* It's not useful to compile and link it as a separate module anymore. -*/ -#ifdef XXH_PRIVATE_API -# ifndef XXH_STATIC_LINKING_ONLY -# define XXH_STATIC_LINKING_ONLY -# endif -# if defined(__GNUC__) -# define XXH_PUBLIC_API static __inline __attribute__((unused)) -# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# define XXH_PUBLIC_API static inline -# elif defined(_MSC_VER) -# define XXH_PUBLIC_API static __inline -# else -# define XXH_PUBLIC_API static /* this version may generate warnings for unused static functions; disable the relevant warning */ -# endif -#else -# define XXH_PUBLIC_API /* do nothing */ -#endif /* XXH_PRIVATE_API */ - -/*!XXH_NAMESPACE, aka Namespace Emulation : - -If you want to include _and expose_ xxHash functions from within your own library, -but also want to avoid symbol collisions with another library which also includes xxHash, - -you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library -with the value of XXH_NAMESPACE (so avoid to keep it NULL and avoid numeric values). - -Note that no change is required within the calling program as long as it includes `xxhash.h` : -regular symbol name will be automatically translated by this header. -*/ -#ifdef XXH_NAMESPACE -# define XXH_CAT(A,B) A##B -# define XXH_NAME2(A,B) XXH_CAT(A,B) -# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) -# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) -# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) -# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) -# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) -# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) -# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) -# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) -# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) -# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) -# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) -# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) -# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) -# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) -# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) -# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) -# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) -# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) -# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) -#endif - - -/* ************************************* -* Version -***************************************/ -#define XXH_VERSION_MAJOR 0 -#define XXH_VERSION_MINOR 6 -#define XXH_VERSION_RELEASE 2 -#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) -XXH_PUBLIC_API unsigned XXH_versionNumber (void); - - -/* **************************** -* Simple Hash Functions -******************************/ -typedef unsigned int XXH32_hash_t; -typedef unsigned long long XXH64_hash_t; - -XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed); -XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed); - -/*! -XXH32() : - Calculate the 32-bits hash of sequence "length" bytes stored at memory address "input". - The memory between input & input+length must be valid (allocated and read-accessible). - "seed" can be used to alter the result predictably. - Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s -XXH64() : - Calculate the 64-bits hash of sequence of length "len" stored at memory address "input". - "seed" can be used to alter the result predictably. - This function runs 2x faster on 64-bits systems, but slower on 32-bits systems (see benchmark). -*/ - - -/* **************************** -* Streaming Hash Functions -******************************/ -typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ -typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ - -/*! State allocation, compatible with dynamic libraries */ - -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); - -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); - - -/* hash streaming */ - -XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned int seed); -XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); -XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); - -XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed); -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); -XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); - -/* -These functions generate the xxHash of an input provided in multiple segments. -Note that, for small input, they are slower than single-call functions, due to state management. -For small input, prefer `XXH32()` and `XXH64()` . - -XXH state must first be allocated, using XXH*_createState() . - -Start a new hash by initializing state with a seed, using XXH*_reset(). - -Then, feed the hash state by calling XXH*_update() as many times as necessary. -Obviously, input must be allocated and read accessible. -The function returns an error code, with 0 meaning OK, and any other value meaning there is an error. - -Finally, a hash value can be produced anytime, by using XXH*_digest(). -This function returns the nn-bits hash as an int or long long. - -It's still possible to continue inserting input into the hash state after a digest, -and generate some new hashes later on, by calling again XXH*_digest(). - -When done, free XXH state space if it was allocated dynamically. -*/ - - -/* ************************** -* Utils -****************************/ -#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* ! C99 */ -# define restrict /* disable restrict */ -#endif - -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dst_state, const XXH32_state_t* restrict src_state); -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dst_state, const XXH64_state_t* restrict src_state); - - -/* ************************** -* Canonical representation -****************************/ -/* Default result type for XXH functions are primitive unsigned 32 and 64 bits. -* The canonical representation uses human-readable write convention, aka big-endian (large digits first). -* These functions allow transformation of hash result into and from its canonical format. -* This way, hash values can be written into a file / memory, and remain comparable on different systems and programs. -*/ -typedef struct { unsigned char digest[4]; } XXH32_canonical_t; -typedef struct { unsigned char digest[8]; } XXH64_canonical_t; - -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); - -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); -XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); - -#endif /* XXHASH_H_5627135585666179 */ - - - -/* ================================================================================================ - This section contains definitions which are not guaranteed to remain stable. - They may change in future versions, becoming incompatible with a different version of the library. - They shall only be used with static linking. - Never use these definitions in association with dynamic linking ! -=================================================================================================== */ -#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXH_STATIC_H_3543687687345) -#define XXH_STATIC_H_3543687687345 - -/* These definitions are only meant to allow allocation of XXH state - statically, on stack, or in a struct for example. - Do not use members directly. */ - - struct XXH32_state_s { - unsigned total_len_32; - unsigned large_len; - unsigned v1; - unsigned v2; - unsigned v3; - unsigned v4; - unsigned mem32[4]; /* buffer defined as U32 for alignment */ - unsigned memsize; - unsigned reserved; /* never read nor write, will be removed in a future version */ - }; /* typedef'd to XXH32_state_t */ - - struct XXH64_state_s { - unsigned long long total_len; - unsigned long long v1; - unsigned long long v2; - unsigned long long v3; - unsigned long long v4; - unsigned long long mem64[4]; /* buffer defined as U64 for alignment */ - unsigned memsize; - unsigned reserved[2]; /* never read nor write, will be removed in a future version */ - }; /* typedef'd to XXH64_state_t */ - - -# ifdef XXH_PRIVATE_API -# include "xxhash.c" /* include xxhash functions as `static`, for inlining */ -# endif - -#endif /* XXH_STATIC_LINKING_ONLY && XXH_STATIC_H_3543687687345 */ - - -#if defined (__cplusplus) -} -#endif diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.c b/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.c deleted file mode 100644 index 008337b..0000000 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) Yann Collet, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - - /*-************************************* - * Dependencies - ***************************************/ -#include "zstd_compress_literals.h" - -size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize) -{ - BYTE* const ostart = (BYTE*)dst; - U32 const flSize = 1 + (srcSize>31) + (srcSize>4095); - - RETURN_ERROR_IF(srcSize + flSize > dstCapacity, dstSize_tooSmall, ""); - - switch(flSize) - { - case 1: /* 2 - 1 - 5 */ - ostart[0] = (BYTE)((U32)set_basic + (srcSize<<3)); - break; - case 2: /* 2 - 2 - 12 */ - MEM_writeLE16(ostart, (U16)((U32)set_basic + (1<<2) + (srcSize<<4))); - break; - case 3: /* 2 - 2 - 20 */ - MEM_writeLE32(ostart, (U32)((U32)set_basic + (3<<2) + (srcSize<<4))); - break; - default: /* not necessary : flSize is {1,2,3} */ - assert(0); - } - - ZSTD_memcpy(ostart + flSize, src, srcSize); - DEBUGLOG(5, "Raw literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize)); - return srcSize + flSize; -} - -size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize) -{ - BYTE* const ostart = (BYTE*)dst; - U32 const flSize = 1 + (srcSize>31) + (srcSize>4095); - - (void)dstCapacity; /* dstCapacity already guaranteed to be >=4, hence large enough */ - - switch(flSize) - { - case 1: /* 2 - 1 - 5 */ - ostart[0] = (BYTE)((U32)set_rle + (srcSize<<3)); - break; - case 2: /* 2 - 2 - 12 */ - MEM_writeLE16(ostart, (U16)((U32)set_rle + (1<<2) + (srcSize<<4))); - break; - case 3: /* 2 - 2 - 20 */ - MEM_writeLE32(ostart, (U32)((U32)set_rle + (3<<2) + (srcSize<<4))); - break; - default: /* not necessary : flSize is {1,2,3} */ - assert(0); - } - - ostart[flSize] = *(const BYTE*)src; - DEBUGLOG(5, "RLE literals: %u -> %u", (U32)srcSize, (U32)flSize + 1); - return flSize+1; -} - -size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, - ZSTD_hufCTables_t* nextHuf, - ZSTD_strategy strategy, int disableLiteralCompression, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - void* entropyWorkspace, size_t entropyWorkspaceSize, - const int bmi2) -{ - size_t const minGain = ZSTD_minGain(srcSize, strategy); - size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB); - BYTE* const ostart = (BYTE*)dst; - U32 singleStream = srcSize < 256; - symbolEncodingType_e hType = set_compressed; - size_t cLitSize; - - DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i srcSize=%u)", - disableLiteralCompression, (U32)srcSize); - - /* Prepare nextEntropy assuming reusing the existing table */ - ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - - if (disableLiteralCompression) - return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); - - /* small ? don't even attempt compression (speed opt) */ -# define COMPRESS_LITERALS_SIZE_MIN 63 - { size_t const minLitSize = (prevHuf->repeatMode == HUF_repeat_valid) ? 6 : COMPRESS_LITERALS_SIZE_MIN; - if (srcSize <= minLitSize) return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); - } - - RETURN_ERROR_IF(dstCapacity < lhSize+1, dstSize_tooSmall, "not enough space for compression"); - { HUF_repeat repeat = prevHuf->repeatMode; - int const preferRepeat = strategy < ZSTD_lazy ? srcSize <= 1024 : 0; - if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1; - cLitSize = singleStream ? - HUF_compress1X_repeat( - ostart+lhSize, dstCapacity-lhSize, src, srcSize, - HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2) : - HUF_compress4X_repeat( - ostart+lhSize, dstCapacity-lhSize, src, srcSize, - HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2); - if (repeat != HUF_repeat_none) { - /* reused the existing table */ - DEBUGLOG(5, "Reusing previous huffman table"); - hType = set_repeat; - } - } - - if ((cLitSize==0) || (cLitSize >= srcSize - minGain) || ERR_isError(cLitSize)) { - ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); - } - if (cLitSize==1) { - ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize); - } - - if (hType == set_compressed) { - /* using a newly constructed table */ - nextHuf->repeatMode = HUF_repeat_check; - } - - /* Build header */ - switch(lhSize) - { - case 3: /* 2 - 2 - 10 - 10 */ - { U32 const lhc = hType + ((!singleStream) << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<14); - MEM_writeLE24(ostart, lhc); - break; - } - case 4: /* 2 - 2 - 14 - 14 */ - { U32 const lhc = hType + (2 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<18); - MEM_writeLE32(ostart, lhc); - break; - } - case 5: /* 2 - 2 - 18 - 18 */ - { U32 const lhc = hType + (3 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<22); - MEM_writeLE32(ostart, lhc); - ostart[4] = (BYTE)(cLitSize >> 10); - break; - } - default: /* not possible : lhSize is {3,4,5} */ - assert(0); - } - DEBUGLOG(5, "Compressed literals: %u -> %u", (U32)srcSize, (U32)(lhSize+cLitSize)); - return lhSize+cLitSize; -} diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.c b/src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.c deleted file mode 100644 index 4edc04d..0000000 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - * Copyright (c) Yann Collet, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -#include "zstd_compress_internal.h" /* ZSTD_hashPtr, ZSTD_count, ZSTD_storeSeq */ -#include "zstd_fast.h" - - -void ZSTD_fillHashTable(ZSTD_matchState_t* ms, - const void* const end, - ZSTD_dictTableLoadMethod_e dtlm) -{ - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32* const hashTable = ms->hashTable; - U32 const hBits = cParams->hashLog; - U32 const mls = cParams->minMatch; - const BYTE* const base = ms->window.base; - const BYTE* ip = base + ms->nextToUpdate; - const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; - const U32 fastHashFillStep = 3; - - /* Always insert every fastHashFillStep position into the hash table. - * Insert the other positions if their hash entry is empty. - */ - for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { - U32 const curr = (U32)(ip - base); - size_t const hash0 = ZSTD_hashPtr(ip, hBits, mls); - hashTable[hash0] = curr; - if (dtlm == ZSTD_dtlm_fast) continue; - /* Only load extra positions for ZSTD_dtlm_full */ - { U32 p; - for (p = 1; p < fastHashFillStep; ++p) { - size_t const hash = ZSTD_hashPtr(ip + p, hBits, mls); - if (hashTable[hash] == 0) { /* not yet filled */ - hashTable[hash] = curr + p; - } } } } -} - - -FORCE_INLINE_TEMPLATE size_t -ZSTD_compressBlock_fast_generic( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, - U32 const mls) -{ - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32* const hashTable = ms->hashTable; - U32 const hlog = cParams->hashLog; - /* support stepSize of 0 */ - size_t const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; - const BYTE* const base = ms->window.base; - const BYTE* const istart = (const BYTE*)src; - /* We check ip0 (ip + 0) and ip1 (ip + 1) each loop */ - const BYTE* ip0 = istart; - const BYTE* ip1; - const BYTE* anchor = istart; - const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); - const U32 prefixStartIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); - const BYTE* const prefixStart = base + prefixStartIndex; - const BYTE* const iend = istart + srcSize; - const BYTE* const ilimit = iend - HASH_READ_SIZE; - U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; - - /* init */ - DEBUGLOG(5, "ZSTD_compressBlock_fast_generic"); - ip0 += (ip0 == prefixStart); - ip1 = ip0 + 1; - { U32 const curr = (U32)(ip0 - base); - U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); - U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; - if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; - } - - /* Main Search Loop */ -#ifdef __INTEL_COMPILER - /* From intel 'The vector pragma indicates that the loop should be - * vectorized if it is legal to do so'. Can be used together with - * #pragma ivdep (but have opted to exclude that because intel - * warns against using it).*/ - #pragma vector always -#endif - while (ip1 < ilimit) { /* < instead of <=, because check at ip0+2 */ - size_t mLength; - BYTE const* ip2 = ip0 + 2; - size_t const h0 = ZSTD_hashPtr(ip0, hlog, mls); - U32 const val0 = MEM_read32(ip0); - size_t const h1 = ZSTD_hashPtr(ip1, hlog, mls); - U32 const val1 = MEM_read32(ip1); - U32 const current0 = (U32)(ip0-base); - U32 const current1 = (U32)(ip1-base); - U32 const matchIndex0 = hashTable[h0]; - U32 const matchIndex1 = hashTable[h1]; - BYTE const* repMatch = ip2 - offset_1; - const BYTE* match0 = base + matchIndex0; - const BYTE* match1 = base + matchIndex1; - U32 offcode; - -#if defined(__aarch64__) - PREFETCH_L1(ip0+256); -#endif - - hashTable[h0] = current0; /* update hash table */ - hashTable[h1] = current1; /* update hash table */ - - assert(ip0 + 1 == ip1); - - if ((offset_1 > 0) & (MEM_read32(repMatch) == MEM_read32(ip2))) { - mLength = (ip2[-1] == repMatch[-1]) ? 1 : 0; - ip0 = ip2 - mLength; - match0 = repMatch - mLength; - mLength += 4; - offcode = 0; - goto _match; - } - if ((matchIndex0 > prefixStartIndex) && MEM_read32(match0) == val0) { - /* found a regular match */ - goto _offset; - } - if ((matchIndex1 > prefixStartIndex) && MEM_read32(match1) == val1) { - /* found a regular match after one literal */ - ip0 = ip1; - match0 = match1; - goto _offset; - } - { size_t const step = ((size_t)(ip0-anchor) >> (kSearchStrength - 1)) + stepSize; - assert(step >= 2); - ip0 += step; - ip1 += step; - continue; - } -_offset: /* Requires: ip0, match0 */ - /* Compute the offset code */ - offset_2 = offset_1; - offset_1 = (U32)(ip0-match0); - offcode = offset_1 + ZSTD_REP_MOVE; - mLength = 4; - /* Count the backwards match length */ - while (((ip0>anchor) & (match0>prefixStart)) - && (ip0[-1] == match0[-1])) { ip0--; match0--; mLength++; } /* catch up */ - -_match: /* Requires: ip0, match0, offcode */ - /* Count the forward length */ - mLength += ZSTD_count(ip0+mLength, match0+mLength, iend); - ZSTD_storeSeq(seqStore, (size_t)(ip0-anchor), anchor, iend, offcode, mLength-MINMATCH); - /* match found */ - ip0 += mLength; - anchor = ip0; - - if (ip0 <= ilimit) { - /* Fill Table */ - assert(base+current0+2 > istart); /* check base overflow */ - hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ - hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); - - if (offset_2 > 0) { /* offset_2==0 means offset_2 is invalidated */ - while ( (ip0 <= ilimit) && (MEM_read32(ip0) == MEM_read32(ip0 - offset_2)) ) { - /* store sequence */ - size_t const rLength = ZSTD_count(ip0+4, ip0+4-offset_2, iend) + 4; - { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */ - hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); - ip0 += rLength; - ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, 0 /*offCode*/, rLength-MINMATCH); - anchor = ip0; - continue; /* faster when present (confirmed on gcc-8) ... (?) */ - } } } - ip1 = ip0 + 1; - } - - /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; - - /* Return the last literals size */ - return (size_t)(iend - anchor); -} - - -size_t ZSTD_compressBlock_fast( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize) -{ - U32 const mls = ms->cParams.minMatch; - assert(ms->dictMatchState == NULL); - switch(mls) - { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4); - case 5 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5); - case 6 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6); - case 7 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7); - } -} - -FORCE_INLINE_TEMPLATE -size_t ZSTD_compressBlock_fast_dictMatchState_generic( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls) -{ - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32* const hashTable = ms->hashTable; - U32 const hlog = cParams->hashLog; - /* support stepSize of 0 */ - U32 const stepSize = cParams->targetLength + !(cParams->targetLength); - const BYTE* const base = ms->window.base; - const BYTE* const istart = (const BYTE*)src; - const BYTE* ip = istart; - const BYTE* anchor = istart; - const U32 prefixStartIndex = ms->window.dictLimit; - const BYTE* const prefixStart = base + prefixStartIndex; - const BYTE* const iend = istart + srcSize; - const BYTE* const ilimit = iend - HASH_READ_SIZE; - U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; - - const ZSTD_matchState_t* const dms = ms->dictMatchState; - const ZSTD_compressionParameters* const dictCParams = &dms->cParams ; - const U32* const dictHashTable = dms->hashTable; - const U32 dictStartIndex = dms->window.dictLimit; - const BYTE* const dictBase = dms->window.base; - const BYTE* const dictStart = dictBase + dictStartIndex; - const BYTE* const dictEnd = dms->window.nextSrc; - const U32 dictIndexDelta = prefixStartIndex - (U32)(dictEnd - dictBase); - const U32 dictAndPrefixLength = (U32)(ip - prefixStart + dictEnd - dictStart); - const U32 dictHLog = dictCParams->hashLog; - - /* if a dictionary is still attached, it necessarily means that - * it is within window size. So we just check it. */ - const U32 maxDistance = 1U << cParams->windowLog; - const U32 endIndex = (U32)((size_t)(ip - base) + srcSize); - assert(endIndex - prefixStartIndex <= maxDistance); - (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ - - /* ensure there will be no underflow - * when translating a dict index into a local index */ - assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); - - /* init */ - DEBUGLOG(5, "ZSTD_compressBlock_fast_dictMatchState_generic"); - ip += (dictAndPrefixLength == 0); - /* dictMatchState repCode checks don't currently handle repCode == 0 - * disabling. */ - assert(offset_1 <= dictAndPrefixLength); - assert(offset_2 <= dictAndPrefixLength); - - /* Main Search Loop */ - while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ - size_t mLength; - size_t const h = ZSTD_hashPtr(ip, hlog, mls); - U32 const curr = (U32)(ip-base); - U32 const matchIndex = hashTable[h]; - const BYTE* match = base + matchIndex; - const U32 repIndex = curr + 1 - offset_1; - const BYTE* repMatch = (repIndex < prefixStartIndex) ? - dictBase + (repIndex - dictIndexDelta) : - base + repIndex; - hashTable[h] = curr; /* update hash table */ - - if ( ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */ - && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { - const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; - mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); - } else if ( (matchIndex <= prefixStartIndex) ) { - size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls); - U32 const dictMatchIndex = dictHashTable[dictHash]; - const BYTE* dictMatch = dictBase + dictMatchIndex; - if (dictMatchIndex <= dictStartIndex || - MEM_read32(dictMatch) != MEM_read32(ip)) { - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } else { - /* found a dict match */ - U32 const offset = (U32)(curr-dictMatchIndex-dictIndexDelta); - mLength = ZSTD_count_2segments(ip+4, dictMatch+4, iend, dictEnd, prefixStart) + 4; - while (((ip>anchor) & (dictMatch>dictStart)) - && (ip[-1] == dictMatch[-1])) { - ip--; dictMatch--; mLength++; - } /* catch up */ - offset_2 = offset_1; - offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); - } - } else if (MEM_read32(match) != MEM_read32(ip)) { - /* it's not a match, and we're not going to check the dictionary */ - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } else { - /* found a regular match */ - U32 const offset = (U32)(ip-match); - mLength = ZSTD_count(ip+4, match+4, iend) + 4; - while (((ip>anchor) & (match>prefixStart)) - && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - offset_2 = offset_1; - offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); - } - - /* match found */ - ip += mLength; - anchor = ip; - - if (ip <= ilimit) { - /* Fill Table */ - assert(base+curr+2 > istart); /* check base overflow */ - hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; /* here because curr+2 could be > iend-8 */ - hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base); - - /* check immediate repcode */ - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); - U32 const repIndex2 = current2 - offset_2; - const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? - dictBase - dictIndexDelta + repIndex2 : - base + repIndex2; - if ( ((U32)((prefixStartIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { - const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; - U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); - hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; - ip += repLength2; - anchor = ip; - continue; - } - break; - } - } - } - - /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; - - /* Return the last literals size */ - return (size_t)(iend - anchor); -} - -size_t ZSTD_compressBlock_fast_dictMatchState( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize) -{ - U32 const mls = ms->cParams.minMatch; - assert(ms->dictMatchState != NULL); - switch(mls) - { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 4); - case 5 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 5); - case 6 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 6); - case 7 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 7); - } -} - - -static size_t ZSTD_compressBlock_fast_extDict_generic( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls) -{ - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32* const hashTable = ms->hashTable; - U32 const hlog = cParams->hashLog; - /* support stepSize of 0 */ - U32 const stepSize = cParams->targetLength + !(cParams->targetLength); - const BYTE* const base = ms->window.base; - const BYTE* const dictBase = ms->window.dictBase; - const BYTE* const istart = (const BYTE*)src; - const BYTE* ip = istart; - const BYTE* anchor = istart; - const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); - const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, cParams->windowLog); - const U32 dictStartIndex = lowLimit; - const BYTE* const dictStart = dictBase + dictStartIndex; - const U32 dictLimit = ms->window.dictLimit; - const U32 prefixStartIndex = dictLimit < lowLimit ? lowLimit : dictLimit; - const BYTE* const prefixStart = base + prefixStartIndex; - const BYTE* const dictEnd = dictBase + prefixStartIndex; - const BYTE* const iend = istart + srcSize; - const BYTE* const ilimit = iend - 8; - U32 offset_1=rep[0], offset_2=rep[1]; - - DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); - - /* switch to "regular" variant if extDict is invalidated due to maxDistance */ - if (prefixStartIndex == dictStartIndex) - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, mls); - - /* Search Loop */ - while (ip < ilimit) { /* < instead of <=, because (ip+1) */ - const size_t h = ZSTD_hashPtr(ip, hlog, mls); - const U32 matchIndex = hashTable[h]; - const BYTE* const matchBase = matchIndex < prefixStartIndex ? dictBase : base; - const BYTE* match = matchBase + matchIndex; - const U32 curr = (U32)(ip-base); - const U32 repIndex = curr + 1 - offset_1; - const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; - const BYTE* const repMatch = repBase + repIndex; - hashTable[h] = curr; /* update hash table */ - DEBUGLOG(7, "offset_1 = %u , curr = %u", offset_1, curr); - - if ( ( ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow */ - & (offset_1 < curr+1 - dictStartIndex) ) /* note: we are searching at curr+1 */ - && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { - const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; - size_t const rLength = ZSTD_count_2segments(ip+1 +4, repMatch +4, iend, repMatchEnd, prefixStart) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, rLength-MINMATCH); - ip += rLength; - anchor = ip; - } else { - if ( (matchIndex < dictStartIndex) || - (MEM_read32(match) != MEM_read32(ip)) ) { - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } - { const BYTE* const matchEnd = matchIndex < prefixStartIndex ? dictEnd : iend; - const BYTE* const lowMatchPtr = matchIndex < prefixStartIndex ? dictStart : prefixStart; - U32 const offset = curr - matchIndex; - size_t mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4; - while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - offset_2 = offset_1; offset_1 = offset; /* update offset history */ - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); - ip += mLength; - anchor = ip; - } } - - if (ip <= ilimit) { - /* Fill Table */ - hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; - hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base); - /* check immediate repcode */ - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); - U32 const repIndex2 = current2 - offset_2; - const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 < curr - dictStartIndex)) /* intentional overflow */ - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { - const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; - { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, 0 /*offcode*/, repLength2-MINMATCH); - hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; - ip += repLength2; - anchor = ip; - continue; - } - break; - } } } - - /* save reps for next block */ - rep[0] = offset_1; - rep[1] = offset_2; - - /* Return the last literals size */ - return (size_t)(iend - anchor); -} - - -size_t ZSTD_compressBlock_fast_extDict( - ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize) -{ - U32 const mls = ms->cParams.minMatch; - switch(mls) - { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 4); - case 5 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 5); - case 6 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 6); - case 7 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 7); - } -} diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/huf_decompress.c b/src/dependencies/zstd-1.5.0/lib/decompress/huf_decompress.c deleted file mode 100644 index b93c9a0..0000000 --- a/src/dependencies/zstd-1.5.0/lib/decompress/huf_decompress.c +++ /dev/null @@ -1,1351 +0,0 @@ -/* ****************************************************************** - * huff0 huffman decoder, - * part of Finite State Entropy library - * Copyright (c) Yann Collet, Facebook, Inc. - * - * You can contact the author at : - * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. -****************************************************************** */ - -/* ************************************************************** -* Dependencies -****************************************************************/ -#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memset */ -#include "../common/compiler.h" -#include "../common/bitstream.h" /* BIT_* */ -#include "../common/fse.h" /* to compress headers */ -#define HUF_STATIC_LINKING_ONLY -#include "../common/huf.h" -#include "../common/error_private.h" - -/* ************************************************************** -* Macros -****************************************************************/ - -/* These two optional macros force the use one way or another of the two - * Huffman decompression implementations. You can't force in both directions - * at the same time. - */ -#if defined(HUF_FORCE_DECOMPRESS_X1) && \ - defined(HUF_FORCE_DECOMPRESS_X2) -#error "Cannot force the use of the X1 and X2 decoders at the same time!" -#endif - - -/* ************************************************************** -* Error Management -****************************************************************/ -#define HUF_isError ERR_isError - - -/* ************************************************************** -* Byte alignment for workSpace management -****************************************************************/ -#define HUF_ALIGN(x, a) HUF_ALIGN_MASK((x), (a) - 1) -#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) - - -/* ************************************************************** -* BMI2 Variant Wrappers -****************************************************************/ -#if DYNAMIC_BMI2 - -#define HUF_DGEN(fn) \ - \ - static size_t fn##_default( \ - void* dst, size_t dstSize, \ - const void* cSrc, size_t cSrcSize, \ - const HUF_DTable* DTable) \ - { \ - return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ - } \ - \ - static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \ - void* dst, size_t dstSize, \ - const void* cSrc, size_t cSrcSize, \ - const HUF_DTable* DTable) \ - { \ - return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ - } \ - \ - static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ - size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \ - { \ - if (bmi2) { \ - return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \ - } \ - return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \ - } - -#else - -#define HUF_DGEN(fn) \ - static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ - size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \ - { \ - (void)bmi2; \ - return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ - } - -#endif - - -/*-***************************/ -/* generic DTableDesc */ -/*-***************************/ -typedef struct { BYTE maxTableLog; BYTE tableType; BYTE tableLog; BYTE reserved; } DTableDesc; - -static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) -{ - DTableDesc dtd; - ZSTD_memcpy(&dtd, table, sizeof(dtd)); - return dtd; -} - - -#ifndef HUF_FORCE_DECOMPRESS_X2 - -/*-***************************/ -/* single-symbol decoding */ -/*-***************************/ -typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX1; /* single-symbol decoding */ - -/** - * Packs 4 HUF_DEltX1 structs into a U64. This is used to lay down 4 entries at - * a time. - */ -static U64 HUF_DEltX1_set4(BYTE symbol, BYTE nbBits) { - U64 D4; - if (MEM_isLittleEndian()) { - D4 = symbol + (nbBits << 8); - } else { - D4 = (symbol << 8) + nbBits; - } - D4 *= 0x0001000100010001ULL; - return D4; -} - -typedef struct { - U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; - U32 rankStart[HUF_TABLELOG_ABSOLUTEMAX + 1]; - U32 statsWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; - BYTE symbols[HUF_SYMBOLVALUE_MAX + 1]; - BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; -} HUF_ReadDTableX1_Workspace; - - -size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize) -{ - return HUF_readDTableX1_wksp_bmi2(DTable, src, srcSize, workSpace, wkspSize, /* bmi2 */ 0); -} - -size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2) -{ - U32 tableLog = 0; - U32 nbSymbols = 0; - size_t iSize; - void* const dtPtr = DTable + 1; - HUF_DEltX1* const dt = (HUF_DEltX1*)dtPtr; - HUF_ReadDTableX1_Workspace* wksp = (HUF_ReadDTableX1_Workspace*)workSpace; - - DEBUG_STATIC_ASSERT(HUF_DECOMPRESS_WORKSPACE_SIZE >= sizeof(*wksp)); - if (sizeof(*wksp) > wkspSize) return ERROR(tableLog_tooLarge); - - DEBUG_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable)); - /* ZSTD_memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */ - - iSize = HUF_readStats_wksp(wksp->huffWeight, HUF_SYMBOLVALUE_MAX + 1, wksp->rankVal, &nbSymbols, &tableLog, src, srcSize, wksp->statsWksp, sizeof(wksp->statsWksp), bmi2); - if (HUF_isError(iSize)) return iSize; - - /* Table header */ - { DTableDesc dtd = HUF_getDTableDesc(DTable); - if (tableLog > (U32)(dtd.maxTableLog+1)) return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */ - dtd.tableType = 0; - dtd.tableLog = (BYTE)tableLog; - ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); - } - - /* Compute symbols and rankStart given rankVal: - * - * rankVal already contains the number of values of each weight. - * - * symbols contains the symbols ordered by weight. First are the rankVal[0] - * weight 0 symbols, followed by the rankVal[1] weight 1 symbols, and so on. - * symbols[0] is filled (but unused) to avoid a branch. - * - * rankStart contains the offset where each rank belongs in the DTable. - * rankStart[0] is not filled because there are no entries in the table for - * weight 0. - */ - { - int n; - int nextRankStart = 0; - int const unroll = 4; - int const nLimit = (int)nbSymbols - unroll + 1; - for (n=0; n<(int)tableLog+1; n++) { - U32 const curr = nextRankStart; - nextRankStart += wksp->rankVal[n]; - wksp->rankStart[n] = curr; - } - for (n=0; n < nLimit; n += unroll) { - int u; - for (u=0; u < unroll; ++u) { - size_t const w = wksp->huffWeight[n+u]; - wksp->symbols[wksp->rankStart[w]++] = (BYTE)(n+u); - } - } - for (; n < (int)nbSymbols; ++n) { - size_t const w = wksp->huffWeight[n]; - wksp->symbols[wksp->rankStart[w]++] = (BYTE)n; - } - } - - /* fill DTable - * We fill all entries of each weight in order. - * That way length is a constant for each iteration of the outter loop. - * We can switch based on the length to a different inner loop which is - * optimized for that particular case. - */ - { - U32 w; - int symbol=wksp->rankVal[0]; - int rankStart=0; - for (w=1; wrankVal[w]; - int const length = (1 << w) >> 1; - int uStart = rankStart; - BYTE const nbBits = (BYTE)(tableLog + 1 - w); - int s; - int u; - switch (length) { - case 1: - for (s=0; ssymbols[symbol + s]; - D.nbBits = nbBits; - dt[uStart] = D; - uStart += 1; - } - break; - case 2: - for (s=0; ssymbols[symbol + s]; - D.nbBits = nbBits; - dt[uStart+0] = D; - dt[uStart+1] = D; - uStart += 2; - } - break; - case 4: - for (s=0; ssymbols[symbol + s], nbBits); - MEM_write64(dt + uStart, D4); - uStart += 4; - } - break; - case 8: - for (s=0; ssymbols[symbol + s], nbBits); - MEM_write64(dt + uStart, D4); - MEM_write64(dt + uStart + 4, D4); - uStart += 8; - } - break; - default: - for (s=0; ssymbols[symbol + s], nbBits); - for (u=0; u < length; u += 16) { - MEM_write64(dt + uStart + u + 0, D4); - MEM_write64(dt + uStart + u + 4, D4); - MEM_write64(dt + uStart + u + 8, D4); - MEM_write64(dt + uStart + u + 12, D4); - } - assert(u == length); - uStart += length; - } - break; - } - symbol += symbolCount; - rankStart += symbolCount * length; - } - } - return iSize; -} - -FORCE_INLINE_TEMPLATE BYTE -HUF_decodeSymbolX1(BIT_DStream_t* Dstream, const HUF_DEltX1* dt, const U32 dtLog) -{ - size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */ - BYTE const c = dt[val].byte; - BIT_skipBits(Dstream, dt[val].nbBits); - return c; -} - -#define HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) \ - *ptr++ = HUF_decodeSymbolX1(DStreamPtr, dt, dtLog) - -#define HUF_DECODE_SYMBOLX1_1(ptr, DStreamPtr) \ - if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ - HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) - -#define HUF_DECODE_SYMBOLX1_2(ptr, DStreamPtr) \ - if (MEM_64bits()) \ - HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) - -HINT_INLINE size_t -HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX1* const dt, const U32 dtLog) -{ - BYTE* const pStart = p; - - /* up to 4 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { - HUF_DECODE_SYMBOLX1_2(p, bitDPtr); - HUF_DECODE_SYMBOLX1_1(p, bitDPtr); - HUF_DECODE_SYMBOLX1_2(p, bitDPtr); - HUF_DECODE_SYMBOLX1_0(p, bitDPtr); - } - - /* [0-3] symbols remaining */ - if (MEM_32bits()) - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd)) - HUF_DECODE_SYMBOLX1_0(p, bitDPtr); - - /* no more data to retrieve from bitstream, no need to reload */ - while (p < pEnd) - HUF_DECODE_SYMBOLX1_0(p, bitDPtr); - - return pEnd-pStart; -} - -FORCE_INLINE_TEMPLATE size_t -HUF_decompress1X1_usingDTable_internal_body( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - BYTE* op = (BYTE*)dst; - BYTE* const oend = op + dstSize; - const void* dtPtr = DTable + 1; - const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; - BIT_DStream_t bitD; - DTableDesc const dtd = HUF_getDTableDesc(DTable); - U32 const dtLog = dtd.tableLog; - - CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); - - HUF_decodeStreamX1(op, &bitD, oend, dt, dtLog); - - if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); - - return dstSize; -} - -FORCE_INLINE_TEMPLATE size_t -HUF_decompress4X1_usingDTable_internal_body( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - /* Check */ - if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ - - { const BYTE* const istart = (const BYTE*) cSrc; - BYTE* const ostart = (BYTE*) dst; - BYTE* const oend = ostart + dstSize; - BYTE* const olimit = oend - 3; - const void* const dtPtr = DTable + 1; - const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; - - /* Init */ - BIT_DStream_t bitD1; - BIT_DStream_t bitD2; - BIT_DStream_t bitD3; - BIT_DStream_t bitD4; - size_t const length1 = MEM_readLE16(istart); - size_t const length2 = MEM_readLE16(istart+2); - size_t const length3 = MEM_readLE16(istart+4); - size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); - const BYTE* const istart1 = istart + 6; /* jumpTable */ - const BYTE* const istart2 = istart1 + length1; - const BYTE* const istart3 = istart2 + length2; - const BYTE* const istart4 = istart3 + length3; - const size_t segmentSize = (dstSize+3) / 4; - BYTE* const opStart2 = ostart + segmentSize; - BYTE* const opStart3 = opStart2 + segmentSize; - BYTE* const opStart4 = opStart3 + segmentSize; - BYTE* op1 = ostart; - BYTE* op2 = opStart2; - BYTE* op3 = opStart3; - BYTE* op4 = opStart4; - DTableDesc const dtd = HUF_getDTableDesc(DTable); - U32 const dtLog = dtd.tableLog; - U32 endSignal = 1; - - if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ - CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); - CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); - CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); - CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); - - /* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */ - for ( ; (endSignal) & (op4 < olimit) ; ) { - HUF_DECODE_SYMBOLX1_2(op1, &bitD1); - HUF_DECODE_SYMBOLX1_2(op2, &bitD2); - HUF_DECODE_SYMBOLX1_2(op3, &bitD3); - HUF_DECODE_SYMBOLX1_2(op4, &bitD4); - HUF_DECODE_SYMBOLX1_1(op1, &bitD1); - HUF_DECODE_SYMBOLX1_1(op2, &bitD2); - HUF_DECODE_SYMBOLX1_1(op3, &bitD3); - HUF_DECODE_SYMBOLX1_1(op4, &bitD4); - HUF_DECODE_SYMBOLX1_2(op1, &bitD1); - HUF_DECODE_SYMBOLX1_2(op2, &bitD2); - HUF_DECODE_SYMBOLX1_2(op3, &bitD3); - HUF_DECODE_SYMBOLX1_2(op4, &bitD4); - HUF_DECODE_SYMBOLX1_0(op1, &bitD1); - HUF_DECODE_SYMBOLX1_0(op2, &bitD2); - HUF_DECODE_SYMBOLX1_0(op3, &bitD3); - HUF_DECODE_SYMBOLX1_0(op4, &bitD4); - endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; - } - - /* check corruption */ - /* note : should not be necessary : op# advance in lock step, and we control op4. - * but curiously, binary generated by gcc 7.2 & 7.3 with -mbmi2 runs faster when >=1 test is present */ - if (op1 > opStart2) return ERROR(corruption_detected); - if (op2 > opStart3) return ERROR(corruption_detected); - if (op3 > opStart4) return ERROR(corruption_detected); - /* note : op4 supposed already verified within main loop */ - - /* finish bitStreams one by one */ - HUF_decodeStreamX1(op1, &bitD1, opStart2, dt, dtLog); - HUF_decodeStreamX1(op2, &bitD2, opStart3, dt, dtLog); - HUF_decodeStreamX1(op3, &bitD3, opStart4, dt, dtLog); - HUF_decodeStreamX1(op4, &bitD4, oend, dt, dtLog); - - /* check */ - { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); - if (!endCheck) return ERROR(corruption_detected); } - - /* decoded size */ - return dstSize; - } -} - - -typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize, - const void *cSrc, - size_t cSrcSize, - const HUF_DTable *DTable); - -HUF_DGEN(HUF_decompress1X1_usingDTable_internal) -HUF_DGEN(HUF_decompress4X1_usingDTable_internal) - - - -size_t HUF_decompress1X1_usingDTable( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc dtd = HUF_getDTableDesc(DTable); - if (dtd.tableType != 0) return ERROR(GENERIC); - return HUF_decompress1X1_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -} - -size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize) -{ - const BYTE* ip = (const BYTE*) cSrc; - - size_t const hSize = HUF_readDTableX1_wksp(DCtx, cSrc, cSrcSize, workSpace, wkspSize); - if (HUF_isError(hSize)) return hSize; - if (hSize >= cSrcSize) return ERROR(srcSize_wrong); - ip += hSize; cSrcSize -= hSize; - - return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0); -} - - -size_t HUF_decompress4X1_usingDTable( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc dtd = HUF_getDTableDesc(DTable); - if (dtd.tableType != 0) return ERROR(GENERIC); - return HUF_decompress4X1_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -} - -static size_t HUF_decompress4X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize, int bmi2) -{ - const BYTE* ip = (const BYTE*) cSrc; - - size_t const hSize = HUF_readDTableX1_wksp_bmi2(dctx, cSrc, cSrcSize, workSpace, wkspSize, bmi2); - if (HUF_isError(hSize)) return hSize; - if (hSize >= cSrcSize) return ERROR(srcSize_wrong); - ip += hSize; cSrcSize -= hSize; - - return HUF_decompress4X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2); -} - -size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize) -{ - return HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, 0); -} - - -#endif /* HUF_FORCE_DECOMPRESS_X2 */ - - -#ifndef HUF_FORCE_DECOMPRESS_X1 - -/* *************************/ -/* double-symbols decoding */ -/* *************************/ - -typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */ -typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t; -typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1]; -typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX]; - - -/* HUF_fillDTableX2Level2() : - * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ -static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 sizeLog, const U32 consumed, - const U32* rankValOrigin, const int minWeight, - const sortedSymbol_t* sortedSymbols, const U32 sortedListSize, - U32 nbBitsBaseline, U16 baseSeq, U32* wksp, size_t wkspSize) -{ - HUF_DEltX2 DElt; - U32* rankVal = wksp; - - assert(wkspSize >= HUF_TABLELOG_MAX + 1); - (void)wkspSize; - /* get pre-calculated rankVal */ - ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1)); - - /* fill skipped values */ - if (minWeight>1) { - U32 i, skipSize = rankVal[minWeight]; - MEM_writeLE16(&(DElt.sequence), baseSeq); - DElt.nbBits = (BYTE)(consumed); - DElt.length = 1; - for (i = 0; i < skipSize; i++) - DTable[i] = DElt; - } - - /* fill DTable */ - { U32 s; for (s=0; s= 1 */ - - rankVal[weight] += length; - } } -} - - -static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog, - const sortedSymbol_t* sortedList, const U32 sortedListSize, - const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight, - const U32 nbBitsBaseline, U32* wksp, size_t wkspSize) -{ - U32* rankVal = wksp; - const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */ - const U32 minBits = nbBitsBaseline - maxWeight; - U32 s; - - assert(wkspSize >= HUF_TABLELOG_MAX + 1); - wksp += HUF_TABLELOG_MAX + 1; - wkspSize -= HUF_TABLELOG_MAX + 1; - - ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1)); - - /* fill DTable */ - for (s=0; s= minBits) { /* enough room for a second symbol */ - U32 sortedRank; - int minWeight = nbBits + scaleLog; - if (minWeight < 1) minWeight = 1; - sortedRank = rankStart[minWeight]; - HUF_fillDTableX2Level2(DTable+start, targetLog-nbBits, nbBits, - rankValOrigin[nbBits], minWeight, - sortedList+sortedRank, sortedListSize-sortedRank, - nbBitsBaseline, symbol, wksp, wkspSize); - } else { - HUF_DEltX2 DElt; - MEM_writeLE16(&(DElt.sequence), symbol); - DElt.nbBits = (BYTE)(nbBits); - DElt.length = 1; - { U32 const end = start + length; - U32 u; - for (u = start; u < end; u++) DTable[u] = DElt; - } } - rankVal[weight] += length; - } -} - -typedef struct { - rankValCol_t rankVal[HUF_TABLELOG_MAX]; - U32 rankStats[HUF_TABLELOG_MAX + 1]; - U32 rankStart0[HUF_TABLELOG_MAX + 2]; - sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1]; - BYTE weightList[HUF_SYMBOLVALUE_MAX + 1]; - U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; -} HUF_ReadDTableX2_Workspace; - -size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, - const void* src, size_t srcSize, - void* workSpace, size_t wkspSize) -{ - U32 tableLog, maxW, sizeOfSort, nbSymbols; - DTableDesc dtd = HUF_getDTableDesc(DTable); - U32 const maxTableLog = dtd.maxTableLog; - size_t iSize; - void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */ - HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr; - U32 *rankStart; - - HUF_ReadDTableX2_Workspace* const wksp = (HUF_ReadDTableX2_Workspace*)workSpace; - - if (sizeof(*wksp) > wkspSize) return ERROR(GENERIC); - - rankStart = wksp->rankStart0 + 1; - ZSTD_memset(wksp->rankStats, 0, sizeof(wksp->rankStats)); - ZSTD_memset(wksp->rankStart0, 0, sizeof(wksp->rankStart0)); - - DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */ - if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); - /* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */ - - iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), /* bmi2 */ 0); - if (HUF_isError(iSize)) return iSize; - - /* check result */ - if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */ - - /* find maxWeight */ - for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */ - - /* Get start index of each weight */ - { U32 w, nextRankStart = 0; - for (w=1; wrankStats[w]; - rankStart[w] = curr; - } - rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/ - sizeOfSort = nextRankStart; - } - - /* sort symbols by weight */ - { U32 s; - for (s=0; sweightList[s]; - U32 const r = rankStart[w]++; - wksp->sortedSymbol[r].symbol = (BYTE)s; - wksp->sortedSymbol[r].weight = (BYTE)w; - } - rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */ - } - - /* Build rankVal */ - { U32* const rankVal0 = wksp->rankVal[0]; - { int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */ - U32 nextRankVal = 0; - U32 w; - for (w=1; wrankStats[w] << (w+rescale); - rankVal0[w] = curr; - } } - { U32 const minBits = tableLog+1 - maxW; - U32 consumed; - for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) { - U32* const rankValPtr = wksp->rankVal[consumed]; - U32 w; - for (w = 1; w < maxW+1; w++) { - rankValPtr[w] = rankVal0[w] >> consumed; - } } } } - - HUF_fillDTableX2(dt, maxTableLog, - wksp->sortedSymbol, sizeOfSort, - wksp->rankStart0, wksp->rankVal, maxW, - tableLog+1, - wksp->calleeWksp, sizeof(wksp->calleeWksp) / sizeof(U32)); - - dtd.tableLog = (BYTE)maxTableLog; - dtd.tableType = 1; - ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); - return iSize; -} - - -FORCE_INLINE_TEMPLATE U32 -HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) -{ - size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ - ZSTD_memcpy(op, dt+val, 2); - BIT_skipBits(DStream, dt[val].nbBits); - return dt[val].length; -} - -FORCE_INLINE_TEMPLATE U32 -HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) -{ - size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ - ZSTD_memcpy(op, dt+val, 1); - if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits); - else { - if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) { - BIT_skipBits(DStream, dt[val].nbBits); - if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8)) - /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */ - DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); - } } - return 1; -} - -#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \ - ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) - -#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \ - if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ - ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) - -#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \ - if (MEM_64bits()) \ - ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) - -HINT_INLINE size_t -HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, - const HUF_DEltX2* const dt, const U32 dtLog) -{ - BYTE* const pStart = p; - - /* up to 8 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { - HUF_DECODE_SYMBOLX2_2(p, bitDPtr); - HUF_DECODE_SYMBOLX2_1(p, bitDPtr); - HUF_DECODE_SYMBOLX2_2(p, bitDPtr); - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); - } - - /* closer to end : up to 2 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); - - while (p <= pEnd-2) - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ - - if (p < pEnd) - p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog); - - return p-pStart; -} - -FORCE_INLINE_TEMPLATE size_t -HUF_decompress1X2_usingDTable_internal_body( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - BIT_DStream_t bitD; - - /* Init */ - CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); - - /* decode */ - { BYTE* const ostart = (BYTE*) dst; - BYTE* const oend = ostart + dstSize; - const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */ - const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; - DTableDesc const dtd = HUF_getDTableDesc(DTable); - HUF_decodeStreamX2(ostart, &bitD, oend, dt, dtd.tableLog); - } - - /* check */ - if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); - - /* decoded size */ - return dstSize; -} - -FORCE_INLINE_TEMPLATE size_t -HUF_decompress4X2_usingDTable_internal_body( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ - - { const BYTE* const istart = (const BYTE*) cSrc; - BYTE* const ostart = (BYTE*) dst; - BYTE* const oend = ostart + dstSize; - BYTE* const olimit = oend - (sizeof(size_t)-1); - const void* const dtPtr = DTable+1; - const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; - - /* Init */ - BIT_DStream_t bitD1; - BIT_DStream_t bitD2; - BIT_DStream_t bitD3; - BIT_DStream_t bitD4; - size_t const length1 = MEM_readLE16(istart); - size_t const length2 = MEM_readLE16(istart+2); - size_t const length3 = MEM_readLE16(istart+4); - size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); - const BYTE* const istart1 = istart + 6; /* jumpTable */ - const BYTE* const istart2 = istart1 + length1; - const BYTE* const istart3 = istart2 + length2; - const BYTE* const istart4 = istart3 + length3; - size_t const segmentSize = (dstSize+3) / 4; - BYTE* const opStart2 = ostart + segmentSize; - BYTE* const opStart3 = opStart2 + segmentSize; - BYTE* const opStart4 = opStart3 + segmentSize; - BYTE* op1 = ostart; - BYTE* op2 = opStart2; - BYTE* op3 = opStart3; - BYTE* op4 = opStart4; - U32 endSignal = 1; - DTableDesc const dtd = HUF_getDTableDesc(DTable); - U32 const dtLog = dtd.tableLog; - - if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ - CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); - CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); - CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); - CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); - - /* 16-32 symbols per loop (4-8 symbols per stream) */ - for ( ; (endSignal) & (op4 < olimit); ) { -#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_1(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_0(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_1(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_0(op2, &bitD2); - endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_1(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_0(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_1(op4, &bitD4); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_0(op4, &bitD4); - endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; -#else - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_1(op1, &bitD1); - HUF_DECODE_SYMBOLX2_1(op2, &bitD2); - HUF_DECODE_SYMBOLX2_1(op3, &bitD3); - HUF_DECODE_SYMBOLX2_1(op4, &bitD4); - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_0(op1, &bitD1); - HUF_DECODE_SYMBOLX2_0(op2, &bitD2); - HUF_DECODE_SYMBOLX2_0(op3, &bitD3); - HUF_DECODE_SYMBOLX2_0(op4, &bitD4); - endSignal = (U32)LIKELY( - (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); -#endif - } - - /* check corruption */ - if (op1 > opStart2) return ERROR(corruption_detected); - if (op2 > opStart3) return ERROR(corruption_detected); - if (op3 > opStart4) return ERROR(corruption_detected); - /* note : op4 already verified within main loop */ - - /* finish bitStreams one by one */ - HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog); - HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog); - HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog); - HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog); - - /* check */ - { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); - if (!endCheck) return ERROR(corruption_detected); } - - /* decoded size */ - return dstSize; - } -} - -HUF_DGEN(HUF_decompress1X2_usingDTable_internal) -HUF_DGEN(HUF_decompress4X2_usingDTable_internal) - -size_t HUF_decompress1X2_usingDTable( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc dtd = HUF_getDTableDesc(DTable); - if (dtd.tableType != 1) return ERROR(GENERIC); - return HUF_decompress1X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -} - -size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize) -{ - const BYTE* ip = (const BYTE*) cSrc; - - size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, - workSpace, wkspSize); - if (HUF_isError(hSize)) return hSize; - if (hSize >= cSrcSize) return ERROR(srcSize_wrong); - ip += hSize; cSrcSize -= hSize; - - return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0); -} - - -size_t HUF_decompress4X2_usingDTable( - void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc dtd = HUF_getDTableDesc(DTable); - if (dtd.tableType != 1) return ERROR(GENERIC); - return HUF_decompress4X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -} - -static size_t HUF_decompress4X2_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize, int bmi2) -{ - const BYTE* ip = (const BYTE*) cSrc; - - size_t hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, - workSpace, wkspSize); - if (HUF_isError(hSize)) return hSize; - if (hSize >= cSrcSize) return ERROR(srcSize_wrong); - ip += hSize; cSrcSize -= hSize; - - return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2); -} - -size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize) -{ - return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, /* bmi2 */ 0); -} - - -#endif /* HUF_FORCE_DECOMPRESS_X1 */ - - -/* ***********************************/ -/* Universal decompression selectors */ -/* ***********************************/ - -size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc const dtd = HUF_getDTableDesc(DTable); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)dtd; - assert(dtd.tableType == 0); - return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)dtd; - assert(dtd.tableType == 1); - return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#else - return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) : - HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#endif -} - -size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, - const void* cSrc, size_t cSrcSize, - const HUF_DTable* DTable) -{ - DTableDesc const dtd = HUF_getDTableDesc(DTable); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)dtd; - assert(dtd.tableType == 0); - return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)dtd; - assert(dtd.tableType == 1); - return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#else - return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) : - HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0); -#endif -} - - -#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) -typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t; -static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] = -{ - /* single, double, quad */ - {{0,0}, {1,1}, {2,2}}, /* Q==0 : impossible */ - {{0,0}, {1,1}, {2,2}}, /* Q==1 : impossible */ - {{ 38,130}, {1313, 74}, {2151, 38}}, /* Q == 2 : 12-18% */ - {{ 448,128}, {1353, 74}, {2238, 41}}, /* Q == 3 : 18-25% */ - {{ 556,128}, {1353, 74}, {2238, 47}}, /* Q == 4 : 25-32% */ - {{ 714,128}, {1418, 74}, {2436, 53}}, /* Q == 5 : 32-38% */ - {{ 883,128}, {1437, 74}, {2464, 61}}, /* Q == 6 : 38-44% */ - {{ 897,128}, {1515, 75}, {2622, 68}}, /* Q == 7 : 44-50% */ - {{ 926,128}, {1613, 75}, {2730, 75}}, /* Q == 8 : 50-56% */ - {{ 947,128}, {1729, 77}, {3359, 77}}, /* Q == 9 : 56-62% */ - {{1107,128}, {2083, 81}, {4006, 84}}, /* Q ==10 : 62-69% */ - {{1177,128}, {2379, 87}, {4785, 88}}, /* Q ==11 : 69-75% */ - {{1242,128}, {2415, 93}, {5155, 84}}, /* Q ==12 : 75-81% */ - {{1349,128}, {2644,106}, {5260,106}}, /* Q ==13 : 81-87% */ - {{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */ - {{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */ -}; -#endif - -/** HUF_selectDecoder() : - * Tells which decoder is likely to decode faster, - * based on a set of pre-computed metrics. - * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . - * Assumption : 0 < dstSize <= 128 KB */ -U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize) -{ - assert(dstSize > 0); - assert(dstSize <= 128*1024); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)dstSize; - (void)cSrcSize; - return 0; -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)dstSize; - (void)cSrcSize; - return 1; -#else - /* decoder timing evaluation */ - { U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */ - U32 const D256 = (U32)(dstSize >> 8); - U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256); - U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256); - DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, to reduce cache eviction */ - return DTime1 < DTime0; - } -#endif -} - - -size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, - size_t dstSize, const void* cSrc, - size_t cSrcSize, void* workSpace, - size_t wkspSize) -{ - /* validation checks */ - if (dstSize == 0) return ERROR(dstSize_tooSmall); - if (cSrcSize == 0) return ERROR(corruption_detected); - - { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)algoNb; - assert(algoNb == 0); - return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)algoNb; - assert(algoNb == 1); - return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize); -#else - return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, - cSrcSize, workSpace, wkspSize): - HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize); -#endif - } -} - -size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize, - void* workSpace, size_t wkspSize) -{ - /* validation checks */ - if (dstSize == 0) return ERROR(dstSize_tooSmall); - if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ - if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ - if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ - - { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)algoNb; - assert(algoNb == 0); - return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, - cSrcSize, workSpace, wkspSize); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)algoNb; - assert(algoNb == 1); - return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, - cSrcSize, workSpace, wkspSize); -#else - return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, - cSrcSize, workSpace, wkspSize): - HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, - cSrcSize, workSpace, wkspSize); -#endif - } -} - - -size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2) -{ - DTableDesc const dtd = HUF_getDTableDesc(DTable); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)dtd; - assert(dtd.tableType == 0); - return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)dtd; - assert(dtd.tableType == 1); - return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#else - return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) : - HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#endif -} - -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2) -{ - const BYTE* ip = (const BYTE*) cSrc; - - size_t const hSize = HUF_readDTableX1_wksp_bmi2(dctx, cSrc, cSrcSize, workSpace, wkspSize, bmi2); - if (HUF_isError(hSize)) return hSize; - if (hSize >= cSrcSize) return ERROR(srcSize_wrong); - ip += hSize; cSrcSize -= hSize; - - return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2); -} -#endif - -size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2) -{ - DTableDesc const dtd = HUF_getDTableDesc(DTable); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)dtd; - assert(dtd.tableType == 0); - return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)dtd; - assert(dtd.tableType == 1); - return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#else - return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) : - HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2); -#endif -} - -size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2) -{ - /* validation checks */ - if (dstSize == 0) return ERROR(dstSize_tooSmall); - if (cSrcSize == 0) return ERROR(corruption_detected); - - { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)algoNb; - assert(algoNb == 0); - return HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)algoNb; - assert(algoNb == 1); - return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2); -#else - return algoNb ? HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2) : - HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2); -#endif - } -} - -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_readDTableX1(HUF_DTable* DTable, const void* src, size_t srcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_readDTableX1_wksp(DTable, src, srcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress1X1_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress1X1_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - HUF_CREATE_STATIC_DTABLEX1(DTable, HUF_TABLELOG_MAX); - return HUF_decompress1X1_DCtx (DTable, dst, dstSize, cSrc, cSrcSize); -} -#endif - -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_readDTableX2(HUF_DTable* DTable, const void* src, size_t srcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_readDTableX2_wksp(DTable, src, srcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress1X2_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress1X2_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX); - return HUF_decompress1X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize); -} -#endif - -#ifndef HUF_FORCE_DECOMPRESS_X2 -size_t HUF_decompress4X1_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} -size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - HUF_CREATE_STATIC_DTABLEX1(DTable, HUF_TABLELOG_MAX); - return HUF_decompress4X1_DCtx(DTable, dst, dstSize, cSrc, cSrcSize); -} -#endif - -#ifndef HUF_FORCE_DECOMPRESS_X1 -size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX); - return HUF_decompress4X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize); -} -#endif - -typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); - -size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ -#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) - static const decompressionAlgo decompress[2] = { HUF_decompress4X1, HUF_decompress4X2 }; -#endif - - /* validation checks */ - if (dstSize == 0) return ERROR(dstSize_tooSmall); - if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ - if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ - if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ - - { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)algoNb; - assert(algoNb == 0); - return HUF_decompress4X1(dst, dstSize, cSrc, cSrcSize); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)algoNb; - assert(algoNb == 1); - return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize); -#else - return decompress[algoNb](dst, dstSize, cSrc, cSrcSize); -#endif - } -} - -size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - /* validation checks */ - if (dstSize == 0) return ERROR(dstSize_tooSmall); - if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ - if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ - if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ - - { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); -#if defined(HUF_FORCE_DECOMPRESS_X1) - (void)algoNb; - assert(algoNb == 0); - return HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize); -#elif defined(HUF_FORCE_DECOMPRESS_X2) - (void)algoNb; - assert(algoNb == 1); - return HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize); -#else - return algoNb ? HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) : - HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) ; -#endif - } -} - -size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress4X_hufOnly_wksp(dctx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} - -size_t HUF_decompress1X_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, - const void* cSrc, size_t cSrcSize) -{ - U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; - return HUF_decompress1X_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, - workSpace, sizeof(workSpace)); -} -#endif diff --git a/src/dependencies/zstd-1.5.0/programs/timefn.c b/src/dependencies/zstd-1.5.0/programs/timefn.c deleted file mode 100644 index 64577b0..0000000 --- a/src/dependencies/zstd-1.5.0/programs/timefn.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) Yann Collet, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - - -/* === Dependencies === */ - -#include "timefn.h" - - -/*-**************************************** -* Time functions -******************************************/ - -#if defined(_WIN32) /* Windows */ - -#include /* abort */ -#include /* perror */ - -UTIL_time_t UTIL_getTime(void) { UTIL_time_t x; QueryPerformanceCounter(&x); return x; } - -PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd) -{ - static LARGE_INTEGER ticksPerSecond; - static int init = 0; - if (!init) { - if (!QueryPerformanceFrequency(&ticksPerSecond)) { - perror("timefn::QueryPerformanceFrequency"); - abort(); - } - init = 1; - } - return 1000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart; -} - -PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd) -{ - static LARGE_INTEGER ticksPerSecond; - static int init = 0; - if (!init) { - if (!QueryPerformanceFrequency(&ticksPerSecond)) { - perror("timefn::QueryPerformanceFrequency"); - abort(); - } - init = 1; - } - return 1000000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart; -} - - - -#elif defined(__APPLE__) && defined(__MACH__) - -UTIL_time_t UTIL_getTime(void) { return mach_absolute_time(); } - -PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd) -{ - static mach_timebase_info_data_t rate; - static int init = 0; - if (!init) { - mach_timebase_info(&rate); - init = 1; - } - return (((clockEnd - clockStart) * (PTime)rate.numer) / ((PTime)rate.denom))/1000ULL; -} - -PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd) -{ - static mach_timebase_info_data_t rate; - static int init = 0; - if (!init) { - mach_timebase_info(&rate); - init = 1; - } - return ((clockEnd - clockStart) * (PTime)rate.numer) / ((PTime)rate.denom); -} - - -/* C11 requires timespec_get, but FreeBSD 11 lacks it, while still claiming C11 compliance. - Android also lacks it but does define TIME_UTC. */ -#elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \ - && defined(TIME_UTC) && !defined(__ANDROID__) - -#include /* abort */ -#include /* perror */ - -UTIL_time_t UTIL_getTime(void) -{ - /* time must be initialized, othersize it may fail msan test. - * No good reason, likely a limitation of timespec_get() for some target */ - UTIL_time_t time = UTIL_TIME_INITIALIZER; - if (timespec_get(&time, TIME_UTC) != TIME_UTC) { - perror("timefn::timespec_get"); - abort(); - } - return time; -} - -static UTIL_time_t UTIL_getSpanTime(UTIL_time_t begin, UTIL_time_t end) -{ - UTIL_time_t diff; - if (end.tv_nsec < begin.tv_nsec) { - diff.tv_sec = (end.tv_sec - 1) - begin.tv_sec; - diff.tv_nsec = (end.tv_nsec + 1000000000ULL) - begin.tv_nsec; - } else { - diff.tv_sec = end.tv_sec - begin.tv_sec; - diff.tv_nsec = end.tv_nsec - begin.tv_nsec; - } - return diff; -} - -PTime UTIL_getSpanTimeMicro(UTIL_time_t begin, UTIL_time_t end) -{ - UTIL_time_t const diff = UTIL_getSpanTime(begin, end); - PTime micro = 0; - micro += 1000000ULL * diff.tv_sec; - micro += diff.tv_nsec / 1000ULL; - return micro; -} - -PTime UTIL_getSpanTimeNano(UTIL_time_t begin, UTIL_time_t end) -{ - UTIL_time_t const diff = UTIL_getSpanTime(begin, end); - PTime nano = 0; - nano += 1000000000ULL * diff.tv_sec; - nano += diff.tv_nsec; - return nano; -} - - - -#else /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */ - -UTIL_time_t UTIL_getTime(void) { return clock(); } -PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; } -PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; } - -#endif - - - -/* returns time span in microseconds */ -PTime UTIL_clockSpanMicro(UTIL_time_t clockStart ) -{ - UTIL_time_t const clockEnd = UTIL_getTime(); - return UTIL_getSpanTimeMicro(clockStart, clockEnd); -} - -/* returns time span in microseconds */ -PTime UTIL_clockSpanNano(UTIL_time_t clockStart ) -{ - UTIL_time_t const clockEnd = UTIL_getTime(); - return UTIL_getSpanTimeNano(clockStart, clockEnd); -} - -void UTIL_waitForNextTick(void) -{ - UTIL_time_t const clockStart = UTIL_getTime(); - UTIL_time_t clockEnd; - do { - clockEnd = UTIL_getTime(); - } while (UTIL_getSpanTimeNano(clockStart, clockEnd) == 0); -} diff --git a/src/dependencies/zstd-1.5.0/programs/zstdgrep.1 b/src/dependencies/zstd-1.5.0/programs/zstdgrep.1 deleted file mode 100644 index bf96185..0000000 --- a/src/dependencies/zstd-1.5.0/programs/zstdgrep.1 +++ /dev/null @@ -1,23 +0,0 @@ -. -.TH "ZSTDGREP" "1" "May 2021" "zstd 1.5.0" "User Commands" -. -.SH "NAME" -\fBzstdgrep\fR \- print lines matching a pattern in zstandard\-compressed files -. -.SH "SYNOPSIS" -\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \.\.\.] -. -.SH "DESCRIPTION" -\fBzstdgrep\fR runs \fBgrep (1)\fR on files or stdin, if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. -.P -The grep\-flags and pattern arguments are passed on to \fBgrep (1)\fR\. If an \fB\-e\fR flag is found in the \fBgrep\-flags\fR, \fBzstdgrep\fR will not look for a pattern argument\. -. -.SH "EXIT STATUS" -In case of missing arguments or missing pattern, 1 will be returned, otherwise 0\. -. -.SH "SEE ALSO" -\fBzstd (1)\fR -. -.SH "AUTHORS" -Thomas Klausner \fIwiz@NetBSD\.org\fR diff --git a/src/dependencies/zstd-1.5.0/programs/zstdgrep.1.md b/src/dependencies/zstd-1.5.0/programs/zstdgrep.1.md deleted file mode 100644 index 363ad4f..0000000 --- a/src/dependencies/zstd-1.5.0/programs/zstdgrep.1.md +++ /dev/null @@ -1,26 +0,0 @@ -zstdgrep(1) -- print lines matching a pattern in zstandard-compressed files -============================================================================ - -SYNOPSIS --------- - -`zstdgrep` [*grep-flags*] [--] _pattern_ [_files_ ...] - - -DESCRIPTION ------------ -`zstdgrep` runs `grep (1)` on files or stdin, if no files argument is given, after decompressing them with `zstdcat (1)`. - -The grep-flags and pattern arguments are passed on to `grep (1)`. If an `-e` flag is found in the `grep-flags`, `zstdgrep` will not look for a pattern argument. - -EXIT STATUS ------------ -In case of missing arguments or missing pattern, 1 will be returned, otherwise 0. - -SEE ALSO --------- -`zstd (1)` - -AUTHORS -------- -Thomas Klausner diff --git a/src/dependencies/zstd-1.5.0/programs/zstdless b/src/dependencies/zstd-1.5.0/programs/zstdless deleted file mode 100755 index 893799e..0000000 --- a/src/dependencies/zstd-1.5.0/programs/zstdless +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -zstdcat "$@" | less diff --git a/src/dependencies/zstd-1.5.0/programs/zstdless.1 b/src/dependencies/zstd-1.5.0/programs/zstdless.1 deleted file mode 100644 index f08bc19..0000000 --- a/src/dependencies/zstd-1.5.0/programs/zstdless.1 +++ /dev/null @@ -1,14 +0,0 @@ -. -.TH "ZSTDLESS" "1" "May 2021" "zstd 1.5.0" "User Commands" -. -.SH "NAME" -\fBzstdless\fR \- view zstandard\-compressed files -. -.SH "SYNOPSIS" -\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \.\.\.] -. -.SH "DESCRIPTION" -\fBzstdless\fR runs \fBless (1)\fR on files or stdin, if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. -.SH "SEE ALSO" -\fBzstd (1)\fR diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/sequence_compression_api.c b/src/dependencies/zstd-1.5.0/tests/fuzz/sequence_compression_api.c deleted file mode 100644 index cc840bf..0000000 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/sequence_compression_api.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -/** - * This fuzz target performs a zstd round-trip test by generating an arbitrary - * array of sequences, generating the associated source buffer, calling - * ZSTD_compressSequences(), and then decompresses and compares the result with - * the original generated source buffer. - */ - -#define ZSTD_STATIC_LINKING_ONLY - -#include -#include -#include -#include -#include -#include "fuzz_helpers.h" -#include "zstd_helpers.h" -#include "fuzz_data_producer.h" - -static ZSTD_CCtx *cctx = NULL; -static ZSTD_DCtx *dctx = NULL; -static void* literalsBuffer = NULL; -static void* generatedSrc = NULL; -static ZSTD_Sequence* generatedSequences = NULL; - -#define ZSTD_FUZZ_GENERATED_SRC_MAXSIZE (1 << 20) /* Allow up to 1MB generated data */ -#define ZSTD_FUZZ_MATCHLENGTH_MAXSIZE (1 << 18) /* Allow up to 256KB matches */ -#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << 18) /* Allow up to a 256KB dict */ -#define ZSTD_FUZZ_GENERATED_LITERALS_SIZE (1 << 18) /* Fixed size 256KB literals buffer */ -#define ZSTD_FUZZ_MAX_NBSEQ (1 << 17) /* Maximum of 128K sequences */ - -/* Deterministic random number generator */ -#define FUZZ_RDG_rotl32(x,r) ((x << r) | (x >> (32 - r))) -static uint32_t FUZZ_RDG_rand(uint32_t* src) -{ - static const uint32_t prime1 = 2654435761U; - static const uint32_t prime2 = 2246822519U; - uint32_t rand32 = *src; - rand32 *= prime1; - rand32 ^= prime2; - rand32 = FUZZ_RDG_rotl32(rand32, 13); - *src = rand32; - return rand32 >> 5; -} - -/* Make a pseudorandom string - this simple function exists to avoid - * taking a dependency on datagen.h to have RDG_genBuffer(). - */ -static char *generatePseudoRandomString(char *str, size_t size) { - const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1234567890!@#$^&*()_"; - uint32_t seed = 0; - if (size) { - for (size_t n = 0; n < size; n++) { - int key = FUZZ_RDG_rand(&seed) % (int) (sizeof charset - 1); - str[n] = charset[key]; - } - } - return str; -} - -/* Returns size of source buffer */ -static size_t decodeSequences(void* dst, size_t nbSequences, - size_t literalsSize, const void* dict, size_t dictSize) { - const uint8_t* litPtr = literalsBuffer; - const uint8_t* const litBegin = literalsBuffer; - const uint8_t* const litEnd = literalsBuffer + literalsSize; - const uint8_t* dictPtr = dict; - uint8_t* op = dst; - const uint8_t* const oend = dst + ZSTD_FUZZ_GENERATED_SRC_MAXSIZE; - size_t generatedSrcBufferSize = 0; - size_t bytesWritten = 0; - uint32_t lastLLSize; - - for (size_t i = 0; i < nbSequences; ++i) { - FUZZ_ASSERT(generatedSequences[i].matchLength != 0); - FUZZ_ASSERT(generatedSequences[i].offset != 0); - - if (litPtr + generatedSequences[i].litLength > litEnd) { - litPtr = litBegin; - } - ZSTD_memcpy(op, litPtr, generatedSequences[i].litLength); - bytesWritten += generatedSequences[i].litLength; - op += generatedSequences[i].litLength; - litPtr += generatedSequences[i].litLength; - - FUZZ_ASSERT(generatedSequences[i].offset != 0); - /* Copy over the match */ - { size_t matchLength = generatedSequences[i].matchLength; - size_t j = 0; - size_t k = 0; - if (dictSize != 0) { - if (generatedSequences[i].offset > bytesWritten) { - /* Offset goes into the dictionary */ - size_t offsetFromEndOfDict = generatedSequences[i].offset - bytesWritten; - for (; k < offsetFromEndOfDict && k < matchLength; ++k) { - op[k] = dictPtr[dictSize - offsetFromEndOfDict + k]; - } - matchLength -= k; - op += k; - } - } - for (; j < matchLength; ++j) { - op[j] = op[j-(int)generatedSequences[i].offset]; - } - op += j; - FUZZ_ASSERT(generatedSequences[i].matchLength == j + k); - bytesWritten += generatedSequences[i].matchLength; - } - } - generatedSrcBufferSize = bytesWritten; - FUZZ_ASSERT(litPtr <= litEnd); - lastLLSize = (uint32_t)(litEnd - litPtr); - if (lastLLSize <= oend - op) { - ZSTD_memcpy(op, litPtr, lastLLSize); - generatedSrcBufferSize += lastLLSize; - } - return generatedSrcBufferSize; -} - -/* Returns nb sequences generated - * TODO: Add repcode fuzzing once we support repcode match splits - */ -static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, - size_t literalsSizeLimit, size_t dictSize, - size_t windowLog) { - uint32_t bytesGenerated = 0; - uint32_t nbSeqGenerated = 0; - uint32_t litLength; - uint32_t matchLength; - uint32_t matchBound; - uint32_t offset; - uint32_t offsetBound; - uint32_t repCode = 0; - uint32_t isFirstSequence = 1; - uint32_t windowSize = 1 << windowLog; - - while (nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ - && bytesGenerated < ZSTD_FUZZ_GENERATED_SRC_MAXSIZE - && !FUZZ_dataProducer_empty(producer)) { - matchBound = ZSTD_FUZZ_MATCHLENGTH_MAXSIZE; - litLength = isFirstSequence && dictSize == 0 ? FUZZ_dataProducer_uint32Range(producer, 1, literalsSizeLimit) - : FUZZ_dataProducer_uint32Range(producer, 0, literalsSizeLimit); - bytesGenerated += litLength; - if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { - break; - } - offsetBound = bytesGenerated > windowSize ? windowSize : bytesGenerated + dictSize; - offset = FUZZ_dataProducer_uint32Range(producer, 1, offsetBound); - if (dictSize > 0 && bytesGenerated <= windowSize) { - /* Prevent match length from being such that it would be associated with an offset too large - * from the decoder's perspective. If not possible (match would be too small), - * then reduce the offset if necessary. - */ - size_t bytesToReachWindowSize = windowSize - bytesGenerated; - if (bytesToReachWindowSize < ZSTD_MINMATCH_MIN) { - uint32_t newOffsetBound = offsetBound > windowSize ? windowSize : offsetBound; - offset = FUZZ_dataProducer_uint32Range(producer, 1, newOffsetBound); - } else { - matchBound = bytesToReachWindowSize > ZSTD_FUZZ_MATCHLENGTH_MAXSIZE ? - ZSTD_FUZZ_MATCHLENGTH_MAXSIZE : bytesToReachWindowSize; - } - } - matchLength = FUZZ_dataProducer_uint32Range(producer, ZSTD_MINMATCH_MIN, matchBound); - bytesGenerated += matchLength; - if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { - break; - } - ZSTD_Sequence seq = {offset, litLength, matchLength, repCode}; - generatedSequences[nbSeqGenerated++] = seq; - isFirstSequence = 0; - } - - return nbSeqGenerated; -} - -static size_t roundTripTest(void *result, size_t resultCapacity, - void *compressed, size_t compressedCapacity, - size_t srcSize, - const void *dict, size_t dictSize, - size_t generatedSequencesSize, - size_t wLog, unsigned cLevel, unsigned hasDict) -{ - size_t cSize; - size_t dSize; - ZSTD_CDict* cdict = NULL; - ZSTD_DDict* ddict = NULL; - - ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, cLevel); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, wLog); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, ZSTD_MINMATCH_MIN); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1); - /* TODO: Add block delim mode fuzzing */ - ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); - if (hasDict) { - FUZZ_ZASSERT(ZSTD_CCtx_loadDictionary(cctx, dict, dictSize)); - FUZZ_ZASSERT(ZSTD_DCtx_loadDictionary(dctx, dict, dictSize)); - } - - cSize = ZSTD_compressSequences(cctx, compressed, compressedCapacity, - generatedSequences, generatedSequencesSize, - generatedSrc, srcSize); - FUZZ_ZASSERT(cSize); - dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize); - FUZZ_ZASSERT(dSize); - - if (cdict) { - ZSTD_freeCDict(cdict); - } - if (ddict) { - ZSTD_freeDDict(ddict); - } - return dSize; -} - -int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) -{ - void* rBuf; - size_t rBufSize; - void* cBuf; - size_t cBufSize; - size_t generatedSrcSize; - size_t nbSequences; - void* dictBuffer; - size_t dictSize = 0; - unsigned hasDict; - unsigned wLog; - int cLevel; - - FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size); - if (literalsBuffer == NULL) { - literalsBuffer = FUZZ_malloc(ZSTD_FUZZ_GENERATED_LITERALS_SIZE); - literalsBuffer = generatePseudoRandomString(literalsBuffer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE); - } - - hasDict = FUZZ_dataProducer_uint32Range(producer, 0, 1); - if (hasDict) { - dictSize = FUZZ_dataProducer_uint32Range(producer, 1, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE); - dictBuffer = FUZZ_malloc(dictSize); - dictBuffer = generatePseudoRandomString(dictBuffer, dictSize); - } - /* Generate window log first so we dont generate offsets too large */ - wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX_32); - cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22); - - if (!generatedSequences) { - generatedSequences = FUZZ_malloc(sizeof(ZSTD_Sequence)*ZSTD_FUZZ_MAX_NBSEQ); - } - if (!generatedSrc) { - generatedSrc = FUZZ_malloc(ZSTD_FUZZ_GENERATED_SRC_MAXSIZE); - } - nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog); - generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize); - cBufSize = ZSTD_compressBound(generatedSrcSize); - cBuf = FUZZ_malloc(cBufSize); - - rBufSize = generatedSrcSize; - rBuf = FUZZ_malloc(rBufSize); - - if (!cctx) { - cctx = ZSTD_createCCtx(); - FUZZ_ASSERT(cctx); - } - if (!dctx) { - dctx = ZSTD_createDCtx(); - FUZZ_ASSERT(dctx); - } - - size_t const result = roundTripTest(rBuf, rBufSize, - cBuf, cBufSize, - generatedSrcSize, - dictBuffer, dictSize, - nbSequences, - wLog, cLevel, hasDict); - FUZZ_ZASSERT(result); - FUZZ_ASSERT_MSG(result == generatedSrcSize, "Incorrect regenerated size"); - FUZZ_ASSERT_MSG(!FUZZ_memcmp(generatedSrc, rBuf, generatedSrcSize), "Corruption!"); - - free(rBuf); - free(cBuf); - FUZZ_dataProducer_free(producer); - if (hasDict) { - free(dictBuffer); - } -#ifndef STATEFUL_FUZZING - ZSTD_freeCCtx(cctx); cctx = NULL; - ZSTD_freeDCtx(dctx); dctx = NULL; - free(generatedSequences); generatedSequences = NULL; - free(generatedSrc); generatedSrc = NULL; - free(literalsBuffer); literalsBuffer = NULL; -#endif - return 0; -} diff --git a/src/dependencies/zstd-1.5.0/.buckconfig b/src/dependencies/zstd-1.5.4/.buckconfig similarity index 100% rename from src/dependencies/zstd-1.5.0/.buckconfig rename to src/dependencies/zstd-1.5.4/.buckconfig diff --git a/src/dependencies/zstd-1.5.0/.buckversion b/src/dependencies/zstd-1.5.4/.buckversion similarity index 100% rename from src/dependencies/zstd-1.5.0/.buckversion rename to src/dependencies/zstd-1.5.4/.buckversion diff --git a/src/dependencies/zstd-1.5.0/.circleci/config.yml b/src/dependencies/zstd-1.5.4/.circleci/config.yml similarity index 80% rename from src/dependencies/zstd-1.5.0/.circleci/config.yml rename to src/dependencies/zstd-1.5.4/.circleci/config.yml index c634737..621ac49 100644 --- a/src/dependencies/zstd-1.5.0/.circleci/config.yml +++ b/src/dependencies/zstd-1.5.4/.circleci/config.yml @@ -13,13 +13,13 @@ jobs: name: Test command: | ./tests/test-license.py - cc -v; CFLAGS="-O0 -Werror -pedantic" make all && make clean - make c99build ; make clean - make c11build ; make clean - make aarch64build ; make clean + cc -v + CFLAGS="-O0 -Werror -pedantic" make allmost; make clean + make c99build; make clean + make c11build; make clean make -j regressiontest; make clean - make shortest ; make clean - make cxxtest ; make clean + make shortest; make clean + make cxxtest; make clean # the second half of the jobs are in this test short-tests-1: docker: @@ -34,6 +34,7 @@ jobs: make ppc64build V=1; make clean make ppcbuild V=1; make clean make armbuild V=1; make clean + make aarch64build V=1; make clean make -C tests test-legacy test-longmatch; make clean make -C lib libzstd-nomt; make clean # This step should only be run in a cron job @@ -84,31 +85,10 @@ workflows: commit: jobs: # Run the tests in parallel - - short-tests-0: - filters: - tags: - only: /.*/ - - short-tests-1: - filters: - tags: - only: /.*/ - # Create a branch called regression and set it to dev to force a - # regression test run - - regression-test: - filters: - branches: - only: - - regression - # Only run on release tags. - - publish-github-release: - requires: - - short-tests-0 - - short-tests-1 - filters: - branches: - ignore: /.*/ - tags: - only: /^v\d+\.\d+\.\d+$/ + - short-tests-0 + - short-tests-1 + - regression-test + nightly: triggers: - schedule: @@ -120,7 +100,7 @@ workflows: - dev - master jobs: - # Run daily long regression tests + # Run daily regression tests - regression-test diff --git a/src/dependencies/zstd-1.5.0/.circleci/images/primary/Dockerfile b/src/dependencies/zstd-1.5.4/.circleci/images/primary/Dockerfile similarity index 89% rename from src/dependencies/zstd-1.5.0/.circleci/images/primary/Dockerfile rename to src/dependencies/zstd-1.5.4/.circleci/images/primary/Dockerfile index dd80041..bfcb6af 100644 --- a/src/dependencies/zstd-1.5.0/.circleci/images/primary/Dockerfile +++ b/src/dependencies/zstd-1.5.4/.circleci/images/primary/Dockerfile @@ -1,4 +1,4 @@ -FROM circleci/buildpack-deps:bionic +FROM circleci/buildpack-deps:focal RUN sudo dpkg --add-architecture i386 RUN sudo apt-get -y -qq update diff --git a/src/dependencies/zstd-1.5.0/.cirrus.yml b/src/dependencies/zstd-1.5.4/.cirrus.yml similarity index 64% rename from src/dependencies/zstd-1.5.0/.cirrus.yml rename to src/dependencies/zstd-1.5.4/.cirrus.yml index fe17aac..27ca65e 100644 --- a/src/dependencies/zstd-1.5.0/.cirrus.yml +++ b/src/dependencies/zstd-1.5.4/.cirrus.yml @@ -2,9 +2,8 @@ task: name: FreeBSD (shortest) freebsd_instance: matrix: + image_family: freebsd-13-0 image_family: freebsd-12-2 - # The stable 11.3 image causes "Agent is not responding" so use a snapshot - image_family: freebsd-11-3-snap install_script: pkg install -y gmake coreutils script: | MOREFLAGS="-Werror" gmake -j all diff --git a/src/dependencies/zstd-1.5.0/.gitattributes b/src/dependencies/zstd-1.5.4/.gitattributes similarity index 100% rename from src/dependencies/zstd-1.5.0/.gitattributes rename to src/dependencies/zstd-1.5.4/.gitattributes diff --git a/src/dependencies/zstd-1.5.0/.github/ISSUE_TEMPLATE/bug_report.md b/src/dependencies/zstd-1.5.4/.github/ISSUE_TEMPLATE/bug_report.md similarity index 94% rename from src/dependencies/zstd-1.5.0/.github/ISSUE_TEMPLATE/bug_report.md rename to src/dependencies/zstd-1.5.4/.github/ISSUE_TEMPLATE/bug_report.md index bacdac2..755a46a 100644 --- a/src/dependencies/zstd-1.5.0/.github/ISSUE_TEMPLATE/bug_report.md +++ b/src/dependencies/zstd-1.5.4/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,8 +26,8 @@ If applicable, add screenshots and charts to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. Mac] - Version [e.g. 22] - - Compiler [e.g gcc] - - Flags [e.g O2] + - Compiler [e.g. gcc] + - Flags [e.g. O2] - Other relevant hardware specs [e.g. Dual-core] - Build system [e.g. Makefile] diff --git a/src/dependencies/zstd-1.5.0/.github/ISSUE_TEMPLATE/feature_request.md b/src/dependencies/zstd-1.5.4/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from src/dependencies/zstd-1.5.0/.github/ISSUE_TEMPLATE/feature_request.md rename to src/dependencies/zstd-1.5.4/.github/ISSUE_TEMPLATE/feature_request.md diff --git a/src/dependencies/zstd-1.5.4/.github/dependabot.yml b/src/dependencies/zstd-1.5.4/.github/dependabot.yml new file mode 100644 index 0000000..5ace460 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/src/dependencies/zstd-1.5.4/.github/workflows/dev-long-tests.yml b/src/dependencies/zstd-1.5.4/.github/workflows/dev-long-tests.yml new file mode 100644 index 0000000..1c8c9ec --- /dev/null +++ b/src/dependencies/zstd-1.5.4/.github/workflows/dev-long-tests.yml @@ -0,0 +1,271 @@ +name: dev-long-tests +# Tests longer than 10mn + +concurrency: + group: long-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: [ dev, release, actionsTest ] + +jobs: + make-all: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: make all + run: make all + + # lasts ~24mn + make-test: + runs-on: ubuntu-latest + env: + DEVNULLRIGHTS: 1 + READFROMBLOCKDEVICE: 1 + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: make test + run: make test + + # lasts ~26mn + make-test-osx: + runs-on: macos-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: OS-X test + run: make test # make -c lib all doesn't work because of the fact that it's not a tty + + no-intrinsics-fuzztest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: no intrinsics fuzztest + run: MOREFLAGS="-DZSTD_NO_INTRINSICS" make -C tests fuzztest + + tsan-zstreamtest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: thread sanitizer zstreamtest + run: CC=clang ZSTREAM_TESTTIME=-T3mn make tsan-test-zstream + + ubsan-zstreamtest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: undefined behavior sanitizer zstreamtest + run: CC=clang make uasan-test-zstream + + # lasts ~15mn + tsan-fuzztest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: thread sanitizer fuzztest + run: CC=clang make tsan-fuzztest + + + big-tests-zstreamtest32: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: zstream tests in 32bit mode, with big tests + run: | + sudo apt-get -qqq update + make libc6install + CC=clang make -C tests test-zstream32 FUZZER_FLAGS="--big-tests" + + # lasts ~23mn + gcc-8-asan-ubsan-testzstd: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: gcc-8 + ASan + UBSan + Test Zstd + # See https://askubuntu.com/a/1428822 + run: | + echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee -a /etc/apt/sources.list + sudo apt-get -qqq update + make gcc8install + CC=gcc-8 make -j uasan-test-zstd + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=${{matrix.toolset}} + /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} + + # This tests that we don't accidently grow the size too much. + # If the size grows intentionally, you can raise these numbers. + # But we do need to think about binary size, since it is a concern. + libzstd-size: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: libzstd size test + run: | + make clean && make -j -C lib libzstd && ./tests/check_size.py lib/libzstd.so 1100000 + make clean && make -j -C lib libzstd ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 400000 + make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 && ./tests/check_size.py lib/libzstd.so 300000 + make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 80000 + + minimal-decompressor-macros: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: minimal decompressor macros + run: | + make clean && make -j all ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror" + make clean && make check ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror" + make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT" + make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT" + make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG" + make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG" + make clean && make -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" + make clean && make check MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" + + dynamic-bmi2: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: dynamic bmi2 tests + run: | + make clean && make -j check MOREFLAGS="-O0 -Werror -mbmi2" + make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1" + make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1 -mbmi2" + make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0" + make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0 -mbmi2" + + test-variants: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: make all variants & validate + run: | + make -j -C programs allVariants MOREFLAGS=-O0 + ./tests/test-variants.sh + + + qemu-consistency: + name: QEMU ${{ matrix.name }} + runs-on: ubuntu-20.04 + strategy: + fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix failed. + matrix: + include: [ + { name: ARM, xcc_pkg: gcc-arm-linux-gnueabi, xcc: arm-linux-gnueabi-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-arm-static }, + { name: ARM64, xcc_pkg: gcc-aarch64-linux-gnu, xcc: aarch64-linux-gnu-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-aarch64-static }, + { name: PPC, xcc_pkg: gcc-powerpc-linux-gnu, xcc: powerpc-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc-static }, + { name: PPC64LE, xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc64le-static }, + { name: S390X, xcc_pkg: gcc-s390x-linux-gnu, xcc: s390x-linux-gnu-gcc, xemu_pkg: qemu-system-s390x, xemu: qemu-s390x-static }, + { name: MIPS, xcc_pkg: gcc-mips-linux-gnu, xcc: mips-linux-gnu-gcc, xemu_pkg: qemu-system-mips, xemu: qemu-mips-static }, + { name: M68K, xcc_pkg: gcc-m68k-linux-gnu, xcc: m68k-linux-gnu-gcc, xemu_pkg: qemu-system-m68k, xemu: qemu-m68k-static }, + ] + env: # Set environment variables + XCC: ${{ matrix.xcc }} + XEMU: ${{ matrix.xemu }} + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: apt update & install + run: | + sudo apt-get update + sudo apt-get install gcc-multilib g++-multilib qemu-utils qemu-user-static + sudo apt-get install ${{ matrix.xcc_pkg }} ${{ matrix.xemu_pkg }} + - name: Environment info + run: | + echo && which $XCC + echo && $XCC --version + echo && $XCC -v # Show built-in specs + echo && which $XEMU + echo && $XEMU --version + - name: ARM + if: ${{ matrix.name == 'ARM' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: ARM64 + if: ${{ matrix.name == 'ARM64' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: PPC + if: ${{ matrix.name == 'PPC' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: PPC64LE + if: ${{ matrix.name == 'PPC64LE' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: S390X + if: ${{ matrix.name == 'S390X' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: MIPS + if: ${{ matrix.name == 'MIPS' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: M68K + if: ${{ matrix.name == 'M68K' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + + mingw-short-test: + runs-on: windows-latest + strategy: + fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix failed. + matrix: + include: [ + { compiler: gcc, msystem: MINGW32, cflags: "-Werror"}, + { compiler: gcc, msystem: MINGW64, cflags: "-Werror"}, + { compiler: clang, msystem: MINGW64, cflags: "--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion -Wno-unused-command-line-argument"}, + ] + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + install: make diffutils + update: true + # Based on https://ariya.io/2020/07/on-github-actions-with-msys2 + - name: install mingw gcc i686 + if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'gcc') }} + run: pacman --noconfirm -S mingw-w64-i686-gcc + - name: install mingw gcc x86_64 + if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'gcc') }} + run: pacman --noconfirm -S mingw-w64-x86_64-gcc + - name: install mingw clang i686 + if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'clang') }} + run: pacman --noconfirm -S mingw-w64-i686-clang + - name: install mingw clang x86_64 + if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'clang') }} + run: pacman --noconfirm -S mingw-w64-x86_64-clang + - name: run mingw tests + run: | + make -v + export CC=${{ matrix.compiler }} + $CC --version + CFLAGS="${{ matrix.cflags }}" make -j allzstd + echo "Testing $CC ${{ matrix.msystem }}" + make clean + MSYS="" make check + + visual-runtime-tests: + runs-on: windows-latest + strategy: + matrix: + platform: [x64, Win32] + configuration: [Release] + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v1.3 + - name: Build and run tests + working-directory: ${{env.GITHUB_WORKSPACE}} + env: + ZSTD_BIN: ./zstd.exe + DATAGEN_BIN: ./datagen.exe + # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference + run: | + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142 /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} + COPY build\VS2010\bin\${{matrix.platform}}_${{matrix.configuration}}\*.exe tests\ + CD tests + sh -e playTests.sh + .\fuzzer.exe -T2m + + # Following instructions at: https://github.com/marketplace/actions/install-cygwin-action + cygwin-tests: + runs-on: windows-latest + steps: + - run: git config --global core.autocrlf input + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - uses: cygwin/cygwin-install-action@f5e0f048310c425e84bc789f493a828c6dc80a25 # tag=master + with: + platform: x86_64 + packages: >- + autoconf, + automake, + gcc-g++, + make, + mingw64-x86_64-gcc-g++, + patch, + perl + - name: cygwin tests + shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}' + run: >- + export PATH=/usr/bin:$(cygpath ${SYSTEMROOT})/system32 && + export CFLAGS="-Werror -O1" && + ls && + make -j allzstd && + make -C tests fuzzer && + ./tests/fuzzer.exe -v -T1m + + intel-cet-compatibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Build Zstd + run: | + make -j zstd V=1 + readelf -n zstd + - name: Get Intel SDE + run: | + curl -LO https://downloadmirror.intel.com/684899/sde-external-9.0.0-2021-11-07-lin.tar.xz + tar xJvf sde-external-9.0.0-2021-11-07-lin.tar.xz + - name: Configure Permissions + run: | + echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope + - name: Run Under SDE + run: | + sde-external-9.0.0-2021-11-07-lin/sde -cet -cet-raise 0 -cet-endbr-exe -cet-stderr -cet-abort -- ./zstd -b3 + + pkg-config: + runs-on: ubuntu-latest + container: + image: debian:testing + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Install dependencies + run: | + apt -y update + apt -y install --no-install-recommends gcc libc6-dev make pkg-config + - name: Build and install + run: make -C lib install + - name: Test pkg-config + run: | + cc -Wall -Wextra -Wpedantic -Werror -o simple examples/simple_compression.c $(pkg-config --cflags --libs libzstd) + ./simple LICENSE + + versions-compatibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Versions Compatibility Test + run: | + make -C tests versionsTest + + clangbuild: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: make clangbuild + run: | + make clangbuild + + clang-pgo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Build PGO Zstd with Clang + env: + CC: clang-14 + LLVM_PROFDATA: llvm-profdata-14 + run: | + make -C programs zstd-pgo + ./programs/zstd -b + + gcc-pgo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + - name: Build PGO Zstd with GCC + env: + CC: gcc + run: | + make -C programs zstd-pgo + ./programs/zstd -b + + +# For reference : icc tests +# icc tests are currently failing on Github Actions, likely to issues during installation stage +# To be fixed later +# +# icc: +# name: icc-check +# runs-on: ubuntu-latest +# steps: +# - name: install icc +# run: | +# export DEBIAN_FRONTEND=noninteractive +# sudo apt-get -qqq update +# sudo apt-get install -y wget build-essential pkg-config cmake ca-certificates gnupg +# sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB +# sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB +# sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" +# sudo apt-get update +# sudo apt-get install -y intel-basekit intel-hpckit +# - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 +# - name: make check +# run: | +# make CC=/opt/intel/oneapi/compiler/latest/linux/bin/intel64/icc check diff --git a/src/dependencies/zstd-1.5.0/.github/workflows/publish-release-artifacts.yml b/src/dependencies/zstd-1.5.4/.github/workflows/publish-release-artifacts.yml similarity index 86% rename from src/dependencies/zstd-1.5.0/.github/workflows/publish-release-artifacts.yml rename to src/dependencies/zstd-1.5.4/.github/workflows/publish-release-artifacts.yml index 952cb26..2c89a91 100644 --- a/src/dependencies/zstd-1.5.0/.github/workflows/publish-release-artifacts.yml +++ b/src/dependencies/zstd-1.5.4/.github/workflows/publish-release-artifacts.yml @@ -3,16 +3,23 @@ name: publish-release-artifacts on: release: types: - - created + - published + +permissions: + contents: read jobs: publish-release-artifacts: + permissions: + contents: read # to fetch code (actions/checkout) + actions: write # to attach binaries to release artifacts (skx/github-action-publish-binaries) + runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 - name: Archive env: @@ -61,7 +68,7 @@ jobs: fi - name: Publish - uses: skx/github-action-publish-binaries@release-1.3 + uses: skx/github-action-publish-binaries@release-2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/src/dependencies/zstd-1.5.4/.github/workflows/scorecards.yml b/src/dependencies/zstd-1.5.4/.github/workflows/scorecards.yml new file mode 100644 index 0000000..6a9e521 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/.github/workflows/scorecards.yml @@ -0,0 +1,64 @@ +name: Scorecards supply-chain security +on: + # Only the default branch is supported. + branch_protection_rule: + schedule: + - cron: '22 21 * * 2' + push: + # TODO: Add release branch when supported? + branches: [ "dev" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecards analysis + if: github.repository == 'facebook/zstd' + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Used to receive a badge. + id-token: write + # Needs for private repositories. + contents: read + actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # tag=v2.1.2 + with: + results_file: results.sarif + results_format: sarif + # (Optional) Read-only PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecards on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_READ_TOKEN }} + + # Publish the results for public repositories to enable scorecard badges. For more details, see + # https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories, `publish_results` will automatically be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # tag=v3.1.2 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@3ebbd71c74ef574dbc558c82f70e52732c8b44fe # tag=v2.2.1 + with: + sarif_file: results.sarif diff --git a/src/dependencies/zstd-1.5.0/.gitignore b/src/dependencies/zstd-1.5.4/.gitignore similarity index 94% rename from src/dependencies/zstd-1.5.0/.gitignore rename to src/dependencies/zstd-1.5.4/.gitignore index ea574d7..a136ea3 100644 --- a/src/dependencies/zstd-1.5.0/.gitignore +++ b/src/dependencies/zstd-1.5.4/.gitignore @@ -29,6 +29,7 @@ dictionary NUL # Build artefacts +contrib/linux-kernel/linux/ projects/ bin/ .buckd/ diff --git a/src/dependencies/zstd-1.5.4/.travis.yml b/src/dependencies/zstd-1.5.4/.travis.yml new file mode 100644 index 0000000..b96bf8b --- /dev/null +++ b/src/dependencies/zstd-1.5.4/.travis.yml @@ -0,0 +1,128 @@ +# Travis CI is used to test platforms that github-actions currently doesn't support +# without either self-hosting or some finnicky work-around. Also, some tests +# are troublesome to migrate since GH Actions runs tests not in a tty. +language: c + +git: + depth: 1 + +branches: + only: + - dev + - release + - master + - travisTest + +addons: + apt: + update: true + +env: + global: + - FUZZERTEST=-T1mn + ZSTREAM_TESTTIME=-T1mn + DECODECORPUS_TESTTIME=-T1mn + +matrix: + fast_finish: true + include: + - name: S390X (big endian) + Fuzz test + dist: trusty + arch: s390x + script: + - FUZZER_FLAGS=--no-big-tests make -C tests fuzztest + + - name: S390X (big endian) + Fuzz test + no intrinsics + dist: trusty + arch: s390x + script: + - MOREFLAGS="-DZSTD_NO_INTRINSICS" FUZZER_FLAGS=--no-big-tests make -C tests fuzztest + + - name: arm64 # ~2.5 mn + os: linux + arch: arm64 + script: + - make check + + - name: arm64fuzz + os: linux + arch: arm64 + script: + - make -C tests fuzztest + + # TODO: migrate to GH Actions once newest clang staticanalyze warnings are fixed + - name: static analyzer scanbuild # ~8mn + dist: trusty # note : it's important to pin down a version of static analyzer, since different versions report different false positives + script: + - make staticAnalyze + + # GH actions can't run this command on OS-X, non-tty issues + - name: OS-X make all lib + os: osx + script: + - make -C lib all + + # Introduced to check compat with old toolchains, to prevent e.g. #1872 + - name: ARM Build Test (on Trusty) + dist: trusty + script: + - make arminstall + - make armbuild + + # check release number (release/new tag only) + - name: Tag-Specific Test + if: tag =~ ^v[0-9]\.[0-9] + script: + - make -C tests checkTag + - tests/checkTag "$TRAVIS_BRANCH" + + - name: PPC64LE + Fuzz test # ~13mn + arch: ppc64le + env: + - FUZZER_FLAGS=--no-big-tests + - MOREFLAGS="-static" + script: + - cat /proc/cpuinfo + - make -C tests fuzztest + + # This test currently fails on GA specifically, for no obvious reason + # (it works fine on travisCI, and on local test platforms). + - name: Versions Compatibility Test # ~6mn + script: + - make -C tests versionsTest + + # meson dedicated test + - name: Focal (Meson + clang) # ~15mn + dist: focal + language: cpp + compiler: clang + install: + - sudo apt-get install -qq liblz4-dev valgrind tree + - | + travis_retry curl -o ~/ninja.zip -L 'https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip' && + unzip ~/ninja.zip -d ~/.local/bin + - | + travis_retry curl -o ~/get-pip.py -L 'https://bootstrap.pypa.io/pip/3.6/get-pip.py' && + python3 ~/get-pip.py --user && + pip3 install --user meson + script: + - | + meson setup \ + --buildtype=debugoptimized \ + -Db_lundef=false \ + -Dauto_features=enabled \ + -Dbin_programs=true \ + -Dbin_tests=true \ + -Dbin_contrib=true \ + -Ddefault_library=both \ + build/meson builddir + - pushd builddir + - ninja + - meson test --verbose --no-rebuild + - DESTDIR=./staging ninja install + - tree ./staging + after_failure: + - cat "$TRAVIS_BUILD_DIR"/builddir/meson-logs/testlog.txt + + allow_failures: + - env: ALLOW_FAILURES=true diff --git a/src/dependencies/zstd-1.5.0/CHANGELOG b/src/dependencies/zstd-1.5.4/CHANGELOG similarity index 86% rename from src/dependencies/zstd-1.5.0/CHANGELOG rename to src/dependencies/zstd-1.5.4/CHANGELOG index 3b15165..4010c1f 100644 --- a/src/dependencies/zstd-1.5.0/CHANGELOG +++ b/src/dependencies/zstd-1.5.4/CHANGELOG @@ -1,3 +1,86 @@ +v1.5.4 (Feb 2023) +perf: +20% faster huffman decompression for targets that can't compile x64 assembly (#3449, @terrelln) +perf: up to +10% faster streaming compression at levels 1-2 (#3114, @embg) +perf: +4-13% for levels 5-12 by optimizing function generation (#3295, @terrelln) +pref: +3-11% compression speed for `arm` target (#3199, #3164, #3145, #3141, #3138, @JunHe77 and #3139, #3160, @danlark1) +perf: +5-30% faster dictionary compression at levels 1-4 (#3086, #3114, #3152, @embg) +perf: +10-20% cold dict compression speed by prefetching CDict tables (#3177, @embg) +perf: +1% faster compression by removing a branch in ZSTD_fast_noDict (#3129, @felixhandte) +perf: Small compression ratio improvements in high compression mode (#2983, #3391, @Cyan4973 and #3285, #3302, @daniellerozenblit) +perf: small speed improvement by better detecting `STATIC_BMI2` for `clang` (#3080, @TocarIP) +perf: Improved streaming performance when `ZSTD_c_stableInBuffer` is set (#2974, @Cyan4973) +cli: Asynchronous I/O for improved cli speed (#2975, #2985, #3021, #3022, @yoniko) +cli: Change `zstdless` behavior to align with `zless` (#2909, @binhdvo) +cli: Keep original file if `-c` or `--stdout` is given (#3052, @dirkmueller) +cli: Keep original files when result is concatenated into a single output with `-o` (#3450, @Cyan4973) +cli: Preserve Permissions and Ownership of regular files (#3432, @felixhandte) +cli: Print zlib/lz4/lzma library versions with `-vv` (#3030, @terrelln) +cli: Print checksum value for single frame files with `-lv` (#3332, @Cyan4973) +cli: Print `dictID` when present with `-lv` (#3184, @htnhan) +cli: when `stderr` is *not* the console, disable status updates, but preserve final summary (#3458, @Cyan4973) +cli: support `--best` and `--no-name` in `gzip` compatibility mode (#3059, @dirkmueller) +cli: support for `posix` high resolution timer `clock_gettime()`, for improved benchmark accuracy (#3423, @Cyan4973) +cli: improved help/usage (`-h`, `-H`) formatting (#3094, @dirkmueller and #3385, @jonpalmisc) +cli: Fix better handling of bogus numeric values (#3268, @ctkhanhly) +cli: Fix input consists of multiple files _and_ `stdin` (#3222, @yoniko) +cli: Fix tiny files passthrough (#3215, @cgbur) +cli: Fix for `-r` on empty directory (#3027, @brailovich) +cli: Fix empty string as argument for `--output-dir-*` (#3220, @embg) +cli: Fix decompression memory usage reported by `-vv --long` (#3042, @u1f35c, and #3232, @zengyijing) +cli: Fix infinite loop when empty input is passed to trainer (#3081, @terrelln) +cli: Fix `--adapt` doesn't work when `--no-progress` is also set (#3354, @terrelln) +api: Support for Block-Level Sequence Producer (#3333, @embg) +api: Support for in-place decompression (#3432, @terrelln) +api: New `ZSTD_CCtx_setCParams()` function, set all parameters defined in a `ZSTD_compressionParameters` structure (#3403, @Cyan4973) +api: Streaming decompression detects incorrect header ID sooner (#3175, @Cyan4973) +api: Window size resizing optimization for edge case (#3345, @daniellerozenblit) +api: More accurate error codes for busy-loop scenarios (#3413, #3455, @Cyan4973) +api: Fix limit overflow in `compressBound` and `decompressBound` (#3362, #3373, Cyan4973) reported by @nigeltao +api: Deprecate several advanced experimental functions: streaming (#3408, @embg), copy (#3196, @mileshu) +bug: Fix corruption that rarely occurs in 32-bit mode with wlog=25 (#3361, @terrelln) +bug: Fix for block-splitter (#3033, @Cyan4973) +bug: Fixes for Sequence Compression API (#3023, #3040, @Cyan4973) +bug: Fix leaking thread handles on Windows (#3147, @animalize) +bug: Fix timing issues with cmake/meson builds (#3166, #3167, #3170, @Cyan4973) +build: Allow user to select legacy level for cmake (#3050, @shadchin) +build: Enable legacy support by default in cmake (#3079, @niamster) +build: Meson build script improvements (#3039, #3120, #3122, #3327, #3357, @eli-schwartz and #3276, @neheb) +build: Add aarch64 to supported architectures for zstd_trace (#3054, @ooosssososos) +build: support AIX architecture (#3219, @qiongsiwu) +build: Fix `ZSTD_LIB_MINIFY` build macro, which now reduces static library size by half (#3366, @terrelln) +build: Fix Windows issues with Multithreading translation layer (#3364, #3380, @yoniko) and ARM64 target (#3320, @cwoffenden) +build: Fix `cmake` script (#3382, #3392, @terrelln and #3252 @Tachi107 and #3167 @Cyan4973) +doc: Updated man page, providing more details for `--train` mode (#3112, @Cyan4973) +doc: Add decompressor errata document (#3092, @terrelln) +misc: Enable Intel CET (#2992, #2994, @hjl-tools) +misc: Fix `contrib/` seekable format (#3058, @yhoogstrate and #3346, @daniellerozenblit) +misc: Improve speed of the one-file library generator (#3241, @wahern and #3005, @cwoffenden) + +v1.5.3 (dev version, unpublished) + +v1.5.2 (Jan, 2022) +perf: Regain Minimal memset()-ing During Reuse of Compression Contexts (@Cyan4973, #2969) +build: Build Zstd with `noexecstack` on All Architectures (@felixhandte, #2964) +doc: Clarify Licensing (@terrelln, #2981) + +v1.5.1 (Dec, 2021) +perf: rebalanced compression levels, to better match the intended speed/level curve, by @senhuang42 +perf: faster huffman decoder, using x64 assembly, by @terrelln +perf: slightly faster high speed modes (strategies fast & dfast), by @felixhandte +perf: improved binary size and faster compilation times, by @terrelln +perf: new row64 mode, used notably in level 12, by @senhuang42 +perf: faster mid-level compression speed in presence of highly repetitive patterns, by @senhuang42 +perf: minor compression ratio improvements for small data at high levels, by @cyan4973 +perf: reduced stack usage (mostly useful for Linux Kernel), by @terrelln +perf: faster compression speed on incompressible data, by @bindhvo +perf: on-demand reduced ZSTD_DCtx state size, using build macro ZSTD_DECODER_INTERNAL_BUFFER, at a small cost of performance, by @bindhvo +build: allows hiding static symbols in the dynamic library, using build macro, by @skitt +build: support for m68k (Motorola 68000's), by @cyan4973 +build: improved AIX support, by @Helflym +build: improved meson unofficial build, by @eli-schwartz +cli : custom memory limit when training dictionary (#2925), by @embg +cli : report advanced parameters information when compressing in very verbose mode (``-vv`), by @Svetlitski-FB + v1.5.0 (May 11, 2021) api: Various functions promoted from experimental to stable API: (#2579-2581, @senhuang42) `ZSTD_defaultCLevel()` diff --git a/src/dependencies/zstd-1.5.0/CODE_OF_CONDUCT.md b/src/dependencies/zstd-1.5.4/CODE_OF_CONDUCT.md similarity index 100% rename from src/dependencies/zstd-1.5.0/CODE_OF_CONDUCT.md rename to src/dependencies/zstd-1.5.4/CODE_OF_CONDUCT.md diff --git a/src/dependencies/zstd-1.5.0/CONTRIBUTING.md b/src/dependencies/zstd-1.5.4/CONTRIBUTING.md similarity index 85% rename from src/dependencies/zstd-1.5.0/CONTRIBUTING.md rename to src/dependencies/zstd-1.5.4/CONTRIBUTING.md index 5effa26..f5e747a 100644 --- a/src/dependencies/zstd-1.5.0/CONTRIBUTING.md +++ b/src/dependencies/zstd-1.5.4/CONTRIBUTING.md @@ -7,7 +7,7 @@ New versions are being developed in the "dev" branch, or in their own feature branch. When they are deemed ready for a release, they are merged into "release". -As a consequences, all contributions must stage first through "dev" +As a consequence, all contributions must stage first through "dev" or their own feature branch. ## Pull Requests @@ -47,7 +47,7 @@ Our contribution process works in three main stages: * Topic and development: * Make a new branch on your fork about the topic you're developing for ``` - # branch names should be consise but sufficiently informative + # branch names should be concise but sufficiently informative git checkout -b git push origin ``` @@ -68,8 +68,8 @@ Our contribution process works in three main stages: ``` 2. Code Review and CI tests * Ensure CI tests pass: - * Before sharing anything to the community, make sure that all CI tests pass on your local fork. - See our section on setting up your CI environment for more information on how to do this. + * Before sharing anything to the community, create a pull request in your own fork against the dev branch + and make sure that all GitHub Actions CI tests pass. See the Continuous Integration section below for more information. * Ensure that static analysis passes on your development machine. See the Static Analysis section below to see how to do this. * Create a pull request: @@ -104,7 +104,7 @@ Our contribution process works in three main stages: issue at hand, then please indicate this by requesting that an issue be closed by commenting. * Just because your changes have been merged does not mean the topic or larger issue is complete. Remember that the change must make it to an official zstd release for it to be meaningful. We recommend - that contributers track the activity on their pull request and corresponding issue(s) page(s) until + that contributors track the activity on their pull request and corresponding issue(s) page(s) until their change makes it to the next release of zstd. Users will often discover bugs in your code or suggest ways to refine and improve your initial changes even after the pull request is merged. @@ -134,11 +134,47 @@ It can be useful to look at additional static analyzers once in a while (and we - Static analyzers are full of false positive. The signal to noise ratio is actually pretty low. - A good CI policy is "zero-warning tolerance". That means that all issues must be solved, including false positives. This quickly becomes a tedious workload. - Multiple static analyzers will feature multiple kind of false positives, sometimes applying to the same code but in different ways leading to : - + torteous code, trying to please multiple constraints, hurting readability and therefore maintenance. Sometimes, such complexity introduce other more subtle bugs, that are just out of scope of the analyzers. + + tortuous code, trying to please multiple constraints, hurting readability and therefore maintenance. Sometimes, such complexity introduce other more subtle bugs, that are just out of scope of the analyzers. + sometimes, these constraints are mutually exclusive : if one try to solve one, the other static analyzer will complain, they can't be both happy at the same time. - As if that was not enough, the list of false positives change with each version. It's hard enough to follow one static analyzer, but multiple ones with their own update agenda, this quickly becomes a massive velocity reducer. -This is different from running a static analyzer once in a while, looking at the output, and __cherry picking__ a few warnings that seem helpful, either because they detected a genuine risk of bug, or because it helps expressing the code in a way which is more readable or more difficult to misuse. These kind of reports can be useful, and are accepted. +This is different from running a static analyzer once in a while, looking at the output, and __cherry picking__ a few warnings that seem helpful, either because they detected a genuine risk of bug, or because it helps expressing the code in a way which is more readable or more difficult to misuse. These kinds of reports can be useful, and are accepted. + +## Continuous Integration +CI tests run every time a pull request (PR) is created or updated. The exact tests +that get run will depend on the destination branch you specify. Some tests take +longer to run than others. Currently, our CI is set up to run a short +series of tests when creating a PR to the dev branch and a longer series of tests +when creating a PR to the release branch. You can look in the configuration files +of the respective CI platform for more information on what gets run when. + +Most people will just want to create a PR with the destination set to their local dev +branch of zstd. You can then find the status of the tests on the PR's page. You can also +re-run tests and cancel running tests from the PR page or from the respective CI's dashboard. + +Almost all of zstd's CI runs on GitHub Actions (configured at `.github/workflows`), which will automatically run on PRs to your +own fork. A small number of tests run on other services (e.g. Travis CI, Circle CI, Appveyor). +These require work to set up on your local fork, and (at least for Travis CI) cost money. +Therefore, if the PR on your local fork passes GitHub Actions, feel free to submit a PR +against the main repo. + +### Third-party CI +A small number of tests cannot run on GitHub Actions, or have yet to be migrated. +For these, we use a variety of third-party services (listed below). It is not necessary to set +these up on your fork in order to contribute to zstd; however, we do link to instructions for those +who want earlier signal. + +| Service | Purpose | Setup Links | Config Path | +|-----------|------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------| +| Travis CI | Used for testing on non-x86 architectures such as PowerPC | https://docs.travis-ci.com/user/tutorial/#to-get-started-with-travis-ci-using-github
    https://github.com/marketplace/travis-ci | `.travis.yml` | +| AppVeyor | Used for some Windows testing (e.g. cygwin, mingw) | https://www.appveyor.com/blog/2018/10/02/github-apps-integration/
    https://github.com/marketplace/appveyor | `appveyor.yml` | +| Cirrus CI | Used for testing on FreeBSD | https://github.com/marketplace/cirrus-ci/ | `.cirrus.yml` | +| Circle CI | Historically was used to provide faster signal,
    but we may be able to migrate these to Github Actions | https://circleci.com/docs/2.0/getting-started/#setting-up-circleci
    https://youtu.be/Js3hMUsSZ2c
    https://circleci.com/docs/2.0/enable-checks/ | `.circleci/config.yml` | + +Note: the instructions linked above mostly cover how to set up a repository with CI from scratch. +The general idea should be the same for setting up CI on your fork of zstd, but you may have to +follow slightly different steps. In particular, please ignore any instructions related to setting up +config files (since zstd already has configs for each of these services). ## Performance Performance is extremely important for zstd and we only merge pull requests whose performance @@ -161,7 +197,7 @@ something subtle merged is extensive benchmarking. You will be doing us a great take the time to run extensive, long-duration, and potentially cross-(os, platform, process, etc) benchmarks on your end before submitting a PR. Of course, you will not be able to benchmark your changes on every single processor and os out there (and neither will we) but do that best -you can:) We've adding some things to think about when benchmarking below in the Benchmarking +you can:) We've added some things to think about when benchmarking below in the Benchmarking Performance section which might be helpful for you. 3. Optimizing performance for a certain OS, processor vendor, compiler, or network system is a perfectly legitimate thing to do as long as it does not harm the overall performance health of Zstd. @@ -237,7 +273,7 @@ for that options you have just provided. If you want to look at the internals of benchmarking script works, you can check out programs/benchzstd.c For example: say you have made a change that you believe improves the speed of zstd level 1. The -very first thing you should use to asses whether you actually achieved any sort of improvement +very first thing you should use to assess whether you actually achieved any sort of improvement is `zstd -b`. You might try to do something like this. Note: you can use the `-i` option to specify a running time for your benchmark in seconds (default is 3 seconds). Usually, the longer the running time, the more stable your results will be. @@ -263,24 +299,24 @@ this method of evaluation will not be sufficient. ### Profiling There are a number of great profilers out there. We're going to briefly mention how you can profile your code using `instruments` on mac, `perf` on linux and `visual studio profiler` -on windows. +on Windows. Say you have an idea for a change that you think will provide some good performance gains for level 1 compression on Zstd. Typically this means, you have identified a section of code that you think can be made to run faster. The first thing you will want to do is make sure that the piece of code is actually taking up -a notable amount of time to run. It is usually not worth optimzing something which accounts for less than +a notable amount of time to run. It is usually not worth optimizing something which accounts for less than 0.0001% of the total running time. Luckily, there are tools to help with this. Profilers will let you see how much time your code spends inside a particular function. -If your target code snippit is only part of a function, it might be worth trying to -isolate that snippit by moving it to its own function (this is usually not necessary but +If your target code snippet is only part of a function, it might be worth trying to +isolate that snippet by moving it to its own function (this is usually not necessary but might be). -Most profilers (including the profilers dicusssed below) will generate a call graph of -functions for you. Your goal will be to find your function of interest in this call grapch -and then inspect the time spent inside of it. You might also want to to look at the -annotated assembly which most profilers will provide you with. +Most profilers (including the profilers discussed below) will generate a call graph of +functions for you. Your goal will be to find your function of interest in this call graph +and then inspect the time spent inside of it. You might also want to look at the annotated +assembly which most profilers will provide you with. #### Instruments We will once again consider the scenario where you think you've identified a piece of code @@ -294,23 +330,23 @@ Instruments. * You will want a benchmark that runs for at least a few seconds (5 seconds will usually be long enough). This way the profiler will have something to work with and you will have ample time to attach your profiler to this process:) - * I will just use benchzstd as my bencharmking script for this example: + * I will just use benchzstd as my benchmarmking script for this example: ``` $ zstd -b1 -i5 # this will run for 5 seconds ``` 5. Once you run your benchmarking script, switch back over to instruments and attach your process to the time profiler. You can do this by: * Clicking on the `All Processes` drop down in the top left of the toolbar. - * Selecting your process from the dropdown. In my case, it is just going to be labled + * Selecting your process from the dropdown. In my case, it is just going to be labeled `zstd` * Hitting the bright red record circle button on the top left of the toolbar -6. You profiler will now start collecting metrics from your bencharking script. Once +6. You profiler will now start collecting metrics from your benchmarking script. Once you think you have collected enough samples (usually this is the case after 3 seconds of recording), stop your profiler. 7. Make sure that in toolbar of the bottom window, `profile` is selected. 8. You should be able to see your call graph. * If you don't see the call graph or an incomplete call graph, make sure you have compiled - zstd and your benchmarking scripg using debug flags. On mac and linux, this just means + zstd and your benchmarking script using debug flags. On mac and linux, this just means you will have to supply the `-g` flag alone with your build script. You might also have to provide the `-fno-omit-frame-pointer` flag 9. Dig down the graph to find your function call and then inspect it by double clicking @@ -329,7 +365,7 @@ Some general notes on perf: counter statistics. Perf uses a high resolution timer and this is likely one of the first things your team will run when assessing your PR. * Perf has a long list of hardware counters that can be viewed with `perf --list`. -When measuring optimizations, something worth trying is to make sure the handware +When measuring optimizations, something worth trying is to make sure the hardware counters you expect to be impacted by your change are in fact being so. For example, if you expect the L1 cache misses to decrease with your change, you can look at the counter `L1-dcache-load-misses` @@ -339,57 +375,6 @@ counter `L1-dcache-load-misses` TODO - -## Setting up continuous integration (CI) on your fork -Zstd uses a number of different continuous integration (CI) tools to ensure that new changes -are well tested before they make it to an official release. Specifically, we use the platforms -travis-ci, circle-ci, and appveyor. - -Changes cannot be merged into the main dev branch unless they pass all of our CI tests. -The easiest way to run these CI tests on your own before submitting a PR to our dev branch -is to configure your personal fork of zstd with each of the CI platforms. Below, you'll find -instructions for doing this. - -### travis-ci -Follow these steps to link travis-ci with your github fork of zstd - -1. Make sure you are logged into your github account -2. Go to https://travis-ci.org/ -3. Click 'Sign in with Github' on the top right -4. Click 'Authorize travis-ci' -5. Click 'Activate all repositories using Github Apps' -6. Select 'Only select repositories' and select your fork of zstd from the drop down -7. Click 'Approve and Install' -8. Click 'Sign in with Github' again. This time, it will be for travis-pro (which will let you view your tests on the web dashboard) -9. Click 'Authorize travis-pro' -10. You should have travis set up on your fork now. - -### circle-ci -TODO - -### appveyor -Follow these steps to link circle-ci with your girhub fork of zstd - -1. Make sure you are logged into your github account -2. Go to https://www.appveyor.com/ -3. Click 'Sign in' on the top right -4. Select 'Github' on the left panel -5. Click 'Authorize appveyor' -6. You might be asked to select which repositories you want to give appveyor permission to. Select your fork of zstd if you're prompted -7. You should have appveyor set up on your fork now. - -### General notes on CI -CI tests run every time a pull request (PR) is created or updated. The exact tests -that get run will depend on the destination branch you specify. Some tests take -longer to run than others. Currently, our CI is set up to run a short -series of tests when creating a PR to the dev branch and a longer series of tests -when creating a PR to the release branch. You can look in the configuration files -of the respective CI platform for more information on what gets run when. - -Most people will just want to create a PR with the destination set to their local dev -branch of zstd. You can then find the status of the tests on the PR's page. You can also -re-run tests and cancel running tests from the PR page or from the respective CI's dashboard. - ## Issues We use GitHub issues to track public bugs. Please ensure your description is clear and has sufficient instructions to be able to reproduce the issue. @@ -470,7 +455,7 @@ This design requirement is fundamental to preserve the portability of the code b Any variable that can be `const` (aka. read-only) **must** be `const`. Any pointer which content will not be modified must be `const`. This property is then controlled at compiler level. - `const` variables are an important signal to readers that this variable isn’t modified. + `const` variables are an important signal to readers that this variable isn't modified. Conversely, non-const variables are a signal to readers to watch out for modifications later on in the function. * If a function must be inlined, mention it explicitly, using project's own portable macros, such as `FORCE_INLINE_ATTR`, diff --git a/src/dependencies/zstd-1.5.0/COPYING b/src/dependencies/zstd-1.5.4/COPYING similarity index 100% rename from src/dependencies/zstd-1.5.0/COPYING rename to src/dependencies/zstd-1.5.4/COPYING diff --git a/src/dependencies/zstd-1.5.0/LICENSE b/src/dependencies/zstd-1.5.4/LICENSE similarity index 82% rename from src/dependencies/zstd-1.5.0/LICENSE rename to src/dependencies/zstd-1.5.4/LICENSE index a793a80..7580028 100644 --- a/src/dependencies/zstd-1.5.0/LICENSE +++ b/src/dependencies/zstd-1.5.4/LICENSE @@ -2,7 +2,7 @@ BSD License For Zstandard software -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -14,9 +14,9 @@ are permitted provided that the following conditions are met: this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. + * Neither the name Facebook, nor Meta, nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED diff --git a/src/dependencies/zstd-1.5.0/Makefile b/src/dependencies/zstd-1.5.4/Makefile similarity index 89% rename from src/dependencies/zstd-1.5.0/Makefile rename to src/dependencies/zstd-1.5.4/Makefile index c1908f0..a7890a5 100644 --- a/src/dependencies/zstd-1.5.0/Makefile +++ b/src/dependencies/zstd-1.5.4/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2015-2021, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -29,6 +29,7 @@ VOID = /dev/null # fail on other tested distros (ubuntu, debian) even # without manually specifying the TARGET_SYSTEM. TARGET_SYSTEM ?= $(OS) +CP ?= cp ifneq (,$(filter Windows%,$(TARGET_SYSTEM))) EXT =.exe @@ -69,7 +70,7 @@ zstd zstd-release: .PHONY: zstdmt zstdmt: $(Q)$(MAKE) -C $(PRGDIR) $@ - $(Q)cp $(PRGDIR)/zstd$(EXT) ./zstdmt$(EXT) + $(Q)$(CP) $(PRGDIR)/zstd$(EXT) ./zstdmt$(EXT) .PHONY: zlibwrapper zlibwrapper: lib @@ -122,6 +123,7 @@ contrib: lib $(MAKE) -C contrib/seekable_format/examples all $(MAKE) -C contrib/seekable_format/tests test $(MAKE) -C contrib/largeNbDicts all + $(MAKE) -C contrib/externalSequenceProducer all cd build/single_file_libs/ ; ./build_decoder_test.sh cd build/single_file_libs/ ; ./build_library_test.sh @@ -141,6 +143,7 @@ clean: $(Q)$(MAKE) -C contrib/seekable_format/examples $@ > $(VOID) $(Q)$(MAKE) -C contrib/seekable_format/tests $@ > $(VOID) $(Q)$(MAKE) -C contrib/largeNbDicts $@ > $(VOID) + $(Q)$(MAKE) -C contrib/externalSequenceProducer $@ > $(VOID) $(Q)$(RM) zstd$(EXT) zstdmt$(EXT) tmp* $(Q)$(RM) -r lz4 @echo Cleaning completed @@ -148,13 +151,15 @@ clean: #------------------------------------------------------------------------------ # make install is validated only for Linux, macOS, Hurd and some BSD targets #------------------------------------------------------------------------------ -ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD DragonFly NetBSD MSYS_NT Haiku)) +ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD DragonFly NetBSD MSYS_NT Haiku AIX)) HOST_OS = POSIX +MKDIR ?= mkdir -p + HAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) EGREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) +ifeq ($(HAVE_COLORNEVER), 1) EGREP_OPTIONS += --color=never endif EGREP = egrep $(EGREP_OPTIONS) @@ -217,7 +222,7 @@ armbuild: clean CC=arm-linux-gnueabi-gcc CFLAGS="-Werror" $(MAKE) allzstd aarch64build: clean - CC=aarch64-linux-gnu-gcc CFLAGS="-Werror" $(MAKE) allzstd + CC=aarch64-linux-gnu-gcc CFLAGS="-Werror -O0" $(MAKE) allzstd ppcbuild: clean CC=powerpc-linux-gnu-gcc CFLAGS="-m32 -Wno-attributes -Werror" $(MAKE) -j allzstd @@ -284,6 +289,22 @@ uasanregressiontest: msanregressiontest: $(MAKE) -C $(FUZZDIR) regressiontest CC=clang CXX=clang++ CFLAGS="-O3 -fsanitize=memory" CXXFLAGS="-O3 -fsanitize=memory" +update_regressionResults : REGRESS_RESULTS_DIR := /tmp/regress_results_dir/ +update_regressionResults: + $(MAKE) -C programs zstd + $(MAKE) -C tests/regression test + $(RM) -rf $(REGRESS_RESULTS_DIR) + $(MKDIR) $(REGRESS_RESULTS_DIR) + ./tests/regression/test \ + --cache tests/regression/cache \ + --output $(REGRESS_RESULTS_DIR)/results.csv \ + --zstd programs/zstd + echo "Showing results differences" + ! diff tests/regression/results.csv $(REGRESS_RESULTS_DIR)/results.csv + echo "Updating results.csv" + $(CP) $(REGRESS_RESULTS_DIR)/results.csv tests/regression/results.csv + + # run UBsan with -fsanitize-recover=pointer-overflow # this only works with recent compilers such as gcc 8+ usan: clean @@ -315,6 +336,8 @@ tsan-%: clean .PHONY: apt-install apt-install: + # TODO: uncomment once issue 3011 is resolved and remove hack from Github Actions .yml + # sudo apt-get update sudo apt-get -yq --no-install-suggests --no-install-recommends --force-yes install $(APT_PACKAGES) .PHONY: apt-add-repo @@ -372,7 +395,7 @@ ifneq (,$(filter $(HOST_OS),MSYS POSIX)) cmakebuild: cmake --version $(RM) -r $(BUILDIR)/cmake/build - mkdir $(BUILDIR)/cmake/build + $(MKDIR) $(BUILDIR)/cmake/build cd $(BUILDIR)/cmake/build; cmake -DCMAKE_INSTALL_PREFIX:PATH=~/install_test_dir $(CMAKE_PARAMS) .. $(MAKE) -C $(BUILDIR)/cmake/build -j4; $(MAKE) -C $(BUILDIR)/cmake/build install; @@ -381,23 +404,23 @@ cmakebuild: c89build: clean $(CC) -v - CFLAGS="-std=c89 -Werror" $(MAKE) allmost # will fail, due to missing support for `long long` + CFLAGS="-std=c89 -Werror -Wno-attributes -Wpedantic -Wno-long-long -Wno-variadic-macros -O0" $(MAKE) lib zstd gnu90build: clean $(CC) -v - CFLAGS="-std=gnu90 -Werror" $(MAKE) allmost + CFLAGS="-std=gnu90 -Werror -O0" $(MAKE) allmost c99build: clean $(CC) -v - CFLAGS="-std=c99 -Werror" $(MAKE) allmost + CFLAGS="-std=c99 -Werror -O0" $(MAKE) allmost gnu99build: clean $(CC) -v - CFLAGS="-std=gnu99 -Werror" $(MAKE) allmost + CFLAGS="-std=gnu99 -Werror -O0" $(MAKE) allmost c11build: clean $(CC) -v - CFLAGS="-std=c11 -Werror" $(MAKE) allmost + CFLAGS="-std=c11 -Werror -O0" $(MAKE) allmost bmix64build: clean $(CC) -v @@ -416,5 +439,5 @@ bmi32build: clean staticAnalyze: SCANBUILD ?= scan-build staticAnalyze: $(CC) -v - CC=$(CC) CPPFLAGS=-g $(SCANBUILD) --status-bugs -v $(MAKE) allzstd examples contrib + CC=$(CC) CPPFLAGS=-g $(SCANBUILD) --status-bugs -v $(MAKE) zstd endif diff --git a/src/dependencies/zstd-1.5.4/Package.swift b/src/dependencies/zstd-1.5.4/Package.swift new file mode 100644 index 0000000..97f2c6a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/Package.swift @@ -0,0 +1,36 @@ +// swift-tools-version:5.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "zstd", + platforms: [ + .macOS(.v10_10), .iOS(.v9), .tvOS(.v9) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "libzstd", + targets: [ "libzstd" ]) + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "libzstd", + path: "lib", + sources: [ "common", "compress", "decompress", "dictBuilder" ], + publicHeadersPath: ".", + cSettings: [ + .headerSearchPath(".") + ]) + ], + swiftLanguageVersions: [.v5], + cLanguageStandard: .gnu11, + cxxLanguageStandard: .gnucxx14 +) diff --git a/src/dependencies/zstd-1.5.0/README.md b/src/dependencies/zstd-1.5.4/README.md similarity index 73% rename from src/dependencies/zstd-1.5.0/README.md rename to src/dependencies/zstd-1.5.4/README.md index dcca766..6bcf757 100644 --- a/src/dependencies/zstd-1.5.0/README.md +++ b/src/dependencies/zstd-1.5.4/README.md @@ -4,10 +4,11 @@ __Zstandard__, or `zstd` as short version, is a fast lossless compression algori targeting real-time compression scenarios at zlib-level and better compression ratios. It's backed by a very fast entropy stage, provided by [Huff0 and FSE library](https://github.com/Cyan4973/FiniteStateEntropy). -The project is provided as an open-source dual [BSD](LICENSE) and [GPLv2](COPYING) licensed **C** library, +Zstandard's format is stable and documented in [RFC8878](https://datatracker.ietf.org/doc/html/rfc8878). Multiple independent implementations are already available. +This repository represents the reference implementation, provided as an open-source dual [BSD](LICENSE) and [GPLv2](COPYING) licensed **C** library, and a command line utility producing and decoding `.zst`, `.gz`, `.xz` and `.lz4` files. Should your project require another programming language, -a list of known ports and bindings is provided on [Zstandard homepage](http://www.zstd.net/#other-languages). +a list of known ports and bindings is provided on [Zstandard homepage](https://facebook.github.io/zstd/#other-languages). **Development branch status:** @@ -17,8 +18,8 @@ a list of known ports and bindings is provided on [Zstandard homepage](http://ww [![Build status][CirrusDevBadge]][CirrusLink] [![Fuzzing Status][OSSFuzzBadge]][OSSFuzzLink] -[travisDevBadge]: https://travis-ci.org/facebook/zstd.svg?branch=dev "Continuous Integration test suite" -[travisLink]: https://travis-ci.org/facebook/zstd +[travisDevBadge]: https://api.travis-ci.com/facebook/zstd.svg?branch=dev "Continuous Integration test suite" +[travisLink]: https://travis-ci.com/facebook/zstd [AppveyorDevBadge]: https://ci.appveyor.com/api/projects/status/xt38wbdxjk5mrbem/branch/dev?svg=true "Windows test suite" [AppveyorLink]: https://ci.appveyor.com/project/YannCollet/zstd-p0yf0 [CircleDevBadge]: https://circleci.com/gh/facebook/zstd/tree/dev.svg?style=shield "Short test suite" @@ -31,37 +32,36 @@ a list of known ports and bindings is provided on [Zstandard homepage](http://ww ## Benchmarks For reference, several fast compression algorithms were tested and compared -on a server running Arch Linux (`Linux version 5.5.11-arch1-1`), -with a Core i9-9900K CPU @ 5.0GHz, +on a desktop running Ubuntu 20.04 (`Linux 5.11.0-41-generic`), +with a Core i7-9700K CPU @ 4.9GHz, using [lzbench], an open-source in-memory benchmark by @inikep compiled with [gcc] 9.3.0, on the [Silesia compression corpus]. [lzbench]: https://github.com/inikep/lzbench -[Silesia compression corpus]: http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia +[Silesia compression corpus]: https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia [gcc]: https://gcc.gnu.org/ | Compressor name | Ratio | Compression| Decompress.| | --------------- | ------| -----------| ---------- | -| **zstd 1.4.5 -1** | 2.884 | 500 MB/s | 1660 MB/s | -| zlib 1.2.11 -1 | 2.743 | 90 MB/s | 400 MB/s | -| brotli 1.0.7 -0 | 2.703 | 400 MB/s | 450 MB/s | -| **zstd 1.4.5 --fast=1** | 2.434 | 570 MB/s | 2200 MB/s | -| **zstd 1.4.5 --fast=3** | 2.312 | 640 MB/s | 2300 MB/s | -| quicklz 1.5.0 -1 | 2.238 | 560 MB/s | 710 MB/s | -| **zstd 1.4.5 --fast=5** | 2.178 | 700 MB/s | 2420 MB/s | -| lzo1x 2.10 -1 | 2.106 | 690 MB/s | 820 MB/s | -| lz4 1.9.2 | 2.101 | 740 MB/s | 4530 MB/s | -| **zstd 1.4.5 --fast=7** | 2.096 | 750 MB/s | 2480 MB/s | -| lzf 3.6 -1 | 2.077 | 410 MB/s | 860 MB/s | -| snappy 1.1.8 | 2.073 | 560 MB/s | 1790 MB/s | +| **zstd 1.5.1 -1** | 2.887 | 530 MB/s | 1700 MB/s | +| [zlib] 1.2.11 -1 | 2.743 | 95 MB/s | 400 MB/s | +| brotli 1.0.9 -0 | 2.702 | 395 MB/s | 450 MB/s | +| **zstd 1.5.1 --fast=1** | 2.437 | 600 MB/s | 2150 MB/s | +| **zstd 1.5.1 --fast=3** | 2.239 | 670 MB/s | 2250 MB/s | +| quicklz 1.5.0 -1 | 2.238 | 540 MB/s | 760 MB/s | +| **zstd 1.5.1 --fast=4** | 2.148 | 710 MB/s | 2300 MB/s | +| lzo1x 2.10 -1 | 2.106 | 660 MB/s | 845 MB/s | +| [lz4] 1.9.3 | 2.101 | 740 MB/s | 4500 MB/s | +| lzf 3.6 -1 | 2.077 | 410 MB/s | 830 MB/s | +| snappy 1.1.9 | 2.073 | 550 MB/s | 1750 MB/s | -[zlib]: http://www.zlib.net/ -[LZ4]: http://www.lz4.org/ +[zlib]: https://www.zlib.net/ +[lz4]: https://lz4.github.io/lz4/ The negative compression levels, specified with `--fast=#`, -offer faster compression and decompression speed in exchange for some loss in -compression ratio compared to level 1, as seen in the table above. +offer faster compression and decompression speed +at the cost of compression ratio (compared to level 1). Zstd can also offer stronger compression ratios at the cost of compression speed. Speed vs Compression trade-off is configurable by small increments. @@ -124,14 +124,27 @@ Dictionary gains are mostly effective in the first few KB. Then, the compression ## Build instructions +`make` is the officially maintained build system of this project. +All other build systems are "compatible" and 3rd-party maintained, +they may feature small differences in advanced options. +When your system allows it, prefer using `make` to build `zstd` and `libzstd`. + ### Makefile If your system is compatible with standard `make` (or `gmake`), invoking `make` in root directory will generate `zstd` cli in root directory. +It will also create `libzstd` into `lib/`. Other available options include: - `make install` : create and install zstd cli, library and man pages -- `make check` : create and run `zstd`, tests its behavior on local platform +- `make check` : create and run `zstd`, test its behavior on local platform + +The `Makefile` follows the [GNU Standard Makefile conventions](https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html), +allowing staged install, standard flags, directory variables and command variables. + +For advanced use cases, specialized compilation flags which control binary generation +are documented in [`lib/README.md`](lib/README.md#modular-build) for the `libzstd` library +and in [`programs/README.md`](programs/README.md#compilation-variables) for the `zstd` CLI. ### cmake @@ -178,13 +191,15 @@ The output binary will be in `buck-out/gen/programs/`. ## Testing -You can run quick local smoke tests by executing the `playTest.sh` script from the `src/tests` directory. -Two env variables `$ZSTD_BIN` and `$DATAGEN_BIN` are needed for the test script to locate the zstd and datagen binary. -For information on CI testing, please refer to TESTING.md +You can run quick local smoke tests by running `make check`. +If you can't use `make`, execute the `playTest.sh` script from the `src/tests` directory. +Two env variables `$ZSTD_BIN` and `$DATAGEN_BIN` are needed for the test script to locate the `zstd` and `datagen` binary. +For information on CI testing, please refer to `TESTING.md`. ## Status -Zstandard is currently deployed within Facebook. It is used continuously to compress large amounts of data in multiple formats and use cases. +Zstandard is currently deployed within Facebook and many other large cloud infrastructures. +It is run continuously to compress large amounts of data in multiple formats and use cases. Zstandard is considered safe for production environments. ## License diff --git a/src/dependencies/zstd-1.5.0/TESTING.md b/src/dependencies/zstd-1.5.4/TESTING.md similarity index 95% rename from src/dependencies/zstd-1.5.0/TESTING.md rename to src/dependencies/zstd-1.5.4/TESTING.md index 32b133b..df842cc 100644 --- a/src/dependencies/zstd-1.5.0/TESTING.md +++ b/src/dependencies/zstd-1.5.4/TESTING.md @@ -22,7 +22,7 @@ They consist of the following tests: - `tests/playTests.sh --test-large-data` - Fuzzer tests: `tests/fuzzer.c`, `tests/zstreamtest.c`, and `tests/decodecorpus.c` - `tests/zstreamtest.c` under Tsan (streaming mode, including multithreaded mode) -- Valgrind Test (`make -C tests valgrindTest`) (testing CLI and fuzzer under valgrind) +- Valgrind Test (`make -C tests test-valgrind`) (testing CLI and fuzzer under `valgrind`) - Fuzzer tests (see above) on ARM, AArch64, PowerPC, and PowerPC64 Long Tests diff --git a/src/dependencies/zstd-1.5.4/appveyor.yml b/src/dependencies/zstd-1.5.4/appveyor.yml new file mode 100644 index 0000000..c58ef91 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/appveyor.yml @@ -0,0 +1,205 @@ +# Following tests are run _only_ on `release` branch +# and on selected feature branch named `appveyorTest` or `visual*` + +- + version: 1.0.{build} + branches: + only: + - release + - master + - /appveyor*/ + - /visual*/ + environment: + matrix: + - COMPILER: "gcc" + HOST: "mingw" + PLATFORM: "x64" + SCRIPT: "make allzstd MOREFLAGS=-static" + ARTIFACT: "true" + BUILD: "true" + - COMPILER: "gcc" + HOST: "mingw" + PLATFORM: "x86" + SCRIPT: "make allzstd MOREFLAGS=-static" + ARTIFACT: "true" + BUILD: "true" + + - COMPILER: "clang-cl" + HOST: "cmake-visual" + PLATFORM: "x64" + CONFIGURATION: "Release" + CMAKE_GENERATOR: "Visual Studio 15 2017" + CMAKE_GENERATOR_PLATFORM: "x64" + CMAKE_GENERATOR_TOOLSET: "LLVM" + APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" + + install: + - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION% + - SET PATH_ORIGINAL=%PATH% + - if [%HOST%]==[mingw] ( + SET "PATH_MINGW32=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin" && + SET "PATH_MINGW64=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin" && + COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\make.exe && + COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin\make.exe + ) + - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] ( + SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;" + ) + + build_script: + - if [%HOST%]==[mingw] ( + ( if [%PLATFORM%]==[x64] ( + SET "PATH=%PATH_MINGW64%;%PATH_ORIGINAL%" + ) else if [%PLATFORM%]==[x86] ( + SET "PATH=%PATH_MINGW32%;%PATH_ORIGINAL%" + ) ) + ) + - if [%HOST%]==[mingw] if [%BUILD%]==[true] ( + make -v && + sh -c "%COMPILER% -v" && + ECHO Building zlib to static link && + SET "CC=%COMPILER%" && + sh -c "cd .. && git clone --depth 1 --branch v1.2.11 https://github.com/madler/zlib" && + sh -c "cd ../zlib && make -f win32/Makefile.gcc libz.a" + ECHO Building zstd && + SET "CPPFLAGS=-I../../zlib" && + SET "LDFLAGS=../../zlib/libz.a" && + sh -c "%SCRIPT%" && + ( if [%COMPILER%]==[gcc] if [%ARTIFACT%]==[true] + ECHO Creating artifacts && + ECHO %cd% && + lib\dll\example\build_package.bat && + make -C programs DEBUGFLAGS= clean zstd && + cd programs\ && 7z a -tzip -mx9 zstd-win-binary-%PLATFORM%.zip zstd.exe && + appveyor PushArtifact zstd-win-binary-%PLATFORM%.zip && + cp zstd.exe ..\bin\zstd.exe && + git clone --depth 1 --branch release https://github.com/facebook/zstd && + cd zstd && + git archive --format=tar release -o zstd-src.tar && + ..\zstd -19 zstd-src.tar && + appveyor PushArtifact zstd-src.tar.zst && + certUtil -hashfile zstd-src.tar.zst SHA256 > zstd-src.tar.zst.sha256.sig && + appveyor PushArtifact zstd-src.tar.zst.sha256.sig && + cd ..\..\bin\ && + 7z a -tzip -mx9 zstd-win-release-%PLATFORM%.zip * && + appveyor PushArtifact zstd-win-release-%PLATFORM%.zip + ) + ) + - if [%HOST%]==[cmake-visual] ( + ECHO *** && + ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% && + PUSHD build\cmake && + cmake -DBUILD_TESTING=ON . && + cmake --build . --config %CONFIGURATION% -j4 && + POPD && + ECHO *** + ) + + test_script: + - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION% + - SET "CC=gcc" + - SET "CXX=g++" + - if [%TEST%]==[cmake] ( + mkdir build\cmake\build && + cd build\cmake\build && + SET FUZZERTEST=-T2mn && + SET ZSTREAM_TESTTIME=-T2mn && + cmake -G "Visual Studio 14 2015 Win64" .. && + cd ..\..\.. && + make clean + ) + + +# The following tests are for regular pushes +# into `dev` or some feature branch +# There run less tests, for shorter feedback loop + +- + version: 1.0.{build} + environment: + matrix: + - COMPILER: "visual" + HOST: "visual" + PLATFORM: "x64" + CONFIGURATION: "Debug" + - COMPILER: "visual" + HOST: "visual" + PLATFORM: "Win32" + CONFIGURATION: "Debug" + - COMPILER: "visual" + HOST: "visual" + PLATFORM: "x64" + CONFIGURATION: "Release" + - COMPILER: "visual" + HOST: "visual" + PLATFORM: "Win32" + CONFIGURATION: "Release" + + - COMPILER: "gcc" + HOST: "cygwin" + PLATFORM: "x64" + + - COMPILER: "clang-cl" + HOST: "cmake-visual" + PLATFORM: "x64" + CONFIGURATION: "Release" + CMAKE_GENERATOR: "Visual Studio 15 2017" + CMAKE_GENERATOR_PLATFORM: "x64" + CMAKE_GENERATOR_TOOLSET: "LLVM" + APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" + + install: + - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION% + - SET PATH_ORIGINAL=%PATH% + - if [%HOST%]==[cygwin] ( + ECHO Installing Cygwin Packages && + C:\cygwin64\setup-x86_64.exe -qnNdO -R "C:\cygwin64" -g -P ^ + gcc,^ + cmake,^ + make + ) + - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] ( + SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;" + ) + + build_script: + - ECHO Building %COMPILER% %PLATFORM% %CONFIGURATION% + - if [%HOST%]==[cygwin] ( + set CHERE_INVOKING=yes && + set CC=%COMPILER% && + C:\cygwin64\bin\bash --login -c " + set -e; + cd build/cmake; + CFLAGS='-Werror' cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_FUZZER_FLAGS=-T20s -DZSTD_ZSTREAM_FLAGS=-T20s -DZSTD_FULLBENCH_FLAGS=-i0 .; + make VERBOSE=1 -j; + ctest -V -L Medium; + " + ) + - if [%HOST%]==[cmake-visual] ( + ECHO *** && + ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% && + PUSHD build\cmake && + cmake -DBUILD_TESTING=ON . && + cmake --build . --config %CONFIGURATION% -j4 && + POPD && + ECHO *** + ) + - if [%HOST%]==[visual] ( + ECHO *** && + ECHO *** Building Visual Studio 2012 %PLATFORM%\%CONFIGURATION% && + ECHO *** && + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && + DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe && + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" && + DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe + ) + + + test_script: + - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION% + - SET "FUZZERTEST=-T10s" + - if [%HOST%]==[mingw] ( + set "CC=%COMPILER%" && + make clean && + make check + ) \ No newline at end of file diff --git a/src/dependencies/zstd-1.5.0/build/.gitignore b/src/dependencies/zstd-1.5.4/build/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/.gitignore rename to src/dependencies/zstd-1.5.4/build/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/LICENSE b/src/dependencies/zstd-1.5.4/build/LICENSE similarity index 100% rename from src/dependencies/zstd-1.5.0/build/LICENSE rename to src/dependencies/zstd-1.5.4/build/LICENSE diff --git a/src/dependencies/zstd-1.5.0/build/README.md b/src/dependencies/zstd-1.5.4/build/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/build/README.md rename to src/dependencies/zstd-1.5.4/build/README.md diff --git a/src/dependencies/zstd-1.5.0/build/VS2008/fullbench/fullbench.vcproj b/src/dependencies/zstd-1.5.4/build/VS2008/fullbench/fullbench.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2008/fullbench/fullbench.vcproj rename to src/dependencies/zstd-1.5.4/build/VS2008/fullbench/fullbench.vcproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2008/fuzzer/fuzzer.vcproj b/src/dependencies/zstd-1.5.4/build/VS2008/fuzzer/fuzzer.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2008/fuzzer/fuzzer.vcproj rename to src/dependencies/zstd-1.5.4/build/VS2008/fuzzer/fuzzer.vcproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2008/zstd.sln b/src/dependencies/zstd-1.5.4/build/VS2008/zstd.sln similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2008/zstd.sln rename to src/dependencies/zstd-1.5.4/build/VS2008/zstd.sln diff --git a/src/dependencies/zstd-1.5.0/build/VS2008/zstd/zstd.vcproj b/src/dependencies/zstd-1.5.4/build/VS2008/zstd/zstd.vcproj similarity index 99% rename from src/dependencies/zstd-1.5.0/build/VS2008/zstd/zstd.vcproj rename to src/dependencies/zstd-1.5.4/build/VS2008/zstd/zstd.vcproj index c7eec57..91f2bda 100644 --- a/src/dependencies/zstd-1.5.0/build/VS2008/zstd/zstd.vcproj +++ b/src/dependencies/zstd-1.5.4/build/VS2008/zstd/zstd.vcproj @@ -384,6 +384,10 @@ RelativePath="..\..\..\programs\fileio.c" > + + diff --git a/src/dependencies/zstd-1.5.0/build/VS2008/zstdlib/zstdlib.vcproj b/src/dependencies/zstd-1.5.4/build/VS2008/zstdlib/zstdlib.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2008/zstdlib/zstdlib.vcproj rename to src/dependencies/zstd-1.5.4/build/VS2008/zstdlib/zstdlib.vcproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/CompileAsCpp.props b/src/dependencies/zstd-1.5.4/build/VS2010/CompileAsCpp.props similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/CompileAsCpp.props rename to src/dependencies/zstd-1.5.4/build/VS2010/CompileAsCpp.props diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/datagen/datagen.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/datagen/datagen.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/datagen/datagen.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/datagen/datagen.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/fullbench-dll/fullbench-dll.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/fullbench-dll/fullbench-dll.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/fullbench-dll/fullbench-dll.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/fullbench-dll/fullbench-dll.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/fullbench/fullbench.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/fullbench/fullbench.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/fullbench/fullbench.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/fullbench/fullbench.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/fuzzer/fuzzer.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/fuzzer/fuzzer.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/fuzzer/fuzzer.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/fuzzer/fuzzer.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/libzstd-dll/libzstd-dll.rc b/src/dependencies/zstd-1.5.4/build/VS2010/libzstd-dll/libzstd-dll.rc similarity index 88% rename from src/dependencies/zstd-1.5.0/build/VS2010/libzstd-dll/libzstd-dll.rc rename to src/dependencies/zstd-1.5.4/build/VS2010/libzstd-dll/libzstd-dll.rc index ee9f562..13e8746 100644 --- a/src/dependencies/zstd-1.5.0/build/VS2010/libzstd-dll/libzstd-dll.rc +++ b/src/dependencies/zstd-1.5.4/build/VS2010/libzstd-dll/libzstd-dll.rc @@ -32,11 +32,11 @@ BEGIN BEGIN BLOCK "040904B0" BEGIN - VALUE "CompanyName", "Yann Collet, Facebook, Inc." + VALUE "CompanyName", "Meta Platforms, Inc." VALUE "FileDescription", "Zstandard - Fast and efficient compression algorithm" VALUE "FileVersion", ZSTD_VERSION_STRING VALUE "InternalName", "libzstd.dll" - VALUE "LegalCopyright", "Copyright (c) 2013-present, Yann Collet, Facebook, Inc." + VALUE "LegalCopyright", "Copyright (c) Meta Platforms, Inc. and affiliates." VALUE "OriginalFilename", "libzstd.dll" VALUE "ProductName", "Zstandard" VALUE "ProductVersion", ZSTD_VERSION_STRING diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/libzstd-dll/libzstd-dll.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/libzstd-dll/libzstd-dll.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/libzstd-dll/libzstd-dll.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/libzstd-dll/libzstd-dll.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/libzstd/libzstd.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/libzstd/libzstd.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/libzstd/libzstd.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/libzstd/libzstd.vcxproj diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/zstd.sln b/src/dependencies/zstd-1.5.4/build/VS2010/zstd.sln similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS2010/zstd.sln rename to src/dependencies/zstd-1.5.4/build/VS2010/zstd.sln diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.rc b/src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.rc similarity index 88% rename from src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.rc rename to src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.rc index f5e4047..a2118c2 100644 --- a/src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.rc +++ b/src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.rc @@ -32,11 +32,11 @@ BEGIN BEGIN BLOCK "040904B0" BEGIN - VALUE "CompanyName", "Yann Collet, Facebook, Inc." + VALUE "CompanyName", "Meta Platforms, Inc." VALUE "FileDescription", "Zstandard - Fast and efficient compression algorithm" VALUE "FileVersion", ZSTD_VERSION_STRING VALUE "InternalName", "zstd.exe" - VALUE "LegalCopyright", "Copyright (c) 2013-present, Yann Collet, Facebook, Inc." + VALUE "LegalCopyright", "Copyright (c) Meta Platforms, Inc. and affiliates." VALUE "OriginalFilename", "zstd.exe" VALUE "ProductName", "Zstandard" VALUE "ProductVersion", ZSTD_VERSION_STRING diff --git a/src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.vcxproj b/src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.vcxproj similarity index 99% rename from src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.vcxproj rename to src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.vcxproj index 46e22f4..8ab239d 100644 --- a/src/dependencies/zstd-1.5.0/build/VS2010/zstd/zstd.vcxproj +++ b/src/dependencies/zstd-1.5.4/build/VS2010/zstd/zstd.vcxproj @@ -62,6 +62,7 @@ + diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/README.md b/src/dependencies/zstd-1.5.4/build/VS_scripts/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/README.md rename to src/dependencies/zstd-1.5.4/build/VS_scripts/README.md diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2010.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2010.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2010.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2010.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2012.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2012.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2012.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2012.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2013.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2013.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2013.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2013.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2015.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2015.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2015.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2015.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Community.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Community.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Community.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Community.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Enterprise.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Enterprise.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Enterprise.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Enterprise.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Professional.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Professional.cmd similarity index 100% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.VS2017Professional.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.VS2017Professional.cmd diff --git a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.generic.cmd b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.generic.cmd similarity index 77% rename from src/dependencies/zstd-1.5.0/build/VS_scripts/build.generic.cmd rename to src/dependencies/zstd-1.5.4/build/VS_scripts/build.generic.cmd index a7ca4d0..b24e6ed 100644 --- a/src/dependencies/zstd-1.5.0/build/VS_scripts/build.generic.cmd +++ b/src/dependencies/zstd-1.5.4/build/VS_scripts/build.generic.cmd @@ -19,10 +19,10 @@ GOTO build :display_help echo Syntax: build.generic.cmd msbuild_version msbuild_platform msbuild_configuration msbuild_toolset -echo msbuild_version: VS installed version (VS2012, VS2013, VS2015, VS2017, ...) +echo msbuild_version: VS installed version (VS2012, VS2013, VS2015, VS2017, VS2019, ...) echo msbuild_platform: Platform (x64 or Win32) echo msbuild_configuration: VS configuration (Release or Debug) -echo msbuild_toolset: Platform Toolset (v100, v110, v120, v140, v141) +echo msbuild_toolset: Platform Toolset (v100, v110, v120, v140, v141, v142, ...) EXIT /B 1 @@ -43,6 +43,16 @@ IF %msbuild_version% == VS2017 ( IF EXIST %msbuild_vs2017enterprise% SET msbuild=%msbuild_vs2017enterprise% ) +:: VS2019 +SET msbuild_vs2019community="%programfiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" +SET msbuild_vs2019professional="%programfiles(x86)%\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" +SET msbuild_vs2019enterprise="%programfiles(x86)%\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" +IF %msbuild_version% == VS2019 ( + IF EXIST %msbuild_vs2019community% SET msbuild=%msbuild_vs2019community% + IF EXIST %msbuild_vs2019professional% SET msbuild=%msbuild_vs2019professional% + IF EXIST %msbuild_vs2019enterprise% SET msbuild=%msbuild_vs2019enterprise% +) + SET project="%~p0\..\VS2010\zstd.sln" SET msbuild_params=/verbosity:minimal /nologo /t:Clean,Build /p:Platform=%msbuild_platform% /p:Configuration=%msbuild_configuration% diff --git a/src/dependencies/zstd-1.5.0/build/cmake/.gitignore b/src/dependencies/zstd-1.5.4/build/cmake/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/.gitignore rename to src/dependencies/zstd-1.5.4/build/cmake/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/cmake/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/CMakeLists.txt similarity index 89% rename from src/dependencies/zstd-1.5.0/build/cmake/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/CMakeLists.txt index a050577..0bffc87 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2016-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -8,18 +8,18 @@ # ################################################################ cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) - -# As of 2018-12-26 ZSTD has been validated to build with cmake version 3.13.2 new policies. -# Set and use the newest cmake policies that are validated to work -set(ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION "3") + +# As of 2018-12-26 ZSTD has been validated to build with cmake version 3.13.2 new policies. +# Set and use the newest cmake policies that are validated to work +set(ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION "3") set(ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION "13") #Policies never changed at PATCH level if("${CMAKE_MAJOR_VERSION}" LESS 3) - set(ZSTD_CMAKE_POLICY_VERSION "${CMAKE_VERSION}") -elseif( "${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}" EQUAL "${CMAKE_MAJOR_VERSION}" AND + set(ZSTD_CMAKE_POLICY_VERSION "${CMAKE_VERSION}") +elseif( "${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}" EQUAL "${CMAKE_MAJOR_VERSION}" AND "${ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION}" GREATER "${CMAKE_MINOR_VERSION}") - set(ZSTD_CMAKE_POLICY_VERSION "${CMAKE_VERSION}") -else() - set(ZSTD_CMAKE_POLICY_VERSION "${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}.${ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION}.0") + set(ZSTD_CMAKE_POLICY_VERSION "${CMAKE_VERSION}") +else() + set(ZSTD_CMAKE_POLICY_VERSION "${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}.${ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION}.0") endif() cmake_policy(VERSION ${ZSTD_CMAKE_POLICY_VERSION}) @@ -40,16 +40,18 @@ if( CMAKE_MAJOR_VERSION LESS 3 ) set(PROJECT_VERSION_PATCH ${zstd_VERSION_PATCH}) set(PROJECT_VERSION "${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH}") enable_language(C) # Main library is in C + enable_language(ASM) # And ASM enable_language(CXX) # Testing contributed code also utilizes CXX else() project(zstd VERSION "${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH}" LANGUAGES C # Main library is in C + ASM # And ASM CXX # Testing contributed code also utilizes CXX ) endif() message(STATUS "ZSTD VERSION: ${zstd_VERSION}") -set(zstd_HOMEPAGE_URL "http://www.zstd.net") +set(zstd_HOMEPAGE_URL "https://facebook.github.io/zstd") set(zstd_DESCRIPTION "Zstandard is a real-time compression algorithm, providing high compression ratios.") # Set a default build type if none was specified @@ -82,18 +84,25 @@ message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}") #----------------------------------------------------------------------------- # Legacy support -option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" OFF) +option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" ON) if (ZSTD_LEGACY_SUPPORT) message(STATUS "ZSTD_LEGACY_SUPPORT defined!") - add_definitions(-DZSTD_LEGACY_SUPPORT=5) + set(ZSTD_LEGACY_LEVEL 5 CACHE STRING "") + add_definitions(-DZSTD_LEGACY_SUPPORT=${ZSTD_LEGACY_LEVEL}) else () message(STATUS "ZSTD_LEGACY_SUPPORT not defined!") add_definitions(-DZSTD_LEGACY_SUPPORT=0) endif () +if (ANDROID) + set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT OFF) +else() + set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT ON) +endif() + # Multi-threading support -option(ZSTD_MULTITHREAD_SUPPORT "MULTITHREADING SUPPORT" ON) +option(ZSTD_MULTITHREAD_SUPPORT "MULTITHREADING SUPPORT" ${ZSTD_MULTITHREAD_SUPPORT_DEFAULT}) if (ZSTD_MULTITHREAD_SUPPORT) message(STATUS "ZSTD_MULTITHREAD_SUPPORT is enabled") diff --git a/src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake similarity index 57% rename from src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake rename to src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake index e23b9d6..0265349 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake +++ b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake @@ -1,7 +1,8 @@ include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) +include(CheckLinkerFlag) -function(EnableCompilerFlag _flag _C _CXX) +function(EnableCompilerFlag _flag _C _CXX _LD) string(REGEX REPLACE "\\+" "PLUS" varname "${_flag}") string(REGEX REPLACE "[^A-Za-z0-9]+" "_" varname "${varname}") string(REGEX REPLACE "^_+" "" varname "${varname}") @@ -18,43 +19,58 @@ function(EnableCompilerFlag _flag _C _CXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" PARENT_SCOPE) endif () endif () + if (_LD) + CHECK_LINKER_FLAG(C ${_flag} LD_FLAG_${varname}) + if (LD_FLAG_${varname}) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_flag}" PARENT_SCOPE) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_flag}" PARENT_SCOPE) + endif () + endif () endfunction() macro(ADD_ZSTD_COMPILATION_FLAGS) if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" OR MINGW) #Not only UNIX but also WIN32 for MinGW - #Set c++11 by default - EnableCompilerFlag("-std=c++11" false true) - #Set c99 by default - EnableCompilerFlag("-std=c99" true false) + # It's possible to select the exact standard used for compilation. + # It's not necessary, but can be employed for specific purposes. + # Note that zstd source code is compatible with both C++98 and above + # and C-gnu90 (c90 + long long + variadic macros ) and above + # EnableCompilerFlag("-std=c++11" false true) # Set C++ compilation to c++11 standard + # EnableCompilerFlag("-std=c99" true false) # Set C compiation to c99 standard if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC) # clang-cl normally maps -Wall to -Weverything. - EnableCompilerFlag("/clang:-Wall" true true) + EnableCompilerFlag("/clang:-Wall" true true false) else () - EnableCompilerFlag("-Wall" true true) + EnableCompilerFlag("-Wall" true true false) endif () - EnableCompilerFlag("-Wextra" true true) - EnableCompilerFlag("-Wundef" true true) - EnableCompilerFlag("-Wshadow" true true) - EnableCompilerFlag("-Wcast-align" true true) - EnableCompilerFlag("-Wcast-qual" true true) - EnableCompilerFlag("-Wstrict-prototypes" true false) + EnableCompilerFlag("-Wextra" true true false) + EnableCompilerFlag("-Wundef" true true false) + EnableCompilerFlag("-Wshadow" true true false) + EnableCompilerFlag("-Wcast-align" true true false) + EnableCompilerFlag("-Wcast-qual" true true false) + EnableCompilerFlag("-Wstrict-prototypes" true false false) # Enable asserts in Debug mode if (CMAKE_BUILD_TYPE MATCHES "Debug") - EnableCompilerFlag("-DDEBUGLEVEL=1" true true) + EnableCompilerFlag("-DDEBUGLEVEL=1" true true false) endif () + # Add noexecstack flags + # LDFLAGS + EnableCompilerFlag("-z noexecstack" false false true) + # CFLAGS & CXXFLAGS + EnableCompilerFlag("-Qunused-arguments" true true false) + EnableCompilerFlag("-Wa,--noexecstack" true true false) elseif (MSVC) # Add specific compilation flags for Windows Visual set(ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate multi-threaded compilation (/MP flag)") if (CMAKE_GENERATOR MATCHES "Visual Studio" AND ACTIVATE_MULTITHREADED_COMPILATION) - EnableCompilerFlag("/MP" true true) + EnableCompilerFlag("/MP" true true false) endif () - + # UNICODE SUPPORT - EnableCompilerFlag("/D_UNICODE" true true) - EnableCompilerFlag("/DUNICODE" true true) + EnableCompilerFlag("/D_UNICODE" true true false) + EnableCompilerFlag("/DUNICODE" true true false) # Enable asserts in Debug mode if (CMAKE_BUILD_TYPE MATCHES "Debug") - EnableCompilerFlag("/DDEBUGLEVEL=1" true true) + EnableCompilerFlag("/DDEBUGLEVEL=1" true true false) endif () endif () diff --git a/src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/FindLibLZ4.cmake b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/FindLibLZ4.cmake similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/FindLibLZ4.cmake rename to src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/FindLibLZ4.cmake diff --git a/src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake rename to src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake diff --git a/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/JoinPaths.cmake b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/JoinPaths.cmake new file mode 100644 index 0000000..c68d91b --- /dev/null +++ b/src/dependencies/zstd-1.5.4/build/cmake/CMakeModules/JoinPaths.cmake @@ -0,0 +1,23 @@ +# This module provides function for joining paths +# known from most languages +# +# SPDX-License-Identifier: (MIT OR CC0-1.0) +# Copyright 2020 Jan Tojnar +# https://github.com/jtojnar/cmake-snips +# +# Modelled after Python’s os.path.join +# https://docs.python.org/3.7/library/os.path.html#os.path.join +# Windows not supported +function(join_paths joined_path first_path_segment) + set(temp_path "${first_path_segment}") + foreach(current_segment IN LISTS ARGN) + if(NOT ("${current_segment}" STREQUAL "")) + if(IS_ABSOLUTE "${current_segment}") + set(temp_path "${current_segment}") + else() + set(temp_path "${temp_path}/${current_segment}") + endif() + endif() + endforeach() + set(${joined_path} "${temp_path}" PARENT_SCOPE) +endfunction() diff --git a/src/dependencies/zstd-1.5.0/build/cmake/README.md b/src/dependencies/zstd-1.5.4/build/cmake/README.md similarity index 92% rename from src/dependencies/zstd-1.5.0/build/cmake/README.md rename to src/dependencies/zstd-1.5.4/build/cmake/README.md index 73b30dc..a460dd1 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/README.md +++ b/src/dependencies/zstd-1.5.4/build/cmake/README.md @@ -1,13 +1,13 @@ # Cmake contributions Contributions to the cmake build configurations are welcome. Please -use case sensitivity that matches modern (ie. cmake version 2.6 and above) +use case sensitivity that matches modern (i.e. cmake version 2.6 and above) conventions of using lower-case for commands, and upper-case for variables. ## How to build -As cmake doesn't support command like `cmake clean`, it's recommended to perform a "out of source build". +As cmake doesn't support command like `cmake clean`, it's recommended to perform an "out of source build". To do this, you can create a new directory and build in it: ```sh cd build/cmake @@ -37,7 +37,7 @@ cmake -LH .. Bool options can be set to `ON/OFF` with `-D[option]=[ON/OFF]`. You can configure cmake options like this: ```sh cd build/cmake/builddir -cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=ON .. +cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=OFF .. make ``` diff --git a/src/dependencies/zstd-1.5.0/build/cmake/contrib/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/contrib/CMakeLists.txt similarity index 88% rename from src/dependencies/zstd-1.5.0/build/cmake/contrib/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/contrib/CMakeLists.txt index f7631d0..8df2a17 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/contrib/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/contrib/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2016-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/build/cmake/contrib/gen_html/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/contrib/gen_html/CMakeLists.txt similarity index 95% rename from src/dependencies/zstd-1.5.0/build/cmake/contrib/gen_html/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/contrib/gen_html/CMakeLists.txt index 8fdd611..d1ff6c6 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/contrib/gen_html/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/contrib/gen_html/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2015-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/build/cmake/contrib/pzstd/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/contrib/pzstd/CMakeLists.txt similarity index 84% rename from src/dependencies/zstd-1.5.0/build/cmake/contrib/pzstd/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/contrib/pzstd/CMakeLists.txt index 5c30a91..f7098fa 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/contrib/pzstd/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/contrib/pzstd/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2016-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -21,10 +21,16 @@ add_executable(pzstd ${PROGRAMS_DIR}/util.c ${PZSTD_DIR}/main.cpp ${PZSTD_DIR}/O set_property(TARGET pzstd APPEND PROPERTY COMPILE_DEFINITIONS "NDEBUG") set_property(TARGET pzstd APPEND PROPERTY COMPILE_OPTIONS "-Wno-shadow") +if (ZSTD_BUILD_SHARED) + set(ZSTD_LIB libzstd_shared) +else() + set(ZSTD_LIB libzstd_static) +endif() + set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) if (CMAKE_USE_PTHREADS_INIT) - target_link_libraries(pzstd libzstd_shared ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(pzstd ${ZSTD_LIB} ${CMAKE_THREAD_LIBS_INIT}) else() message(SEND_ERROR "ZSTD currently does not support thread libraries other than pthreads") endif() diff --git a/src/dependencies/zstd-1.5.0/build/cmake/lib/.gitignore b/src/dependencies/zstd-1.5.4/build/cmake/lib/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/lib/.gitignore rename to src/dependencies/zstd-1.5.4/build/cmake/lib/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/cmake/lib/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/lib/CMakeLists.txt similarity index 80% rename from src/dependencies/zstd-1.5.0/build/cmake/lib/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/lib/CMakeLists.txt index 5f75665..3034958 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/lib/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/lib/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2015-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -7,7 +7,7 @@ # in the COPYING file in the root directory of this source tree). # ################################################################ -project(libzstd C) +project(libzstd C ASM) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) option(ZSTD_BUILD_STATIC "BUILD STATIC LIBRARIES" ON) @@ -22,7 +22,12 @@ include_directories(${LIBRARY_DIR} ${LIBRARY_DIR}/common) file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c) file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c) -file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) +if (MSVC) + file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) + add_compile_options(-DZSTD_DISABLE_ASM) +else () + file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c ${LIBRARY_DIR}/decompress/*.S) +endif () file(GLOB DictBuilderSources ${LIBRARY_DIR}/dictBuilder/*.c) set(Sources @@ -72,6 +77,12 @@ if (MSVC) set(PlatformDependResources ${MSVC_RESOURCE_DIR}/libzstd-dll.rc) endif () +# Explicitly set the language to C for all files, including ASM files. +# Our assembly expects to be compiled by a C compiler, and is only enabled for +# __GNUC__ compatible compilers. Otherwise all the ASM code is disabled by +# macros. +set_source_files_properties(${Sources} PROPERTIES LANGUAGE C) + # Split project to static and shared libraries build set(library_targets) if (ZSTD_BUILD_SHARED) @@ -106,7 +117,7 @@ if (MSVC) endif () # With MSVC static library needs to be renamed to avoid conflict with import library -if (MSVC) +if (MSVC OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT MINGW)) set(STATIC_LIBRARY_BASE_NAME zstd_static) else () set(STATIC_LIBRARY_BASE_NAME zstd) @@ -130,30 +141,17 @@ if (ZSTD_BUILD_STATIC) OUTPUT_NAME ${STATIC_LIBRARY_BASE_NAME}) endif () -if (UNIX OR MINGW) - # pkg-config - set(PREFIX "${CMAKE_INSTALL_PREFIX}") - set(EXEC_PREFIX "\${prefix}") - set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") - set(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}") - set(VERSION "${zstd_VERSION}") +# pkg-config +include(JoinPaths) # can be replaced by cmake_path(APPEND) in CMake 3.20 +set(PREFIX "${CMAKE_INSTALL_PREFIX}") +set(EXEC_PREFIX "\${prefix}") +join_paths(LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") +join_paths(INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") +set(LIBS_PRIVATE "${THREADS_LIBS}") +set(VERSION "${zstd_VERSION}") - string(LENGTH "${PREFIX}" PREFIX_LENGTH) - string(SUBSTRING "${LIBDIR}" 0 ${PREFIX_LENGTH} LIBDIR_PREFIX) - string(SUBSTRING "${LIBDIR}" ${PREFIX_LENGTH} -1 LIBDIR_SUFFIX) - string(SUBSTRING "${INCLUDEDIR}" 0 ${PREFIX_LENGTH} INCLUDEDIR_PREFIX) - string(SUBSTRING "${INCLUDEDIR}" ${PREFIX_LENGTH} -1 INCLUDEDIR_SUFFIX) - - if ("${INCLUDEDIR_PREFIX}" STREQUAL "${PREFIX}") - set(INCLUDEDIR "\${prefix}${INCLUDEDIR_SUFFIX}") - endif() - if ("${LIBDIR_PREFIX}" STREQUAL "${PREFIX}") - set(LIBDIR "\${exec_prefix}${LIBDIR_SUFFIX}") - endif() - - configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -endif () +configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") # install target install(FILES @@ -168,6 +166,7 @@ install(TARGETS ${library_targets} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}" ) # uninstall target diff --git a/src/dependencies/zstd-1.5.0/build/cmake/lib/cmake_uninstall.cmake.in b/src/dependencies/zstd-1.5.4/build/cmake/lib/cmake_uninstall.cmake.in similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/lib/cmake_uninstall.cmake.in rename to src/dependencies/zstd-1.5.4/build/cmake/lib/cmake_uninstall.cmake.in diff --git a/src/dependencies/zstd-1.5.0/build/cmake/programs/.gitignore b/src/dependencies/zstd-1.5.4/build/cmake/programs/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/programs/.gitignore rename to src/dependencies/zstd-1.5.4/build/cmake/programs/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/cmake/programs/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/programs/CMakeLists.txt similarity index 93% rename from src/dependencies/zstd-1.5.0/build/cmake/programs/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/programs/CMakeLists.txt index f1d1277..58d998e 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/programs/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/programs/CMakeLists.txt @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2015-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -32,12 +32,14 @@ if (MSVC) set(PlatformDependResources ${MSVC_RESOURCE_DIR}/zstd.rc) endif () -add_executable(zstd ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/dibio.c ${PROGRAMS_DIR}/zstdcli_trace.c ${PlatformDependResources}) +add_executable(zstd ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/fileio_asyncio.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/dibio.c ${PROGRAMS_DIR}/zstdcli_trace.c ${PlatformDependResources}) target_link_libraries(zstd ${PROGRAMS_ZSTD_LINK_TARGET}) if (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") target_link_libraries(zstd rt) endif () -install(TARGETS zstd RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") +install(TARGETS zstd + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}") if (UNIX) add_custom_target(zstdcat ALL ${CMAKE_COMMAND} -E create_symlink zstd zstdcat DEPENDS zstd COMMENT "Creating zstdcat symlink") @@ -73,7 +75,7 @@ if (UNIX) ${CMAKE_CURRENT_BINARY_DIR}/zstdless.1 DESTINATION "${MAN_INSTALL_DIR}") - add_executable(zstd-frugal ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c) + add_executable(zstd-frugal ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/fileio_asyncio.c) target_link_libraries(zstd-frugal ${PROGRAMS_ZSTD_LINK_TARGET}) set_property(TARGET zstd-frugal APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_NOBENCH;ZSTD_NODICT;ZSTD_NOTRACE") endif () diff --git a/src/dependencies/zstd-1.5.0/build/cmake/tests/.gitignore b/src/dependencies/zstd-1.5.4/build/cmake/tests/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/tests/.gitignore rename to src/dependencies/zstd-1.5.4/build/cmake/tests/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/cmake/tests/CMakeLists.txt b/src/dependencies/zstd-1.5.4/build/cmake/tests/CMakeLists.txt similarity index 88% rename from src/dependencies/zstd-1.5.0/build/cmake/tests/CMakeLists.txt rename to src/dependencies/zstd-1.5.4/build/cmake/tests/CMakeLists.txt index 8bba6ea..250f050 100644 --- a/src/dependencies/zstd-1.5.0/build/cmake/tests/CMakeLists.txt +++ b/src/dependencies/zstd-1.5.4/build/cmake/tests/CMakeLists.txt @@ -1,6 +1,6 @@ # ################################################################ # zstd - Makefile -# Copyright (C) Yann Collet 2014-present +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # BSD license @@ -27,7 +27,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # You can contact the author at : -# - zstd homepage : http://www.zstd.net/ +# - zstd homepage : https://facebook.github.io/zstd/ # ################################################################ project(tests) @@ -57,7 +57,9 @@ target_link_libraries(datagen libzstd_static) # fullbench # add_executable(fullbench ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${TESTS_DIR}/fullbench.c) -set_property(TARGET fullbench APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +if (NOT MSVC) + target_compile_options(fullbench PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(fullbench libzstd_static) add_test(NAME fullbench COMMAND fullbench ${ZSTD_FULLBENCH_FLAGS}) @@ -65,7 +67,9 @@ add_test(NAME fullbench COMMAND fullbench ${ZSTD_FULLBENCH_FLAGS}) # fuzzer # add_executable(fuzzer ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${TESTS_DIR}/fuzzer.c) -set_property(TARGET fuzzer APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +if (NOT MSVC) + target_compile_options(fuzzer PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(fuzzer libzstd_static) AddTestFlagsOption(ZSTD_FUZZER_FLAGS "$ENV{FUZZERTEST} $ENV{FUZZER_FLAGS}" "Semicolon-separated list of flags to pass to the fuzzer test (see `fuzzer -h` for usage)") @@ -77,8 +81,10 @@ add_test(NAME fuzzer COMMAND fuzzer ${ZSTD_FUZZER_FLAGS}) # # zstreamtest # -add_executable(zstreamtest ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${TESTS_DIR}/seqgen.c ${TESTS_DIR}/zstreamtest.c) -set_property(TARGET zstreamtest APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +add_executable(zstreamtest ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${TESTS_DIR}/seqgen.c ${TESTS_DIR}/zstreamtest.c ${TESTS_DIR}/external_matchfinder.c) +if (NOT MSVC) + target_compile_options(zstreamtest PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(zstreamtest libzstd_static) AddTestFlagsOption(ZSTD_ZSTREAM_FLAGS "$ENV{ZSTREAM_TESTTIME} $ENV{FUZZER_FLAGS}" "Semicolon-separated list of flags to pass to the zstreamtest test (see `zstreamtest -h` for usage)") @@ -90,13 +96,14 @@ add_test(NAME zstreamtest COMMAND zstreamtest ${ZSTD_ZSTREAM_FLAGS}) AddTestFlagsOption(ZSTD_PLAYTESTS_FLAGS "$ENV{PLAYTESTS_FLAGS}" "Semicolon-separated list of flags to pass to the playTests.sh test") add_test(NAME playTests COMMAND sh -c "\"${TESTS_DIR}/playTests.sh\" ${ZSTD_PLAYTESTS_FLAGS}") -if (ZSTD_BUILD_PROGRAMS) +find_program(UNAME uname) # Run script only in unix shell environments +if (ZSTD_BUILD_PROGRAMS AND UNAME) set_property(TEST playTests APPEND PROPERTY ENVIRONMENT "ZSTD_BIN=$" "DATAGEN_BIN=$" ) else() - message(STATUS "Disabling playTests.sh test because ZSTD_BUILD_PROGRAMS is not enabled") + message(STATUS "Disabling playTests.sh test because requirements not met") set_tests_properties(playTests PROPERTIES DISABLED YES) endif() diff --git a/src/dependencies/zstd-1.5.0/build/cmake/zstdConfig.cmake b/src/dependencies/zstd-1.5.4/build/cmake/zstdConfig.cmake similarity index 100% rename from src/dependencies/zstd-1.5.0/build/cmake/zstdConfig.cmake rename to src/dependencies/zstd-1.5.4/build/cmake/zstdConfig.cmake diff --git a/src/dependencies/zstd-1.5.0/build/meson/GetZstdLibraryVersion.py b/src/dependencies/zstd-1.5.4/build/meson/GetZstdLibraryVersion.py similarity index 100% rename from src/dependencies/zstd-1.5.0/build/meson/GetZstdLibraryVersion.py rename to src/dependencies/zstd-1.5.4/build/meson/GetZstdLibraryVersion.py diff --git a/src/dependencies/zstd-1.5.0/build/meson/InstallSymlink.py b/src/dependencies/zstd-1.5.4/build/meson/InstallSymlink.py similarity index 100% rename from src/dependencies/zstd-1.5.0/build/meson/InstallSymlink.py rename to src/dependencies/zstd-1.5.4/build/meson/InstallSymlink.py diff --git a/src/dependencies/zstd-1.5.0/build/meson/README.md b/src/dependencies/zstd-1.5.4/build/meson/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/build/meson/README.md rename to src/dependencies/zstd-1.5.4/build/meson/README.md diff --git a/src/dependencies/zstd-1.5.0/build/meson/contrib/gen_html/meson.build b/src/dependencies/zstd-1.5.4/build/meson/contrib/gen_html/meson.build similarity index 100% rename from src/dependencies/zstd-1.5.0/build/meson/contrib/gen_html/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/contrib/gen_html/meson.build diff --git a/src/dependencies/zstd-1.5.0/build/meson/contrib/meson.build b/src/dependencies/zstd-1.5.4/build/meson/contrib/meson.build similarity index 100% rename from src/dependencies/zstd-1.5.0/build/meson/contrib/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/contrib/meson.build diff --git a/src/dependencies/zstd-1.5.0/build/meson/contrib/pzstd/meson.build b/src/dependencies/zstd-1.5.4/build/meson/contrib/pzstd/meson.build similarity index 92% rename from src/dependencies/zstd-1.5.0/build/meson/contrib/pzstd/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/contrib/pzstd/meson.build index dcf2136..b95dc79 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/contrib/pzstd/meson.build +++ b/src/dependencies/zstd-1.5.4/build/meson/contrib/pzstd/meson.build @@ -18,7 +18,8 @@ pzstd_sources = [join_paths(zstd_rootdir, 'programs/util.c'), join_paths(zstd_rootdir, 'contrib/pzstd/SkippableFrame.cpp')] pzstd = executable('pzstd', pzstd_sources, - cpp_args: [ '-DNDEBUG', '-Wno-shadow', '-pedantic', '-Wno-deprecated-declarations' ], + cpp_args: pzstd_warning_flags, include_directories: pzstd_includes, dependencies: [ libzstd_dep, thread_dep ], + override_options: ['b_ndebug=true'], install: true) diff --git a/src/dependencies/zstd-1.5.0/build/meson/lib/meson.build b/src/dependencies/zstd-1.5.4/build/meson/lib/meson.build similarity index 75% rename from src/dependencies/zstd-1.5.0/build/meson/lib/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/lib/meson.build index 5cc9fee..68db2ca 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/lib/meson.build +++ b/src/dependencies/zstd-1.5.4/build/meson/lib/meson.build @@ -45,6 +45,15 @@ libzstd_sources = [join_paths(zstd_rootdir, 'lib/common/entropy_common.c'), join_paths(zstd_rootdir, 'lib/dictBuilder/divsufsort.c'), join_paths(zstd_rootdir, 'lib/dictBuilder/zdict.c')] +# really we need anything that defines __GNUC__ as that is what ZSTD_ASM_SUPPORTED is gated on +# but these are the two compilers that are supported in tree and actually handle this correctly +# Otherwise, explicitly disable assembly. +if [compiler_gcc, compiler_clang].contains(cc_id) + libzstd_sources += join_paths(zstd_rootdir, 'lib/decompress/huf_decompress_amd64.S') +else + add_project_arguments('-DZSTD_DISABLE_ASM', language: 'c') +endif + # Explicit define legacy support add_project_arguments('-DZSTD_LEGACY_SUPPORT=@0@'.format(legacy_level), language: 'c') @@ -74,7 +83,8 @@ libzstd_c_args = [] if cc_id == compiler_msvc if default_library_type != 'static' libzstd_sources += [windows_mod.compile_resources( - join_paths(zstd_rootdir, 'build/VS2010/libzstd-dll/libzstd-dll.rc'))] + join_paths(zstd_rootdir, 'build/VS2010/libzstd-dll/libzstd-dll.rc'), + include_directories: libzstd_includes)] libzstd_c_args += ['-DZSTD_DLL_EXPORT=1', '-DZSTD_HEAPMODE=0', '-D_CONSOLE', @@ -108,6 +118,7 @@ libzstd = library('zstd', libzstd_sources, include_directories: libzstd_includes, c_args: libzstd_c_args, + gnu_symbol_visibility: 'hidden', dependencies: libzstd_deps, install: true, version: zstd_libversion) @@ -115,12 +126,41 @@ libzstd = library('zstd', libzstd_dep = declare_dependency(link_with: libzstd, include_directories: libzstd_includes) +# we link to both: +# - the shared library (for public symbols) +# - the static library (for private symbols) +# +# this is needed because internally private symbols are used all the time, and +# -fvisibility=hidden means those cannot be found +if get_option('default_library') == 'static' + libzstd_static = libzstd + libzstd_internal_dep = libzstd_dep +else + if get_option('default_library') == 'shared' + libzstd_static = static_library('zstd_objlib', + objects: libzstd.extract_all_objects(recursive: true), + build_by_default: false) + else + libzstd_static = libzstd.get_static_lib() + endif + + if cc_id == compiler_msvc + # msvc does not actually support linking to both, but errors out with: + # error LNK2005: ZSTD_ already defined in zstd.lib(zstd-1.dll) + libzstd_internal_dep = declare_dependency(link_with: libzstd_static) + else + libzstd_internal_dep = declare_dependency(link_with: libzstd, + # the static library must be linked after the shared one + dependencies: declare_dependency(link_with: libzstd_static)) + endif +endif + pkgconfig.generate(libzstd, name: 'libzstd', filebase: 'libzstd', description: 'fast lossless compression algorithm library', version: zstd_libversion, - url: 'http://www.zstd.net/') + url: 'https://facebook.github.io/zstd/') install_headers(join_paths(zstd_rootdir, 'lib/zstd.h'), join_paths(zstd_rootdir, 'lib/zdict.h'), diff --git a/src/dependencies/zstd-1.5.0/build/meson/meson.build b/src/dependencies/zstd-1.5.4/build/meson/meson.build similarity index 84% rename from src/dependencies/zstd-1.5.0/build/meson/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/meson.build index 2a425b2..576dc44 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/meson.build +++ b/src/dependencies/zstd-1.5.4/build/meson/meson.build @@ -12,12 +12,21 @@ project('zstd', ['c', 'cpp'], license: ['BSD', 'GPLv2'], default_options : [ - 'c_std=gnu99', + # There shouldn't be any need to force a C standard convention for zstd + # but in case one would want that anyway, this can be done here. + # 'c_std=gnu99', + # c++11 standard is useful for pzstd 'cpp_std=c++11', - 'buildtype=release' + 'buildtype=release', + 'warning_level=3', + # -Wdocumentation does not actually pass, nor do the test binaries, + # so this isn't safe + #'werror=true' ], - version: 'DUMMY', - meson_version: '>=0.47.0') + version: run_command( + find_program('GetZstdLibraryVersion.py'), '../../lib/zstd.h', + check: true).stdout().strip(), + meson_version: '>=0.50.0') cc = meson.get_compiler('c') cxx = meson.get_compiler('cpp') @@ -38,16 +47,6 @@ compiler_msvc = 'msvc' zstd_version = meson.project_version() -zstd_h_file = join_paths(meson.current_source_dir(), '../../lib/zstd.h') -GetZstdLibraryVersion_py = find_program('GetZstdLibraryVersion.py', native : true) -r = run_command(GetZstdLibraryVersion_py, zstd_h_file) -if r.returncode() == 0 - zstd_version = r.stdout().strip() - message('Project version is now: @0@'.format(zstd_version)) -else - error('Cannot find project version in @0@'.format(zstd_h_file)) -endif - zstd_libversion = zstd_version # ============================================================================= @@ -88,7 +87,7 @@ feature_lz4 = get_option('lz4') # Dependencies # ============================================================================= -libm_dep = cc.find_library('m', required: bin_tests) +libm_dep = cc.find_library('m', required: false) thread_dep = dependency('threads', required: feature_multi_thread) use_multi_thread = thread_dep.found() # Arguments in dependency should be equivalent to those passed to pkg-config @@ -105,11 +104,11 @@ use_lz4 = lz4_dep.found() add_project_arguments('-DXXH_NAMESPACE=ZSTD_', language: ['c']) +pzstd_warning_flags = [] if [compiler_gcc, compiler_clang].contains(cc_id) - common_warning_flags = [ '-Wextra', '-Wundef', '-Wshadow', '-Wcast-align', '-Wcast-qual' ] + common_warning_flags = [ '-Wundef', '-Wshadow', '-Wcast-align', '-Wcast-qual' ] + pzstd_warning_flags = ['-Wno-shadow', '-Wno-deprecated-declarations'] if cc_id == compiler_clang - # Should use Meson's own --werror build option - #common_warning_flags += '-Werror' common_warning_flags += ['-Wconversion', '-Wno-sign-conversion', '-Wdocumentation'] endif cc_compile_flags = cc.get_supported_arguments(common_warning_flags + ['-Wstrict-prototypes']) diff --git a/src/dependencies/zstd-1.5.0/build/meson/meson_options.txt b/src/dependencies/zstd-1.5.4/build/meson/meson_options.txt similarity index 93% rename from src/dependencies/zstd-1.5.0/build/meson/meson_options.txt rename to src/dependencies/zstd-1.5.4/build/meson/meson_options.txt index 90a81c5..f35cd5f 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/meson_options.txt +++ b/src/dependencies/zstd-1.5.4/build/meson/meson_options.txt @@ -10,11 +10,11 @@ # Read guidelines from https://wiki.gnome.org/Initiatives/GnomeGoals/MesonPorting -option('legacy_level', type: 'integer', min: 0, max: 7, value: '5', +option('legacy_level', type: 'integer', min: 0, max: 7, value: 5, description: 'Support any legacy format: 7 to 1 for v0.7+ to v0.1+') option('debug_level', type: 'integer', min: 0, max: 9, value: 1, description: 'Enable run-time debug. See lib/common/debug.h') -option('backtrace', type: 'boolean', value: false, +option('backtrace', type: 'feature', value: 'disabled', description: 'Display a stack backtrace when execution generates a runtime exception') option('static_runtime', type: 'boolean', value: false, description: 'Link to static run-time libraries on MSVC') diff --git a/src/dependencies/zstd-1.5.0/build/meson/programs/meson.build b/src/dependencies/zstd-1.5.4/build/meson/programs/meson.build similarity index 83% rename from src/dependencies/zstd-1.5.0/build/meson/programs/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/programs/meson.build index d255627..e611dc3 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/programs/meson.build +++ b/src/dependencies/zstd-1.5.4/build/meson/programs/meson.build @@ -14,18 +14,26 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/util.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/fileio.c'), + join_paths(zstd_rootdir, 'programs/fileio_asyncio.c'), join_paths(zstd_rootdir, 'programs/benchfn.c'), join_paths(zstd_rootdir, 'programs/benchzstd.c'), join_paths(zstd_rootdir, 'programs/datagen.c'), join_paths(zstd_rootdir, 'programs/dibio.c'), join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')] +zstd_deps = [ libzstd_internal_dep ] zstd_c_args = libzstd_debug_cflags + +zstd_frugal_deps = [ libzstd_internal_dep ] +zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ] + if use_multi_thread + zstd_deps += [ thread_dep ] zstd_c_args += [ '-DZSTD_MULTITHREAD' ] + zstd_frugal_deps += [ thread_dep ] + zstd_frugal_c_args += [ '-DZSTD_MULTITHREAD' ] endif -zstd_deps = [ libzstd_dep ] if use_zlib zstd_deps += [ zlib_dep ] zstd_c_args += [ '-DZSTD_GZCOMPRESS', '-DZSTD_GZDECOMPRESS' ] @@ -43,7 +51,8 @@ endif export_dynamic_on_windows = false # explicit backtrace enable/disable for Linux & Darwin -if not use_backtrace +have_execinfo = cc.has_header('execinfo.h', required: use_backtrace) +if not have_execinfo zstd_c_args += '-DBACKTRACE_ENABLE=0' elif use_debug and host_machine_os == os_windows # MinGW target zstd_c_args += '-DBACKTRACE_ENABLE=1' @@ -53,7 +62,8 @@ endif if cc_id == compiler_msvc if default_library_type != 'static' zstd_programs_sources += [windows_mod.compile_resources( - join_paths(zstd_rootdir, 'build/VS2010/zstd/zstd.rc'))] + join_paths(zstd_rootdir, 'build/VS2010/zstd/zstd.rc'), + include_directories: libzstd_includes)] endif endif @@ -67,14 +77,15 @@ zstd = executable('zstd', zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/fileio.c')] + join_paths(zstd_rootdir, 'programs/fileio.c'), + join_paths(zstd_rootdir, 'programs/fileio_asyncio.c')] # Minimal target, with only zstd compression and decompression. # No bench. No legacy. executable('zstd-frugal', zstd_frugal_sources, - dependencies: libzstd_dep, - c_args: [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ], + dependencies: zstd_frugal_deps, + c_args: zstd_frugal_c_args, install: true) install_data(join_paths(zstd_rootdir, 'programs/zstdgrep'), diff --git a/src/dependencies/zstd-1.5.0/build/meson/tests/meson.build b/src/dependencies/zstd-1.5.4/build/meson/tests/meson.build similarity index 65% rename from src/dependencies/zstd-1.5.0/build/meson/tests/meson.build rename to src/dependencies/zstd-1.5.4/build/meson/tests/meson.build index 1b23363..e70b734 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/tests/meson.build +++ b/src/dependencies/zstd-1.5.4/build/meson/tests/meson.build @@ -21,7 +21,6 @@ FUZZER_FLAGS = ['--no-big-tests'] FUZZERTEST = '-T200s' ZSTREAM_TESTTIME = '-T90s' DECODECORPUS_TESTTIME = '-T30' -ZSTDRTTEST = ['--test-large-data'] # ============================================================================= # Executables @@ -29,64 +28,64 @@ ZSTDRTTEST = ['--test-large-data'] test_includes = [ include_directories(join_paths(zstd_rootdir, 'programs')) ] -datagen_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), - join_paths(zstd_rootdir, 'tests/datagencli.c')] +testcommon_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), + join_paths(zstd_rootdir, 'programs/util.c'), + join_paths(zstd_rootdir, 'programs/timefn.c'), + join_paths(zstd_rootdir, 'programs/benchfn.c'), + join_paths(zstd_rootdir, 'programs/benchzstd.c')] + +testcommon = static_library('testcommon', + testcommon_sources, + # needed due to use of private symbol + -fvisibility=hidden + link_with: libzstd_static) + +testcommon_dep = declare_dependency(link_with: testcommon, + dependencies: libzstd_deps, + include_directories: libzstd_includes) + +datagen_sources = [join_paths(zstd_rootdir, 'tests/datagencli.c')] datagen = executable('datagen', datagen_sources, c_args: [ '-DNDEBUG' ], include_directories: test_includes, - dependencies: libzstd_dep, + dependencies: testcommon_dep, install: false) -fullbench_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), - join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), - join_paths(zstd_rootdir, 'programs/benchfn.c'), - join_paths(zstd_rootdir, 'programs/benchzstd.c'), - join_paths(zstd_rootdir, 'tests/fullbench.c')] +fullbench_sources = [join_paths(zstd_rootdir, 'tests/fullbench.c')] fullbench = executable('fullbench', fullbench_sources, include_directories: test_includes, - dependencies: libzstd_dep, + dependencies: testcommon_dep, install: false) -fuzzer_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), - join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), - join_paths(zstd_rootdir, 'tests/fuzzer.c')] +fuzzer_sources = [join_paths(zstd_rootdir, 'tests/fuzzer.c')] fuzzer = executable('fuzzer', fuzzer_sources, include_directories: test_includes, - dependencies: [ libzstd_dep, thread_dep ], + dependencies: [ testcommon_dep, thread_dep ], install: false) -zstreamtest_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), - join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), +zstreamtest_sources = [ join_paths(zstd_rootdir, 'tests/seqgen.c'), - join_paths(zstd_rootdir, 'tests/zstreamtest.c')] + join_paths(zstd_rootdir, 'tests/zstreamtest.c'), + join_paths(zstd_rootdir, 'tests/external_matchfinder.c')] zstreamtest = executable('zstreamtest', zstreamtest_sources, include_directories: test_includes, - dependencies: libzstd_dep, + dependencies: testcommon_dep, install: false) -paramgrill_sources = [join_paths(zstd_rootdir, 'programs/benchfn.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), - join_paths(zstd_rootdir, 'programs/benchzstd.c'), - join_paths(zstd_rootdir, 'programs/datagen.c'), - join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'tests/paramgrill.c')] +paramgrill_sources = [join_paths(zstd_rootdir, 'tests/paramgrill.c')] paramgrill = executable('paramgrill', paramgrill_sources, include_directories: test_includes, - dependencies: [ libzstd_dep, libm_dep ], + dependencies: [ testcommon_dep, libm_dep ], install: false) roundTripCrash_sources = [join_paths(zstd_rootdir, 'tests/roundTripCrash.c')] roundTripCrash = executable('roundTripCrash', roundTripCrash_sources, - dependencies: [ libzstd_dep ], + dependencies: [ testcommon_dep ], install: false) longmatch_sources = [join_paths(zstd_rootdir, 'tests/longmatch.c')] @@ -111,26 +110,18 @@ if 0 < legacy_level and legacy_level <= 4 install: false) endif -decodecorpus_sources = [join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), - join_paths(zstd_rootdir, 'tests/decodecorpus.c')] +decodecorpus_sources = [join_paths(zstd_rootdir, 'tests/decodecorpus.c')] decodecorpus = executable('decodecorpus', decodecorpus_sources, include_directories: test_includes, - dependencies: [ libzstd_dep, libm_dep ], + dependencies: [ testcommon_dep, libm_dep ], install: false) -poolTests_sources = [join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/timefn.c'), - join_paths(zstd_rootdir, 'tests/poolTests.c'), - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/threading.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')] +poolTests_sources = [join_paths(zstd_rootdir, 'tests/poolTests.c')] poolTests = executable('poolTests', poolTests_sources, include_directories: test_includes, - dependencies: [ libzstd_dep, thread_dep ], + dependencies: [ testcommon_dep, thread_dep ], install: false) checkTag_sources = [join_paths(zstd_rootdir, 'tests/checkTag.c')] @@ -144,24 +135,38 @@ checkTag = executable('checkTag', # ============================================================================= if tests_supported_oses.contains(host_machine_os) - valgrind_prog = find_program('valgrind', ['/usr/bin/valgrind'], required: true) + valgrind_prog = find_program('valgrind', ['/usr/bin/valgrind'], required: false) valgrindTest_py = files('valgrindTest.py') - test('valgrindTest', - valgrindTest_py, - args: [valgrind_prog.path(), zstd, datagen, fuzzer, fullbench], - depends: [zstd, datagen, fuzzer, fullbench], - timeout: 600) # Timeout should work on HDD drive + if valgrind_prog.found() + test('valgrindTest', + valgrindTest_py, + args: [valgrind_prog.path(), zstd, datagen, fuzzer, fullbench], + depends: [zstd, datagen, fuzzer, fullbench], + timeout: 600) # Timeout should work on HDD drive + endif endif if host_machine_os != os_windows playTests_sh = find_program(join_paths(zstd_rootdir, 'tests/playTests.sh'), required: true) - test('test-zstd', - playTests_sh, - args: ZSTDRTTEST, - env: ['ZSTD_BIN=' + zstd.full_path(), 'DATAGEN_BIN=./datagen'], - depends: [datagen], - workdir: meson.current_build_dir(), - timeout: 2800) # Timeout should work on HDD drive + + # add slow tests only if the meson version is new enough to support + # test setups with default-excluded suites + if meson.version().version_compare('>=0.57.0') + matrix = {'fast': [], 'slow': ['--test-large-data']} + else + matrix = {'fast': []} + endif + + foreach suite, opt: matrix + test('test-zstd-'+suite, + playTests_sh, + args: opt, + env: ['ZSTD_BIN=' + zstd.full_path(), 'DATAGEN_BIN=./datagen'], + depends: [datagen], + suite: suite, + workdir: meson.current_build_dir(), + timeout: 2800) # Timeout should work on HDD drive + endforeach endif test('test-fullbench-1', @@ -186,10 +191,6 @@ test('test-zstream-1', zstreamtest, args: ['-v', ZSTREAM_TESTTIME] + FUZZER_FLAGS, timeout: 240) -test('test-zstream-2', - zstreamtest, - args: ['-mt', '-t1', ZSTREAM_TESTTIME] + FUZZER_FLAGS, - timeout: 120) test('test-zstream-3', zstreamtest, args: ['--newapi', '-t1', ZSTREAM_TESTTIME] + FUZZER_FLAGS, @@ -204,3 +205,11 @@ test('test-decodecorpus', args: ['-t', DECODECORPUS_TESTTIME], timeout: 60) test('test-poolTests', poolTests) # should be fast + +if meson.version().version_compare('>=0.57.0') + add_test_setup('fast', + is_default: true, + exclude_suites: ['slow']) + add_test_setup('slow', + exclude_suites: ['fast']) +endif diff --git a/src/dependencies/zstd-1.5.0/build/meson/tests/valgrindTest.py b/src/dependencies/zstd-1.5.4/build/meson/tests/valgrindTest.py similarity index 92% rename from src/dependencies/zstd-1.5.0/build/meson/tests/valgrindTest.py rename to src/dependencies/zstd-1.5.4/build/meson/tests/valgrindTest.py index 218f745..05d8487 100644 --- a/src/dependencies/zstd-1.5.0/build/meson/tests/valgrindTest.py +++ b/src/dependencies/zstd-1.5.4/build/meson/tests/valgrindTest.py @@ -21,7 +21,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): if subprocess.call([*VALGRIND_ARGS, zstd], stdout=subprocess.DEVNULL) == 0: - raise subprocess.CalledProcessError('zstd without argument should have failed') + raise subprocess.SubprocessError('zstd without argument should have failed') with subprocess.Popen([datagen, '-g80'], stdout=subprocess.PIPE) as p1, \ subprocess.Popen([*VALGRIND_ARGS, zstd, '-', '-c'], @@ -30,7 +30,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() with subprocess.Popen([datagen, '-g16KB'], stdout=subprocess.PIPE) as p1, \ subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'], @@ -39,7 +39,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() with tempfile.NamedTemporaryFile() as tmp_fd: with subprocess.Popen([datagen, '-g2930KB'], stdout=subprocess.PIPE) as p1, \ @@ -48,7 +48,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() subprocess.check_call([*VALGRIND_ARGS, zstd, '-vdf', tmp_fd.name, '-c'], stdout=subprocess.DEVNULL) @@ -60,7 +60,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() subprocess.check_call([*VALGRIND_ARGS, fuzzer, '-T1mn', '-t1']) subprocess.check_call([*VALGRIND_ARGS, fullbench, '-i1']) diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/.gitignore b/src/dependencies/zstd-1.5.4/build/single_file_libs/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/.gitignore rename to src/dependencies/zstd-1.5.4/build/single_file_libs/.gitignore diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/README.md b/src/dependencies/zstd-1.5.4/build/single_file_libs/README.md similarity index 91% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/README.md rename to src/dependencies/zstd-1.5.4/build/single_file_libs/README.md index 1705b76..64c973a 100644 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/README.md +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/README.md @@ -12,7 +12,7 @@ This is the most common use case. The decompression library is small, adding, fo Create `zstddeclib.c` from the Zstd source using: ``` cd zstd/build/single_file_libs -./combine.sh -r ../../lib -o zstddeclib.c zstddeclib-in.c +python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c ``` Then add the resulting file to your project (see the [example files](examples)). @@ -26,7 +26,7 @@ The same tool can amalgamate the entire Zstd library for ease of adding both com Create `zstd.c` from the Zstd source using: ``` cd zstd/build/single_file_libs -./combine.sh -r ../../lib -o zstd.c zstd-in.c +python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -k zstd.h -o zstd.c zstd-in.c ``` It's possible to create a compressor-only library but since the decompressor is so small in comparison this doesn't bring much of a gain (but for the curious, simply remove the files in the _decompress_ section at the end of `zstd-in.c`). diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/build_decoder_test.sh b/src/dependencies/zstd-1.5.4/build/single_file_libs/build_decoder_test.sh similarity index 97% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/build_decoder_test.sh rename to src/dependencies/zstd-1.5.4/build/single_file_libs/build_decoder_test.sh index 48d017f..c4ca55f 100755 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/build_decoder_test.sh +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/build_decoder_test.sh @@ -11,7 +11,7 @@ IN_FILES="examples/emscripten.c" # Emscripten build using emcc. emscripten_emcc_build() { - # Compile the the same example as above + # Compile the same example as above CC_FLAGS="-Wall -Wextra -Wshadow -Werror -Os -g0 -flto" emcc $CC_FLAGS -s WASM=1 -I. -o $OUT_WASM $IN_FILES # Did compilation work? diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/build_library_test.sh b/src/dependencies/zstd-1.5.4/build/single_file_libs/build_library_test.sh similarity index 96% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/build_library_test.sh rename to src/dependencies/zstd-1.5.4/build/single_file_libs/build_library_test.sh index 7fb9965..f4ba109 100755 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/build_library_test.sh +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/build_library_test.sh @@ -14,7 +14,7 @@ IN_FILES="zstd.c examples/roundtrip.c" # Emscripten build using emcc. emscripten_emcc_build() { - # Compile the the same example as above + # Compile the same example as above CC_FLAGS="-Wall -Wextra -Wshadow -Werror -Os -g0 -flto" emcc $CC_FLAGS -s WASM=1 -I. -o $OUT_WASM $IN_FILES # Did compilation work? @@ -69,7 +69,7 @@ fi echo "Single file library creation script: PASSED" # Copy the header to here (for the tests) -cp "$ZSTD_SRC_ROOT/zstd.h" zstd.h +cp "$ZSTD_SRC_ROOT/zstd.h" examples/zstd.h # Compile the generated output cc -Wall -Wextra -Werror -Wshadow -pthread -I. -Os -g0 -o $OUT_FILE zstd.c examples/roundtrip.c diff --git a/src/dependencies/zstd-1.5.4/build/single_file_libs/combine.py b/src/dependencies/zstd-1.5.4/build/single_file_libs/combine.py new file mode 100755 index 0000000..771dd20 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/combine.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 + +# Tool to bundle multiple C/C++ source files, inlining any includes. +# +# Note: there are two types of exclusion options: the '-x' flag, which besides +# excluding a file also adds an #error directive in place of the #include, and +# the '-k' flag, which keeps the #include and doesn't inline the file. The +# intended use cases are: '-x' for files that would normally be #if'd out, so +# features that 100% won't be used in the amalgamated file, for which every +# occurrence adds the error, and '-k' for headers that we wish to manually +# include, such as a project's public API, for which occurrences after the first +# are removed. +# +# Todo: the error handling could be better, which currently throws and halts +# (which is functional just not very friendly). +# +# Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) + +import argparse, re, sys + +from pathlib import Path +from typing import Any, List, Optional, Pattern, Set, TextIO + +# Set of file roots when searching (equivalent to -I paths for the compiler). +roots: Set[Path] = set() + +# Set of (canonical) file Path objects to exclude from inlining (and not only +# exclude but to add a compiler error directive when they're encountered). +excludes: Set[Path] = set() + +# Set of (canonical) file Path objects to keep as include directives. +keeps: Set[Path] = set() + +# Whether to keep the #pragma once directives (unlikely, since this will result +# in a warning, but the option is there). +keep_pragma: bool = False + +# Destination file object (or stdout if no output file was supplied). +destn: TextIO = sys.stdout + +# Set of file Path objects previously inlined (and to ignore if reencountering). +found: Set[Path] = set() + +# Compiled regex Pattern to handle "#pragma once" in various formats: +# +# #pragma once +# #pragma once +# # pragma once +# #pragma once +# #pragma once // comment +# +# Ignoring commented versions, same as include_regex. +# +pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') + +# Compiled regex Pattern to handle the following type of file includes: +# +# #include "file" +# #include "file" +# # include "file" +# #include "file" +# #include "file" // comment +# #include "file" // comment with quote " +# +# And all combinations of, as well as ignoring the following: +# +# #include +# //#include "file" +# /*#include "file"*/ +# +# We don't try to catch errors since the compiler will do this (and the code is +# expected to be valid before processing) and we don't care what follows the +# file (whether it's a valid comment or not, since anything after the quoted +# string is ignored) +# +include_regex: Pattern = re.compile(r'^\s*#\s*include\s*"(.+?)"') + +# Simple tests to prove include_regex's cases. +# +def test_match_include() -> bool: + if (include_regex.match('#include "file"') and + include_regex.match(' #include "file"') and + include_regex.match('# include "file"') and + include_regex.match('#include "file"') and + include_regex.match('#include "file" // comment')): + if (not include_regex.match('#include ') and + not include_regex.match('//#include "file"') and + not include_regex.match('/*#include "file"*/')): + found = include_regex.match('#include "file" // "') + if (found and found.group(1) == 'file'): + print('#include match valid') + return True + return False + +# Simple tests to prove pragma_regex's cases. +# +def test_match_pragma() -> bool: + if (pragma_regex.match('#pragma once') and + pragma_regex.match(' #pragma once') and + pragma_regex.match('# pragma once') and + pragma_regex.match('#pragma once') and + pragma_regex.match('#pragma once // comment')): + if (not pragma_regex.match('//#pragma once') and + not pragma_regex.match('/*#pragma once*/')): + print('#pragma once match valid') + return True + return False + +# Finds 'file'. First the list of 'root' paths are searched, followed by the +# currently processing file's 'parent' path, returning a valid Path in +# canonical form. If no match is found None is returned. +# +def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: + for root in roots: + found = root.joinpath(file).resolve() + if (found.is_file()): + return found + if (parent): + found = parent.joinpath(file).resolve(); + else: + found = Path(file) + if (found.is_file()): + return found + return None + +# Helper to resolve lists of files. 'file_list' is passed in from the arguments +# and each entry resolved to its canonical path (like any include entry, either +# from the list of root paths or the owning file's 'parent', which in this case +# is case is the input file). The results are stored in 'resolved'. +# +def resolve_excluded_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None: + if (file_list): + for filename in file_list: + found = resolve_include(filename, parent) + if (found): + resolved.add(found) + else: + error_line(f'Warning: excluded file not found: {filename}') + +# Writes 'line' to the open 'destn' (or stdout). +# +def write_line(line: str) -> None: + print(line, file=destn) + +# Logs 'line' to stderr. This is also used for general notifications that we +# don't want to go to stdout (so the source can be piped). +# +def error_line(line: Any) -> None: + print(line, file=sys.stderr) + +# Inline the contents of 'file' (with any of its includes also inlined, etc.). +# +# Note: text encoding errors are ignored and replaced with ? when reading the +# input files. This isn't ideal, but it's more than likely in the comments than +# code and a) the text editor has probably also failed to read the same content, +# and b) the compiler probably did too. +# +def add_file(file: Path, file_name: str = None) -> None: + if (file.is_file()): + if (not file_name): + file_name = file.name + error_line(f'Processing: {file_name}') + with file.open('r', errors='replace') as opened: + for line in opened: + line = line.rstrip('\n') + match_include = include_regex.match(line); + if (match_include): + # We have a quoted include directive so grab the file + inc_name = match_include.group(1) + resolved = resolve_include(inc_name, file.parent) + if (resolved): + if (resolved in excludes): + # The file was excluded so error if the compiler uses it + write_line(f'#error Using excluded file: {inc_name} (re-amalgamate source to fix)') + error_line(f'Excluding: {inc_name}') + else: + if (resolved not in found): + # The file was not previously encountered + found.add(resolved) + if (resolved in keeps): + # But the include was flagged to keep as included + write_line(f'/**** *NOT* inlining {inc_name} ****/') + write_line(line) + error_line(f'Not inlining: {inc_name}') + else: + # The file was neither excluded nor seen before so inline it + write_line(f'/**** start inlining {inc_name} ****/') + add_file(resolved, inc_name) + write_line(f'/**** ended inlining {inc_name} ****/') + else: + write_line(f'/**** skipping file: {inc_name} ****/') + else: + # The include file didn't resolve to a file + write_line(f'#error Unable to find: {inc_name}') + error_line(f'Error: Unable to find: {inc_name}') + else: + # Skip any 'pragma once' directives, otherwise write the source line + if (keep_pragma or not pragma_regex.match(line)): + write_line(line) + else: + error_line(f'Error: Invalid file: {file}') + +# Start here +parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') +parser.add_argument('-r', '--root', action='append', type=Path, help='file root search path') +parser.add_argument('-x', '--exclude', action='append', help='file to completely exclude from inlining') +parser.add_argument('-k', '--keep', action='append', help='file to exclude from inlining but keep the include directive') +parser.add_argument('-p', '--pragma', action='store_true', default=False, help='keep any "#pragma once" directives (removed by default)') +parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='output file (otherwise stdout)') +parser.add_argument('input', type=Path, help='input file') +args = parser.parse_args() + +# Fail early on an invalid input (and store it so we don't recurse) +args.input = args.input.resolve(strict=True) +found.add(args.input) + +# Resolve all of the root paths upfront (we'll halt here on invalid roots) +if (args.root): + for path in args.root: + roots.add(path.resolve(strict=True)) + +# The remaining params: so resolve the excluded files and #pragma once directive +resolve_excluded_files(args.exclude, excludes, args.input.parent) +resolve_excluded_files(args.keep, keeps, args.input.parent) +keep_pragma = args.pragma; + +# Then recursively process the input file +try: + if (args.output): + destn = args.output + add_file(args.input) +finally: + if (destn): + destn.close() diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/combine.sh b/src/dependencies/zstd-1.5.4/build/single_file_libs/combine.sh similarity index 76% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/combine.sh rename to src/dependencies/zstd-1.5.4/build/single_file_libs/combine.sh index 8eac4f9..222c2c3 100755 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/combine.sh +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/combine.sh @@ -2,11 +2,7 @@ # Tool to bundle multiple C/C++ source files, inlining any includes. # -# Note: this POSIX-compliant script is many times slower than the original bash -# implementation (due to the grep calls) but it runs and works everywhere. -# # TODO: ROOTS, FOUND, etc., as arrays (since they fail on paths with spaces) -# TODO: revert to Bash-only regex (the grep ones being too slow) # # Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) @@ -52,13 +48,54 @@ test_deps() { fi } -# Tests if list $1 has item $2 (returning zero on a match) -list_has_item() { - if echo "$1" | grep -Eq "(^|\s*)$2(\$|\s*)"; then +# Test if glob pattern $1 matches subject $2 (see fnmatch(3)) +fnmatch() { + case "$2" in + $1) return 0 - else - return 1 + ;; + esac + return 1 +} + +# Test if line $1 is local include directive +is_include_line() { + fnmatch "*#*include*" "$1" || return 1 + printf "%s\n" "$1" | grep -Eq '^\s*#\s*include\s*".+"' +} + +# Test if line $1 is pragma once directive +is_pragma_once_line() { + fnmatch "*#*pragma*once*" "$1" || return 1 + printf "%s\n" "$1" | grep -Eq '^\s*#\s*pragma\s*once\s*' +} + +# Tests if list $1 has item $2 (returning zero on a match) +# (originally used grep -Eq "(^|\s*)$2(\$|\s*)) +readonly list_FS="$IFS" +list_has_item() { + # Re: escaping glob pattern special characters in item string: + # + # bash (tested 3.2.57, 5.1.4), dash (tested 0.5.10.2), NetBSD /bin/sh + # (tested 8.2), and Solaris /bin/sh (tested 11.4) require escaping + # backslashes in a bracket expression despite POSIX specifying that + # backslash loses significance in a bracket expression. + # + # Conversely, neither FreeBSD /bin/sh (tested 12.2) nor OpenBSD /bin/sh + # (tested 7.1) obey backslash-escaping in case statement patterns even + # outside bracket expressions, so escape special characters using bracket + # expressions. + # + # Solaris /bin/sh (tested 11.4) requires vertical bar (|) to be escaped. + # + # All accommodations should behave as expected under strict POSIX semantics. + if fnmatch "*[\\*?[|]*" "$2"; then + set -- "$1" "$(printf '%s\n' "$2" | sed -e 's/[*?[|]/[&]/g; s/[\]/[\\&]/g')" fi + for item_P in "*[$list_FS]$2[$list_FS]*" "*[$list_FS]$2" "$2[$list_FS]*" "$2"; do + fnmatch "${item_P}" "$1" && return 0 + done + return 1 } # Adds a new line with the supplied arguments to $DESTN (or stdout) @@ -124,13 +161,13 @@ add_file() { # Read the file local line= while IFS= read -r line; do - if echo "$line" | grep -Eq '^\s*#\s*include\s*".+"'; then + if is_include_line "$line"; then # We have an include directive so strip the (first) file local inc=$(echo "$line" | grep -Eo '".*"' | sed -E 's/"([^"]+)"/\1/' | head -1) local res_inc="$(resolve_include "$srcdir" "$inc")" if list_has_item "$XINCS" "$inc"; then # The file was excluded so error if the source attempts to use it - write_line "#error Using excluded file: $inc" + write_line "#error Using excluded file: $inc (re-amalgamate source to fix)" log_line "Excluding: $inc" else if ! list_has_item "$FOUND" "$res_inc"; then @@ -155,7 +192,7 @@ add_file() { # Skip any 'pragma once' directives, otherwise write the source line local write=$PONCE if [ $write -eq 0 ]; then - if echo "$line" | grep -Eqv '^\s*#\s*pragma\s*once\s*'; then + if ! is_pragma_once_line "$line"; then write=1 fi fi @@ -200,6 +237,7 @@ if [ -n "$1" ]; then printf "" > "$DESTN" fi test_deps + log_line "Processing using the slower shell script; this might take a while" add_file "$1" else echo "Input file not found: \"$1\"" diff --git a/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_decoder.sh b/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_decoder.sh new file mode 100755 index 0000000..3c0c577 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_decoder.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# Where to find the sources +ZSTD_SRC_ROOT="../../lib" + +# Amalgamate the sources +echo "Amalgamating files..." +# Using the faster Python script if we have 3.8 or higher +if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then + ./combine.py -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c +else + ./combine.sh -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c +fi +# Did combining work? +if [ $? -ne 0 ]; then + echo "Combine script: FAILED" + exit 1 +fi +echo "Combine script: PASSED" diff --git a/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_library.sh b/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_library.sh new file mode 100755 index 0000000..a6f71f0 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/create_single_file_library.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# Where to find the sources +ZSTD_SRC_ROOT="../../lib" + +# Amalgamate the sources +echo "Amalgamating files..." +# Using the faster Python script if we have 3.8 or higher +if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then + ./combine.py -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstd.c zstd-in.c +else + ./combine.sh -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstd.c zstd-in.c +fi +# Did combining work? +if [ $? -ne 0 ]; then + echo "Combine script: FAILED" + exit 1 +fi +echo "Combine script: PASSED" diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/README.md b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/README.md rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/README.md diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/emscripten.c b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/emscripten.c similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/emscripten.c rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/emscripten.c diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/roundtrip.c b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/roundtrip.c similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/roundtrip.c rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/roundtrip.c diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/shell.html b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/shell.html similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/shell.html rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/shell.html diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/simple.c b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/simple.c similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/simple.c rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/simple.c diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard-dxt1.inl b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard-dxt1.inl similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard-dxt1.inl rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard-dxt1.inl diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard-zstd.inl b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard-zstd.inl similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard-zstd.inl rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard-zstd.inl diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard.png b/src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard.png similarity index 100% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/examples/testcard.png rename to src/dependencies/zstd-1.5.4/build/single_file_libs/examples/testcard.png diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/zstd-in.c b/src/dependencies/zstd-1.5.4/build/single_file_libs/zstd-in.c similarity index 85% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/zstd-in.c rename to src/dependencies/zstd-1.5.4/build/single_file_libs/zstd-in.c index 1b27953..e6fca9e 100644 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/zstd-in.c +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/zstd-in.c @@ -4,11 +4,11 @@ * * Generate using: * \code - * combine.sh -r ../../lib -o zstd.c zstd-in.c + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstd.c zstd-in.c * \endcode */ /* - * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,9 +25,13 @@ * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also * defined in mem.h (breaking C99 compatibility). * - * Note: the undefs for xxHash allow Zstd's implementation to coinside with with + * Note: the undefs for xxHash allow Zstd's implementation to coincide with * standalone xxHash usage (with global defines). * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). + * * Note: multithreading is enabled for all platforms apart from Emscripten. */ #define DEBUGLEVEL 0 @@ -43,6 +47,8 @@ #define ZSTD_MULTITHREAD #endif #define ZSTD_TRACE 0 +/* TODO: Can't amalgamate ASM function */ +#define ZSTD_DISABLE_ASM 1 /* Include zstd_deps.h first with all the options we need enabled. */ #define ZSTD_DEPS_NEED_MALLOC diff --git a/src/dependencies/zstd-1.5.0/build/single_file_libs/zstddeclib-in.c b/src/dependencies/zstd-1.5.4/build/single_file_libs/zstddeclib-in.c similarity index 79% rename from src/dependencies/zstd-1.5.0/build/single_file_libs/zstddeclib-in.c rename to src/dependencies/zstd-1.5.4/build/single_file_libs/zstddeclib-in.c index 019d9c2..8d9c1f5 100644 --- a/src/dependencies/zstd-1.5.0/build/single_file_libs/zstddeclib-in.c +++ b/src/dependencies/zstd-1.5.4/build/single_file_libs/zstddeclib-in.c @@ -4,11 +4,11 @@ * * Generate using: * \code - * combine.sh -r ../../lib -o zstddeclib.c zstddeclib-in.c + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c * \endcode */ /* - * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,8 +25,12 @@ * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also * defined in mem.h (breaking C99 compatibility). * - * Note: the undefs for xxHash allow Zstd's implementation to coinside with with + * Note: the undefs for xxHash allow Zstd's implementation to coincide with * standalone xxHash usage (with global defines). + * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). */ #define DEBUGLEVEL 0 #define MEM_MODULE @@ -39,6 +43,8 @@ #define ZSTD_LEGACY_SUPPORT 0 #define ZSTD_STRIP_ERROR_STRINGS #define ZSTD_TRACE 0 +/* TODO: Can't amalgamate ASM function */ +#define ZSTD_DISABLE_ASM 1 /* Include zstd_deps.h first with all the options we need enabled. */ #define ZSTD_DEPS_NEED_MALLOC diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/README.md b/src/dependencies/zstd-1.5.4/contrib/VS2005/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/README.md rename to src/dependencies/zstd-1.5.4/contrib/VS2005/README.md diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/fullbench/fullbench.vcproj b/src/dependencies/zstd-1.5.4/contrib/VS2005/fullbench/fullbench.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/fullbench/fullbench.vcproj rename to src/dependencies/zstd-1.5.4/contrib/VS2005/fullbench/fullbench.vcproj diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/fuzzer/fuzzer.vcproj b/src/dependencies/zstd-1.5.4/contrib/VS2005/fuzzer/fuzzer.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/fuzzer/fuzzer.vcproj rename to src/dependencies/zstd-1.5.4/contrib/VS2005/fuzzer/fuzzer.vcproj diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/zstd.sln b/src/dependencies/zstd-1.5.4/contrib/VS2005/zstd.sln similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/zstd.sln rename to src/dependencies/zstd-1.5.4/contrib/VS2005/zstd.sln diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/zstd/zstd.vcproj b/src/dependencies/zstd-1.5.4/contrib/VS2005/zstd/zstd.vcproj similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/zstd/zstd.vcproj rename to src/dependencies/zstd-1.5.4/contrib/VS2005/zstd/zstd.vcproj index 78645d1..e37ebee 100644 --- a/src/dependencies/zstd-1.5.0/contrib/VS2005/zstd/zstd.vcproj +++ b/src/dependencies/zstd-1.5.4/contrib/VS2005/zstd/zstd.vcproj @@ -363,6 +363,10 @@ RelativePath="..\..\..\programs\fileio.c" > + + diff --git a/src/dependencies/zstd-1.5.0/contrib/VS2005/zstdlib/zstdlib.vcproj b/src/dependencies/zstd-1.5.4/contrib/VS2005/zstdlib/zstdlib.vcproj similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/VS2005/zstdlib/zstdlib.vcproj rename to src/dependencies/zstd-1.5.4/contrib/VS2005/zstdlib/zstdlib.vcproj diff --git a/src/dependencies/zstd-1.5.0/contrib/cleanTabs b/src/dependencies/zstd-1.5.4/contrib/cleanTabs similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/cleanTabs rename to src/dependencies/zstd-1.5.4/contrib/cleanTabs diff --git a/src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/.gitignore b/src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/Makefile b/src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/Makefile similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/Makefile rename to src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/Makefile index a21a002..ecc9e63 100644 --- a/src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2019-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/check_flipped_bits.c b/src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/check_flipped_bits.c similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/check_flipped_bits.c rename to src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/check_flipped_bits.c index cc40ab8..09ddd46 100644 --- a/src/dependencies/zstd-1.5.0/contrib/diagnose_corruption/check_flipped_bits.c +++ b/src/dependencies/zstd-1.5.4/contrib/diagnose_corruption/check_flipped_bits.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/docker/Dockerfile b/src/dependencies/zstd-1.5.4/contrib/docker/Dockerfile similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/docker/Dockerfile rename to src/dependencies/zstd-1.5.4/contrib/docker/Dockerfile diff --git a/src/dependencies/zstd-1.5.0/contrib/docker/README.md b/src/dependencies/zstd-1.5.4/contrib/docker/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/docker/README.md rename to src/dependencies/zstd-1.5.4/contrib/docker/README.md diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/.gitignore b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/.gitignore new file mode 100644 index 0000000..147710a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/.gitignore @@ -0,0 +1,2 @@ +# build artifacts +externalSequenceProducer diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/Makefile b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/Makefile new file mode 100644 index 0000000..0591ae0 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/Makefile @@ -0,0 +1,40 @@ +# ################################################################ +# Copyright (c) Yann Collet, Meta Platforms, Inc. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# ################################################################ + +PROGDIR = ../../programs +LIBDIR = ../../lib + +LIBZSTD = $(LIBDIR)/libzstd.a + +CPPFLAGS+= -I$(LIBDIR) -I$(LIBDIR)/compress -I$(LIBDIR)/common + +CFLAGS ?= -O3 +CFLAGS += -std=gnu99 +DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ + -Wstrict-aliasing=1 -Wswitch-enum \ + -Wstrict-prototypes -Wundef -Wpointer-arith \ + -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ + -Wredundant-decls +CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) + +default: externalSequenceProducer + +all: externalSequenceProducer + +externalSequenceProducer: sequence_producer.c main.c $(LIBZSTD) + $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ + +.PHONY: $(LIBZSTD) +$(LIBZSTD): + $(MAKE) -C $(LIBDIR) libzstd.a CFLAGS="$(CFLAGS)" + +clean: + $(RM) *.o + $(MAKE) -C $(LIBDIR) clean > /dev/null + $(RM) externalSequenceProducer diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/README.md b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/README.md new file mode 100644 index 0000000..c16a170 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/README.md @@ -0,0 +1,14 @@ +externalSequenceProducer +===================== + +`externalSequenceProducer` is a test tool for the Block-Level Sequence Producer API. +It demonstrates how to use the API to perform a simple round-trip test. + +A sample sequence producer is provided in sequence_producer.c, but the user can swap +this out with a different one if desired. The sample sequence producer implements +LZ parsing with a 1KB hashtable. Dictionary-based parsing is not currently supported. + +Command line : +``` +externalSequenceProducer filename +``` diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/main.c b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/main.c new file mode 100644 index 0000000..e67e295 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/main.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include +#include +#include +#include + +#define ZSTD_STATIC_LINKING_ONLY +#include "zstd.h" +#include "zstd_errors.h" +#include "sequence_producer.h" // simpleSequenceProducer + +#define CHECK(res) \ +do { \ + if (ZSTD_isError(res)) { \ + printf("ERROR: %s\n", ZSTD_getErrorName(res)); \ + return 1; \ + } \ +} while (0) \ + +int main(int argc, char *argv[]) { + if (argc != 2) { + printf("Usage: externalSequenceProducer \n"); + return 1; + } + + ZSTD_CCtx* const zc = ZSTD_createCCtx(); + + int simpleSequenceProducerState = 0xdeadbeef; + + // Here is the crucial bit of code! + ZSTD_registerSequenceProducer( + zc, + &simpleSequenceProducerState, + simpleSequenceProducer + ); + + { + size_t const res = ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 1); + CHECK(res); + } + + FILE *f = fopen(argv[1], "rb"); + assert(f); + { + int const ret = fseek(f, 0, SEEK_END); + assert(ret == 0); + } + size_t const srcSize = ftell(f); + { + int const ret = fseek(f, 0, SEEK_SET); + assert(ret == 0); + } + + char* const src = malloc(srcSize + 1); + assert(src); + { + size_t const ret = fread(src, srcSize, 1, f); + assert(ret == 1); + int const ret2 = fclose(f); + assert(ret2 == 0); + } + + size_t const dstSize = ZSTD_compressBound(srcSize); + char* const dst = malloc(dstSize); + assert(dst); + + size_t const cSize = ZSTD_compress2(zc, dst, dstSize, src, srcSize); + CHECK(cSize); + + char* const val = malloc(srcSize); + assert(val); + + { + size_t const res = ZSTD_decompress(val, srcSize, dst, cSize); + CHECK(res); + } + + if (memcmp(src, val, srcSize) == 0) { + printf("Compression and decompression were successful!\n"); + printf("Original size: %lu\n", srcSize); + printf("Compressed size: %lu\n", cSize); + } else { + printf("ERROR: input and validation buffers don't match!\n"); + for (size_t i = 0; i < srcSize; i++) { + if (src[i] != val[i]) { + printf("First bad index: %zu\n", i); + break; + } + } + return 1; + } + + ZSTD_freeCCtx(zc); + free(src); + free(dst); + free(val); + return 0; +} diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.c b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.c new file mode 100644 index 0000000..60a2f95 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "zstd_compress_internal.h" +#include "sequence_producer.h" + +#define HSIZE 1024 +static U32 const HLOG = 10; +static U32 const MLS = 4; +static U32 const BADIDX = 0xffffffff; + +size_t simpleSequenceProducer( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +) { + const BYTE* const istart = (const BYTE*)src; + const BYTE* const iend = istart + srcSize; + const BYTE* ip = istart; + const BYTE* anchor = istart; + size_t seqCount = 0; + U32 hashTable[HSIZE]; + + (void)sequenceProducerState; + (void)dict; + (void)dictSize; + (void)outSeqsCapacity; + (void)compressionLevel; + + { int i; + for (i=0; i < HSIZE; i++) { + hashTable[i] = BADIDX; + } } + + while (ip + MLS < iend) { + size_t const hash = ZSTD_hashPtr(ip, HLOG, MLS); + U32 const matchIndex = hashTable[hash]; + hashTable[hash] = (U32)(ip - istart); + + if (matchIndex != BADIDX) { + const BYTE* const match = istart + matchIndex; + U32 const matchLen = (U32)ZSTD_count(ip, match, iend); + if (matchLen >= ZSTD_MINMATCH_MIN) { + U32 const litLen = (U32)(ip - anchor); + U32 const offset = (U32)(ip - match); + ZSTD_Sequence const seq = { + offset, litLen, matchLen, 0 + }; + + /* Note: it's crucial to stay within the window size! */ + if (offset <= windowSize) { + outSeqs[seqCount++] = seq; + ip += matchLen; + anchor = ip; + continue; + } + } + } + + ip++; + } + + { ZSTD_Sequence const finalSeq = { + 0, (U32)(iend - anchor), 0, 0 + }; + outSeqs[seqCount++] = finalSeq; + } + + return seqCount; +} diff --git a/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.h b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.h new file mode 100644 index 0000000..19f9982 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/externalSequenceProducer/sequence_producer.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef MATCHFINDER_H +#define MATCHFINDER_H + +#define ZSTD_STATIC_LINKING_ONLY +#include "zstd.h" + +size_t simpleSequenceProducer( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +#endif diff --git a/src/dependencies/zstd-1.5.0/contrib/freestanding_lib/freestanding.py b/src/dependencies/zstd-1.5.4/contrib/freestanding_lib/freestanding.py similarity index 94% rename from src/dependencies/zstd-1.5.0/contrib/freestanding_lib/freestanding.py rename to src/dependencies/zstd-1.5.4/contrib/freestanding_lib/freestanding.py index 1971687..df69832 100755 --- a/src/dependencies/zstd-1.5.0/contrib/freestanding_lib/freestanding.py +++ b/src/dependencies/zstd-1.5.4/contrib/freestanding_lib/freestanding.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # ################################################################ -# Copyright (c) 2021-2021, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -27,7 +27,6 @@ SKIPPED_FILES = [ "common/pool.h", "common/threading.c", "common/threading.h", - "common/zstd_trace.c", "common/zstd_trace.h", "compress/zstdmt_compress.h", "compress/zstdmt_compress.c", @@ -341,7 +340,7 @@ class PartialPreprocessor(object): if macro2 is not None and not resolved: assert ifdef and defined and op == '&&' and cmp is not None - # If the statment is true, but we have a single value check, then + # If the statement is true, but we have a single value check, then # check the value. defined_value = self._defs[macro] are_ints = True @@ -432,7 +431,7 @@ class Freestanding(object): external_xxhash: bool, xxh64_state: Optional[str], xxh64_prefix: Optional[str], rewritten_includes: [(str, str)], defs: [(str, Optional[str])], replaces: [(str, str)], - undefs: [str], excludes: [str], seds: [str], + undefs: [str], excludes: [str], seds: [str], spdx: bool, ): self._zstd_deps = zstd_deps self._mem = mem @@ -447,6 +446,7 @@ class Freestanding(object): self._undefs = undefs self._excludes = excludes self._seds = seds + self._spdx = spdx def _dst_lib_file_paths(self): """ @@ -461,7 +461,8 @@ class Freestanding(object): print(*args, **kwargs) def _copy_file(self, lib_path): - if not (lib_path.endswith(".c") or lib_path.endswith(".h")): + suffixes = [".c", ".h", ".S"] + if not any((lib_path.endswith(suffix) for suffix in suffixes)): return if lib_path in SKIPPED_FILES: self._log(f"\tSkipping file: {lib_path}") @@ -640,6 +641,27 @@ class Freestanding(object): for sed in self._seds: self._process_sed(sed) + def _process_spdx(self): + if not self._spdx: + return + self._log("Processing spdx") + SPDX_C = "// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause\n" + SPDX_H_S = "/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */\n" + for filepath in self._dst_lib_file_paths(): + file = FileLines(filepath) + if file.lines[0] == SPDX_C or file.lines[0] == SPDX_H_S: + continue + for line in file.lines: + if "SPDX-License-Identifier" in line: + raise RuntimeError(f"Unexpected SPDX license identifier: {file.filename} {repr(line)}") + if file.filename.endswith(".c"): + file.lines.insert(0, SPDX_C) + elif file.filename.endswith(".h") or file.filename.endswith(".S"): + file.lines.insert(0, SPDX_H_S) + else: + raise RuntimeError(f"Unexpected file extension: {file.filename}") + file.write() + def go(self): @@ -651,6 +673,7 @@ class Freestanding(object): self._rewrite_includes() self._replace_xxh64_prefix() self._process_seds() + self._process_spdx() def parse_optional_pair(defines: [str]) -> [(str, Optional[str])]: @@ -689,8 +712,9 @@ def main(name, args): parser.add_argument("--xxh64-prefix", default=None, help="Alternate XXH64 function prefix (excluding _) e.g. --xxh64-prefix=xxh64") parser.add_argument("--rewrite-include", default=[], dest="rewritten_includes", action="append", help="Rewrite an include REGEX=NEW (e.g. '=')") parser.add_argument("--sed", default=[], dest="seds", action="append", help="Apply a sed replacement. Format: `s/REGEX/FORMAT/[g]`. REGEX is a Python regex. FORMAT is a Python format string formatted by the regex dict.") + parser.add_argument("--spdx", action="store_true", help="Add SPDX License Identifiers") parser.add_argument("-D", "--define", default=[], dest="defs", action="append", help="Pre-define this macro (can be passed multiple times)") - parser.add_argument("-U", "--undefine", default=[], dest="undefs", action="append", help="Pre-undefine this macro (can be passed mutliple times)") + parser.add_argument("-U", "--undefine", default=[], dest="undefs", action="append", help="Pre-undefine this macro (can be passed multiple times)") parser.add_argument("-R", "--replace", default=[], dest="replaces", action="append", help="Pre-define this macro and replace the first ifndef block with its definition") parser.add_argument("-E", "--exclude", default=[], dest="excludes", action="append", help="Exclude all lines between 'BEGIN ' and 'END '") args = parser.parse_args(args) @@ -743,6 +767,7 @@ def main(name, args): args.undefs, args.excludes, args.seds, + args.spdx, ).go() if __name__ == "__main__": diff --git a/src/dependencies/zstd-1.5.0/contrib/gen_html/.gitignore b/src/dependencies/zstd-1.5.4/contrib/gen_html/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/gen_html/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/gen_html/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/gen_html/Makefile b/src/dependencies/zstd-1.5.4/contrib/gen_html/Makefile similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/gen_html/Makefile rename to src/dependencies/zstd-1.5.4/contrib/gen_html/Makefile index 425f266..26e8703 100644 --- a/src/dependencies/zstd-1.5.0/contrib/gen_html/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/gen_html/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2016-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/gen_html/README.md b/src/dependencies/zstd-1.5.4/contrib/gen_html/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/gen_html/README.md rename to src/dependencies/zstd-1.5.4/contrib/gen_html/README.md diff --git a/src/dependencies/zstd-1.5.0/contrib/gen_html/gen-zstd-manual.sh b/src/dependencies/zstd-1.5.4/contrib/gen_html/gen-zstd-manual.sh similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/gen_html/gen-zstd-manual.sh rename to src/dependencies/zstd-1.5.4/contrib/gen_html/gen-zstd-manual.sh diff --git a/src/dependencies/zstd-1.5.0/contrib/gen_html/gen_html.cpp b/src/dependencies/zstd-1.5.4/contrib/gen_html/gen_html.cpp similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/gen_html/gen_html.cpp rename to src/dependencies/zstd-1.5.4/contrib/gen_html/gen_html.cpp index 90d5b21..1da5879 100644 --- a/src/dependencies/zstd-1.5.0/contrib/gen_html/gen_html.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/gen_html/gen_html.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Przemyslaw Skibinski, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/.gitignore b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/largeNbDicts/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/largeNbDicts/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/Makefile b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/Makefile similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/largeNbDicts/Makefile rename to src/dependencies/zstd-1.5.4/contrib/largeNbDicts/Makefile index 4c055b0..40734e6 100644 --- a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2018-present, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/README.md b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/README.md new file mode 100644 index 0000000..010102c --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/README.md @@ -0,0 +1,33 @@ +largeNbDicts +===================== + +`largeNbDicts` is a benchmark test tool +dedicated to the specific scenario of +dictionary decompression using a very large number of dictionaries. +When dictionaries are constantly changing, they are always "cold", +suffering from increased latency due to cache misses. + +The tool is created in a bid to investigate performance for this scenario, +and experiment mitigation techniques. + +Command line : +``` +largeNbDicts [Options] filename(s) + +Options : +-z : benchmark compression (default) +-d : benchmark decompression +-r : recursively load all files in subdirectories (default: off) +-B# : split input into blocks of size # (default: no split) +-# : use compression level # (default: 3) +-D # : use # as a dictionary (default: create one) +-i# : nb benchmark rounds (default: 6) +--nbBlocks=#: use # blocks for bench (default: one per file) +--nbDicts=# : create # dictionaries for bench (default: one per block) +-h : help (this text) + +Advanced Options (see zstd.h for documentation) : +--dedicated-dict-search +--dict-content-type=# +--dict-attach-pref=# +``` diff --git a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/largeNbDicts.c b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/largeNbDicts.c similarity index 82% rename from src/dependencies/zstd-1.5.0/contrib/largeNbDicts/largeNbDicts.c rename to src/dependencies/zstd-1.5.4/contrib/largeNbDicts/largeNbDicts.c index ddbb3e0..eeaaf71 100644 --- a/src/dependencies/zstd-1.5.0/contrib/largeNbDicts/largeNbDicts.c +++ b/src/dependencies/zstd-1.5.4/contrib/largeNbDicts/largeNbDicts.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-present, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,7 @@ /*--- Dependencies ---*/ #include /* size_t */ -#include /* malloc, free, abort */ +#include /* malloc, free, abort, qsort*/ #include /* fprintf */ #include /* UINT_MAX */ #include /* assert */ @@ -39,6 +39,7 @@ #define BLOCKSIZE_DEFAULT 0 /* no slicing into blocks */ #define DICTSIZE (4 KB) #define CLEVEL_DEFAULT 3 +#define DICT_LOAD_METHOD ZSTD_dlm_byCopy #define BENCH_TIME_DEFAULT_S 6 #define RUN_TIME_DEFAULT_MS 1000 @@ -156,19 +157,6 @@ createDictionaryBuffer(const char* dictionaryName, } } -static ZSTD_CDict* createCDictForDedicatedDictSearch(const void* dict, size_t dictSize, int compressionLevel) -{ - ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); - ZSTD_CCtxParams_init(params, compressionLevel); - ZSTD_CCtxParams_setParameter(params, ZSTD_c_enableDedicatedDictSearch, 1); - ZSTD_CCtxParams_setParameter(params, ZSTD_c_compressionLevel, compressionLevel); - - ZSTD_CDict* cdict = ZSTD_createCDict_advanced2(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, params, ZSTD_defaultCMem); - - ZSTD_freeCCtxParams(params); - return cdict; -} - /*! BMK_loadFiles() : * Loads `buffer`, with content from files listed within `fileNamesTable`. * Fills `buffer` entirely. @@ -461,14 +449,12 @@ static void freeCDictCollection(cdict_collection_t cdictc) } /* returns .buffers=NULL if operation fails */ -static cdict_collection_t createCDictCollection(const void* dictBuffer, size_t dictSize, size_t nbCDict, int cLevel, int dedicatedDictSearch) +static cdict_collection_t createCDictCollection(const void* dictBuffer, size_t dictSize, size_t nbCDict, ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams) { ZSTD_CDict** const cdicts = malloc(nbCDict * sizeof(ZSTD_CDict*)); if (cdicts==NULL) return kNullCDictCollection; for (size_t dictNb=0; dictNb < nbCDict; dictNb++) { - cdicts[dictNb] = dedicatedDictSearch ? - createCDictForDedicatedDictSearch(dictBuffer, dictSize, cLevel) : - ZSTD_createCDict(dictBuffer, dictSize, cLevel); + cdicts[dictNb] = ZSTD_createCDict_advanced2(dictBuffer, dictSize, DICT_LOAD_METHOD, dictContentType, cctxParams, ZSTD_defaultCMem); CONTROL(cdicts[dictNb] != NULL); } cdict_collection_t cdictc; @@ -591,11 +577,13 @@ typedef struct { cdict_collection_t dictionaries; } compressInstructions; -compressInstructions createCompressInstructions(cdict_collection_t dictionaries) +compressInstructions createCompressInstructions(cdict_collection_t dictionaries, ZSTD_CCtx_params* cctxParams) { compressInstructions ci; ci.cctx = ZSTD_createCCtx(); CONTROL(ci.cctx != NULL); + if (cctxParams) + ZSTD_CCtx_setParametersUsingCCtxParams(ci.cctx, cctxParams); ci.nbDicts = dictionaries.nbCDict; ci.dictNb = 0; ci.dictionaries = dictionaries; @@ -636,10 +624,10 @@ size_t compress(const void* src, size_t srcSize, void* dst, size_t dstCapacity, compressInstructions* const ci = (compressInstructions*) payload; (void)dstCapacity; - ZSTD_compress_usingCDict(ci->cctx, - dst, srcSize, - src, srcSize, - ci->dictionaries.cdicts[ci->dictNb]); + ZSTD_CCtx_refCDict(ci->cctx, ci->dictionaries.cdicts[ci->dictNb]); + ZSTD_compress2(ci->cctx, + dst, srcSize, + src, srcSize); ci->dictNb = ci->dictNb + 1; if (ci->dictNb >= ci->nbDicts) ci->dictNb = 0; @@ -663,25 +651,55 @@ size_t decompress(const void* src, size_t srcSize, void* dst, size_t dstCapacity return result; } +typedef enum { + fastest = 0, + median = 1, +} metricAggregatePref_e; -static int benchMem(slice_collection_t dstBlocks, - slice_collection_t srcBlocks, +/* compareFunction() : + * Sort input in decreasing order when used with qsort() */ +int compareFunction(const void *a, const void *b) +{ + double x = *(const double *)a; + double y = *(const double *)b; + if (x < y) + return 1; + else if (x > y) + return -1; + return 0; +} + +double aggregateData(double *data, size_t size, + metricAggregatePref_e metricAggregatePref) +{ + qsort(data, size, sizeof(*data), compareFunction); + if (metricAggregatePref == fastest) + return data[0]; + else /* median */ + return (data[(size - 1) / 2] + data[size / 2]) / 2; +} + +static int benchMem(slice_collection_t dstBlocks, slice_collection_t srcBlocks, ddict_collection_t ddictionaries, - cdict_collection_t cdictionaries, - unsigned nbRounds, int benchCompression) + cdict_collection_t cdictionaries, unsigned nbRounds, + int benchCompression, const char *exeName, + ZSTD_CCtx_params *cctxParams, + metricAggregatePref_e metricAggregatePref) { assert(dstBlocks.nbSlices == srcBlocks.nbSlices); + if (benchCompression) assert(cctxParams); unsigned const ms_per_round = RUN_TIME_DEFAULT_MS; unsigned const total_time_ms = nbRounds * ms_per_round; - double bestSpeed = 0.; + double *const speedPerRound = (double *)malloc(nbRounds * sizeof(double)); BMK_timedFnState_t* const benchState = BMK_createTimedFnState(total_time_ms, ms_per_round); decompressInstructions di = createDecompressInstructions(ddictionaries); - compressInstructions ci = createCompressInstructions(cdictionaries); + compressInstructions ci = + createCompressInstructions(cdictionaries, cctxParams); void* payload = benchCompression ? (void*)&ci : (void*)&di; BMK_benchParams_t const bp = { .benchFn = benchCompression ? compress : decompress, @@ -697,6 +715,7 @@ static int benchMem(slice_collection_t dstBlocks, .blockResults = NULL }; + size_t roundNb = 0; for (;;) { BMK_runOutcome_t const outcome = BMK_benchTimedFn(benchState, bp); CONTROL(BMK_isSuccessful_runOutcome(outcome)); @@ -706,16 +725,57 @@ static int benchMem(slice_collection_t dstBlocks, double const dTime_sec = (double)dTime_ns / 1000000000; size_t const srcSize = result.sumOfReturn; double const speed_MBps = (double)srcSize / dTime_sec / (1 MB); - if (speed_MBps > bestSpeed) bestSpeed = speed_MBps; + speedPerRound[roundNb] = speed_MBps; if (benchCompression) - DISPLAY("Compression Speed : %.1f MB/s \r", bestSpeed); + DISPLAY("Compression Speed : %.1f MB/s \r", speed_MBps); else - DISPLAY("Decompression Speed : %.1f MB/s \r", bestSpeed); + DISPLAY("Decompression Speed : %.1f MB/s \r", speed_MBps); fflush(stdout); if (BMK_isCompleted_TimedFn(benchState)) break; + roundNb++; } DISPLAY("\n"); + /* BMK_benchTimedFn may not run exactly nbRounds iterations */ + double speedAggregated = + aggregateData(speedPerRound, roundNb + 1, metricAggregatePref); + if (metricAggregatePref == fastest) + DISPLAY("Fastest Speed : %.1f MB/s \n", speedAggregated); + else + DISPLAY("Median Speed : %.1f MB/s \n", speedAggregated); + + char* csvFileName = malloc(strlen(exeName) + 5); + strcpy(csvFileName, exeName); + strcat(csvFileName, ".csv"); + FILE* csvFile = fopen(csvFileName, "r"); + if (!csvFile) { + csvFile = fopen(csvFileName, "wt"); + assert(csvFile); + fprintf(csvFile, "%s\n", exeName); + /* Print table headers */ + fprintf( + csvFile, + "Compression/Decompression,Level,nbDicts,dictAttachPref,metricAggregatePref,Speed\n"); + } else { + fclose(csvFile); + csvFile = fopen(csvFileName, "at"); + assert(csvFile); + } + + int cLevel = -1; + int dictAttachPref = -1; + if (benchCompression) { + ZSTD_CCtxParams_getParameter(cctxParams, ZSTD_c_compressionLevel, + &cLevel); + ZSTD_CCtxParams_getParameter(cctxParams, ZSTD_c_forceAttachDict, + &dictAttachPref); + } + fprintf(csvFile, "%s,%d,%ld,%d,%d,%.1f\n", + benchCompression ? "Compression" : "Decompression", cLevel, + benchCompression ? ci.nbDicts : di.nbDicts, dictAttachPref, + metricAggregatePref, speedAggregated); + fclose(csvFile); + free(csvFileName); freeDecompressInstructions(di); freeCompressInstructions(ci); @@ -730,12 +790,11 @@ static int benchMem(slice_collection_t dstBlocks, * dictionary : optional (can be NULL), file to load as dictionary, * if none provided : will be calculated on the fly by the program. * @return : 0 is success, 1+ otherwise */ -int bench(const char** fileNameTable, unsigned nbFiles, - const char* dictionary, - size_t blockSize, int clevel, - unsigned nbDictMax, unsigned nbBlocks, +int bench(const char **fileNameTable, unsigned nbFiles, const char *dictionary, + size_t blockSize, int clevel, unsigned nbDictMax, unsigned nbBlocks, unsigned nbRounds, int benchCompression, - int dedicatedDictSearch) + ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params *cctxParams, + const char *exeName, metricAggregatePref_e metricAggregatePref) { int result = 0; @@ -786,20 +845,18 @@ int bench(const char** fileNameTable, unsigned nbFiles, /* dictionary determination */ buffer_t const dictBuffer = createDictionaryBuffer(dictionary, srcs.buffer.ptr, - srcs.slices.capacities, srcs.slices.nbSlices, + srcSlices.capacities, srcSlices.nbSlices, DICTSIZE); CONTROL(dictBuffer.ptr != NULL); - ZSTD_CDict* const cdict = dedicatedDictSearch ? - createCDictForDedicatedDictSearch(dictBuffer.ptr, dictBuffer.size, clevel) : - ZSTD_createCDict(dictBuffer.ptr, dictBuffer.size, clevel); + ZSTD_CDict* const cdict = ZSTD_createCDict_advanced2(dictBuffer.ptr, dictBuffer.size, DICT_LOAD_METHOD, dictContentType, cctxParams, ZSTD_defaultCMem); CONTROL(cdict != NULL); size_t const cTotalSizeNoDict = compressBlocks(NULL, dstSlices, srcSlices, NULL, clevel); CONTROL(cTotalSizeNoDict != 0); DISPLAYLEVEL(3, "compressing at level %u without dictionary : Ratio=%.2f (%u bytes) \n", clevel, - (double)totalSrcSlicesSize / cTotalSizeNoDict, (unsigned)cTotalSizeNoDict); + (double)totalSrcSlicesSize / (double)cTotalSizeNoDict, (unsigned)cTotalSizeNoDict); size_t* const cSizes = malloc(nbBlocks * sizeof(size_t)); CONTROL(cSizes != NULL); @@ -808,21 +865,21 @@ int bench(const char** fileNameTable, unsigned nbFiles, CONTROL(cTotalSize != 0); DISPLAYLEVEL(3, "compressed using a %u bytes dictionary : Ratio=%.2f (%u bytes) \n", (unsigned)dictBuffer.size, - (double)totalSrcSlicesSize / cTotalSize, (unsigned)cTotalSize); + (double)totalSrcSlicesSize / (double)cTotalSize, (unsigned)cTotalSize); /* now dstSlices contain the real compressed size of each block, instead of the maximum capacity */ shrinkSizes(dstSlices, cSizes); unsigned const nbDicts = nbDictMax ? nbDictMax : nbBlocks; - cdict_collection_t const cdictionaries = createCDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts, clevel, dedicatedDictSearch); + cdict_collection_t const cdictionaries = createCDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts, dictContentType, cctxParams); CONTROL(cdictionaries.cdicts != NULL); ddict_collection_t const ddictionaries = createDDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts); CONTROL(ddictionaries.ddicts != NULL); if (benchCompression) { - size_t const dictMem = ZSTD_estimateCDictSize(dictBuffer.size, ZSTD_dlm_byCopy); + size_t const dictMem = ZSTD_sizeof_CDict(cdictionaries.cdicts[0]); size_t const allDictMem = dictMem * nbDicts; DISPLAYLEVEL(3, "generating %u dictionaries, using %.1f MB of memory \n", nbDicts, (double)allDictMem / (1 MB)); @@ -832,11 +889,13 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollection(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression); + result = benchMem(dstSlices, resultCollection.slices, ddictionaries, + cdictionaries, nbRounds, benchCompression, exeName, + cctxParams, metricAggregatePref); freeBufferCollection(resultCollection); } else { - size_t const dictMem = ZSTD_estimateDDictSize(dictBuffer.size, ZSTD_dlm_byCopy); + size_t const dictMem = ZSTD_estimateDDictSize(dictBuffer.size, DICT_LOAD_METHOD); size_t const allDictMem = dictMem * nbDicts; DISPLAYLEVEL(3, "generating %u dictionaries, using %.1f MB of memory \n", nbDicts, (double)allDictMem / (1 MB)); @@ -846,7 +905,9 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollectionSizes(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression); + result = benchMem(resultCollection.slices, dstSlices, ddictionaries, + cdictionaries, nbRounds, benchCompression, exeName, + NULL, metricAggregatePref); freeBufferCollection(resultCollection); } @@ -924,9 +985,15 @@ int usage(const char* exeName) DISPLAY ("-# : use compression level # (default: %u) \n", CLEVEL_DEFAULT); DISPLAY ("-D # : use # as a dictionary (default: create one) \n"); DISPLAY ("-i# : nb benchmark rounds (default: %u) \n", BENCH_TIME_DEFAULT_S); + DISPLAY ("-p# : print speed for all rounds 0=fastest 1=median (default: 0) \n"); DISPLAY ("--nbBlocks=#: use # blocks for bench (default: one per file) \n"); DISPLAY ("--nbDicts=# : create # dictionaries for bench (default: one per block) \n"); DISPLAY ("-h : help (this text) \n"); + DISPLAY (" \n"); + DISPLAY ("Advanced Options (see zstd.h for documentation) : \n"); + DISPLAY ("--dedicated-dict-search\n"); + DISPLAY ("--dict-content-type=#\n"); + DISPLAY ("--dict-attach-pref=#\n"); return 0; } @@ -956,6 +1023,10 @@ int main (int argc, const char** argv) size_t blockSize = BLOCKSIZE_DEFAULT; unsigned nbDicts = 0; /* determine nbDicts automatically: 1 dictionary per block */ unsigned nbBlocks = 0; /* determine nbBlocks automatically, from source and blockSize */ + ZSTD_dictContentType_e dictContentType = ZSTD_dct_auto; + ZSTD_dictAttachPref_e dictAttachPref = ZSTD_dictDefaultAttach; + ZSTD_paramSwitch_e prefetchCDictTables = ZSTD_ps_auto; + metricAggregatePref_e metricAggregatePref = fastest; for (int argNb = 1; argNb < argc ; argNb++) { const char* argument = argv[argNb]; @@ -965,6 +1036,7 @@ int main (int argc, const char** argv) if (!strcmp(argument, "-r")) { recursiveMode = 1; continue; } if (!strcmp(argument, "-D")) { argNb++; assert(argNb < argc); dictionary = argv[argNb]; continue; } if (longCommandWArg(&argument, "-i")) { nbRounds = readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "-p")) { metricAggregatePref = (int)readU32FromChar(&argument); continue;} if (longCommandWArg(&argument, "--dictionary=")) { dictionary = argument; continue; } if (longCommandWArg(&argument, "-B")) { blockSize = readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--blockSize=")) { blockSize = readU32FromChar(&argument); continue; } @@ -972,6 +1044,9 @@ int main (int argc, const char** argv) if (longCommandWArg(&argument, "--nbBlocks=")) { nbBlocks = readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--clevel=")) { cLevel = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--dedicated-dict-search")) { dedicatedDictSearch = 1; continue; } + if (longCommandWArg(&argument, "--dict-content-type=")) { dictContentType = (int)readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "--dict-attach-pref=")) { dictAttachPref = (int)readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "--prefetch-cdict-tables=")) { prefetchCDictTables = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "-")) { cLevel = (int)readU32FromChar(&argument); continue; } /* anything that's not a command is a filename */ nameTable[nameIdx++] = argument; @@ -989,10 +1064,22 @@ int main (int argc, const char** argv) nameTable = NULL; /* UTIL_createFileNamesTable() takes ownership of nameTable */ } - int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dedicatedDictSearch); + ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams(); + ZSTD_CCtxParams_init(cctxParams, cLevel); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_enableDedicatedDictSearch, dedicatedDictSearch); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_nbWorkers, 0); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_forceAttachDict, dictAttachPref); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_prefetchCDictTables, prefetchCDictTables); + + int result = + bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, + dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, + benchCompression, dictContentType, cctxParams, exeName, + metricAggregatePref); UTIL_freeFileNamesTable(filenameTable); free(nameTable); + ZSTD_freeCCtxParams(cctxParams); return result; } diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/.gitignore b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/Makefile b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/Makefile similarity index 77% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/Makefile rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/Makefile index c391df7..63dd15d 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -26,20 +26,20 @@ libzstd: --rewrite-include '"(\.\./)?zstd_errors.h"=' \ --sed 's,/\*\*\*,/* *,g' \ --sed 's,/\*\*,/*,g' \ + --spdx \ -DZSTD_NO_INTRINSICS \ -DZSTD_NO_UNUSED_FUNCTIONS \ -DZSTD_LEGACY_SUPPORT=0 \ -DZSTD_STATIC_LINKING_ONLY \ -DFSE_STATIC_LINKING_ONLY \ - -DHUF_STATIC_LINKING_ONLY \ -DXXH_STATIC_LINKING_ONLY \ - -DMEM_FORCE_MEMORY_ACCESS=0 \ -D__GNUC__ \ + -D__linux__=1 \ -DSTATIC_BMI2=0 \ -DZSTD_ADDRESS_SANITIZER=0 \ -DZSTD_MEMORY_SANITIZER=0 \ + -DZSTD_DATAFLOW_SANITIZER=0 \ -DZSTD_COMPRESS_HEAPMODE=1 \ - -UZSTD_NO_INLINE \ -UNO_PREFETCH \ -U__cplusplus \ -UZSTD_DLL_EXPORT \ @@ -48,14 +48,19 @@ libzstd: -UZSTD_MULTITHREAD \ -U_MSC_VER \ -U_WIN32 \ - -RZSTDLIB_VISIBILITY= \ - -RZSTDERRORLIB_VISIBILITY= \ + -RZSTDLIB_VISIBLE= \ + -RZSTDERRORLIB_VISIBLE= \ + -RZSTD_FALLTHROUGH=fallthrough \ -DZSTD_HAVE_WEAK_SYMBOLS=0 \ -DZSTD_TRACE=0 \ - -DZSTD_NO_TRACE + -DZSTD_NO_TRACE \ + -DZSTD_DISABLE_ASM \ + -DZSTD_LINUX_KERNEL + rm linux/lib/zstd/decompress/huf_decompress_amd64.S mv linux/lib/zstd/zstd.h linux/include/linux/zstd_lib.h mv linux/lib/zstd/zstd_errors.h linux/include/linux/ cp linux_zstd.h linux/include/linux/zstd.h + cp zstd_common_module.c linux/lib/zstd cp zstd_compress_module.c linux/lib/zstd cp zstd_decompress_module.c linux/lib/zstd cp decompress_sources.h linux/lib/zstd @@ -86,10 +91,18 @@ import-upstream: rm $(LINUX)/lib/zstd/common/xxhash.* rm $(LINUX)/lib/zstd/compress/zstdmt_* +DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ + -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ + -Wstrict-prototypes -Wundef -Wpointer-arith \ + -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ + -Wredundant-decls -Wmissing-prototypes -Wc++-compat \ + -Wimplicit-fallthrough + .PHONY: test test: libzstd - $(MAKE) -C test run-test CFLAGS="-O3 $(CFLAGS)" -j + $(MAKE) -C test run-test CFLAGS="-O3 $(CFLAGS) $(DEBUGFLAGS) -Werror" -j .PHONY: clean clean: $(RM) -rf linux + $(MAKE) -C test clean diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/README.md b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/README.md rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/README.md diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/btrfs-benchmark.sh b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/btrfs-benchmark.sh similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/btrfs-benchmark.sh rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/btrfs-benchmark.sh diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/btrfs-extract-benchmark.sh b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/btrfs-extract-benchmark.sh similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/btrfs-extract-benchmark.sh rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/btrfs-extract-benchmark.sh diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/decompress_sources.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/decompress_sources.h similarity index 79% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/decompress_sources.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/decompress_sources.h index f35bef0..8a47eb2 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/decompress_sources.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/decompress_sources.h @@ -1,6 +1,6 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -16,6 +16,12 @@ * decompression. */ +/* + * Disable the ASM Huffman implementation because we need to + * include all the sources. + */ +#define ZSTD_DISABLE_ASM 1 + #include "common/debug.c" #include "common/entropy_common.c" #include "common/error_private.c" diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux.mk b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux.mk similarity index 85% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux.mk rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux.mk index 19485e3..464c410 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux.mk +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux.mk @@ -1,6 +1,6 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -10,16 +10,10 @@ # ################################################################ obj-$(CONFIG_ZSTD_COMPRESS) += zstd_compress.o obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd_decompress.o - -ccflags-y += -O3 +obj-$(CONFIG_ZSTD_COMMON) += zstd_common.o zstd_compress-y := \ zstd_compress_module.o \ - common/debug.o \ - common/entropy_common.o \ - common/error_private.o \ - common/fse_decompress.o \ - common/zstd_common.o \ compress/fse_compress.o \ compress/hist.o \ compress/huf_compress.o \ @@ -35,12 +29,15 @@ zstd_compress-y := \ zstd_decompress-y := \ zstd_decompress_module.o \ + decompress/huf_decompress.o \ + decompress/zstd_ddict.o \ + decompress/zstd_decompress.o \ + decompress/zstd_decompress_block.o \ + +zstd_common-y := \ + zstd_common_module.o \ common/debug.o \ common/entropy_common.o \ common/error_private.o \ common/fse_decompress.o \ common/zstd_common.o \ - decompress/huf_decompress.o \ - decompress/zstd_ddict.o \ - decompress/zstd_decompress.o \ - decompress/zstd_decompress_block.o \ diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux_zstd.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux_zstd.h similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux_zstd.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux_zstd.h index 446ecab..f109d49 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/linux_zstd.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/linux_zstd.h @@ -1,6 +1,6 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/mem.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/mem.h similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/mem.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/mem.h index 4b5db57..a723182 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/mem.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/mem.h @@ -1,6 +1,6 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -30,6 +30,8 @@ * Basic Types *****************************************************************/ typedef uint8_t BYTE; +typedef uint8_t U8; +typedef int8_t S8; typedef uint16_t U16; typedef int16_t S16; typedef uint32_t U32; diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/squashfs-benchmark.sh b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/squashfs-benchmark.sh similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/squashfs-benchmark.sh rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/squashfs-benchmark.sh diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/Makefile b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/Makefile similarity index 85% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/Makefile rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/Makefile index 2908839..67b55e6 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -18,9 +18,13 @@ CPPFLAGS += -DZSTD_ASAN_DONT_POISON_WORKSPACE LINUX_ZSTD_MODULE := $(wildcard $(LINUX_ZSTDLIB)/*.c) LINUX_ZSTD_COMMON := $(wildcard $(LINUX_ZSTDLIB)/common/*.c) LINUX_ZSTD_COMPRESS := $(wildcard $(LINUX_ZSTDLIB)/compress/*.c) -LINUX_ZSTD_DECOMPRESS := $(wildcard $(LINUX_ZSTDLIB)/decompress/*.c) +LINUX_ZSTD_DECOMPRESS := $(wildcard $(LINUX_ZSTDLIB)/decompress/*.c $(LINUX_ZSTDLIB)/decompress/*.S) LINUX_ZSTD_FILES := $(LINUX_ZSTD_MODULE) $(LINUX_ZSTD_COMMON) $(LINUX_ZSTD_COMPRESS) $(LINUX_ZSTD_DECOMPRESS) -LINUX_ZSTD_OBJECTS := $(LINUX_ZSTD_FILES:.c=.o) +LINUX_ZSTD_OBJECTS0 := $(LINUX_ZSTD_FILES:.c=.o) +LINUX_ZSTD_OBJECTS := $(LINUX_ZSTD_OBJECTS0:.S=.o) + +%.o: %.S + $(COMPILE.S) $(OUTPUT_OPTION) $< liblinuxzstd.a: $(LINUX_ZSTD_OBJECTS) $(AR) $(ARFLAGS) $@ $^ @@ -41,4 +45,5 @@ clean: $(RM) -f $(LINUX_ZSTDLIB)/*.o $(RM) -f $(LINUX_ZSTDLIB)/**/*.o $(RM) -f *.o *.a + $(RM) -f static_test $(RM) -f test diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/asm/unaligned.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/asm/unaligned.h similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/asm/unaligned.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/asm/unaligned.h index 02c2d74..86ec4ca 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/asm/unaligned.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/asm/unaligned.h @@ -20,6 +20,7 @@ static unsigned _isLittleEndian(void) { const union { uint32_t u; uint8_t c[4]; } one = { 1 }; assert(_IS_LITTLE_ENDIAN == one.c[0]); + (void)one; return _IS_LITTLE_ENDIAN; } diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/compiler.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/compiler.h similarity index 82% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/compiler.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/compiler.h index ea3422e..988ce4a 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/compiler.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/compiler.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -18,4 +18,6 @@ #define noinline __attribute__((noinline)) #endif +#define fallthrough __attribute__((__fallthrough__)) + #endif diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/errno.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/errno.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/errno.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/errno.h index b247522..b4bdcba 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/errno.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/errno.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/kernel.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/kernel.h similarity index 91% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/kernel.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/kernel.h index 1f702ab..a4d791c 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/kernel.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/kernel.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/limits.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/limits.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/limits.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/limits.h index db9c099..574aa7b 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/limits.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/limits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/math64.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/math64.h similarity index 89% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/math64.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/math64.h index 8eefa2d..7f6713e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/math64.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/math64.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/module.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/module.h similarity index 77% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/module.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/module.h index be6d20d..06ef56f 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/module.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/module.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -12,6 +12,8 @@ #define EXPORT_SYMBOL(symbol) \ void* __##symbol = symbol +#define EXPORT_SYMBOL_GPL(symbol) \ + void* __##symbol = symbol #define MODULE_LICENSE(license) #define MODULE_DESCRIPTION(description) diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/printk.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/printk.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/printk.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/printk.h index eab08e0..92a2527 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/printk.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/printk.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/stddef.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/stddef.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/stddef.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/stddef.h index 8538eb3..15c7408 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/stddef.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/stddef.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/swab.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/swab.h similarity index 89% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/swab.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/swab.h index 783046b..2b48b43 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/swab.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/swab.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/types.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/types.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/types.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/types.h index 459a457..b413db6 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/types.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/xxhash.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/xxhash.h similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/xxhash.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/xxhash.h index 0a43bb2..d41cbd9 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/include/linux/xxhash.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/include/linux/xxhash.h @@ -2,7 +2,7 @@ * xxHash - Extremely Fast Hash algorithm * Copyright (C) 2012-2016, Yann Collet. * - * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + * BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -124,11 +124,10 @@ XXH_API uint64_t xxh64(const void *input, size_t length, uint64_t seed); static inline unsigned long xxhash(const void *input, size_t length, uint64_t seed) { -#if BITS_PER_LONG == 64 - return xxh64(input, length, seed); -#else - return xxh32(input, length, seed); -#endif + if (sizeof(size_t) == 8) + return xxh64(input, length, seed); + else + return xxh32(input, length, seed); } /*-**************************** @@ -261,7 +260,7 @@ XXH_API void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state * xxHash - Extremely Fast Hash algorithm * Copyright (C) 2012-2016, Yann Collet. * - * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + * BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/macro-test.sh b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/macro-test.sh similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/macro-test.sh rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/macro-test.sh index c688ac0..9ea84aa 100755 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/macro-test.sh +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/macro-test.sh @@ -36,9 +36,9 @@ test_not_present "ZSTD_NO_INTRINSICS" test_not_present "ZSTD_NO_UNUSED_FUNCTIONS" test_not_present "ZSTD_LEGACY_SUPPORT" test_not_present "STATIC_BMI2" -test_not_present "ZSTD_NO_INLINE" test_not_present "ZSTD_DLL_EXPORT" test_not_present "ZSTD_DLL_IMPORT" test_not_present "__ICCARM__" test_not_present "_MSC_VER" test_not_present "_WIN32" +test_not_present "__linux__" diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/static_test.c b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/static_test.c similarity index 83% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/static_test.c rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/static_test.c index 50c594c..ba4a420 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/static_test.c +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/static_test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,17 +28,19 @@ static const char kEmptyZstdFrame[] = { 0x28, 0xb5, 0x2f, 0xfd, 0x24, 0x00, 0x01, 0x00, 0x00, 0x99, 0xe9, 0xd8, 0x51 }; -static void test_decompress_unzstd() { +static void test_decompress_unzstd(void) { fprintf(stderr, "Testing decompress unzstd... "); { size_t const wkspSize = zstd_dctx_workspace_bound(); void* wksp = malloc(wkspSize); - CONTROL(wksp != NULL); ZSTD_DCtx* dctx = zstd_init_dctx(wksp, wkspSize); + CONTROL(wksp != NULL); CONTROL(dctx != NULL); - size_t const dSize = zstd_decompress_dctx(dctx, NULL, 0, kEmptyZstdFrame, sizeof(kEmptyZstdFrame)); - CONTROL(!zstd_is_error(dSize)); - CONTROL(dSize == 0); + { + size_t const dSize = zstd_decompress_dctx(dctx, NULL, 0, kEmptyZstdFrame, sizeof(kEmptyZstdFrame)); + CONTROL(!zstd_is_error(dSize)); + CONTROL(dSize == 0); + } free(wksp); } fprintf(stderr, "Ok\n"); diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/test.c b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/test.c similarity index 84% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/test.c rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/test.c index 9064be7..0f4ba3f 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/test/test.c +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/test/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -30,15 +30,15 @@ typedef struct { size_t compSize; } test_data_t; -test_data_t create_test_data(void) { +static test_data_t create_test_data(void) { test_data_t data; data.dataSize = 128 * 1024; - data.data = malloc(data.dataSize); + data.data = (char*)malloc(data.dataSize); CONTROL(data.data != NULL); - data.data2 = malloc(data.dataSize); + data.data2 = (char*)malloc(data.dataSize); CONTROL(data.data2 != NULL); data.compSize = zstd_compress_bound(data.dataSize); - data.comp = malloc(data.compSize); + data.comp = (char*)malloc(data.compSize); CONTROL(data.comp != NULL); memset(data.data, 0, data.dataSize); return data; @@ -54,26 +54,27 @@ static void free_test_data(test_data_t const *data) { #define MAX(a, b) ((a) > (b) ? (a) : (b)) static void test_btrfs(test_data_t const *data) { - fprintf(stderr, "testing btrfs use cases... "); size_t const size = MIN(data->dataSize, 128 * 1024); + fprintf(stderr, "testing btrfs use cases... "); for (int level = -1; level < 16; ++level) { zstd_parameters params = zstd_get_params(level, size); - CONTROL(params.cParams.windowLog <= 17); size_t const workspaceSize = MAX(zstd_cstream_workspace_bound(¶ms.cParams), zstd_dstream_workspace_bound(size)); void *workspace = malloc(workspaceSize); - CONTROL(workspace != NULL); char const *ip = data->data; char const *iend = ip + size; char *op = data->comp; char *oend = op + data->compSize; + + CONTROL(params.cParams.windowLog <= 17); + CONTROL(workspace != NULL); { zstd_cstream *cctx = zstd_init_cstream(¶ms, size, workspace, workspaceSize); - CONTROL(cctx != NULL); zstd_out_buffer out = {NULL, 0, 0}; zstd_in_buffer in = {NULL, 0, 0}; + CONTROL(cctx != NULL); for (;;) { if (in.pos == in.size) { in.src = ip; @@ -108,9 +109,9 @@ static void test_btrfs(test_data_t const *data) { oend = op + size; { zstd_dstream *dctx = zstd_init_dstream(1ULL << params.cParams.windowLog, workspace, workspaceSize); - CONTROL(dctx != NULL); zstd_out_buffer out = {NULL, 0, 0}; zstd_in_buffer in = {NULL, 0, 0}; + CONTROL(dctx != NULL); for (;;) { if (in.pos == in.size) { in.src = ip; @@ -125,15 +126,16 @@ static void test_btrfs(test_data_t const *data) { out.pos = 0; op += out.size; } - - size_t const ret = zstd_decompress_stream(dctx, &out, &in); - CONTROL(!zstd_is_error(ret)); - if (ret == 0) { - break; + { + size_t const ret = zstd_decompress_stream(dctx, &out, &in); + CONTROL(!zstd_is_error(ret)); + if (ret == 0) { + break; + } } } } - CONTROL(op - data->data2 == data->dataSize); + CONTROL((size_t)(op - data->data2) == data->dataSize); CONTROL(!memcmp(data->data, data->data2, data->dataSize)); free(workspace); } @@ -141,14 +143,14 @@ static void test_btrfs(test_data_t const *data) { } static void test_decompress_unzstd(test_data_t const *data) { - fprintf(stderr, "Testing decompress unzstd... "); size_t cSize; + fprintf(stderr, "Testing decompress unzstd... "); { zstd_parameters params = zstd_get_params(19, 0); size_t const wkspSize = zstd_cctx_workspace_bound(¶ms.cParams); void* wksp = malloc(wkspSize); - CONTROL(wksp != NULL); zstd_cctx* cctx = zstd_init_cctx(wksp, wkspSize); + CONTROL(wksp != NULL); CONTROL(cctx != NULL); cSize = zstd_compress_cctx(cctx, data->comp, data->compSize, data->data, data->dataSize, ¶ms); CONTROL(!zstd_is_error(cSize)); @@ -157,19 +159,21 @@ static void test_decompress_unzstd(test_data_t const *data) { { size_t const wkspSize = zstd_dctx_workspace_bound(); void* wksp = malloc(wkspSize); - CONTROL(wksp != NULL); zstd_dctx* dctx = zstd_init_dctx(wksp, wkspSize); + CONTROL(wksp != NULL); CONTROL(dctx != NULL); - size_t const dSize = zstd_decompress_dctx(dctx, data->data2, data->dataSize, data->comp, cSize); - CONTROL(!zstd_is_error(dSize)); - CONTROL(dSize == data->dataSize); + { + size_t const dSize = zstd_decompress_dctx(dctx, data->data2, data->dataSize, data->comp, cSize); + CONTROL(!zstd_is_error(dSize)); + CONTROL(dSize == data->dataSize); + } CONTROL(!memcmp(data->data, data->data2, data->dataSize)); free(wksp); } fprintf(stderr, "Ok\n"); } -static void test_f2fs() { +static void test_f2fs(void) { fprintf(stderr, "testing f2fs uses... "); CONTROL(zstd_min_clevel() < 0); CONTROL(zstd_max_clevel() == 22); @@ -182,26 +186,32 @@ static void __attribute__((noinline)) use(void *x) { asm volatile("" : "+r"(x)); } -static void __attribute__((noinline)) set_stack() { +static void __attribute__((noinline)) fill_stack(void) { + memset(g_stack, 0x33, 8192); +} + +static void __attribute__((noinline)) set_stack(void) { char stack[8192]; g_stack = stack; - memset(g_stack, 0x33, 8192); use(g_stack); } -static void __attribute__((noinline)) check_stack() { +static void __attribute__((noinline)) check_stack(void) { size_t cleanStack = 0; while (cleanStack < 8192 && g_stack[cleanStack] == 0x33) { ++cleanStack; } - size_t const stackSize = 8192 - cleanStack; - fprintf(stderr, "Maximum stack size: %zu\n", stackSize); - CONTROL(stackSize <= 2048 + 512); + { + size_t const stackSize = 8192 - cleanStack; + fprintf(stderr, "Maximum stack size: %zu\n", stackSize); + CONTROL(stackSize <= 2048 + 512); + } } static void test_stack_usage(test_data_t const *data) { set_stack(); + fill_stack(); test_f2fs(); test_btrfs(data); test_decompress_unzstd(data); diff --git a/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_common_module.c b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_common_module.c new file mode 100644 index 0000000..2fead39 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_common_module.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include + +#include "common/huf.h" +#include "common/fse.h" +#include "common/zstd_internal.h" + +// Export symbols shared by compress and decompress into a common module + +#undef ZSTD_isError /* defined within zstd_internal.h */ +EXPORT_SYMBOL_GPL(FSE_readNCount); +EXPORT_SYMBOL_GPL(HUF_readStats); +EXPORT_SYMBOL_GPL(HUF_readStats_wksp); +EXPORT_SYMBOL_GPL(ZSTD_isError); +EXPORT_SYMBOL_GPL(ZSTD_getErrorName); +EXPORT_SYMBOL_GPL(ZSTD_getErrorCode); +EXPORT_SYMBOL_GPL(ZSTD_customMalloc); +EXPORT_SYMBOL_GPL(ZSTD_customCalloc); +EXPORT_SYMBOL_GPL(ZSTD_customFree); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("Zstd Common"); diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_compress_module.c b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_compress_module.c similarity index 58% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_compress_module.c rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_compress_module.c index 37d08ff..8ecf432 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_compress_module.c +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_compress_module.c @@ -1,6 +1,6 @@ -// SPDX-License-Identifier: GPL-2.0-only +// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -17,6 +17,43 @@ #include "common/zstd_deps.h" #include "common/zstd_internal.h" +#define ZSTD_FORWARD_IF_ERR(ret) \ + do { \ + size_t const __ret = (ret); \ + if (ZSTD_isError(__ret)) \ + return __ret; \ + } while (0) + +static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters, + unsigned long long pledged_src_size) +{ + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset( + cctx, ZSTD_reset_session_and_parameters)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize( + cctx, pledged_src_size)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_windowLog, parameters->cParams.windowLog)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_hashLog, parameters->cParams.hashLog)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_chainLog, parameters->cParams.chainLog)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_searchLog, parameters->cParams.searchLog)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_minMatch, parameters->cParams.minMatch)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_targetLength, parameters->cParams.targetLength)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_strategy, parameters->cParams.strategy)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag)); + ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( + cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag)); + return 0; +} + int zstd_min_clevel(void) { return ZSTD_minCLevel(); @@ -59,7 +96,8 @@ EXPORT_SYMBOL(zstd_init_cctx); size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, const void *src, size_t src_size, const zstd_parameters *parameters) { - return ZSTD_compress_advanced(cctx, dst, dst_capacity, src, src_size, NULL, 0, *parameters); + ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size)); + return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size); } EXPORT_SYMBOL(zstd_compress_cctx); @@ -73,7 +111,6 @@ zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, unsigned long long pledged_src_size, void *workspace, size_t workspace_size) { zstd_cstream *cstream; - size_t ret; if (workspace == NULL) return NULL; @@ -86,8 +123,7 @@ zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, if (pledged_src_size == 0) pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; - ret = ZSTD_initCStream_advanced(cstream, NULL, 0, *parameters, pledged_src_size); - if (ZSTD_isError(ret)) + if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size))) return NULL; return cstream; @@ -97,7 +133,11 @@ EXPORT_SYMBOL(zstd_init_cstream); size_t zstd_reset_cstream(zstd_cstream *cstream, unsigned long long pledged_src_size) { - return ZSTD_resetCStream(cstream, pledged_src_size); + if (pledged_src_size == 0) + pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; + ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_reset(cstream, ZSTD_reset_session_only) ); + ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_setPledgedSrcSize(cstream, pledged_src_size) ); + return 0; } EXPORT_SYMBOL(zstd_reset_cstream); diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_decompress_module.c b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_decompress_module.c similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_decompress_module.c rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_decompress_module.c index 15005cd..eb1c49e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_decompress_module.c +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_decompress_module.c @@ -1,6 +1,6 @@ -// SPDX-License-Identifier: GPL-2.0-only +// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_deps.h b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_deps.h similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_deps.h rename to src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_deps.h index 853b724..9251614 100644 --- a/src/dependencies/zstd-1.5.0/contrib/linux-kernel/zstd_deps.h +++ b/src/dependencies/zstd-1.5.4/contrib/linux-kernel/zstd_deps.h @@ -1,6 +1,6 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/match_finders/README.md b/src/dependencies/zstd-1.5.4/contrib/match_finders/README.md similarity index 86% rename from src/dependencies/zstd-1.5.0/contrib/match_finders/README.md rename to src/dependencies/zstd-1.5.4/contrib/match_finders/README.md index 0f4a3b1..54055c3 100644 --- a/src/dependencies/zstd-1.5.0/contrib/match_finders/README.md +++ b/src/dependencies/zstd-1.5.4/contrib/match_finders/README.md @@ -14,7 +14,7 @@ * files would be small relative to the size of the file. * * Various 'diffing' algorithms utilize this notion of edit distance and - * the corrensponding concept of a minimal edit script between two + * the corresponding concept of a minimal edit script between two * sequences to identify the regions within two files where they differ. * The core algorithm used in this match finder is described in: * @@ -28,12 +28,12 @@ * * Note: after some experimentation, this approach proved to not provide enough * utility to justify the additional CPU used in finding matches. The one area - * where this approach consistenly outperforms Zstandard even on level 19 is - * when compressing small files (<10 KB) using a equally small dictionary that + * where this approach consistently outperforms Zstandard even on level 19 is + * when compressing small files (<10 KB) using an equally small dictionary that * is very similar to the source file. For the use case that this was intended, * (large similar files) this approach by itself took 5-10X longer than zstd-19 and * generally resulted in 2-3X larger files. The core advantage that zstd-19 has - * over this appraoch for match finding is the overlapping matches. This approach + * over this approach for match finding is the overlapping matches. This approach * cannot find any. * * I'm leaving this in the contrib section in case this ever becomes interesting diff --git a/src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.c b/src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.c similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.c rename to src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.c index aab545f..d685cdd 100644 --- a/src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.c +++ b/src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -12,7 +12,7 @@ * Dependencies ***************************************/ -/* Currently relies on qsort when combining contiguous matches. This can probabily +/* Currently relies on qsort when combining contiguous matches. This can probably * be avoided but would require changes to the algorithm. The qsort is far from * the bottleneck in this algorithm even for medium sized files so it's probably * not worth trying to address */ @@ -26,7 +26,7 @@ * Constants ***************************************/ -/* Just a sential for the entires of the diagnomal matrix */ +/* Just a sential for the entries of the diagonal matrix */ #define ZSTD_EDIST_DIAG_MAX (S32)(1 << 30) /* How large should a snake be to be considered a 'big' snake. @@ -39,7 +39,7 @@ #define ZSTD_EDIST_SNAKE_ITER_THRESH 200 /* After how many iterations should be just give up and take - * the best availabe edit script for this round */ + * the best available edit script for this round */ #define ZSTD_EDIST_EXPENSIVE_THRESH 1024 /*-************************************* @@ -57,10 +57,10 @@ typedef struct { const BYTE* src; size_t dictSize; size_t srcSize; - S32* forwardDiag; /* Entires of the forward diagonal stored here */ - S32* backwardDiag; /* Entires of the backward diagonal stored here. + S32* forwardDiag; /* Entries of the forward diagonal stored here */ + S32* backwardDiag; /* Entries of the backward diagonal stored here. * Note: this buffer and the 'forwardDiag' buffer - * are contiguous. See the ZSTD_eDist_genSequences */ + * are contiguous. See the ZSTD_eDist_genSequences */ ZSTD_eDist_match* matches; /* Accumulate matches of length 1 in this buffer. * In a subsequence post-processing step, we combine * contiguous matches. */ @@ -192,7 +192,7 @@ static void ZSTD_eDist_diag(ZSTD_eDist_state* state, if (!useHeuristics) continue; - /* Everything under this point is a heuritic. Using these will + /* Everything under this point is a heuristic. Using these will * substantially speed up the match finding. In some cases, taking * the total match finding time from several minutes to seconds. * Of course, the caveat is that the edit script found may no longer @@ -366,8 +366,8 @@ static int ZSTD_eDist_compare(ZSTD_eDist_state* state, } } else if (srcLow == srcHigh) { while (dictLow < dictHigh) { - /* Reaching this point means deleteing dict[dictLow] from - * the current positino of dict */ + /* Reaching this point means deleting dict[dictLow] from + * the current position of dict */ dictLow++; } } else { @@ -395,7 +395,7 @@ static int ZSTD_eDist_matchComp(const void* p, const void* q) } /* The matches from the approach above will all be of the form - * (dictIdx, srcIdx, 1). this method combines contiguous matches + * (dictIdx, srcIdx, 1). This method combines contiguous matches * of length MINMATCH or greater. Matches less than MINMATCH * are discarded */ static void ZSTD_eDist_combineMatches(ZSTD_eDist_state* state) @@ -460,7 +460,7 @@ static size_t ZSTD_eDist_convertMatchesToSequences(ZSTD_Sequence* sequences, } /*-************************************* -* Interal utils +* Internal utils ***************************************/ static size_t ZSTD_eDist_hamingDist(const BYTE* const a, diff --git a/src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.h b/src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.h similarity index 89% rename from src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.h rename to src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.h index c775a49..c739e2a 100644 --- a/src/dependencies/zstd-1.5.0/contrib/match_finders/zstd_edist.h +++ b/src/dependencies/zstd-1.5.4/contrib/match_finders/zstd_edist.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -21,7 +21,7 @@ * files would be small relative to the size of the file. * * Various 'diffing' algorithms utilize this notion of edit distance and - * the corrensponding concept of a minimal edit script between two + * the corresponding concept of a minimal edit script between two * sequences to identify the regions within two files where they differ. * The core algorithm used in this match finder is described in: * @@ -35,12 +35,12 @@ * * Note: after some experimentation, this approach proved to not provide enough * utility to justify the additional CPU used in finding matches. The one area - * where this approach consistenly outperforms Zstandard even on level 19 is - * when compressing small files (<10 KB) using a equally small dictionary that + * where this approach consistently outperforms Zstandard even on level 19 is + * when compressing small files (<10 KB) using an equally small dictionary that * is very similar to the source file. For the use case that this was intended, * (large similar files) this approach by itself took 5-10X longer than zstd-19 and * generally resulted in 2-3X larger files. The core advantage that zstd-19 has - * over this appraoch for match finding is the overlapping matches. This approach + * over this approach for match finding is the overlapping matches. This approach * cannot find any. * * I'm leaving this in the contrib section in case this ever becomes interesting diff --git a/src/dependencies/zstd-1.5.0/contrib/premake/premake4.lua b/src/dependencies/zstd-1.5.4/contrib/premake/premake4.lua similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/premake/premake4.lua rename to src/dependencies/zstd-1.5.4/contrib/premake/premake4.lua diff --git a/src/dependencies/zstd-1.5.0/contrib/premake/zstd.lua b/src/dependencies/zstd-1.5.4/contrib/premake/zstd.lua similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/premake/zstd.lua rename to src/dependencies/zstd-1.5.4/contrib/premake/zstd.lua diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/.gitignore b/src/dependencies/zstd-1.5.4/contrib/pzstd/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/pzstd/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/BUCK b/src/dependencies/zstd-1.5.4/contrib/pzstd/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/BUCK rename to src/dependencies/zstd-1.5.4/contrib/pzstd/BUCK diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/ErrorHolder.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/ErrorHolder.h similarity index 95% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/ErrorHolder.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/ErrorHolder.h index 829651c..2c2797e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/ErrorHolder.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/ErrorHolder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Logging.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/Logging.h similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Logging.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Logging.h index beb160b..84a08d2 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Logging.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Logging.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Makefile b/src/dependencies/zstd-1.5.4/contrib/pzstd/Makefile similarity index 90% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Makefile rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Makefile index 25265e7..830053c 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2016-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -57,19 +57,6 @@ LD_COMMAND = $(CXX) $^ $(ALL_LDFLAGS) $(LIBS) -pthread -o $@ CC_COMMAND = $(CC) $(DEPFLAGS) $(ALL_CFLAGS) -c $< -o $@ CXX_COMMAND = $(CXX) $(DEPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@ -# Get a list of all zstd files so we rebuild the static library when we need to -ZSTDCOMMON_FILES := $(wildcard $(ZSTDDIR)/common/*.c) \ - $(wildcard $(ZSTDDIR)/common/*.h) -ZSTDCOMP_FILES := $(wildcard $(ZSTDDIR)/compress/*.c) \ - $(wildcard $(ZSTDDIR)/compress/*.h) -ZSTDDECOMP_FILES := $(wildcard $(ZSTDDIR)/decompress/*.c) \ - $(wildcard $(ZSTDDIR)/decompress/*.h) -ZSTDPROG_FILES := $(wildcard $(PROGDIR)/*.c) \ - $(wildcard $(PROGDIR)/*.h) -ZSTD_FILES := $(wildcard $(ZSTDDIR)/*.h) \ - $(ZSTDDECOMP_FILES) $(ZSTDCOMMON_FILES) $(ZSTDCOMP_FILES) \ - $(ZSTDPROG_FILES) - # List all the pzstd source files so we can determine their dependencies PZSTD_SRCS := $(wildcard *.cpp) PZSTD_TESTS := $(wildcard test/*.cpp) @@ -189,7 +176,8 @@ roundtrip: test/RoundTripTest$(EXT) # Use the static library that zstd builds for simplicity and # so we get the compiler options correct -$(ZSTDDIR)/libzstd.a: $(ZSTD_FILES) +.PHONY: $(ZSTDDIR)/libzstd.a +$(ZSTDDIR)/libzstd.a: CFLAGS="$(ALL_CFLAGS)" LDFLAGS="$(ALL_LDFLAGS)" $(MAKE) -C $(ZSTDDIR) libzstd.a # Rules to build the tests diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Options.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/Options.cpp similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Options.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Options.cpp index 3729222..a77824e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Options.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Options.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -87,7 +87,7 @@ void usage() { std::fprintf(stderr, " -V, --version : display version number and exit\n"); std::fprintf(stderr, " -v, --verbose : verbose mode; specify multiple times to increase log level (default:2)\n"); std::fprintf(stderr, " -q, --quiet : suppress warnings; specify twice to suppress errors too\n"); - std::fprintf(stderr, " -c, --stdout : force write to standard output, even if it is the console\n"); + std::fprintf(stderr, " -c, --stdout : write to standard output (even if it is the console)\n"); #ifdef UTIL_HAS_CREATEFILELIST std::fprintf(stderr, " -r : operate recursively on directories\n"); #endif diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Options.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/Options.h similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Options.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Options.h index 924543a..92c18a3 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Options.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Options.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.cpp similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.cpp index 2c09bda..67b9419 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -10,11 +10,13 @@ #include "Pzstd.h" #include "SkippableFrame.h" #include "utils/FileSystem.h" +#include "utils/Portability.h" #include "utils/Range.h" #include "utils/ScopeGuard.h" #include "utils/ThreadPool.h" #include "utils/WorkQueue.h" +#include #include #include #include @@ -336,6 +338,10 @@ static size_t calculateStep( const ZSTD_parameters ¶ms) { (void)size; (void)numThreads; + // Not validated to work correctly for window logs > 23. + // It will definitely fail if windowLog + 2 is >= 4GB because + // the skippable frame can only store sizes up to 4GB. + assert(params.cParams.windowLog <= 23); return size_t{1} << (params.cParams.windowLog + 2); } @@ -587,7 +593,8 @@ std::uint64_t writeFile( // start writing before compression is done because we need to know the // compressed size. // Wait for the compressed size to be available and write skippable frame - SkippableFrame frame(out->size()); + assert(uint64_t(out->size()) < uint64_t(1) << 32); + SkippableFrame frame(uint32_t(out->size())); if (!writeData(frame.data(), outputFd)) { errorHolder.setError("Failed to write output"); return bytesWritten; diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.h similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.h index c667c88..3645e59 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/Pzstd.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/Pzstd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/README.md b/src/dependencies/zstd-1.5.4/contrib/pzstd/README.md similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/README.md rename to src/dependencies/zstd-1.5.4/contrib/pzstd/README.md index 84d9458..bc8f831 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/README.md +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/README.md @@ -31,7 +31,7 @@ If this number is not suitable, during compilation you can define `PZSTD_NUM_THR ## Benchmarks -As a reference, PZstandard and Pigz were compared on an Intel Core i7 @ 3.1 GHz, each using 4 threads, with the [Silesia compression corpus](http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia). +As a reference, PZstandard and Pigz were compared on an Intel Core i7 @ 3.1 GHz, each using 4 threads, with the [Silesia compression corpus](https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia). Compression Speed vs Ratio with 4 Threads | Decompression Speed with 4 Threads ------------------------------------------|----------------------------------- diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.cpp similarity index 94% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.cpp index 769866d..3bea4eb 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.h similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.h index 60deed0..817415e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/SkippableFrame.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/SkippableFrame.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/images/Cspeed.png b/src/dependencies/zstd-1.5.4/contrib/pzstd/images/Cspeed.png similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/images/Cspeed.png rename to src/dependencies/zstd-1.5.4/contrib/pzstd/images/Cspeed.png diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/images/Dspeed.png b/src/dependencies/zstd-1.5.4/contrib/pzstd/images/Dspeed.png similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/images/Dspeed.png rename to src/dependencies/zstd-1.5.4/contrib/pzstd/images/Dspeed.png diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/main.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/main.cpp similarity index 91% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/main.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/main.cpp index b93f043..422b4a5 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/main.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/BUCK b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/test/BUCK rename to src/dependencies/zstd-1.5.4/contrib/pzstd/test/BUCK diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/OptionsTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/OptionsTest.cpp similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/test/OptionsTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/test/OptionsTest.cpp index e601148..91e3975 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/OptionsTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/OptionsTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/PzstdTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/PzstdTest.cpp similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/test/PzstdTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/test/PzstdTest.cpp index 5c7d663..75453f5 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/PzstdTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/PzstdTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTrip.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTrip.h similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTrip.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTrip.h index c6364ec..f777622 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTrip.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTrip.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTripTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTripTest.cpp similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTripTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTripTest.cpp index 36af067..c37646d 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/test/RoundTripTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/test/RoundTripTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/BUCK b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/BUCK rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/BUCK diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Buffer.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Buffer.h similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Buffer.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Buffer.h index f69c3b4..a85f770 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Buffer.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Buffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -45,7 +45,7 @@ class Buffer { : buffer_(buffer), range_(data) {} Buffer(Buffer&&) = default; - Buffer& operator=(Buffer&&) & = default; + Buffer& operator=(Buffer&&) = default; /** * Splits the data into two pieces: [begin, begin + n), [begin + n, end). diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/FileSystem.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/FileSystem.h similarity index 76% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/FileSystem.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/FileSystem.h index 3cfbe86..8d57d05 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/FileSystem.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/FileSystem.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -8,16 +8,18 @@ */ #pragma once +#include "utils/Portability.h" #include "utils/Range.h" #include #include #include +#include #include // A small subset of `std::filesystem`. // `std::filesystem` should be a drop in replacement. -// See http://en.cppreference.com/w/cpp/filesystem for documentation. +// See https://en.cppreference.com/w/cpp/filesystem for documentation. namespace pzstd { @@ -28,7 +30,7 @@ typedef struct ::_stat64 file_status; typedef struct ::stat file_status; #endif -/// http://en.cppreference.com/w/cpp/filesystem/status +/// https://en.cppreference.com/w/cpp/filesystem/status inline file_status status(StringPiece path, std::error_code& ec) noexcept { file_status status; #if defined(_MSC_VER) @@ -44,7 +46,7 @@ inline file_status status(StringPiece path, std::error_code& ec) noexcept { return status; } -/// http://en.cppreference.com/w/cpp/filesystem/is_regular_file +/// https://en.cppreference.com/w/cpp/filesystem/is_regular_file inline bool is_regular_file(file_status status) noexcept { #if defined(S_ISREG) return S_ISREG(status.st_mode); @@ -55,12 +57,12 @@ inline bool is_regular_file(file_status status) noexcept { #endif } -/// http://en.cppreference.com/w/cpp/filesystem/is_regular_file +/// https://en.cppreference.com/w/cpp/filesystem/is_regular_file inline bool is_regular_file(StringPiece path, std::error_code& ec) noexcept { return is_regular_file(status(path, ec)); } -/// http://en.cppreference.com/w/cpp/filesystem/is_directory +/// https://en.cppreference.com/w/cpp/filesystem/is_directory inline bool is_directory(file_status status) noexcept { #if defined(S_ISDIR) return S_ISDIR(status.st_mode); @@ -71,22 +73,22 @@ inline bool is_directory(file_status status) noexcept { #endif } -/// http://en.cppreference.com/w/cpp/filesystem/is_directory +/// https://en.cppreference.com/w/cpp/filesystem/is_directory inline bool is_directory(StringPiece path, std::error_code& ec) noexcept { return is_directory(status(path, ec)); } -/// http://en.cppreference.com/w/cpp/filesystem/file_size +/// https://en.cppreference.com/w/cpp/filesystem/file_size inline std::uintmax_t file_size( StringPiece path, std::error_code& ec) noexcept { auto stat = status(path, ec); if (ec) { - return -1; + return std::numeric_limits::max(); } if (!is_regular_file(stat)) { ec.assign(ENOTSUP, std::generic_category()); - return -1; + return std::numeric_limits::max(); } ec.clear(); return stat.st_size; diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Likely.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Likely.h similarity index 92% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Likely.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Likely.h index 7cea8da..52243a6 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Likely.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Likely.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Portability.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Portability.h new file mode 100644 index 0000000..ef1f86e --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Portability.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + */ + +#pragma once + +#include + +// Required for windows, which defines min/max, but we want the std:: version. +#undef min +#undef max diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Range.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Range.h similarity index 94% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Range.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Range.h index fedb5d7..0fd8f9f 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/Range.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/Range.h @@ -1,12 +1,12 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). */ - + /** * A subset of `folly/Range.h`. * All code copied verbatim modulo formatting @@ -14,7 +14,9 @@ #pragma once #include "utils/Likely.h" +#include "utils/Portability.h" +#include #include #include #include @@ -83,8 +85,8 @@ class Range { Range(const Range&) = default; Range(Range&&) = default; - Range& operator=(const Range&) & = default; - Range& operator=(Range&&) & = default; + Range& operator=(const Range&) = default; + Range& operator=(Range&&) = default; constexpr size_type size() const { return e_ - b_; diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ResourcePool.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ResourcePool.h similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ResourcePool.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ResourcePool.h index 8dfcdd7..7c4bb62 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ResourcePool.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ResourcePool.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ScopeGuard.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ScopeGuard.h similarity index 88% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ScopeGuard.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ScopeGuard.h index 31768f4..911fd98 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ScopeGuard.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ScopeGuard.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -15,7 +15,7 @@ namespace pzstd { /** * Dismissable scope guard. * `Function` must be callable and take no parameters. - * Unless `dissmiss()` is called, the callable is executed upon destruction of + * Unless `dismiss()` is called, the callable is executed upon destruction of * `ScopeGuard`. * * Example: diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ThreadPool.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ThreadPool.h similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ThreadPool.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ThreadPool.h index 8ece8e0..a087d7c 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/ThreadPool.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/ThreadPool.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/WorkQueue.h b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/WorkQueue.h similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/WorkQueue.h rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/WorkQueue.h index 1d14d92..d7947b8 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/WorkQueue.h +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/WorkQueue.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/BUCK b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/BUCK rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/BUCK diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/BufferTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/BufferTest.cpp similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/BufferTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/BufferTest.cpp index fbba74e..58bf08d 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/BufferTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/BufferTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/RangeTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/RangeTest.cpp similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/RangeTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/RangeTest.cpp index 755b50f..8b7dee2 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/RangeTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/RangeTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ResourcePoolTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ResourcePoolTest.cpp similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ResourcePoolTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ResourcePoolTest.cpp index 6fe1451..750ee08 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ResourcePoolTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ResourcePoolTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ScopeGuardTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ScopeGuardTest.cpp similarity index 91% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ScopeGuardTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ScopeGuardTest.cpp index 7bc624d..0f77cdf 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ScopeGuardTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ScopeGuardTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ThreadPoolTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ThreadPoolTest.cpp similarity index 96% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ThreadPoolTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ThreadPoolTest.cpp index 703fd4c..a01052e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/ThreadPoolTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/ThreadPoolTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/WorkQueueTest.cpp b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/WorkQueueTest.cpp similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/WorkQueueTest.cpp rename to src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/WorkQueueTest.cpp index 14cf773..16600bb 100644 --- a/src/dependencies/zstd-1.5.0/contrib/pzstd/utils/test/WorkQueueTest.cpp +++ b/src/dependencies/zstd-1.5.4/contrib/pzstd/utils/test/WorkQueueTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/recovery/Makefile b/src/dependencies/zstd-1.5.4/contrib/recovery/Makefile similarity index 95% rename from src/dependencies/zstd-1.5.0/contrib/recovery/Makefile rename to src/dependencies/zstd-1.5.4/contrib/recovery/Makefile index 9a9f4f2..be6ea4b 100644 --- a/src/dependencies/zstd-1.5.0/contrib/recovery/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/recovery/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2019-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/recovery/recover_directory.c b/src/dependencies/zstd-1.5.4/contrib/recovery/recover_directory.c similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/recovery/recover_directory.c rename to src/dependencies/zstd-1.5.4/contrib/recovery/recover_directory.c index 13f83fd..b9bd7ab 100644 --- a/src/dependencies/zstd-1.5.0/contrib/recovery/recover_directory.c +++ b/src/dependencies/zstd-1.5.4/contrib/recovery/recover_directory.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/.gitignore b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/Makefile b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/Makefile similarity index 97% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/Makefile rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/Makefile index 9df6b75..fcc0458 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2017-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_compression.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_compression.c similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_compression.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_compression.c index 4118b0a..0ec9fbd 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_compression.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_processing.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_processing.c similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_processing.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_processing.c index 36226b4..b1709db 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/parallel_processing.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/parallel_processing.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_compression.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_compression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_compression.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_compression.c index 9a331a8..182b46f 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_compression.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression.c index e9e2013..2c4f3ba 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression_mem.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression_mem.c similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression_mem.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression_mem.c index e7b1c65..44a06fb 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/examples/seekable_decompression_mem.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/examples/seekable_decompression_mem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/.gitignore b/src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/.gitignore rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/.gitignore diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/Makefile b/src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/Makefile similarity index 95% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/Makefile rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/Makefile index d51deb3..a81f222 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/Makefile +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) 2017-present, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/seekable_tests.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/seekable_tests.c similarity index 82% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/seekable_tests.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/seekable_tests.c index a482638..1bb2d0e 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/tests/seekable_tests.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/tests/seekable_tests.c @@ -186,6 +186,40 @@ int main(int argc, const char** argv) } printf("Success!\n"); + + printf("Test %u - check ZSTD magic in compressing empty string: ", testNb++); + { // compressing empty string should return a zstd header + size_t const capacity = 255; + char* inBuffer = malloc(capacity); + assert(inBuffer != NULL); + inBuffer[0] = '\0'; + void* const outBuffer = malloc(capacity); + assert(outBuffer != NULL); + + ZSTD_seekable_CStream *s = ZSTD_seekable_createCStream(); + ZSTD_seekable_initCStream(s, 1, 1, 255); + + ZSTD_inBuffer input = { .src=inBuffer, .pos=0, .size=0 }; + ZSTD_outBuffer output = { .dst=outBuffer, .pos=0, .size=capacity }; + + ZSTD_seekable_compressStream(s, &output, &input); + ZSTD_seekable_endStream(s, &output); + + if((((char*)output.dst)[0] != '\x28') | (((char*)output.dst)[1] != '\xb5') | (((char*)output.dst)[2] != '\x2f') | (((char*)output.dst)[3] != '\xfd')) { + printf("%#02x %#02x %#02x %#02x\n", ((char*)output.dst)[0], ((char*)output.dst)[1] , ((char*)output.dst)[2] , ((char*)output.dst)[3] ); + + free(inBuffer); + free(outBuffer); + ZSTD_seekable_freeCStream(s); + goto _test_error; + } + + free(inBuffer); + free(outBuffer); + ZSTD_seekable_freeCStream(s); + } + printf("Success!\n"); + /* TODO: Add more tests */ printf("Finished tests\n"); return 0; diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstd_seekable.h b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstd_seekable.h similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/zstd_seekable.h rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/zstd_seekable.h diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstd_seekable_compression_format.md b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstd_seekable_compression_format.md similarity index 98% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/zstd_seekable_compression_format.md rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/zstd_seekable_compression_format.md index 55aebfd..7bd0790 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstd_seekable_compression_format.md +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstd_seekable_compression_format.md @@ -2,7 +2,7 @@ ### Notices -Copyright (c) 2017-present Facebook, Inc. +Copyright (c) Meta Platforms, Inc. and affiliates. Permission is granted to copy and distribute this document for any purpose and without charge, diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_compress.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_compress.c similarity index 99% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_compress.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_compress.c index 242bd2a..113f6f9 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_compress.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_compress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -350,7 +350,7 @@ size_t ZSTD_seekable_writeSeekTable(ZSTD_frameLog* fl, ZSTD_outBuffer* output) size_t ZSTD_seekable_endStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output) { - if (!zcs->writingSeekTable && zcs->frameDSize) { + if (!zcs->writingSeekTable) { const size_t endFrame = ZSTD_seekable_endFrame(zcs, output); if (ZSTD_isError(endFrame)) return endFrame; /* return an accurate size hint */ diff --git a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_decompress.c b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_decompress.c similarity index 87% rename from src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_decompress.c rename to src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_decompress.c index 5eed024..fbb2d4f 100644 --- a/src/dependencies/zstd-1.5.0/contrib/seekable_format/zstdseek_decompress.c +++ b/src/dependencies/zstd-1.5.4/contrib/seekable_format/zstdseek_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-present, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -23,13 +23,64 @@ # endif #endif +/* ************************************************************ +* Detect POSIX version +* PLATFORM_POSIX_VERSION = 0 for non-Unix e.g. Windows +* PLATFORM_POSIX_VERSION = 1 for Unix-like but non-POSIX +* PLATFORM_POSIX_VERSION > 1 is equal to found _POSIX_VERSION +* Value of PLATFORM_POSIX_VERSION can be forced on command line +***************************************************************/ +#ifndef PLATFORM_POSIX_VERSION + +# if (defined(__APPLE__) && defined(__MACH__)) || defined(__SVR4) || defined(_AIX) || defined(__hpux) /* POSIX.1-2001 (SUSv3) conformant */ \ + || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) /* BSD distros */ + /* exception rule : force posix version to 200112L, + * note: it's better to use unistd.h's _POSIX_VERSION whenever possible */ +# define PLATFORM_POSIX_VERSION 200112L + +/* try to determine posix version through official unistd.h's _POSIX_VERSION (https://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html). + * note : there is no simple way to know in advance if is present or not on target system, + * Posix specification mandates its presence and its content, but target system must respect this spec. + * It's necessary to _not_ #include whenever target OS is not unix-like + * otherwise it will block preprocessing stage. + * The following list of build macros tries to "guess" if target OS is likely unix-like, and therefore can #include + */ +# elif !defined(_WIN32) \ + && ( defined(__unix__) || defined(__unix) \ + || defined(__midipix__) || defined(__VMS) || defined(__HAIKU__) ) + +# if defined(__linux__) || defined(__linux) || defined(__CYGWIN__) +# ifndef _POSIX_C_SOURCE +# define _POSIX_C_SOURCE 200809L /* feature test macro : https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html */ +# endif +# endif +# include /* declares _POSIX_VERSION */ +# if defined(_POSIX_VERSION) /* POSIX compliant */ +# define PLATFORM_POSIX_VERSION _POSIX_VERSION +# else +# define PLATFORM_POSIX_VERSION 1 +# endif + +# ifdef __UCLIBC__ +# ifndef __USE_MISC +# define __USE_MISC /* enable st_mtim on uclibc */ +# endif +# endif + +# else /* non-unix target platform (like Windows) */ +# define PLATFORM_POSIX_VERSION 0 +# endif + +#endif /* PLATFORM_POSIX_VERSION */ + + /* ************************************************************ * Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW ***************************************************************/ #if defined(_MSC_VER) && _MSC_VER >= 1400 # define LONG_SEEK _fseeki64 #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ -# define LONG_SEEK fseeko +# define LONG_SEEK fseeko #elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) # define LONG_SEEK fseeko64 #elif defined(_WIN32) && !defined(__DJGPP__) @@ -466,9 +517,9 @@ size_t ZSTD_seekable_decompress(ZSTD_seekable* zs, void* dst, size_t len, unsign size_t forwardProgress; if (zs->decompressedOffset < offset) { /* dummy decompressions until we get to the target offset */ - outTmp = (ZSTD_outBuffer){zs->outBuff, MIN(SEEKABLE_BUFF_SIZE, offset - zs->decompressedOffset), 0}; + outTmp = (ZSTD_outBuffer){zs->outBuff, (size_t) (MIN(SEEKABLE_BUFF_SIZE, offset - zs->decompressedOffset)), 0}; } else { - outTmp = (ZSTD_outBuffer){dst, len, zs->decompressedOffset - offset}; + outTmp = (ZSTD_outBuffer){dst, len, (size_t) (zs->decompressedOffset - offset)}; } prevOutPos = outTmp.pos; diff --git a/src/dependencies/zstd-1.5.4/contrib/seqBench/Makefile b/src/dependencies/zstd-1.5.4/contrib/seqBench/Makefile new file mode 100644 index 0000000..e7f08a4 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/seqBench/Makefile @@ -0,0 +1,58 @@ +# ################################################################ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# ################################################################ + +PROGDIR = ../../programs +LIBDIR = ../../lib + +LIBZSTD = $(LIBDIR)/libzstd.a + +CPPFLAGS+= -I$(LIBDIR) -I$(LIBDIR)/common -I$(LIBDIR)/dictBuilder -I$(PROGDIR) + +CFLAGS ?= -O3 -g +CFLAGS += -std=gnu99 +DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ + -Wstrict-aliasing=1 -Wswitch-enum \ + -Wstrict-prototypes -Wundef -Wpointer-arith \ + -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ + -Wredundant-decls +CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) + + +default: seqBench + +all : seqBench + +seqBench: util.o timefn.o benchfn.o datagen.o xxhash.o seqBench.c $(LIBZSTD) + $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ + +.PHONY: $(LIBZSTD) +$(LIBZSTD): + $(MAKE) -C $(LIBDIR) libzstd.a CFLAGS="$(CFLAGS)" + +benchfn.o: $(PROGDIR)/benchfn.c + $(CC) $(CPPFLAGS) $(CFLAGS) $^ -c + +timefn.o: $(PROGDIR)/timefn.c + $(CC) $(CPPFLAGS) $(CFLAGS) $^ -c + +datagen.o: $(PROGDIR)/datagen.c + $(CC) $(CPPFLAGS) $(CFLAGS) $^ -c + +util.o: $(PROGDIR)/util.c + $(CC) $(CPPFLAGS) $(CFLAGS) $^ -c + + +xxhash.o : $(LIBDIR)/common/xxhash.c + $(CC) $(CPPFLAGS) $(CFLAGS) $^ -c + + +clean: + $(RM) *.o + $(MAKE) -C $(LIBDIR) clean > /dev/null + $(RM) seqBench diff --git a/src/dependencies/zstd-1.5.4/contrib/seqBench/seqBench.c b/src/dependencies/zstd-1.5.4/contrib/seqBench/seqBench.c new file mode 100644 index 0000000..7efebec --- /dev/null +++ b/src/dependencies/zstd-1.5.4/contrib/seqBench/seqBench.c @@ -0,0 +1,53 @@ +#define ZSTD_STATIC_LINKING_ONLY +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + ZSTD_CCtx* zc = ZSTD_createCCtx(); + + if (argc != 2) { + printf("Usage: seqBench \n"); // TODO provide the block delim option here + return 1; + } + + FILE *f = fopen(argv[1], "rb"); + fseek(f, 0, SEEK_END); + long inBufSize = ftell(f); + fseek(f, 0, SEEK_SET); + + char *inBuf = malloc(inBufSize + 1); + fread(inBuf, inBufSize, 1, f); + fclose(f); + + size_t seqsSize = ZSTD_sequenceBound(inBufSize); + ZSTD_Sequence *seqs = (ZSTD_Sequence*)malloc(seqsSize * sizeof(ZSTD_Sequence)); + char *outBuf = malloc(ZSTD_compressBound(inBufSize)); + + ZSTD_generateSequences(zc, seqs, seqsSize, inBuf, inBufSize); + ZSTD_CCtx_setParameter(zc, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters); + size_t outBufSize = ZSTD_compressSequences(zc, outBuf, inBufSize, seqs, seqsSize, inBuf, inBufSize); + if (ZSTD_isError(outBufSize)) { + printf("ERROR: %lu\n", outBufSize); + return 1; + } + + char *validationBuf = malloc(inBufSize); + ZSTD_decompress(validationBuf, inBufSize, outBuf, outBufSize); + + if (memcmp(inBuf, validationBuf, inBufSize) == 0) { + printf("Compression and decompression were successful!\n"); + } else { + printf("ERROR: input and validation buffers don't match!\n"); + for (int i = 0; i < inBufSize; i++) { + if (inBuf[i] != validationBuf[i]) { + printf("First bad index: %d\n", i); + break; + } + } + } + + return 0; +} diff --git a/src/dependencies/zstd-1.5.0/contrib/snap/snapcraft.yaml b/src/dependencies/zstd-1.5.4/contrib/snap/snapcraft.yaml similarity index 100% rename from src/dependencies/zstd-1.5.0/contrib/snap/snapcraft.yaml rename to src/dependencies/zstd-1.5.4/contrib/snap/snapcraft.yaml diff --git a/src/dependencies/zstd-1.5.0/doc/README.md b/src/dependencies/zstd-1.5.4/doc/README.md similarity index 78% rename from src/dependencies/zstd-1.5.0/doc/README.md rename to src/dependencies/zstd-1.5.4/doc/README.md index bb7a3e4..8f3babc 100644 --- a/src/dependencies/zstd-1.5.0/doc/README.md +++ b/src/dependencies/zstd-1.5.4/doc/README.md @@ -5,8 +5,9 @@ This directory contains material defining the Zstandard format, as well as detailed instructions to use `zstd` library. __`zstd_manual.html`__ : Documentation of `zstd.h` API, in html format. -Click on this link: [http://zstd.net/zstd_manual.html](http://zstd.net/zstd_manual.html) -to display documentation of latest release in readable format within a browser. +Unfortunately, Github doesn't display `html` files in parsed format, just as source code. +For a readable display of html API documentation of latest release, +use this link: [https://raw.githack.com/facebook/zstd/release/doc/zstd_manual.html](https://raw.githack.com/facebook/zstd/release/doc/zstd_manual.html) . __`zstd_compression_format.md`__ : This document defines the Zstandard compression format. Compliant decoders must adhere to this document, diff --git a/src/dependencies/zstd-1.5.4/doc/decompressor_errata.md b/src/dependencies/zstd-1.5.4/doc/decompressor_errata.md new file mode 100644 index 0000000..b162e7f --- /dev/null +++ b/src/dependencies/zstd-1.5.4/doc/decompressor_errata.md @@ -0,0 +1,84 @@ +Decompressor Errata +=================== + +This document captures known decompressor bugs, where the decompressor rejects a valid zstd frame. +Each entry will contain: +1. The last affected decompressor versions. +2. The decompressor components affected. +2. Whether the compressed frame could ever be produced by the reference compressor. +3. An example frame. +4. A description of the bug. + +The document is in reverse chronological order, with the bugs that affect the most recent zstd decompressor versions listed first. + + +Compressed block with 0 literals and 0 sequences +------------------------------------------------ + +**Last affected version**: v1.5.2 + +**Affected decompressor component(s)**: Library & CLI + +**Produced by the reference compressor**: No + +**Example Frame**: `28b5 2ffd 2000 1500 0000 00` + +The zstd decoder incorrectly rejected blocks of type `Compressed_Block` that encodes literals as `Raw_Literals_Block` with no literals, and has no sequences. + +This type of block was never generated by the reference compressor. + +Additionally, these blocks were disallowed by the spec up until spec version 0.3.2 when the restriction was lifted by [PR#1689](https://github.com/facebook/zstd/pull/1689). + +> A Compressed_Block has the extra restriction that Block_Size is always strictly less than the decompressed size. If this condition cannot be respected, the block must be sent uncompressed instead (Raw_Block). + +First block is RLE block +------------------------ + +**Last affected version**: v1.4.3 + +**Affected decompressor component(s)**: CLI only + +**Produced by the reference compressor**: No + +**Example Frame**: `28b5 2ffd a001 0002 0002 0010 000b 0000 00` + +The zstd CLI decompressor rejected cases where the first block was an RLE block whose `Block_Size` is 131072, and the frame contains more than one block. +This only affected the zstd CLI, and not the library. + +The example is an RLE block with 131072 bytes, followed by a second RLE block with 1 byte. + +The compressor currently works around this limitation by explicitly avoiding producing RLE blocks as the first +block. + +https://github.com/facebook/zstd/blob/8814aa5bfa74f05a86e55e9d508da177a893ceeb/lib/compress/zstd_compress.c#L3527-L3535 + +Tiny FSE Table & Block +---------------------- + +**Last affected version**: v1.3.4 + +**Affected decompressor component(s)**: Library & CLI + +**Produced by the reference compressor**: Possibly until version v1.3.4, but probably never + +**Example Frame**: `28b5 2ffd 2027 c500 0080 f3f1 f0ec ebc6 c5c7 f09d 4300 0000 e0e0 0658 0100 603e 52` + +The zstd library rejected blocks of type `Compressed_Block` whose offset of the last table with type `FSE_Compressed_Mode` was less than 4 bytes from the end of the block. + +In more depth, let `Last_Table_Offset` be the offset in the compressed block (excluding the header) that +the last table with type `FSE_Compressed_Mode` started. If `Block_Content - Last_Table_Offset < 4` then +the buggy zstd decompressor would reject the block. This occurs when the last serialized table is 2 bytes +and the bitstream size is 1 byte. + +For example: +* There is 1 sequence in the block +* `Literals_Lengths_Mode` is `FSE_Compressed_Mode` & the serialized table size is 2 bytes +* `Offsets_Mode` is `Predefined_Mode` +* `Match_Lengths_Mode` is `Predefined_Mode` +* The bitstream is 1 byte. E.g. there is only one sequence and it fits in 1 byte. + +The total `Block_Content` is `5` bytes, and `Last_Table_Offset` is `2`. + +See the compressor workaround code: + +https://github.com/facebook/zstd/blob/8814aa5bfa74f05a86e55e9d508da177a893ceeb/lib/compress/zstd_compress.c#L2667-L2682 diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/.gitignore b/src/dependencies/zstd-1.5.4/doc/educational_decoder/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/.gitignore rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/.gitignore diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/Makefile b/src/dependencies/zstd-1.5.4/doc/educational_decoder/Makefile similarity index 97% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/Makefile rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/Makefile index a9c601e..f6deeb1 100644 --- a/src/dependencies/zstd-1.5.0/doc/educational_decoder/Makefile +++ b/src/dependencies/zstd-1.5.4/doc/educational_decoder/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/README.md b/src/dependencies/zstd-1.5.4/doc/educational_decoder/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/README.md rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/README.md diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/harness.c b/src/dependencies/zstd-1.5.4/doc/educational_decoder/harness.c similarity index 98% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/harness.c rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/harness.c index 935f60d..12c5a80 100644 --- a/src/dependencies/zstd-1.5.0/doc/educational_decoder/harness.c +++ b/src/dependencies/zstd-1.5.4/doc/educational_decoder/harness.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.c b/src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.c similarity index 99% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.c rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.c index 62e6f0d..9ade765 100644 --- a/src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.c +++ b/src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -1890,7 +1890,7 @@ static size_t HUF_decompress_4stream(const HUF_dtable *const dtable, /// Initializes a Huffman table using canonical Huffman codes /// For more explanation on canonical Huffman codes see -/// http://www.cs.uofs.edu/~mccloske/courses/cmps340/huff_canonical_dec2015.html +/// https://www.cs.scranton.edu/~mccloske/courses/cmps340/huff_canonical_dec2015.html /// Codes within a level are allocated in symbol order (i.e. smaller symbols get /// earlier codes) static void HUF_init_dtable(HUF_dtable *const table, const u8 *const bits, @@ -2145,7 +2145,7 @@ static void FSE_init_dtable(FSE_dtable *const dtable, // "All remaining symbols are sorted in their natural order. Starting from // symbol 0 and table position 0, each symbol gets attributed as many cells - // as its probability. Cell allocation is spreaded, not linear." + // as its probability. Cell allocation is spread, not linear." // Place the rest in the table const u16 step = (size >> 1) + (size >> 3) + 3; const u16 mask = size - 1; diff --git a/src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.h b/src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.h similarity index 97% rename from src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.h rename to src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.h index d89c835..c13c813 100644 --- a/src/dependencies/zstd-1.5.0/doc/educational_decoder/zstd_decompress.h +++ b/src/dependencies/zstd-1.5.4/doc/educational_decoder/zstd_decompress.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/doc/images/CSpeed2.png b/src/dependencies/zstd-1.5.4/doc/images/CSpeed2.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/CSpeed2.png rename to src/dependencies/zstd-1.5.4/doc/images/CSpeed2.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/DCspeed5.png b/src/dependencies/zstd-1.5.4/doc/images/DCspeed5.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/DCspeed5.png rename to src/dependencies/zstd-1.5.4/doc/images/DCspeed5.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/DSpeed3.png b/src/dependencies/zstd-1.5.4/doc/images/DSpeed3.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/DSpeed3.png rename to src/dependencies/zstd-1.5.4/doc/images/DSpeed3.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/cdict_v136.png b/src/dependencies/zstd-1.5.4/doc/images/cdict_v136.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/cdict_v136.png rename to src/dependencies/zstd-1.5.4/doc/images/cdict_v136.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/dict-cr.png b/src/dependencies/zstd-1.5.4/doc/images/dict-cr.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/dict-cr.png rename to src/dependencies/zstd-1.5.4/doc/images/dict-cr.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/dict-cs.png b/src/dependencies/zstd-1.5.4/doc/images/dict-cs.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/dict-cs.png rename to src/dependencies/zstd-1.5.4/doc/images/dict-cs.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/dict-ds.png b/src/dependencies/zstd-1.5.4/doc/images/dict-ds.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/dict-ds.png rename to src/dependencies/zstd-1.5.4/doc/images/dict-ds.png diff --git a/src/dependencies/zstd-1.5.0/doc/images/zstd_cdict_v1_3_5.png b/src/dependencies/zstd-1.5.4/doc/images/zstd_cdict_v1_3_5.png similarity index 100% rename from src/dependencies/zstd-1.5.0/doc/images/zstd_cdict_v1_3_5.png rename to src/dependencies/zstd-1.5.4/doc/images/zstd_cdict_v1_3_5.png diff --git a/src/dependencies/zstd-1.5.4/doc/images/zstd_logo86.png b/src/dependencies/zstd-1.5.4/doc/images/zstd_logo86.png new file mode 100644 index 0000000000000000000000000000000000000000..8abefe21b1e172b9683392057421984f64c8c9a4 GIT binary patch literal 13069 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/zstd-1.5.0/doc/zstd_compression_format.md b/src/dependencies/zstd-1.5.4/doc/zstd_compression_format.md similarity index 97% rename from src/dependencies/zstd-1.5.0/doc/zstd_compression_format.md rename to src/dependencies/zstd-1.5.4/doc/zstd_compression_format.md index 5c7deb9..e40677a 100644 --- a/src/dependencies/zstd-1.5.0/doc/zstd_compression_format.md +++ b/src/dependencies/zstd-1.5.4/doc/zstd_compression_format.md @@ -3,7 +3,7 @@ Zstandard Compression Format ### Notices -Copyright (c) 2016-2021 Yann Collet, Facebook, Inc. +Copyright (c) Meta Platforms, Inc. and affiliates. Permission is granted to copy and distribute this document for any purpose and without charge, @@ -26,7 +26,7 @@ The purpose of this document is to define a lossless compressed data format, that is independent of CPU type, operating system, file system and character set, suitable for file compression, pipe and streaming compression, -using the [Zstandard algorithm](http://www.zstandard.org). +using the [Zstandard algorithm](https://facebook.github.io/zstd/). The text of the specification assumes a basic background in programming at the level of bits and other primitive data representations. @@ -35,7 +35,7 @@ even for an arbitrarily long sequentially presented input data stream, using only an a priori bounded amount of intermediate storage, and hence can be used in data communications. The format uses the Zstandard compression method, -and optional [xxHash-64 checksum method](http://www.xxhash.org), +and optional [xxHash-64 checksum method](https://cyan4973.github.io/xxHash/), for detection of data corruption. The data format defined by this specification @@ -134,7 +134,7 @@ __`Content_Checksum`__ An optional 32-bit checksum, only present if `Content_Checksum_flag` is set. The content checksum is the result -of [xxh64() hash function](http://www.xxhash.org) +of [xxh64() hash function](https://cyan4973.github.io/xxHash/) digesting the original (decoded) data as input, and a seed of zero. The low 4 bytes of the checksum are stored in __little-endian__ format. @@ -435,7 +435,7 @@ They can be decoded first, and then copied during [Sequence Execution], or they can be decoded on the flow during [Sequence Execution]. Literals can be stored uncompressed or compressed using Huffman prefix codes. -When compressed, an optional tree description can be present, +When compressed, a tree description may optionally be present, followed by 1 or 4 streams. | `Literals_Section_Header` | [`Huffman_Tree_Description`] | [jumpTable] | Stream1 | [Stream2] | [Stream3] | [Stream4] | @@ -510,7 +510,7 @@ Its value is : `Size_Format = (Literals_Section_Header[0]>>2) & 3` `Regenerated_Size = (Literals_Section_Header[0]>>4) + (Literals_Section_Header[1]<<4) + (Literals_Section_Header[2]<<12)` Only Stream1 is present for these cases. -Note : it's allowed to represent a short value (for example `13`) +Note : it's allowed to represent a short value (for example `27`) using a long format, even if it's less efficient. __`Size_Format` for `Compressed_Literals_Block` and `Treeless_Literals_Block`__ : @@ -521,19 +521,33 @@ __`Size_Format` for `Compressed_Literals_Block` and `Treeless_Literals_Block`__ Both `Regenerated_Size` and `Compressed_Size` use 10 bits (0-1023). `Literals_Section_Header` uses 3 bytes. - `Size_Format` == 01 : 4 streams. - Both `Regenerated_Size` and `Compressed_Size` use 10 bits (0-1023). + Both `Regenerated_Size` and `Compressed_Size` use 10 bits (6-1023). `Literals_Section_Header` uses 3 bytes. - `Size_Format` == 10 : 4 streams. - Both `Regenerated_Size` and `Compressed_Size` use 14 bits (0-16383). + Both `Regenerated_Size` and `Compressed_Size` use 14 bits (6-16383). `Literals_Section_Header` uses 4 bytes. - `Size_Format` == 11 : 4 streams. - Both `Regenerated_Size` and `Compressed_Size` use 18 bits (0-262143). + Both `Regenerated_Size` and `Compressed_Size` use 18 bits (6-262143). `Literals_Section_Header` uses 5 bytes. Both `Compressed_Size` and `Regenerated_Size` fields follow __little-endian__ convention. Note: `Compressed_Size` __includes__ the size of the Huffman Tree description _when_ it is present. +4 streams is superior to 1 stream in decompression speed, +by exploiting instruction level parallelism. +But it's also more expensive, +costing on average ~7.3 bytes more than the 1 stream mode, mostly from the jump table. + +In general, use the 4 streams mode when there are more literals to decode, +to favor higher decompression speeds. +Beyond 1KB, the 4 streams mode is compulsory anyway. + +Note that a minimum of 6 bytes is required for the 4 streams mode. +That's a technical minimum, but it's not recommended to employ the 4 streams mode +for such a small quantity, that would be wasteful. +A more practical lower bound would be around ~256 bytes. + #### Raw Literals Block The data in Stream1 is `Regenerated_Size` bytes long, it contains the raw literals data to be used during [Sequence Execution]. @@ -945,14 +959,14 @@ sequences are applied to them: |:--------------:|:-----------------:|:------------------:|:------------------:|:------------------:|:-----------------------:| | | | 1 | 4 | 8 | starting values | | 1114 | 11 | 1111 | 1 | 4 | non-repeat | -| 1 | 22 | 1111 | 1 | 4 | repeat 1; no change | +| 1 | 22 | 1111 | 1 | 4 | repeat 1: no change | | 2225 | 22 | 2222 | 1111 | 1 | non-repeat | | 1114 | 111 | 1111 | 2222 | 1111 | non-repeat | | 3336 | 33 | 3333 | 1111 | 2222 | non-repeat | -| 2 | 22 | 1111 | 3333 | 2222 | repeat 2; swap 1 & 2 | -| 3 | 33 | 2222 | 1111 | 3333 | repeat 3; rotate 3 to 1 | -| 3 | 0 | 2221 | 2222 | 1111 | insert resolved offset | -| 1 | 0 | 2222 | 2221 | 3333 | repeat 2 | +| 2 | 22 | 1111 | 3333 | 2222 | repeat 2: swap 1 & 2 | +| 3 | 33 | 2222 | 1111 | 3333 | repeat 3: rotate 3 to 1 | +| 3 | 0 | 2221 | 2222 | 1111 | special case : insert `repeat1 - 1` | +| 1 | 0 | 2222 | 2221 | 1111 | == repeat 2 | Skippable Frames @@ -967,14 +981,14 @@ into a flow of concatenated frames. Skippable frames defined in this specification are compatible with [LZ4] ones. -[LZ4]:http://www.lz4.org +[LZ4]:https://lz4.github.io/lz4/ From a compliant decoder perspective, skippable frames need just be skipped, and their content ignored, resuming decoding after the skippable frame. It can be noted that a skippable frame can be used to watermark a stream of concatenated frames -embedding any kind of tracking information (even just an UUID). +embedding any kind of tracking information (even just a UUID). Users wary of such possibility should scan the stream of concatenated frames in an attempt to detect such frame for analysis or removal. @@ -1124,7 +1138,7 @@ These symbols define a full state reset, reading `Accuracy_Log` bits. Then, all remaining symbols, sorted in natural order, are allocated cells. Starting from symbol `0` (if it exists), and table position `0`, each symbol gets allocated as many cells as its probability. -Cell allocation is spreaded, not linear : +Cell allocation is spread, not linear : each successor position follows this rule : ``` @@ -1669,7 +1683,7 @@ or at least provide a meaningful error code explaining for which reason it canno Version changes --------------- -- 0.3.7 : clarifications for Repeat_Offsets +- 0.3.7 : clarifications for Repeat_Offsets, matching RFC8878 - 0.3.6 : clarifications for Dictionary_ID - 0.3.5 : clarifications for Block_Maximum_Size - 0.3.4 : clarifications for FSE decoding table diff --git a/src/dependencies/zstd-1.5.0/doc/zstd_manual.html b/src/dependencies/zstd-1.5.4/doc/zstd_manual.html similarity index 83% rename from src/dependencies/zstd-1.5.0/doc/zstd_manual.html rename to src/dependencies/zstd-1.5.4/doc/zstd_manual.html index 010f10a..c33f0e2 100644 --- a/src/dependencies/zstd-1.5.0/doc/zstd_manual.html +++ b/src/dependencies/zstd-1.5.4/doc/zstd_manual.html @@ -1,10 +1,10 @@ -zstd 1.5.0 Manual +zstd 1.5.4 Manual -

    zstd 1.5.0 Manual

    +

    zstd 1.5.4 Manual


    Contents

      @@ -121,7 +121,9 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); note 6 : This function replaces ZSTD_getDecompressedSize()


      -
      unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
      +
      ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
      +ZSTDLIB_API
      +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
       

      NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). Both functions work the same way, but ZSTD_getDecompressedSize() blends "empty", "unknown" and "error" results to the same return value (0), @@ -137,8 +139,30 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); or an error code if input is invalid


      -

      Helper functions

      #define ZSTD_COMPRESSBOUND(srcSize)   ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
      -size_t      ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
      +

      Helper functions

      /* ZSTD_compressBound() :
      + * maximum compressed size in worst case single-pass scenario.
      + * When invoking `ZSTD_compress()` or any other one-pass compression function,
      + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)
      + * as it eliminates one potential failure scenario,
      + * aka not enough room in dst buffer to write the compressed frame.
      + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE .
      + *        In which case, ZSTD_compressBound() will return an error code
      + *        which can be tested using ZSTD_isError().
      + *
      + * ZSTD_COMPRESSBOUND() :
      + * same as ZSTD_compressBound(), but as a macro.
      + * It can be used to produce constants, which can be useful for static allocation,
      + * for example to size a static array on stack.
      + * Will produce constant value 0 if srcSize too large.
      + */
      +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U)
      +#define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
      +size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
      +/* ZSTD_isError() :
      + * Most ZSTD_* functions returning a size_t value can be tested for error,
      + * using ZSTD_isError().
      + * @return 1 if error, 0 otherwise
      + */
       unsigned    ZSTD_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
       const char* ZSTD_getErrorName(size_t code);     /*!< provides readable string from an error code */
       int         ZSTD_minCLevel(void);               /*!< minimum negative compression level allowed, requires v1.4.0+ */
      @@ -357,8 +381,11 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
            * ZSTD_c_stableOutBuffer
            * ZSTD_c_blockDelimiters
            * ZSTD_c_validateSequences
      -     * ZSTD_c_splitBlocks
      +     * ZSTD_c_useBlockSplitter
            * ZSTD_c_useRowMatchFinder
      +     * ZSTD_c_prefetchCDictTables
      +     * ZSTD_c_enableSeqProducerFallback
      +     * ZSTD_c_maxBlockSize
            * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
            * note : never ever use experimentalParam? names directly;
            *        also, the enums values themselves are unstable and can still change.
      @@ -377,7 +404,11 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
            ZSTD_c_experimentalParam12=1009,
            ZSTD_c_experimentalParam13=1010,
            ZSTD_c_experimentalParam14=1011,
      -     ZSTD_c_experimentalParam15=1012
      +     ZSTD_c_experimentalParam15=1012,
      +     ZSTD_c_experimentalParam16=1013,
      +     ZSTD_c_experimentalParam17=1014,
      +     ZSTD_c_experimentalParam18=1015,
      +     ZSTD_c_experimentalParam19=1016
       } ZSTD_cParameter;
       

      typedef struct {
      @@ -440,7 +471,7 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
                         They will be used to compress next frame.
                         Resetting session never fails.
         - The parameters : changes all parameters back to "default".
      -                  This removes any reference to any dictionary too.
      +                  This also removes any reference to any dictionary or external sequence producer.
                         Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
                         otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
         - Both : similar to resetting the session, followed by resetting parameters.
      @@ -479,13 +510,15 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
            * ZSTD_d_stableOutBuffer
            * ZSTD_d_forceIgnoreChecksum
            * ZSTD_d_refMultipleDDicts
      +     * ZSTD_d_disableHuffmanAssembly
            * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
            * note : never ever use experimentalParam? names directly
            */
            ZSTD_d_experimentalParam1=1000,
            ZSTD_d_experimentalParam2=1001,
            ZSTD_d_experimentalParam3=1002,
      -     ZSTD_d_experimentalParam4=1003
      +     ZSTD_d_experimentalParam4=1003,
      +     ZSTD_d_experimentalParam5=1004
       
       } ZSTD_dParameter;
       

      @@ -654,6 +687,9 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + + Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + to compress with a dictionary.


      @@ -689,6 +725,33 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); size_t ZSTD_freeDStream(ZSTD_DStream* zds);
      /* accept NULL pointer */

      Streaming decompression functions


      +
      size_t ZSTD_initDStream(ZSTD_DStream* zds);
      +

      Initialize/reset DStream state for new decompression operation. + Call before new decompression operation using same DStream. + + Note : This function is redundant with the advanced API and equivalent to: + ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + ZSTD_DCtx_refDDict(zds, NULL); + +


      + +
      size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
      +

      Streaming decompression function. + Call repetitively to consume full input updating it as necessary. + Function will update both input and output `pos` fields exposing current state via these fields: + - `input.pos < input.size`, some input remaining and caller should provide remaining input + on the next call. + - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + call ZSTD_decompressStream() again to flush remaining data to output. + Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + + @return : 0 when a frame is completely decoded and fully flushed, + or an error code, which can be tested using ZSTD_isError(), + or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + +


      +
      size_t ZSTD_DStreamInSize(void);    /*!< recommended size for input buffer */
       

      size_t ZSTD_DStreamOutSize(void);   /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */
      @@ -794,7 +857,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
         If @return == 0, the dictID could not be decoded.
         This could for one of the following reasons :
         - The frame does not require a dictionary to be decoded (most common case).
      -  - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
      +  - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.
           Note : this use case also happens when using a non-conformant dictionary.
         - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
         - This is not a Zstandard frame.
      @@ -803,7 +866,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
       
       

      Advanced dictionary and prefix API (Requires v1.4.0+)

        This API allows dictionaries to be used with ZSTD_compress2(),
      - ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and
      + ZSTD_compressStream2(), and ZSTD_decompressDCtx(). Dictionaries are sticky, and
        only reset with the context is reset with ZSTD_reset_parameters or
        ZSTD_reset_session_and_parameters. Prefixes are single-use.
       
      @@ -814,8 +877,9 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);
      /* accept NULL pointer */ @result : 0, or an error code (which can be tested with ZSTD_isError()). Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, meaning "return to no-dictionary mode". - Note 1 : Dictionary is sticky, it will be used for all future compressed frames. - To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters). + Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + until parameters are reset, a new dictionary is loaded, or the dictionary + is explicitly invalidated by loading a NULL dictionary. Note 2 : Loading a dictionary involves building tables. It's also a CPU consuming operation, with non-negligible impact on latency. Tables are dependent on compression parameters, and for this reason, @@ -828,7 +892,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */


      size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
      -

      Reference a prepared dictionary, to be used for all next compressed frames. +

      Reference a prepared dictionary, to be used for all future compressed frames. Note that compression parameters are enforced from within CDict, and supersede any compression parameter previously set within CCtx. The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. @@ -863,9 +927,9 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */


      size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
      -

      Create an internal DDict from dict buffer, - to be used to decompress next frames. - The dictionary remains valid for all future frames, until explicitly invalidated. +

      Create an internal DDict from dict buffer, to be used to decompress all future frames. + The dictionary remains valid for all future frames, until explicitly invalidated, or + a new dictionary is loaded. @result : 0, or an error code (which can be tested with ZSTD_isError()). Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, meaning "return to no-dictionary mode". @@ -889,9 +953,10 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ The memory for the table is allocated on the first call to refDDict, and can be freed with ZSTD_freeDCtx(). + If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + will be managed, and referencing a dictionary effectively "discards" any previous one. + @result : 0, or an error code (which can be tested with ZSTD_isError()). - Note 1 : Currently, only one dictionary can be managed. - Referencing a new dictionary effectively "discards" any previous one. Special: referencing a NULL DDict means "return to no-dictionary mode". Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. @@ -1072,14 +1137,18 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); } ZSTD_literalCompressionMode_e;


      typedef enum {
      -  ZSTD_urm_auto = 0,                   /* Automatically determine whether or not we use row matchfinder */
      -  ZSTD_urm_disableRowMatchFinder = 1,  /* Never use row matchfinder */
      -  ZSTD_urm_enableRowMatchFinder = 2    /* Always use row matchfinder when applicable */
      -} ZSTD_useRowMatchFinderMode_e;
      +  /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final
      +   * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable
      +   * or ZSTD_ps_disable allow for a force enable/disable the feature.
      +   */
      +  ZSTD_ps_auto = 0,         /* Let the library automatically determine whether the feature shall be enabled */
      +  ZSTD_ps_enable = 1,       /* Force-enable the feature */
      +  ZSTD_ps_disable = 2       /* Do not use the feature */
      +} ZSTD_paramSwitch_e;
       

      Frame size functions

      
       
      -
      unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
      +
      ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
       

      `src` should point to the start of a series of ZSTD encoded and/or skippable frames `srcSize` must be the _exact_ size of this series (i.e. there should be a frame boundary at `src + srcSize`) @@ -1102,7 +1171,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); however it does mean that all frame data must be present and valid.


      -
      unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
      +
      ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
       

      `src` should point to the start of a series of ZSTD encoded and/or skippable frames `srcSize` must be the _exact_ size of this series (i.e. there should be a frame boundary at `src + srcSize`) @@ -1117,26 +1186,80 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);


      -
      size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
       

      srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. @return : size of the Frame Header, or an error code (if srcSize is too small)


      +
      ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize);
      +

      Zstd supports in-place decompression, where the input and output buffers overlap. + In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + and the input buffer must be at the end of the output buffer. + + _______________________ Output Buffer ________________________ + | | + | ____ Input Buffer ____| + | | | + v v v + |---------------------------------------|-----------|----------| + ^ ^ ^ + |___________________ Output_Size ___________________|_ Margin _| + + NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + ZSTD_decompressDCtx(). + NOTE: This function supports multi-frame input. + + @param src The compressed frame(s) + @param srcSize The size of the compressed frame(s) + @returns The decompression margin or an error that can be checked with ZSTD_isError(). + +


      + +
      #define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)(                                              \
      +        ZSTD_FRAMEHEADERSIZE_MAX                                                              /* Frame header */ + \
      +        4                                                                                         /* checksum */ + \
      +        ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \
      +        (blockSize)                                                                    /* One block of margin */   \
      +    ))
      +

      Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + the compressed frame, compute it from the original size and the blockSizeLog. + See ZSTD_decompressionMargin() for details. + + WARNING: This macro does not support multi-frame input, the input must be a single + zstd frame. If you need that support use the function, or implement it yourself. + + @param originalSize The original uncompressed size of the data. + @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + Unless you explicitly set the windowLog smaller than + ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + +


      +
      typedef enum {
         ZSTD_sf_noBlockDelimiters = 0,         /* Representation of ZSTD_Sequence has no block delimiters, sequences only */
         ZSTD_sf_explicitBlockDelimiters = 1    /* Representation of ZSTD_Sequence contains explicit block delimiters */
       } ZSTD_sequenceFormat_e;
       

      -

      Generate sequences using ZSTD_compress2, given a source buffer. +

      ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize);
      +

      `srcSize` : size of the input buffer + @return : upper-bound for the number of sequences that can be generated + from a buffer of srcSize bytes + + note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + +


      + +

      Generate sequences using ZSTD_compress2(), given a source buffer. Each block will end with a dummy sequence with offset == 0, matchLength == 0, and litLength == length of last literals. litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) simply acts as a block delimiter. - zc can be used to insert custom compression params. - This function invokes ZSTD_compress2 + @zc can be used to insert custom compression params. + This function invokes ZSTD_compress2(). The output of this function can be fed into ZSTD_compressSequences() with CCtx setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters @@ -1144,9 +1267,9 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);


      -
      size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize);
       

      Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals - by merging them into into the literals of the next sequence. + by merging them into the literals of the next sequence. As such, the final generated result has no explicit representation of block boundaries, and the final last literals segment is not represented in the sequences. @@ -1157,10 +1280,13 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);


      -
      size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize,
      -                      const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
      -                      const void* src, size_t srcSize);
      -

      Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. +

      ZSTDLIB_STATIC_API size_t
      +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize,
      +            const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
      +            const void* src, size_t srcSize);
      +

      Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + @src contains the entire input (not just the literals). + If @srcSize > sum(sequence.length), the remaining bytes are considered all literals If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) The entire source is compressed into a single frame. @@ -1185,15 +1311,15 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, and cannot emit an RLE block that disagrees with the repcode history - @return : final compressed size or a ZSTD error. + @return : final compressed size, or a ZSTD error code.


      -
      size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity,
      +
      ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity,
                                       const void* src, size_t srcSize, unsigned magicVariant);
       

      Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. - Skippable frames begin with a a 4-byte magic number. There are 16 possible choices of magic number, + Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. @@ -1205,12 +1331,31 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);


      +
      size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant,
      +                                const void* src, size_t srcSize);
      +

      Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + + The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + in the magicVariant. + + Returns an error if destination buffer is not large enough, or if the frame is not skippable. + + @return : number of bytes written or a ZSTD error. + +


      + +
      unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size);
      +

      Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + +


      +

      Memory management

      
       
      -
      size_t ZSTD_estimateCCtxSize(int compressionLevel);
      -size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
      -size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
      -size_t ZSTD_estimateDCtxSize(void);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void);
       

      These functions make it possible to estimate memory usage of a future {D,C}Ctx, before its creation. @@ -1230,16 +1375,19 @@ size_t ZSTD_estimateDCtxSize(void); and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. - Note 2 : only single-threaded compression is supported. + Note : only single-threaded compression is supported. ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + + Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + Size estimates assume that no external sequence producer is registered.


      -
      size_t ZSTD_estimateCStreamSize(int compressionLevel);
      -size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
      -size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
      -size_t ZSTD_estimateDStreamSize(size_t windowSize);
      -size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
       

      ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. It will also consider src size to be arbitrarily "large", which is worst case. If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. @@ -1251,20 +1399,25 @@ size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); Note : if streaming is init with function ZSTD_init?Stream_usingDict(), an internal ?Dict will be created, which additional size is not estimated here. - In this case, get total size by adding ZSTD_estimate?DictSize + In this case, get total size by adding ZSTD_estimate?DictSize + Note 2 : only single-threaded compression is supported. + ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + Size estimates assume that no external sequence producer is registered. +


      -
      size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
      -size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
      -size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
      +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
       

      ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller.


      -
      ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
      -ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticCCtx() */
      +
      ZSTDLIB_STATIC_API ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
      +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticCCtx() */
       

      Initialize an object using a pre-allocated fixed-size buffer. workspace: The memory area to emplace the object into. Provided pointer *must be 8-bytes aligned*. @@ -1287,7 +1440,7 @@ ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);


      -
      ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticDCtx() */
      +
      ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticDCtx() */
       

      typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
       typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
      @@ -1303,9 +1456,24 @@ ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /**< this con
        
       


      +
      typedef struct POOL_ctx_s ZSTD_threadPool;
      +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads);
      +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool);  /* accept NULL pointer */
      +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool);
      +

      These prototypes make it possible to share a thread pool among multiple compression contexts. + This can limit resources for applications with multiple threads where each one uses + a threaded compression mode (via ZSTD_c_nbWorkers parameter). + ZSTD_createThreadPool creates a new thread pool with a given number of threads. + Note that the lifetime of such pool must exist while being used. + ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + to use an internal thread pool). + ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. + +


      +

      Advanced compression functions

      
       
      -
      ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
      +
      ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
       

      Create a digested dictionary for compression Dictionary content is just referenced, not duplicated. As a consequence, `dictBuffer` **must** outlive CDict, @@ -1313,22 +1481,22 @@ ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this con note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef


      -
      ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
      +
      ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
       

      @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. `estimatedSrcSize` value is optional, select 0 if not known


      -
      ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
      +
      ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
       

      same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0


      -
      size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
       

      Ensure param values remain within authorized range. @return 0 on success, or an error code (can be checked with ZSTD_isError())


      -
      ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
      +
      ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
       

      optimize params for a given `srcSize` and `dictSize`. `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. `dictSize` must be `0` when there is no dictionary. @@ -1336,18 +1504,27 @@ ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this con This function never fails (wide contract)


      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams);
      +

      Set all parameters provided within @cparams into the working @cctx. + Note : if modifying parameters during compression (MT mode only), + note that changes to the .windowLog parameter will be ignored. + @return 0 on success, or an error code (can be checked with ZSTD_isError()) +


      +
      ZSTD_DEPRECATED("use ZSTD_compress2")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
      -                              void* dst, size_t dstCapacity,
      -                        const void* src, size_t srcSize,
      -                        const void* dict,size_t dictSize,
      -                              ZSTD_parameters params);
      +                  void* dst, size_t dstCapacity,
      +            const void* src, size_t srcSize,
      +            const void* dict,size_t dictSize,
      +                  ZSTD_parameters params);
       

      Note : this function is now DEPRECATED. It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. This prototype will generate compilation warnings.


      ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
                                         void* dst, size_t dstCapacity,
                                   const void* src, size_t srcSize,
      @@ -1358,31 +1535,31 @@ size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
         This prototype will generate compilation warnings. 
       


      -
      size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
       

      Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. It saves some memory, but also requires that `dict` outlives its usage within `cctx`


      -
      size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
       

      Same as ZSTD_CCtx_loadDictionary(), but gives finer control over how to load the dictionary (by copy ? by reference ?) and how to interpret it (automatic ? force raw mode ? full mode only ?)


      -
      size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
       

      Same as ZSTD_CCtx_refPrefix(), but gives finer control over how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?)


      -
      size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value);
       

      Get the requested compression parameter value, selected by enum ZSTD_cParameter, and store it into int* value. @return : 0, or an error code (which can be tested with ZSTD_isError()).


      -
      ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
      -size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /* accept NULL pointer */
      +
      ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
      +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /* accept NULL pointer */
       

      Quick howto : - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure - ZSTD_CCtxParams_setParameter() : Push parameters one by one into @@ -1401,24 +1578,24 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointe


      -
      size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
       

      Reset params to default values.


      -
      size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
       

      Initializes the compression parameters of cctxParams according to compression level. All other parameters are reset to their default values.


      -
      size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
       

      Initializes the compression and frame parameters of cctxParams according to params. All other parameters are reset to their default values.


      -
      size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value);
       

      Similar to ZSTD_CCtx_setParameter. Set one compression parameter, selected by enum ZSTD_cParameter. Parameters must be applied to a ZSTD_CCtx using @@ -1428,14 +1605,14 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointe


      -
      size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value);
       

      Similar to ZSTD_CCtx_getParameter. Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. @result : 0, or an error code (which can be tested with ZSTD_isError()).


      -
      size_t ZSTD_CCtx_setParametersUsingCCtxParams(
      +
      ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams(
               ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params);
       

      Apply a set of ZSTD_CCtx_params to the compression context. This can be done even after compression is started, @@ -1445,7 +1622,7 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointe


      -
      size_t ZSTD_compressStream2_simpleArgs (
      +
      ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs (
                       ZSTD_CCtx* cctx,
                       void* dst, size_t dstCapacity, size_t* dstPos,
                 const void* src, size_t srcSize, size_t* srcPos,
      @@ -1459,40 +1636,40 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /* accept NULL pointe
       
       

      Advanced decompression functions

      
       
      -
      unsigned ZSTD_isFrame(const void* buffer, size_t size);
      +
      ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size);
       

      Tells if the content of `buffer` starts with a valid Frame Identifier. Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. Note 3 : Skippable Frame Identifiers are considered valid.


      -
      ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
      +
      ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
       

      Create a digested dictionary, ready to start decompression operation without startup delay. Dictionary content is referenced, and therefore stays in dictBuffer. It is important that dictBuffer outlives DDict, it must remain read accessible throughout the lifetime of DDict


      -
      size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
       

      Same as ZSTD_DCtx_loadDictionary(), but references `dict` content instead of copying it into `dctx`. This saves memory if `dict` remains around., However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression.


      -
      size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
       

      Same as ZSTD_DCtx_loadDictionary(), but gives direct control over how to load the dictionary (by copy ? by reference ?) and how to interpret it (automatic ? force raw mode ? full mode only ?).


      -
      size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
       

      Same as ZSTD_DCtx_refPrefix(), but gives finer control over how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?)


      -
      size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
       

      Refuses allocating internal buffers for frames requiring a window size larger than provided limit. This protects a decoder context from reserving too much memory for itself (potential attack scenario). This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. @@ -1501,7 +1678,7 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointe


      -
      size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value);
       

      Get the requested decompression parameter value, selected by enum ZSTD_dParameter, and store it into int* value. @return : 0, or an error code (which can be tested with ZSTD_isError()). @@ -1509,6 +1686,7 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointe


      ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
       

      This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). Instruct the decoder context about what kind of data to decode next. @@ -1517,7 +1695,7 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); @return : 0, or an error code (which can be tested using ZSTD_isError()).


      -
      size_t ZSTD_decompressStream_simpleArgs (
      +
      ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs (
                       ZSTD_DCtx* dctx,
                       void* dst, size_t dstCapacity, size_t* dstPos,
                 const void* src, size_t srcSize, size_t* srcPos);
      @@ -1535,6 +1713,7 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
       
       

      Advanced Streaming compression functions


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
                    int compressionLevel,
                    unsigned long long pledgedSrcSize);
      @@ -1552,6 +1731,7 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
       


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
                const void* dict, size_t dictSize,
                      int compressionLevel);
      @@ -1569,6 +1749,7 @@ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
       


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
               const void* dict, size_t dictSize,
                     ZSTD_parameters params,
      @@ -1590,17 +1771,19 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
       


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
       

      This function is DEPRECATED, and equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); ZSTD_CCtx_refCDict(zcs, cdict); - + note : cdict will just be referenced, and must outlive compression session This prototype will generate compilation warnings.


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
                          const ZSTD_CDict* cdict,
                                ZSTD_frameParameters fParams,
      @@ -1622,6 +1805,7 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
       


      ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API
       size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
       

      This function is DEPRECATED, and is equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -1651,7 +1835,7 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */ } ZSTD_frameProgression;


      -
      size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
      +
      ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
       

      Tell how many bytes are ready to be flushed immediately. Useful for multithreading scenarios (nbWorkers >= 1). Probe the oldest active job, defined as oldest job not yet entirely flushed, @@ -1667,32 +1851,32 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);


      Advanced Streaming decompression functions


      -
      size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
      +
      ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
       

      ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); ZSTD_DCtx_loadDictionary(zds, dict, dictSize); note: no dictionary will be used if dict == NULL or dictSize < 8 - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


      -
      size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
      +
      ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
       

      ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); ZSTD_DCtx_refDDict(zds, ddict); note : ddict is referenced, it must outlive decompression session - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


      -
      size_t ZSTD_resetDStream(ZSTD_DStream* zds);
      +
      ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions")
      +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
       

      ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); re-use decompression parameters from previous init; saves dictionary loading - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


      @@ -1710,7 +1894,6 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -1731,11 +1914,12 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again.
      -

      Buffer-less streaming compression functions

      size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
      -size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
      -size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
      -size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**<  note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
      +

      Buffer-less streaming compression functions

      ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
      +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
      +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
       

      +
      size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**<  note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
      +

      size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */
       

      Buffer-less streaming decompression (synchronous mode)

      @@ -1747,8 +1931,8 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned lo
         Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
         Data fragment must be large enough to ensure successful decoding.
        `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
      -  @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
      -           >0 : `srcSize` is too small, please provide at least @result bytes on next attempt.
      +  result  : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
      +           >0 : `srcSize` is too small, please provide at least result bytes on next attempt.
                  errorCode, which can be tested using ZSTD_isError().
       
         It fills a ZSTD_frameHeader structure with important information to correctly decode the frame,
      @@ -1767,7 +1951,7 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned lo
       
         The most memory efficient way is to use a round buffer of sufficient size.
         Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
      -  which can @return an error code if required value is too large for current system (in 32-bits mode).
      +  which can return an error code if required value is too large for current system (in 32-bits mode).
         In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
         up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
         which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
      @@ -1787,7 +1971,7 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned lo
         ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
         ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
       
      - @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
      +  result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
         It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
         It can also be an error code, which can be tested with ZSTD_isError().
       
      @@ -1818,14 +2002,16 @@ typedef struct {
           unsigned headerSize;
           unsigned dictID;
           unsigned checksumFlag;
      +    unsigned _reserved1;
      +    unsigned _reserved2;
       } ZSTD_frameHeader;
       

      -
      size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
      +
      ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
       /*! ZSTD_getFrameHeader_advanced() :
        *  same as ZSTD_getFrameHeader(),
        *  with added capability to select a format (like ZSTD_f_zstd1_magicless) */
      -size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format);
      -size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize);  /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */
      +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format);
      +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize);  /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */
       

      decode Frame Header, or requires larger `srcSize`. @return : 0, `zfhPtr` is correctly filled, >0, `srcSize` is too small, value is wanted `srcSize` amount, @@ -1845,7 +2031,6 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long - It is necessary to init context before starting + compression : any ZSTD_compressBegin*() variant, including with dictionary + decompression : any ZSTD_decompressBegin*() variant, including with dictionary - + copyCCtx() and copyDCtx() can be used too - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + If input is larger than a block size, it's necessary to split input data into multiple blocks + For inputs larger than a single block, consider using regular ZSTD_compress() instead. @@ -1861,10 +2046,36 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long Use ZSTD_insertBlock() for such a case.


      -

      Raw zstd block functions

      size_t ZSTD_getBlockSize   (const ZSTD_CCtx* cctx);
      -size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
      -size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
      -size_t ZSTD_insertBlock    (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */
      +

      Raw zstd block functions

      ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize   (const ZSTD_CCtx* cctx);
      +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
      +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
      +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock    (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */
       

      +
      ZSTDLIB_STATIC_API void
      +ZSTD_registerSequenceProducer(
      +  ZSTD_CCtx* cctx,
      +  void* sequenceProducerState,
      +  ZSTD_sequenceProducer_F* sequenceProducer
      +);
      +

      Instruct zstd to use a block-level external sequence producer function. + + The sequenceProducerState must be initialized by the caller, and the caller is + responsible for managing its lifetime. This parameter is sticky across + compressions. It will remain set until the user explicitly resets compression + parameters. + + Sequence producer registration is considered to be an "advanced parameter", + part of the "advanced API". This means it will only have an effect on compression + APIs which respect advanced parameters, such as compress2() and compressStream2(). + Older compression APIs such as compressCCtx(), which predate the introduction of + "advanced parameters", will ignore any external sequence producer setting. + + The sequence producer can be "cleared" by registering a NULL function pointer. This + removes all limitations described above in the "LIMITATIONS" section of the API docs. + + The user is strongly encouraged to read the full API documentation (above) before + calling this function. +


      + diff --git a/src/dependencies/zstd-1.5.0/examples/.gitignore b/src/dependencies/zstd-1.5.4/examples/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/examples/.gitignore rename to src/dependencies/zstd-1.5.4/examples/.gitignore diff --git a/src/dependencies/zstd-1.5.0/examples/Makefile b/src/dependencies/zstd-1.5.4/examples/Makefile similarity index 98% rename from src/dependencies/zstd-1.5.0/examples/Makefile rename to src/dependencies/zstd-1.5.4/examples/Makefile index 8d7361d..31f52d3 100644 --- a/src/dependencies/zstd-1.5.0/examples/Makefile +++ b/src/dependencies/zstd-1.5.4/examples/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/README.md b/src/dependencies/zstd-1.5.4/examples/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/examples/README.md rename to src/dependencies/zstd-1.5.4/examples/README.md diff --git a/src/dependencies/zstd-1.5.0/examples/common.h b/src/dependencies/zstd-1.5.4/examples/common.h similarity index 86% rename from src/dependencies/zstd-1.5.0/examples/common.h rename to src/dependencies/zstd-1.5.4/examples/common.h index 181f6b3..4873e87 100644 --- a/src/dependencies/zstd-1.5.0/examples/common.h +++ b/src/dependencies/zstd-1.5.4/examples/common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -21,6 +21,17 @@ #include // stat #include + +/* UNUSED_ATTR tells the compiler it is okay if the function is unused. */ +#if defined(__GNUC__) +# define UNUSED_ATTR __attribute__((unused)) +#else +# define UNUSED_ATTR +#endif + +#define HEADER_FUNCTION static UNUSED_ATTR + + /* * Define the returned error code from utility functions. */ @@ -57,7 +68,7 @@ typedef enum { * Check the zstd error code and die if an error occurred after printing a * message. */ -#define CHECK_ZSTD(fn, ...) \ +#define CHECK_ZSTD(fn) \ do { \ size_t const err = (fn); \ CHECK(!ZSTD_isError(err), "%s", ZSTD_getErrorName(err)); \ @@ -68,7 +79,7 @@ typedef enum { * * @return The size of a given file path. */ -static size_t fsize_orDie(const char *filename) +HEADER_FUNCTION size_t fsize_orDie(const char *filename) { struct stat st; if (stat(filename, &st) != 0) { @@ -96,7 +107,7 @@ static size_t fsize_orDie(const char *filename) * @return If successful this function will return a FILE pointer to an * opened file otherwise it sends an error to stderr and exits. */ -static FILE* fopen_orDie(const char *filename, const char *instruction) +HEADER_FUNCTION FILE* fopen_orDie(const char *filename, const char *instruction) { FILE* const inFile = fopen(filename, instruction); if (inFile) return inFile; @@ -108,7 +119,7 @@ static FILE* fopen_orDie(const char *filename, const char *instruction) /*! fclose_orDie() : * Close an opened file using given FILE pointer. */ -static void fclose_orDie(FILE* file) +HEADER_FUNCTION void fclose_orDie(FILE* file) { if (!fclose(file)) { return; }; /* error */ @@ -123,7 +134,7 @@ static void fclose_orDie(FILE* file) * * @return The number of bytes read. */ -static size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) +HEADER_FUNCTION size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) { size_t const readSize = fread(buffer, 1, sizeToRead, file); if (readSize == sizeToRead) return readSize; /* good */ @@ -143,7 +154,7 @@ static size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) * * @return The number of bytes written. */ -static size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) +HEADER_FUNCTION size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) { size_t const writtenSize = fwrite(buffer, 1, sizeToWrite, file); if (writtenSize == sizeToWrite) return sizeToWrite; /* good */ @@ -159,7 +170,7 @@ static size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) * cated memory. If there is an error, this function will send that * error to stderr and exit. */ -static void* malloc_orDie(size_t size) +HEADER_FUNCTION void* malloc_orDie(size_t size) { void* const buff = malloc(size); if (buff) return buff; @@ -177,7 +188,7 @@ static void* malloc_orDie(size_t size) * @return If successful this function will load file into buffer and * return file size, otherwise it will printout an error to stderr and exit. */ -static size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSize) +HEADER_FUNCTION size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSize) { size_t const fileSize = fsize_orDie(fileName); CHECK(fileSize <= bufferSize, "File too large!"); @@ -201,7 +212,8 @@ static size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSi * @return If successful this function will return buffer and bufferSize(=fileSize), * otherwise it will printout an error to stderr and exit. */ -static void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) { +HEADER_FUNCTION void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) +{ size_t const fileSize = fsize_orDie(fileName); *bufferSize = fileSize; void* const buffer = malloc_orDie(*bufferSize); @@ -217,7 +229,7 @@ static void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) { * Note: This function will send an error to stderr and exit if it * cannot write to a given file. */ -static void saveFile_orDie(const char* fileName, const void* buff, size_t buffSize) +HEADER_FUNCTION void saveFile_orDie(const char* fileName, const void* buff, size_t buffSize) { FILE* const oFile = fopen_orDie(fileName, "wb"); size_t const wSize = fwrite(buff, 1, buffSize, oFile); diff --git a/src/dependencies/zstd-1.5.0/examples/dictionary_compression.c b/src/dependencies/zstd-1.5.4/examples/dictionary_compression.c similarity index 85% rename from src/dependencies/zstd-1.5.0/examples/dictionary_compression.c rename to src/dependencies/zstd-1.5.4/examples/dictionary_compression.c index 0eee650..83edc1c 100644 --- a/src/dependencies/zstd-1.5.0/examples/dictionary_compression.c +++ b/src/dependencies/zstd-1.5.4/examples/dictionary_compression.c @@ -1,12 +1,22 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). * You may select, at your option, one of the above-listed licenses. - */ +**/ + +/* This example deals with Dictionary compression, + * its counterpart is `examples/dictionary_decompression.c` . + * These examples presume that a dictionary already exists. + * The main method to create a dictionary is `zstd --train`, + * look at the CLI documentation for details. + * Another possible method is to employ dictionary training API, + * published in `lib/zdict.h` . +**/ + #include // printf #include // free #include // memset, strcat @@ -14,7 +24,7 @@ #include "common.h" // Helper functions, CHECK(), and CHECK_ZSTD() /* createDict() : - `dictFileName` is supposed to have been created using `zstd --train` */ +** `dictFileName` is supposed already created using `zstd --train` */ static ZSTD_CDict* createCDict_orDie(const char* dictFileName, int cLevel) { size_t dictSize; diff --git a/src/dependencies/zstd-1.5.0/examples/dictionary_decompression.c b/src/dependencies/zstd-1.5.4/examples/dictionary_decompression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/examples/dictionary_decompression.c rename to src/dependencies/zstd-1.5.4/examples/dictionary_decompression.c index 107cfc1..e6c9999 100644 --- a/src/dependencies/zstd-1.5.0/examples/dictionary_decompression.c +++ b/src/dependencies/zstd-1.5.4/examples/dictionary_decompression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/multiple_simple_compression.c b/src/dependencies/zstd-1.5.4/examples/multiple_simple_compression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/examples/multiple_simple_compression.c rename to src/dependencies/zstd-1.5.4/examples/multiple_simple_compression.c index 5d2a28f..bf77ca1 100644 --- a/src/dependencies/zstd-1.5.0/examples/multiple_simple_compression.c +++ b/src/dependencies/zstd-1.5.4/examples/multiple_simple_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/multiple_streaming_compression.c b/src/dependencies/zstd-1.5.4/examples/multiple_streaming_compression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/examples/multiple_streaming_compression.c rename to src/dependencies/zstd-1.5.4/examples/multiple_streaming_compression.c index d4efc8e..b12ad03 100644 --- a/src/dependencies/zstd-1.5.0/examples/multiple_streaming_compression.c +++ b/src/dependencies/zstd-1.5.4/examples/multiple_streaming_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/simple_compression.c b/src/dependencies/zstd-1.5.4/examples/simple_compression.c similarity index 97% rename from src/dependencies/zstd-1.5.0/examples/simple_compression.c rename to src/dependencies/zstd-1.5.4/examples/simple_compression.c index 27a65b1..7c88072 100644 --- a/src/dependencies/zstd-1.5.0/examples/simple_compression.c +++ b/src/dependencies/zstd-1.5.4/examples/simple_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/simple_decompression.c b/src/dependencies/zstd-1.5.4/examples/simple_decompression.c similarity index 97% rename from src/dependencies/zstd-1.5.0/examples/simple_decompression.c rename to src/dependencies/zstd-1.5.4/examples/simple_decompression.c index 59c1fd4..f499156 100644 --- a/src/dependencies/zstd-1.5.0/examples/simple_decompression.c +++ b/src/dependencies/zstd-1.5.4/examples/simple_decompression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/streaming_compression.c b/src/dependencies/zstd-1.5.4/examples/streaming_compression.c similarity index 84% rename from src/dependencies/zstd-1.5.0/examples/streaming_compression.c rename to src/dependencies/zstd-1.5.4/examples/streaming_compression.c index e20bcde..ed0a3a6 100644 --- a/src/dependencies/zstd-1.5.0/examples/streaming_compression.c +++ b/src/dependencies/zstd-1.5.4/examples/streaming_compression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -15,9 +15,12 @@ #include // presumes zstd library is installed #include "common.h" // Helper functions, CHECK(), and CHECK_ZSTD() - -static void compressFile_orDie(const char* fname, const char* outName, int cLevel) +static void compressFile_orDie(const char* fname, const char* outName, int cLevel, + int nbThreads) { + fprintf (stderr, "Starting compression of %s with level %d, using %d threads\n", + fname, cLevel, nbThreads); + /* Open the input and output files. */ FILE* const fin = fopen_orDie(fname, "rb"); FILE* const fout = fopen_orDie(outName, "wb"); @@ -39,7 +42,7 @@ static void compressFile_orDie(const char* fname, const char* outName, int cLeve */ CHECK_ZSTD( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, cLevel) ); CHECK_ZSTD( ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1) ); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 4); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, nbThreads); /* This loop read from the input file, compresses that entire chunk, * and writes all output produced to the output file. @@ -106,19 +109,32 @@ int main(int argc, const char** argv) { const char* const exeName = argv[0]; - if (argc!=2) { + if (argc < 2) { printf("wrong arguments\n"); printf("usage:\n"); - printf("%s FILE\n", exeName); + printf("%s FILE [LEVEL] [THREADS]\n", exeName); return 1; } + int cLevel = 1; + int nbThreads = 4; + + if (argc >= 3) { + cLevel = atoi (argv[2]); + CHECK(cLevel != 0, "can't parse LEVEL!"); + } + + if (argc >= 4) { + nbThreads = atoi (argv[3]); + CHECK(nbThreads != 0, "can't parse THREADS!"); + } + const char* const inFilename = argv[1]; char* const outFilename = createOutFilename_orDie(inFilename); - compressFile_orDie(inFilename, outFilename, 1); + compressFile_orDie(inFilename, outFilename, cLevel, nbThreads); free(outFilename); /* not strictly required, since program execution stops there, - * but some static analyzer main complain otherwise */ + * but some static analyzer may complain otherwise */ return 0; } diff --git a/src/dependencies/zstd-1.5.0/examples/streaming_compression_thread_pool.c b/src/dependencies/zstd-1.5.4/examples/streaming_compression_thread_pool.c similarity index 94% rename from src/dependencies/zstd-1.5.0/examples/streaming_compression_thread_pool.c rename to src/dependencies/zstd-1.5.4/examples/streaming_compression_thread_pool.c index 5a6551b..a1a0241 100644 --- a/src/dependencies/zstd-1.5.0/examples/streaming_compression_thread_pool.c +++ b/src/dependencies/zstd-1.5.4/examples/streaming_compression_thread_pool.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Martin Liska, SUSE, Facebook, Inc. + * Copyright (c) Martin Liska, SUSE, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,8 +28,10 @@ typedef struct compress_args static void *compressFile_orDie(void *data) { + const int nbThreads = 16; + compress_args_t *args = (compress_args_t *)data; - fprintf (stderr, "Starting compression of %s with level %d\n", args->fname, args->cLevel); + fprintf (stderr, "Starting compression of %s with level %d, using %d threads\n", args->fname, args->cLevel, nbThreads); /* Open the input and output files. */ FILE* const fin = fopen_orDie(args->fname, "rb"); FILE* const fout = fopen_orDie(args->outName, "wb"); @@ -56,9 +58,9 @@ static void *compressFile_orDie(void *data) */ CHECK_ZSTD( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, args->cLevel) ); CHECK_ZSTD( ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1) ); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 16); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, nbThreads); - /* This loop read from the input file, compresses that entire chunk, + /* This loop reads from the input file, compresses that entire chunk, * and writes all output produced to the output file. */ size_t const toRead = buffInSize; diff --git a/src/dependencies/zstd-1.5.0/examples/streaming_decompression.c b/src/dependencies/zstd-1.5.4/examples/streaming_decompression.c similarity index 98% rename from src/dependencies/zstd-1.5.0/examples/streaming_decompression.c rename to src/dependencies/zstd-1.5.4/examples/streaming_decompression.c index 6dc4c22..95fa112 100644 --- a/src/dependencies/zstd-1.5.0/examples/streaming_decompression.c +++ b/src/dependencies/zstd-1.5.4/examples/streaming_decompression.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/examples/streaming_memory_usage.c b/src/dependencies/zstd-1.5.4/examples/streaming_memory_usage.c similarity index 99% rename from src/dependencies/zstd-1.5.0/examples/streaming_memory_usage.c rename to src/dependencies/zstd-1.5.4/examples/streaming_memory_usage.c index a5219ef..957acb6 100644 --- a/src/dependencies/zstd-1.5.0/examples/streaming_memory_usage.c +++ b/src/dependencies/zstd-1.5.4/examples/streaming_memory_usage.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/.gitignore b/src/dependencies/zstd-1.5.4/lib/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/.gitignore rename to src/dependencies/zstd-1.5.4/lib/.gitignore diff --git a/src/dependencies/zstd-1.5.0/lib/BUCK b/src/dependencies/zstd-1.5.4/lib/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/BUCK rename to src/dependencies/zstd-1.5.4/lib/BUCK diff --git a/src/dependencies/zstd-1.5.0/lib/Makefile b/src/dependencies/zstd-1.5.4/lib/Makefile similarity index 63% rename from src/dependencies/zstd-1.5.0/lib/Makefile rename to src/dependencies/zstd-1.5.4/lib/Makefile index 9109476..a4cf61a 100644 --- a/src/dependencies/zstd-1.5.0/lib/Makefile +++ b/src/dependencies/zstd-1.5.4/lib/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -8,110 +8,13 @@ # You may select, at your option, one of the above-listed licenses. # ################################################################ -# Note: by default, the static library is built single-threaded and dynamic library is built -# multi-threaded. It is possible to force multi or single threaded builds by appending -# -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded). -.PHONY: default -default: lib-release - -# define silent mode as default (verbose mode with V=1 or VERBOSE=1) -$(V)$(VERBOSE).SILENT: - -# When cross-compiling from linux to windows, -# one might need to specify TARGET_SYSTEM as "Windows." -# Building from Fedora fails without it. -# (but Ubuntu and Debian don't need to set anything) -TARGET_SYSTEM ?= $(OS) - -# Version numbers -LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h` -LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h` -LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h` -LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) -LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) -LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) -LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) -LIBVER := $(shell echo $(LIBVER_SCRIPT)) -VERSION?= $(LIBVER) -CCVER := $(shell $(CC) --version) - -# ZSTD_LIB_MINIFY is a helper variable that -# configures a bunch of other variables to space-optimized defaults. -ZSTD_LIB_MINIFY ?= 0 -ifneq ($(ZSTD_LIB_MINIFY), 0) - HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0) - ZSTD_LEGACY_SUPPORT ?= 0 - ZSTD_LIB_DEPRECATED ?= 0 - HUF_FORCE_DECOMPRESS_X1 ?= 1 - ZSTD_FORCE_DECOMPRESS_SHORT ?= 1 - ZSTD_NO_INLINE ?= 1 - ZSTD_STRIP_ERROR_STRINGS ?= 1 -ifneq ($(HAVE_CC_OZ), 0) - # Some compilers (clang) support an even more space-optimized setting. - CFLAGS += -Oz -else - CFLAGS += -Os -endif - CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \ - -DDYNAMIC_BMI2=0 -DNDEBUG -else - CFLAGS += -O3 -endif - -DEBUGLEVEL ?= 0 -CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) -ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed - CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting -endif -DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ - -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ - -Wstrict-prototypes -Wundef -Wpointer-arith \ - -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ - -Wredundant-decls -Wmissing-prototypes -Wc++-compat -CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) -FLAGS = $(CPPFLAGS) $(CFLAGS) - -CPPFLAGS_DYNLIB = -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded -LDFLAGS_DYNLIB = -pthread -CPPFLAGS_STATLIB = # static library build defaults to single-threaded - -HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) -GREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) - GREP_OPTIONS += --color=never -endif -GREP = grep $(GREP_OPTIONS) -SED_ERE_OPT ?= -E - -ZSTDCOMMON_FILES := $(sort $(wildcard common/*.c)) -ZSTDCOMP_FILES := $(sort $(wildcard compress/*.c)) -ZSTDDECOMP_FILES := $(sort $(wildcard decompress/*.c)) -ZDICT_FILES := $(sort $(wildcard dictBuilder/*.c)) -ZDEPR_FILES := $(sort $(wildcard deprecated/*.c)) -ZSTD_FILES := $(ZSTDCOMMON_FILES) - -ifeq ($(findstring GCC,$(CCVER)),GCC) -decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize -endif - # Modules ZSTD_LIB_COMPRESSION ?= 1 ZSTD_LIB_DECOMPRESSION ?= 1 ZSTD_LIB_DICTBUILDER ?= 1 ZSTD_LIB_DEPRECATED ?= 0 -# Legacy support -ZSTD_LEGACY_SUPPORT ?= 5 -ZSTD_LEGACY_MULTITHREADED_API ?= 0 - -# Build size optimizations -HUF_FORCE_DECOMPRESS_X1 ?= 0 -HUF_FORCE_DECOMPRESS_X2 ?= 0 -ZSTD_FORCE_DECOMPRESS_SHORT ?= 0 -ZSTD_FORCE_DECOMPRESS_LONG ?= 0 -ZSTD_NO_INLINE ?= 0 -ZSTD_STRIP_ERROR_STRINGS ?= 0 - +# Input variables for libzstd.mk ifeq ($(ZSTD_LIB_COMPRESSION), 0) ZSTD_LIB_DICTBUILDER = 0 ZSTD_LIB_DEPRECATED = 0 @@ -122,86 +25,46 @@ ifeq ($(ZSTD_LIB_DECOMPRESSION), 0) ZSTD_LIB_DEPRECATED = 0 endif +include libzstd.mk + +ZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES) + ifneq ($(ZSTD_LIB_COMPRESSION), 0) - ZSTD_FILES += $(ZSTDCOMP_FILES) + ZSTD_FILES += $(ZSTD_COMPRESS_FILES) endif ifneq ($(ZSTD_LIB_DECOMPRESSION), 0) - ZSTD_FILES += $(ZSTDDECOMP_FILES) + ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES) endif ifneq ($(ZSTD_LIB_DEPRECATED), 0) - ZSTD_FILES += $(ZDEPR_FILES) + ZSTD_FILES += $(ZSTD_DEPRECATED_FILES) endif ifneq ($(ZSTD_LIB_DICTBUILDER), 0) - ZSTD_FILES += $(ZDICT_FILES) + ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES) endif -ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0) - CFLAGS += -DHUF_FORCE_DECOMPRESS_X1 -endif - -ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0) - CFLAGS += -DHUF_FORCE_DECOMPRESS_X2 -endif - -ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0) - CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT -endif - -ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0) - CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG -endif - -ifneq ($(ZSTD_NO_INLINE), 0) - CFLAGS += -DZSTD_NO_INLINE -endif - -ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0) - CFLAGS += -DZSTD_STRIP_ERROR_STRINGS -endif - -ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0) - CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API -endif - -ifneq ($(ZSTD_LEGACY_SUPPORT), 0) -ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) - ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') -endif -endif -CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) - ZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES)) -ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_SRC:.c=.o) +ZSTD_LOCAL_OBJ0 := $(ZSTD_LOCAL_SRC:.c=.o) +ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_OBJ0:.S=.o) -ZSTD_SUBDIR := common compress decompress dictBuilder legacy deprecated -vpath %.c $(ZSTD_SUBDIR) +VERSION := $(ZSTD_VERSION) -UNAME := $(shell uname) +# Note: by default, the static library is built single-threaded and dynamic library is built +# multi-threaded. It is possible to force multi or single threaded builds by appending +# -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded). +.PHONY: default +default: lib-release -ifndef BUILD_DIR -ifeq ($(UNAME), Darwin) - ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0) - HASH ?= md5 - endif -else ifeq ($(UNAME), FreeBSD) - HASH ?= gmd5sum -else ifeq ($(UNAME), NetBSD) - HASH ?= md5 -n -else ifeq ($(UNAME), OpenBSD) - HASH ?= md5 +CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded +LDFLAGS_DYNLIB += -pthread +CPPFLAGS_STATLIB += # static library build defaults to single-threaded + + +ifeq ($(findstring GCC,$(CCVER)),GCC) +decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize endif -HASH ?= md5sum - -HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " ) -HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) -ifeq ($(HAVE_HASH),0) - $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) - BUILD_DIR := obj/generic_noconf -endif -endif # BUILD_DIR # macOS linker doesn't support -soname, and use different extension @@ -212,19 +75,16 @@ ifeq ($(UNAME), Darwin) SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT) SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER) else - SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR) + ifeq ($(UNAME), AIX) + SONAME_FLAGS = + else + SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR) + endif SHARED_EXT = so SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR) SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER) endif -SET_CACHE_DIRECTORY = \ - +$(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/$(HASH_DIR) \ - CPPFLAGS="$(CPPFLAGS)" \ - CFLAGS="$(CFLAGS)" \ - LDFLAGS="$(LDFLAGS)" - .PHONY: all all: lib @@ -233,6 +93,13 @@ all: lib .PHONY: libzstd.a # must be run every time libzstd.a: CPPFLAGS += $(CPPFLAGS_STATLIB) +SET_CACHE_DIRECTORY = \ + +$(MAKE) --no-print-directory $@ \ + BUILD_DIR=obj/$(HASH_DIR) \ + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + ifndef BUILD_DIR # determine BUILD_DIR from compilation flags @@ -343,6 +210,14 @@ $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR) @echo CC $@ $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< +$(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR) + @echo AS $@ + $(COMPILE.S) $(OUTPUT_OPTION) $< + +$(ZSTD_STATLIB_DIR)/%.o : %.S | $(ZSTD_STATLIB_DIR) + @echo AS $@ + $(COMPILE.S) $(OUTPUT_OPTION) $< + MKDIR ?= mkdir $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR): $(MKDIR) -p $@ @@ -374,9 +249,9 @@ clean: #----------------------------------------------------------------------------- # make install is validated only for below listed environments #----------------------------------------------------------------------------- -ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku)) +ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX)) -all: libzstd.pc +lib: libzstd.pc HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,) @@ -421,16 +296,16 @@ INSTALL_PROGRAM ?= $(INSTALL) INSTALL_DATA ?= $(INSTALL) -m 644 -libzstd.pc: libzstd.pc: libzstd.pc.in @echo creating pkgconfig - @sed $(SED_ERE_OPT) \ + @sed \ -e 's|@PREFIX@|$(PREFIX)|' \ -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \ - -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \ - -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \ - -e 's|@VERSION@|$(VERSION)|' \ - $< >$@ + -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \ + -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \ + -e 's|@VERSION@|$(VERSION)|' \ + -e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \ + $< >$@ .PHONY: install install: install-pc install-static install-shared install-includes diff --git a/src/dependencies/zstd-1.5.0/lib/README.md b/src/dependencies/zstd-1.5.4/lib/README.md similarity index 91% rename from src/dependencies/zstd-1.5.0/lib/README.md rename to src/dependencies/zstd-1.5.4/lib/README.md index f781ac5..c3b5d18 100644 --- a/src/dependencies/zstd-1.5.0/lib/README.md +++ b/src/dependencies/zstd-1.5.4/lib/README.md @@ -91,7 +91,7 @@ The file structure is designed to make this selection manually achievable for an `ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`, and `ZSTD_LIB_DEPRECATED` as `0` to forgo compilation of the corresponding features. This will also disable compilation of all - dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable + dependencies (e.g. `ZSTD_LIB_COMPRESSION=0` will also disable dictBuilder). - There are a number of options that can help minimize the binary size of @@ -125,7 +125,7 @@ The file structure is designed to make this selection manually achievable for an `ZSTD_getErrorName` (implied by `ZSTD_LIB_MINIFY`). Finally, when integrating into your application, make sure you're doing link- - time optimation and unused symbol garbage collection (via some combination of, + time optimization and unused symbol garbage collection (via some combination of, e.g., `-flto`, `-ffat-lto-objects`, `-fuse-linker-plugin`, `-ffunction-sections`, `-fdata-sections`, `-fmerge-all-constants`, `-Wl,--gc-sections`, `-Wl,-z,norelro`, and an archiver that understands @@ -155,6 +155,19 @@ The file structure is designed to make this selection manually achievable for an - The build macro `ZSTD_NO_INTRINSICS` can be defined to disable all explicit intrinsics. Compiler builtins are still used. +- The build macro `ZSTD_DECODER_INTERNAL_BUFFER` can be set to control + the amount of extra memory used during decompression to store literals. + This defaults to 64kB. Reducing this value reduces the memory footprint of + `ZSTD_DCtx` decompression contexts, + but might also result in a small decompression speed cost. + +- The C compiler macros `ZSTDLIB_VISIBLE`, `ZSTDERRORLIB_VISIBLE` and `ZDICTLIB_VISIBLE` + can be overridden to control the visibility of zstd's API. Additionally, + `ZSTDLIB_STATIC_API` and `ZDICTLIB_STATIC_API` can be overridden to control the visibility + of zstd's static API. Specifically, it can be set to `ZSTDLIB_HIDDEN` to hide the symbols + from the shared library. These macros default to `ZSTDLIB_VISIBILITY`, + `ZSTDERRORLIB_VSIBILITY`, and `ZDICTLIB_VISIBILITY` if unset, for backwards compatibility + with the old macro names. #### Windows : using MinGW+MSYS to create DLL diff --git a/src/dependencies/zstd-1.5.4/lib/common/bits.h b/src/dependencies/zstd-1.5.4/lib/common/bits.h new file mode 100644 index 0000000..7939f3d --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/bits.h @@ -0,0 +1,175 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_BITS_H +#define ZSTD_BITS_H + +#include "mem.h" + +MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) +{ + assert(val != 0); + { + static const int DeBruijnBytePos[32] = {0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9}; + return DeBruijnBytePos[((U32) ((val & -(S32) val) * 0x077CB531U)) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return _tzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_ctz(val); +# else + return ZSTD_countTrailingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { + assert(val != 0); + { + static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31}; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return 31 - DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return _lzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)(31 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_clz(val); +# else + return ZSTD_countLeadingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return _tzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(__LP64__) + return (unsigned)__builtin_ctzll(val); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (leastSignificantWord == 0) { + return 32 + ZSTD_countTrailingZeros32(mostSignificantWord); + } else { + return ZSTD_countTrailingZeros32(leastSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return _lzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, val); + return (unsigned)(63 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_clzll(val)); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (mostSignificantWord == 0) { + return 32 + ZSTD_countLeadingZeros32(leastSignificantWord); + } else { + return ZSTD_countLeadingZeros32(mostSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) +{ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + return ZSTD_countTrailingZeros64((U64)val) >> 3; + } else { + return ZSTD_countTrailingZeros32((U32)val) >> 3; + } + } else { /* Big Endian CPU */ + if (MEM_64bits()) { + return ZSTD_countLeadingZeros64((U64)val) >> 3; + } else { + return ZSTD_countLeadingZeros32((U32)val) >> 3; + } + } +} + +MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ +{ + assert(val != 0); + return 31 - ZSTD_countLeadingZeros32(val); +} + +#endif /* ZSTD_BITS_H */ diff --git a/src/dependencies/zstd-1.5.0/lib/common/bitstream.h b/src/dependencies/zstd-1.5.4/lib/common/bitstream.h similarity index 89% rename from src/dependencies/zstd-1.5.0/lib/common/bitstream.h rename to src/dependencies/zstd-1.5.4/lib/common/bitstream.h index 2e5a933..db1b4cf 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/bitstream.h +++ b/src/dependencies/zstd-1.5.4/lib/common/bitstream.h @@ -1,7 +1,7 @@ /* ****************************************************************** * bitstream * Part of FSE library - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -30,14 +30,15 @@ extern "C" { #include "compiler.h" /* UNLIKELY() */ #include "debug.h" /* assert(), DEBUGLOG(), RAWLOG() */ #include "error_private.h" /* error codes and messages */ +#include "bits.h" /* ZSTD_highbit32 */ /*========================================= * Target specific =========================================*/ #ifndef ZSTD_NO_INTRINSICS -# if defined(__BMI__) && defined(__GNUC__) -# include /* support for bextr (experimental) */ +# if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__) +# include /* support for bextr (experimental)/bzhi */ # elif defined(__ICCARM__) # include # endif @@ -132,42 +133,6 @@ MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC); MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); /* faster, but works only if nbBits >= 1 */ - - -/*-************************************************************** -* Internal functions -****************************************************************/ -MEM_STATIC unsigned BIT_highbit32 (U32 val) -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ -# if STATIC_BMI2 == 1 - return _lzcnt_u32(val) ^ 31; -# else - unsigned long r = 0; - return _BitScanReverse(&r, val) ? (unsigned)r : 0; -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ - return __builtin_clz (val) ^ 31; -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return 31 - __CLZ(val); -# else /* Software version */ - static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, - 11, 14, 16, 18, 22, 25, 3, 30, - 8, 12, 20, 28, 15, 17, 24, 7, - 19, 27, 23, 6, 26, 5, 4, 31 }; - U32 v = val; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27]; -# endif - } -} - /*===== Local Constants =====*/ static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, @@ -197,6 +162,16 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, return 0; } +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) +{ +#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS) + return _bzhi_u64(bitContainer, nbBits); +#else + assert(nbBits < BIT_MASK_SIZE); + return bitContainer & BIT_mask[nbBits]; +#endif +} + /*! BIT_addBits() : * can add up to 31 bits into `bitC`. * Note : does not check for register overflow ! */ @@ -206,7 +181,7 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, DEBUG_STATIC_ASSERT(BIT_MASK_SIZE == 32); assert(nbBits < BIT_MASK_SIZE); assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); - bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos; + bitC->bitContainer |= BIT_getLowerBits(value, nbBits) << bitC->bitPos; bitC->bitPos += nbBits; } @@ -285,7 +260,7 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer); bitD->bitContainer = MEM_readLEST(bitD->ptr); { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; - bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ } } else { bitD->ptr = bitD->start; @@ -293,27 +268,27 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si switch(srcSize) { case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16); - /* fall-through */ + ZSTD_FALLTHROUGH; case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24); - /* fall-through */ + ZSTD_FALLTHROUGH; case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32); - /* fall-through */ + ZSTD_FALLTHROUGH; case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; - /* fall-through */ + ZSTD_FALLTHROUGH; case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; - /* fall-through */ + ZSTD_FALLTHROUGH; case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; - /* fall-through */ + ZSTD_FALLTHROUGH; default: break; } { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; - bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; if (lastByte == 0) return ERROR(corruption_detected); /* endMark not present */ } bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize)*8; @@ -332,16 +307,15 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c U32 const regMask = sizeof(bitContainer)*8 - 1; /* if start > regMask, bitstream is corrupted, and result is undefined */ assert(nbBits < BIT_MASK_SIZE); - return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; -} - -MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) -{ -#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 - return _bzhi_u64(bitContainer, nbBits); + /* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better + * than accessing memory. When bmi2 instruction is not present, we consider + * such cpus old (pre-Haswell, 2013) and their performance is not of that + * importance. + */ +#if defined(__x86_64__) || defined(_M_X86) + return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1); #else - assert(nbBits < BIT_MASK_SIZE); - return bitContainer & BIT_mask[nbBits]; + return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; #endif } @@ -391,7 +365,7 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned n } /*! BIT_readBitsFast() : - * unsafe version; only works only if nbBits >= 1 */ + * unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits) { size_t const value = BIT_lookBitsFast(bitD, nbBits); diff --git a/src/dependencies/zstd-1.5.0/lib/common/compiler.h b/src/dependencies/zstd-1.5.4/lib/common/compiler.h similarity index 67% rename from src/dependencies/zstd-1.5.0/lib/common/compiler.h rename to src/dependencies/zstd-1.5.4/lib/common/compiler.h index a951d0a..d4f2f28 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/compiler.h +++ b/src/dependencies/zstd-1.5.4/lib/common/compiler.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -11,6 +11,8 @@ #ifndef ZSTD_COMPILER_H #define ZSTD_COMPILER_H +#include "portability_macros.h" + /*-******************************************************* * Compiler specifics *********************************************************/ @@ -40,7 +42,7 @@ /** On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC). - This explictly marks such functions as __cdecl so that the code will still compile + This explicitly marks such functions as __cdecl so that the code will still compile if a CC other than __cdecl has been made the default. */ #if defined(_MSC_VER) @@ -92,29 +94,17 @@ /* target attribute */ -#ifndef __has_attribute - #define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ -#endif #if defined(__GNUC__) || defined(__ICCARM__) # define TARGET_ATTRIBUTE(target) __attribute__((__target__(target))) #else # define TARGET_ATTRIBUTE(target) #endif -/* Enable runtime BMI2 dispatch based on the CPU. - * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. +/* Target attribute for BMI2 dynamic dispatch. + * Enable lzcnt, bmi, and bmi2. + * We test for bmi1 & bmi2. lzcnt is included in bmi1. */ -#ifndef DYNAMIC_BMI2 - #if ((defined(__clang__) && __has_attribute(__target__)) \ - || (defined(__GNUC__) \ - && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ - && (defined(__x86_64__) || defined(_M_X86)) \ - && !defined(__BMI2__) - # define DYNAMIC_BMI2 1 - #else - # define DYNAMIC_BMI2 0 - #endif -#endif +#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2") /* prefetch * can be disabled, by declaring NO_PREFETCH build macro */ @@ -150,8 +140,9 @@ } /* vectorization - * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax */ -#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) + * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax, + * and some compilers, like Intel ICC and MCST LCC, do not support it at all. */ +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__) # if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5) # define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) # else @@ -174,6 +165,12 @@ #define UNLIKELY(x) (x) #endif +#if __has_builtin(__builtin_unreachable) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))) +# define ZSTD_UNREACHABLE { assert(0), __builtin_unreachable(); } +#else +# define ZSTD_UNREACHABLE { assert(0); } +#endif + /* disable warnings */ #ifdef _MSC_VER /* Visual Studio */ # include /* For Visual 2005 */ @@ -190,6 +187,8 @@ # ifdef __AVX2__ //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2 # define STATIC_BMI2 1 # endif +# elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__) +# define STATIC_BMI2 1 # endif #endif @@ -197,26 +196,103 @@ #define STATIC_BMI2 0 #endif -/* compat. with non-clang compilers */ -#ifndef __has_builtin -# define __has_builtin(x) 0 -#endif - -/* compat. with non-clang compilers */ -#ifndef __has_feature -# define __has_feature(x) 0 -#endif - -/* detects whether we are being compiled under msan */ -#ifndef ZSTD_MEMORY_SANITIZER -# if __has_feature(memory_sanitizer) -# define ZSTD_MEMORY_SANITIZER 1 -# else -# define ZSTD_MEMORY_SANITIZER 0 +/* compile time determination of SIMD support */ +#if !defined(ZSTD_NO_INTRINSICS) +# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +# define ZSTD_ARCH_X86_SSE2 +# endif +# if defined(__ARM_NEON) || defined(_M_ARM64) +# define ZSTD_ARCH_ARM_NEON +# endif +# +# if defined(ZSTD_ARCH_X86_SSE2) +# include +# elif defined(ZSTD_ARCH_ARM_NEON) +# include # endif #endif -#if ZSTD_MEMORY_SANITIZER +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define ZSTD_HAS_C_ATTRIBUTE(x) 0 +#endif + +/* Only use C++ attributes in C++. Some compilers report support for C++ + * attributes when compiling with C. + */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute. + * - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough + * - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * - Else: __attribute__((__fallthrough__)) + */ +#ifndef ZSTD_FALLTHROUGH +# if ZSTD_HAS_C_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif __has_attribute(__fallthrough__) +/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon + * gcc complains about: a label can only be part of a statement and a declaration is not a statement. + */ +# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__)) +# else +# define ZSTD_FALLTHROUGH +# endif +#endif + +/*-************************************************************** +* Alignment check +*****************************************************************/ + +/* this test was initially positioned in mem.h, + * but this file is removed (or replaced) for linux kernel + * so it's now hosted in compiler.h, + * which remains valid for both user & kernel spaces. + */ + +#ifndef ZSTD_ALIGNOF +# if defined(__GNUC__) || defined(_MSC_VER) +/* covers gcc, clang & MSVC */ +/* note : this section must come first, before C11, + * due to a limitation in the kernel source generator */ +# define ZSTD_ALIGNOF(T) __alignof(T) + +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +/* C11 support */ +# include +# define ZSTD_ALIGNOF(T) alignof(T) + +# else +/* No known support for alignof() - imperfect backup */ +# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T)) + +# endif +#endif /* ZSTD_ALIGNOF */ + +/*-************************************************************** +* Sanitizer +*****************************************************************/ + +/* Issue #3240 reports an ASAN failure on an llvm-mingw build. Out of an + * abundance of caution, disable our custom poisoning on mingw. */ +#ifdef __MINGW32__ +#ifndef ZSTD_ASAN_DONT_POISON_WORKSPACE +#define ZSTD_ASAN_DONT_POISON_WORKSPACE 1 +#endif +#ifndef ZSTD_MSAN_DONT_POISON_WORKSPACE +#define ZSTD_MSAN_DONT_POISON_WORKSPACE 1 +#endif +#endif + +#if ZSTD_MEMORY_SANITIZER && !defined(ZSTD_MSAN_DONT_POISON_WORKSPACE) /* Not all platforms that support msan provide sanitizers/msan_interface.h. * We therefore declare the functions we need ourselves, rather than trying to * include the header file... */ @@ -237,18 +313,7 @@ void __msan_poison(const volatile void *a, size_t size); intptr_t __msan_test_shadow(const volatile void *x, size_t size); #endif -/* detects whether we are being compiled under asan */ -#ifndef ZSTD_ADDRESS_SANITIZER -# if __has_feature(address_sanitizer) -# define ZSTD_ADDRESS_SANITIZER 1 -# elif defined(__SANITIZE_ADDRESS__) -# define ZSTD_ADDRESS_SANITIZER 1 -# else -# define ZSTD_ADDRESS_SANITIZER 0 -# endif -#endif - -#if ZSTD_ADDRESS_SANITIZER +#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE) /* Not all platforms that support asan provide sanitizers/asan_interface.h. * We therefore declare the functions we need ourselves, rather than trying to * include the header file... */ diff --git a/src/dependencies/zstd-1.5.0/lib/common/cpu.h b/src/dependencies/zstd-1.5.4/lib/common/cpu.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/common/cpu.h rename to src/dependencies/zstd-1.5.4/lib/common/cpu.h index 8acd33b..8bc34a3 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/cpu.h +++ b/src/dependencies/zstd-1.5.4/lib/common/cpu.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/common/debug.c b/src/dependencies/zstd-1.5.4/lib/common/debug.c similarity index 93% rename from src/dependencies/zstd-1.5.0/lib/common/debug.c rename to src/dependencies/zstd-1.5.4/lib/common/debug.c index bb863c9..ebf7bfc 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/debug.c +++ b/src/dependencies/zstd-1.5.4/lib/common/debug.c @@ -1,7 +1,7 @@ /* ****************************************************************** * debug * Part of FSE library - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy diff --git a/src/dependencies/zstd-1.5.0/lib/common/debug.h b/src/dependencies/zstd-1.5.4/lib/common/debug.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/common/debug.h rename to src/dependencies/zstd-1.5.4/lib/common/debug.h index 3b2a320..0e9817e 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/debug.h +++ b/src/dependencies/zstd-1.5.4/lib/common/debug.h @@ -1,7 +1,7 @@ /* ****************************************************************** * debug * Part of FSE library - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy diff --git a/src/dependencies/zstd-1.5.0/lib/common/entropy_common.c b/src/dependencies/zstd-1.5.4/lib/common/entropy_common.c similarity index 89% rename from src/dependencies/zstd-1.5.0/lib/common/entropy_common.c rename to src/dependencies/zstd-1.5.4/lib/common/entropy_common.c index 41cd695..e2173af 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/entropy_common.c +++ b/src/dependencies/zstd-1.5.4/lib/common/entropy_common.c @@ -1,6 +1,6 @@ /* ****************************************************************** * Common functions of New Generation Entropy library - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -19,8 +19,8 @@ #include "error_private.h" /* ERR_*, ERROR */ #define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */ #include "fse.h" -#define HUF_STATIC_LINKING_ONLY /* HUF_TABLELOG_ABSOLUTEMAX */ #include "huf.h" +#include "bits.h" /* ZSDT_highbit32, ZSTD_countTrailingZeros32 */ /*=== Version ===*/ @@ -38,28 +38,6 @@ const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); } /*-************************************************************** * FSE NCount encoding-decoding ****************************************************************/ -static U32 FSE_ctz(U32 val) -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - return _BitScanForward(&r, val) ? (unsigned)r : 0; -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ - return __builtin_ctz(val); -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return __CTZ(val); -# else /* Software version */ - U32 count = 0; - while ((val & 1) == 0) { - val >>= 1; - ++count; - } - return count; -# endif - } -} - FORCE_INLINE_TEMPLATE size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, const void* headerBuffer, size_t hbSize) @@ -107,7 +85,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne * repeat. * Avoid UB by setting the high bit to 1. */ - int repeats = FSE_ctz(~bitStream | 0x80000000) >> 1; + int repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; while (repeats >= 12) { charnum += 3 * 12; if (LIKELY(ip <= iend-7)) { @@ -118,7 +96,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne ip = iend - 4; } bitStream = MEM_readLE32(ip) >> bitCount; - repeats = FSE_ctz(~bitStream | 0x80000000) >> 1; + repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; } charnum += 3 * repeats; bitStream >>= 2 * repeats; @@ -183,7 +161,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne * know that threshold > 1. */ if (remaining <= 1) break; - nbBits = BIT_highbit32(remaining) + 1; + nbBits = ZSTD_highbit32(remaining) + 1; threshold = 1 << (nbBits - 1); } if (charnum >= maxSV1) break; @@ -217,7 +195,7 @@ static size_t FSE_readNCount_body_default( } #if DYNAMIC_BMI2 -TARGET_ATTRIBUTE("bmi2") static size_t FSE_readNCount_body_bmi2( +BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2( short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, const void* headerBuffer, size_t hbSize) { @@ -258,7 +236,7 @@ size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats, const void* src, size_t srcSize) { U32 wksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; - return HUF_readStats_wksp(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, wksp, sizeof(wksp), /* bmi2 */ 0); + return HUF_readStats_wksp(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, wksp, sizeof(wksp), /* flags */ 0); } FORCE_INLINE_TEMPLATE size_t @@ -299,21 +277,21 @@ HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats, ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32)); weightTotal = 0; { U32 n; for (n=0; n= HUF_TABLELOG_MAX) return ERROR(corruption_detected); + if (huffWeight[n] > HUF_TABLELOG_MAX) return ERROR(corruption_detected); rankStats[huffWeight[n]]++; weightTotal += (1 << huffWeight[n]) >> 1; } } if (weightTotal == 0) return ERROR(corruption_detected); /* get last non-null symbol weight (implied, total must be 2^n) */ - { U32 const tableLog = BIT_highbit32(weightTotal) + 1; + { U32 const tableLog = ZSTD_highbit32(weightTotal) + 1; if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected); *tableLogPtr = tableLog; /* determine last weight */ { U32 const total = 1 << tableLog; U32 const rest = total - weightTotal; - U32 const verif = 1 << BIT_highbit32(rest); - U32 const lastWeight = BIT_highbit32(rest) + 1; + U32 const verif = 1 << ZSTD_highbit32(rest); + U32 const lastWeight = ZSTD_highbit32(rest) + 1; if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */ huffWeight[oSize] = (BYTE)lastWeight; rankStats[lastWeight]++; @@ -337,7 +315,7 @@ static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* r } #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, +static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, const void* src, size_t srcSize, void* workSpace, size_t wkspSize) @@ -350,13 +328,13 @@ size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, - int bmi2) + int flags) { #if DYNAMIC_BMI2 - if (bmi2) { + if (flags & HUF_flags_bmi2) { return HUF_readStats_body_bmi2(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); } #endif - (void)bmi2; + (void)flags; return HUF_readStats_body_default(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); } diff --git a/src/dependencies/zstd-1.5.0/lib/common/error_private.c b/src/dependencies/zstd-1.5.4/lib/common/error_private.c similarity index 76% rename from src/dependencies/zstd-1.5.0/lib/common/error_private.c rename to src/dependencies/zstd-1.5.4/lib/common/error_private.c index 6d1135f..075fc5e 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/error_private.c +++ b/src/dependencies/zstd-1.5.4/lib/common/error_private.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -27,9 +27,11 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(version_unsupported): return "Version not supported"; case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; - case PREFIX(corruption_detected): return "Corrupted block detected"; + case PREFIX(corruption_detected): return "Data corruption detected"; case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; + case PREFIX(literals_headerWrong): return "Header of Literals' block doesn't respect format specification"; case PREFIX(parameter_unsupported): return "Unsupported parameter"; + case PREFIX(parameter_combination_unsupported): return "Unsupported combination of parameters"; case PREFIX(parameter_outOfBound): return "Parameter is out of bound"; case PREFIX(init_missing): return "Context should be init first"; case PREFIX(memory_allocation): return "Allocation error : not enough memory"; @@ -38,17 +40,22 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large"; case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; + case PREFIX(stabilityCondition_notRespected): return "pledged buffer stability condition is not respected"; case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; case PREFIX(dictionary_wrong): return "Dictionary mismatch"; case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples"; case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; case PREFIX(srcSize_wrong): return "Src size is incorrect"; case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer"; + case PREFIX(noForwardProgress_destFull): return "Operation made no progress over multiple calls, due to output buffer being full"; + case PREFIX(noForwardProgress_inputEmpty): return "Operation made no progress over multiple calls, due to input being empty"; /* following error codes are not stable and may be removed or changed in a future version */ case PREFIX(frameIndex_tooLarge): return "Frame index is too large"; case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking"; case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong"; case PREFIX(srcBuffer_wrong): return "Source buffer is wrong"; + case PREFIX(sequenceProducer_failed): return "Block-level external sequence producer returned an error code"; + case PREFIX(externalSequences_invalid): return "External sequences are not valid"; case PREFIX(maxCode): default: return notErrorCode; } diff --git a/src/dependencies/zstd-1.5.4/lib/common/error_private.h b/src/dependencies/zstd-1.5.4/lib/common/error_private.h new file mode 100644 index 0000000..325daad --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/error_private.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* Note : this module is expected to remain private, do not expose it */ + +#ifndef ERROR_H_MODULE +#define ERROR_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* **************************************** +* Dependencies +******************************************/ +#include "../zstd_errors.h" /* enum list */ +#include "compiler.h" +#include "debug.h" +#include "zstd_deps.h" /* size_t */ + + +/* **************************************** +* Compiler-specific +******************************************/ +#if defined(__GNUC__) +# define ERR_STATIC static __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define ERR_STATIC static inline +#elif defined(_MSC_VER) +# define ERR_STATIC static __inline +#else +# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ +#endif + + +/*-**************************************** +* Customization (error_public.h) +******************************************/ +typedef ZSTD_ErrorCode ERR_enum; +#define PREFIX(name) ZSTD_error_##name + + +/*-**************************************** +* Error codes handling +******************************************/ +#undef ERROR /* already defined on Visual Studio */ +#define ERROR(name) ZSTD_ERROR(name) +#define ZSTD_ERROR(name) ((size_t)-PREFIX(name)) + +ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } + +ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } + +/* check and forward error code */ +#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e +#define CHECK_F(f) { CHECK_V_F(_var_err__, f); } + + +/*-**************************************** +* Error Strings +******************************************/ + +const char* ERR_getErrorString(ERR_enum code); /* error_private.c */ + +ERR_STATIC const char* ERR_getErrorName(size_t code) +{ + return ERR_getErrorString(ERR_getErrorCode(code)); +} + +/** + * Ignore: this is an internal helper. + * + * This is a helper function to help force C99-correctness during compilation. + * Under strict compilation modes, variadic macro arguments can't be empty. + * However, variadic function arguments can be. Using a function therefore lets + * us statically check that at least one (string) argument was passed, + * independent of the compilation flags. + */ +static INLINE_KEYWORD UNUSED_ATTR +void _force_has_format_string(const char *format, ...) { + (void)format; +} + +/** + * Ignore: this is an internal helper. + * + * We want to force this function invocation to be syntactically correct, but + * we don't want to force runtime evaluation of its arguments. + */ +#define _FORCE_HAS_FORMAT_STRING(...) \ + if (0) { \ + _force_has_format_string(__VA_ARGS__); \ + } + +#define ERR_QUOTE(str) #str + +/** + * Return the specified error if the condition evaluates to true. + * + * In debug modes, prints additional information. + * In order to do that (particularly, printing the conditional that failed), + * this can't just wrap RETURN_ERROR(). + */ +#define RETURN_ERROR_IF(cond, err, ...) \ + if (cond) { \ + RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } + +/** + * Unconditionally return the specified error. + * + * In debug modes, prints additional information. + */ +#define RETURN_ERROR(err, ...) \ + do { \ + RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } while(0); + +/** + * If the provided expression evaluates to an error code, returns that error code. + * + * In debug modes, prints additional information. + */ +#define FORWARD_IF_ERROR(err, ...) \ + do { \ + size_t const err_code = (err); \ + if (ERR_isError(err_code)) { \ + RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ + __FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return err_code; \ + } \ + } while(0); + +#if defined (__cplusplus) +} +#endif + +#endif /* ERROR_H_MODULE */ diff --git a/src/dependencies/zstd-1.5.0/lib/common/fse.h b/src/dependencies/zstd-1.5.4/lib/common/fse.h similarity index 85% rename from src/dependencies/zstd-1.5.0/lib/common/fse.h rename to src/dependencies/zstd-1.5.4/lib/common/fse.h index 19dd4fe..02a1f0b 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/fse.h +++ b/src/dependencies/zstd-1.5.4/lib/common/fse.h @@ -1,7 +1,7 @@ /* ****************************************************************** * FSE : Finite State Entropy codec * Public Prototypes declaration - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -53,34 +53,6 @@ extern "C" { FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */ -/*-**************************************** -* FSE simple functions -******************************************/ -/*! FSE_compress() : - Compress content of buffer 'src', of size 'srcSize', into destination buffer 'dst'. - 'dst' buffer must be already allocated. Compression runs faster is dstCapacity >= FSE_compressBound(srcSize). - @return : size of compressed data (<= dstCapacity). - Special values : if return == 0, srcData is not compressible => Nothing is stored within dst !!! - if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression instead. - if FSE_isError(return), compression failed (more details using FSE_getErrorName()) -*/ -FSE_PUBLIC_API size_t FSE_compress(void* dst, size_t dstCapacity, - const void* src, size_t srcSize); - -/*! FSE_decompress(): - Decompress FSE data from buffer 'cSrc', of size 'cSrcSize', - into already allocated destination buffer 'dst', of size 'dstCapacity'. - @return : size of regenerated data (<= maxDstSize), - or an error code, which can be tested using FSE_isError() . - - ** Important ** : FSE_decompress() does not decompress non-compressible nor RLE data !!! - Why ? : making this distinction requires a header. - Header management is intentionally delegated to the user layer, which can better manage special cases. -*/ -FSE_PUBLIC_API size_t FSE_decompress(void* dst, size_t dstCapacity, - const void* cSrc, size_t cSrcSize); - - /*-***************************************** * Tool functions ******************************************/ @@ -91,20 +63,6 @@ FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */ -/*-***************************************** -* FSE advanced functions -******************************************/ -/*! FSE_compress2() : - Same as FSE_compress(), but allows the selection of 'maxSymbolValue' and 'tableLog' - Both parameters can be defined as '0' to mean : use default value - @return : size of compressed data - Special values : if return == 0, srcData is not compressible => Nothing is stored within cSrc !!! - if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression. - if FSE_isError(return), it's an error code. -*/ -FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog); - - /*-***************************************** * FSE detailed API ******************************************/ @@ -164,8 +122,6 @@ FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize, /*! Constructor and Destructor of FSE_CTable. Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */ typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */ -FSE_PUBLIC_API FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog); -FSE_PUBLIC_API void FSE_freeCTable (FSE_CTable* ct); /*! FSE_buildCTable(): Builds `ct`, which must be already allocated, using FSE_createCTable(). @@ -241,23 +197,7 @@ FSE_PUBLIC_API size_t FSE_readNCount_bmi2(short* normalizedCounter, unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, const void* rBuffer, size_t rBuffSize, int bmi2); -/*! Constructor and Destructor of FSE_DTable. - Note that its size depends on 'tableLog' */ typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */ -FSE_PUBLIC_API FSE_DTable* FSE_createDTable(unsigned tableLog); -FSE_PUBLIC_API void FSE_freeDTable(FSE_DTable* dt); - -/*! FSE_buildDTable(): - Builds 'dt', which must be already allocated, using FSE_createDTable(). - return : 0, or an errorCode, which can be tested using FSE_isError() */ -FSE_PUBLIC_API size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog); - -/*! FSE_decompress_usingDTable(): - Decompress compressed source `cSrc` of size `cSrcSize` using `dt` - into `dst` which must be already allocated. - @return : size of regenerated data (necessarily <= `dstCapacity`), - or an errorCode, which can be tested using FSE_isError() */ -FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt); /*! Tutorial : @@ -320,24 +260,15 @@ If there is an error, the function will return an error code, which can be teste unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus); /**< same as FSE_optimalTableLog(), which used `minus==2` */ -/* FSE_compress_wksp() : - * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`). - * FSE_COMPRESS_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable. - */ -#define FSE_COMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) ) -size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); - -size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits); -/**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */ - size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue); /**< build a fake FSE_CTable, designed to compress always the same symbolValue */ /* FSE_buildCTable_wksp() : * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`). * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`. + * See FSE_buildCTable_wksp() for breakdown of workspace usage. */ -#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (maxSymbolValue + 2 + (1ull << (tableLog - 2))) +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */) #define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)) size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); @@ -346,19 +277,11 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< Same as FSE_buildDTable(), using an externally allocated `workspace` produced with `FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxSymbolValue)` */ -size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits); -/**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */ - -size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue); -/**< build a fake FSE_DTable, designed to always generate the same symbolValue */ - -#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) +#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + 1 + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) #define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned)) -size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize); -/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)` */ - size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2); -/**< Same as FSE_decompress_wksp() but with dynamic BMI2 support. Pass 1 if your CPU supports BMI2 or 0 if it doesn't. */ +/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)`. + * Set bmi2 to 1 if your CPU supports BMI2 or 0 if it doesn't */ typedef enum { FSE_repeat_none, /**< Cannot use the previous table */ @@ -554,7 +477,7 @@ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePt /* FSE_getMaxNbBits() : * Approximate maximum cost of a symbol, in bits. - * Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) + * Fractional get rounded up (i.e. a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) * note 1 : assume symbolValue is valid (<= maxSymbolValue) * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue) diff --git a/src/dependencies/zstd-1.5.0/lib/common/fse_decompress.c b/src/dependencies/zstd-1.5.4/lib/common/fse_decompress.c similarity index 76% rename from src/dependencies/zstd-1.5.0/lib/common/fse_decompress.c rename to src/dependencies/zstd-1.5.4/lib/common/fse_decompress.c index f4ff58f..1e1c9f9 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/fse_decompress.c +++ b/src/dependencies/zstd-1.5.4/lib/common/fse_decompress.c @@ -1,6 +1,6 @@ /* ****************************************************************** * FSE : Finite State Entropy decoder - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -24,6 +24,7 @@ #include "error_private.h" #define ZSTD_DEPS_NEED_MALLOC #include "zstd_deps.h" +#include "bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -55,19 +56,6 @@ #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y) #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y) - -/* Function templates */ -FSE_DTable* FSE_createDTable (unsigned tableLog) -{ - if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX; - return (FSE_DTable*)ZSTD_malloc( FSE_DTABLE_SIZE_U32(tableLog) * sizeof (U32) ); -} - -void FSE_freeDTable (FSE_DTable* dt) -{ - ZSTD_free(dt); -} - static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize) { void* const tdPtr = dt+1; /* because *dt is unsigned, 32-bits aligned on 32-bits */ @@ -127,10 +115,10 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo } } /* Now we spread those positions across the table. - * The benefit of doing it in two stages is that we avoid the the + * The benefit of doing it in two stages is that we avoid the * variable size inner loop, which caused lots of branch misses. * Now we can run through all the positions without any branch misses. - * We unroll the loop twice, since that is what emperically worked best. + * We unroll the loop twice, since that is what empirically worked best. */ { size_t position = 0; @@ -166,7 +154,7 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo for (u=0; utableLog = 0; - DTableH->fastMode = 0; - - cell->newState = 0; - cell->symbol = symbolValue; - cell->nbBits = 0; - - return 0; -} - - -size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits) -{ - void* ptr = dt; - FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr; - void* dPtr = dt + 1; - FSE_decode_t* const dinfo = (FSE_decode_t*)dPtr; - const unsigned tableSize = 1 << nbBits; - const unsigned tableMask = tableSize - 1; - const unsigned maxSV1 = tableMask+1; - unsigned s; - - /* Sanity checks */ - if (nbBits < 1) return ERROR(GENERIC); /* min size */ - - /* Build Decoding Table */ - DTableH->tableLog = (U16)nbBits; - DTableH->fastMode = 1; - for (s=0; sfastMode; - - /* select fast mode (static) */ - if (fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1); - return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0); -} - - -size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) -{ - return FSE_decompress_wksp_bmi2(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, /* bmi2 */ 0); -} - typedef struct { short ncount[FSE_MAX_SYMBOL_VALUE + 1]; FSE_DTable dtable[1]; /* Dynamically sized */ @@ -342,7 +267,8 @@ FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body( } if (FSE_DECOMPRESS_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(tableLog_tooLarge); - workSpace = wksp->dtable + FSE_DTABLE_SIZE_U32(tableLog); + assert(sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog) <= wkspSize); + workSpace = (BYTE*)workSpace + sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); wkspSize -= sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); CHECK_F( FSE_buildDTable_internal(wksp->dtable, wksp->ncount, maxSymbolValue, tableLog, workSpace, wkspSize) ); @@ -365,7 +291,7 @@ static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, co } #if DYNAMIC_BMI2 -TARGET_ATTRIBUTE("bmi2") static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) { return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1); } @@ -382,22 +308,4 @@ size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, return FSE_decompress_wksp_body_default(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize); } - -typedef FSE_DTable DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)]; - -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) { - U32 wksp[FSE_BUILD_DTABLE_WKSP_SIZE_U32(FSE_TABLELOG_ABSOLUTE_MAX, FSE_MAX_SYMBOL_VALUE)]; - return FSE_buildDTable_wksp(dt, normalizedCounter, maxSymbolValue, tableLog, wksp, sizeof(wksp)); -} - -size_t FSE_decompress(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize) -{ - /* Static analyzer seems unable to understand this table will be properly initialized later */ - U32 wksp[FSE_DECOMPRESS_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)]; - return FSE_decompress_wksp(dst, dstCapacity, cSrc, cSrcSize, FSE_MAX_TABLELOG, wksp, sizeof(wksp)); -} -#endif - - #endif /* FSE_COMMONDEFS_ONLY */ diff --git a/src/dependencies/zstd-1.5.4/lib/common/huf.h b/src/dependencies/zstd-1.5.4/lib/common/huf.h new file mode 100644 index 0000000..73d1ee5 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/huf.h @@ -0,0 +1,273 @@ +/* ****************************************************************** + * huff0 huffman codec, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef HUF_H_298734234 +#define HUF_H_298734234 + +/* *** Dependencies *** */ +#include "zstd_deps.h" /* size_t */ +#include "mem.h" /* U32 */ +#define FSE_STATIC_LINKING_ONLY +#include "fse.h" + + +/* *** Tool functions *** */ +#define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */ +size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */ + +/* Error Management */ +unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */ +const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */ + + +#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */) +#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64)) + +/* *** Constants *** */ +#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */ +#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */ +#define HUF_SYMBOLVALUE_MAX 255 + +#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ +#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX) +# error "HUF_TABLELOG_MAX is too large !" +#endif + + +/* **************************************** +* Static allocation +******************************************/ +/* HUF buffer bounds */ +#define HUF_CTABLEBOUND 129 +#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true when incompressible is pre-filtered with fast heuristic */ +#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ + +/* static allocation of HUF's Compression Table */ +/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */ +typedef size_t HUF_CElt; /* consider it an incomplete type */ +#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */ +#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t)) +#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ + HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */ + +/* static allocation of HUF's DTable */ +typedef U32 HUF_DTable; +#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog))) +#define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) } +#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) } + + +/* **************************************** +* Advanced decompression functions +******************************************/ + +/** + * Huffman flags bitset. + * For all flags, 0 is the default value. + */ +typedef enum { + /** + * If compiled with DYNAMIC_BMI2: Set flag only if the CPU supports BMI2 at runtime. + * Otherwise: Ignored. + */ + HUF_flags_bmi2 = (1 << 0), + /** + * If set: Test possible table depths to find the one that produces the smallest header + encoded size. + * If unset: Use heuristic to find the table depth. + */ + HUF_flags_optimalDepth = (1 << 1), + /** + * If set: If the previous table can encode the input, always reuse the previous table. + * If unset: If the previous table can encode the input, reuse the previous table if it results in a smaller output. + */ + HUF_flags_preferRepeat = (1 << 2), + /** + * If set: Sample the input and check if the sample is uncompressible, if it is then don't attempt to compress. + * If unset: Always histogram the entire input. + */ + HUF_flags_suspectUncompressible = (1 << 3), + /** + * If set: Don't use assembly implementations + * If unset: Allow using assembly implementations + */ + HUF_flags_disableAsm = (1 << 4), + /** + * If set: Don't use the fast decoding loop, always use the fallback decoding loop. + * If unset: Use the fast decoding loop when possible. + */ + HUF_flags_disableFast = (1 << 5) +} HUF_flags_e; + + +/* **************************************** + * HUF detailed API + * ****************************************/ +#define HUF_OPTIMAL_DEPTH_THRESHOLD ZSTD_btultra + +/*! HUF_compress() does the following: + * 1. count symbol occurrence from source[] into table count[] using FSE_count() (exposed within "fse.h") + * 2. (optional) refine tableLog using HUF_optimalTableLog() + * 3. build Huffman table from count using HUF_buildCTable() + * 4. save Huffman table to memory buffer using HUF_writeCTable() + * 5. encode the data stream using HUF_compress4X_usingCTable() + * + * The following API allows targeting specific sub-functions for advanced tasks. + * For example, it's possible to compress several blocks using the same 'CTable', + * or to save and regenerate 'CTable' using external methods. + */ +unsigned HUF_minTableLog(unsigned symbolCardinality); +unsigned HUF_cardinality(const unsigned* count, unsigned maxSymbolValue); +unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, void* workSpace, + size_t wkspSize, HUF_CElt* table, const unsigned* count, int flags); /* table is used as scratch space for building and testing tables, not a return value */ +size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize); +size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); +int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); + +typedef enum { + HUF_repeat_none, /**< Cannot use the previous table */ + HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1, 4}X_repeat */ + HUF_repeat_valid /**< Can use the previous table and it is assumed to be valid */ + } HUF_repeat; + +/** HUF_compress4X_repeat() : + * Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress4X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +/** HUF_buildCTable_wksp() : + * Same as HUF_buildCTable(), but using externally allocated scratch buffer. + * `workSpace` must be aligned on 4-bytes boundaries, and its size must be >= HUF_CTABLE_WORKSPACE_SIZE. + */ +#define HUF_CTABLE_WORKSPACE_SIZE_U32 ((4 * (HUF_SYMBOLVALUE_MAX + 1)) + 192) +#define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_buildCTable_wksp (HUF_CElt* tree, + const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, + void* workSpace, size_t wkspSize); + +/*! HUF_readStats() : + * Read compact Huffman tree, saved by HUF_writeCTable(). + * `huffWeight` is destination buffer. + * @return : size read from `src` , or an error Code . + * Note : Needed by HUF_readCTable() and HUF_readDTableXn() . */ +size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize); + +/*! HUF_readStats_wksp() : + * Same as HUF_readStats() but takes an external workspace which must be + * 4-byte aligned and its size must be >= HUF_READ_STATS_WORKSPACE_SIZE. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +#define HUF_READ_STATS_WORKSPACE_SIZE_U32 FSE_DECOMPRESS_WKSP_SIZE_U32(6, HUF_TABLELOG_MAX-1) +#define HUF_READ_STATS_WORKSPACE_SIZE (HUF_READ_STATS_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workspace, size_t wkspSize, + int flags); + +/** HUF_readCTable() : + * Loading a CTable saved with HUF_writeCTable() */ +size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights); + +/** HUF_getNbBitsFromCTable() : + * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX + * Note 1 : is not inlined, as HUF_CElt definition is private */ +U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue); + +/* + * HUF_decompress() does the following: + * 1. select the decompression algorithm (X1, X2) based on pre-computed heuristics + * 2. build Huffman table from save, using HUF_readDTableX?() + * 3. decode 1 or 4 segments in parallel using HUF_decompress?X?_usingDTable() + */ + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize); + +/** + * The minimum workspace size for the `workSpace` used in + * HUF_readDTableX1_wksp() and HUF_readDTableX2_wksp(). + * + * The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when + * HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15. + * Buffer overflow errors may potentially occur if code modifications result in + * a required workspace size greater than that specified in the following + * macro. + */ +#define HUF_DECOMPRESS_WORKSPACE_SIZE ((2 << 10) + (1 << 9)) +#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32)) + + +/* ====================== */ +/* single stream variants */ +/* ====================== */ + +size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +/** HUF_compress1X_repeat() : + * Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress1X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); /**< double-symbols decoder */ +#endif + +/* BMI2 variants. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#endif +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif + +#endif /* HUF_H_298734234 */ + +#if defined (__cplusplus) +} +#endif diff --git a/src/dependencies/zstd-1.5.0/lib/common/mem.h b/src/dependencies/zstd-1.5.4/lib/common/mem.h similarity index 83% rename from src/dependencies/zstd-1.5.0/lib/common/mem.h rename to src/dependencies/zstd-1.5.4/lib/common/mem.h index 9f3b81a..98dd47a 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/mem.h +++ b/src/dependencies/zstd-1.5.4/lib/common/mem.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -51,6 +51,8 @@ extern "C" { # include /* intptr_t */ # endif typedef uint8_t BYTE; + typedef uint8_t U8; + typedef int8_t S8; typedef uint16_t U16; typedef int16_t S16; typedef uint32_t U32; @@ -63,6 +65,8 @@ extern "C" { # error "this implementation requires char to be exactly 8-bit type" #endif typedef unsigned char BYTE; + typedef unsigned char U8; + typedef signed char S8; #if USHRT_MAX != 65535 # error "this implementation requires short to be exactly 16-bit type" #endif @@ -129,21 +133,15 @@ MEM_STATIC size_t MEM_swapST(size_t in); /*-************************************************************** * Memory I/O Implementation *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (i.e., not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. +/* MEM_FORCE_MEMORY_ACCESS : For accessing unaligned memory: + * Method 0 : always use `memcpy()`. Safe and portable. + * Method 1 : Use compiler extension to set unaligned access. * Method 2 : direct access. This method is portable but violate C standard. * It can generate buggy code on targets depending on alignment. - * In some circumstances, it's the only known way to get the most performance (i.e. GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) + * Default : method 1 if supported, else method 0 */ #ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__) +# ifdef __GNUC__ # define MEM_FORCE_MEMORY_ACCESS 1 # endif #endif @@ -153,8 +151,22 @@ MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } MEM_STATIC unsigned MEM_isLittleEndian(void) { +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return 1; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return 0; +#elif defined(__clang__) && __LITTLE_ENDIAN__ + return 1; +#elif defined(__clang__) && __BIG_ENDIAN__ + return 0; +#elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86) + return 1; +#elif defined(__DMC__) && defined(_M_IX86) + return 1; +#else const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ return one.c[0]; +#endif } #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) @@ -172,30 +184,19 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; } #elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -#if defined(_MSC_VER) || (defined(__INTEL_COMPILER) && defined(WIN32)) - __pragma( pack(push, 1) ) - typedef struct { U16 v; } unalign16; - typedef struct { U32 v; } unalign32; - typedef struct { U64 v; } unalign64; - typedef struct { size_t v; } unalignArch; - __pragma( pack(pop) ) -#else - typedef struct { U16 v; } __attribute__((packed)) unalign16; - typedef struct { U32 v; } __attribute__((packed)) unalign32; - typedef struct { U64 v; } __attribute__((packed)) unalign64; - typedef struct { size_t v; } __attribute__((packed)) unalignArch; -#endif +typedef __attribute__((aligned(1))) U16 unalign16; +typedef __attribute__((aligned(1))) U32 unalign32; +typedef __attribute__((aligned(1))) U64 unalign64; +typedef __attribute__((aligned(1))) size_t unalignArch; -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign16*)ptr)->v; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign32*)ptr)->v; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign64*)ptr)->v; } -MEM_STATIC size_t MEM_readST(const void* ptr) { return ((const unalignArch*)ptr)->v; } +MEM_STATIC U16 MEM_read16(const void* ptr) { return *(const unalign16*)ptr; } +MEM_STATIC U32 MEM_read32(const void* ptr) { return *(const unalign32*)ptr; } +MEM_STATIC U64 MEM_read64(const void* ptr) { return *(const unalign64*)ptr; } +MEM_STATIC size_t MEM_readST(const void* ptr) { return *(const unalignArch*)ptr; } -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign16*)memPtr)->v = value; } -MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign32*)memPtr)->v = value; } -MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign64*)memPtr)->v = value; } +MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(unalign16*)memPtr = value; } +MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(unalign32*)memPtr = value; } +MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(unalign64*)memPtr = value; } #else @@ -239,6 +240,14 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) #endif /* MEM_FORCE_MEMORY_ACCESS */ +MEM_STATIC U32 MEM_swap32_fallback(U32 in) +{ + return ((in << 24) & 0xff000000 ) | + ((in << 8) & 0x00ff0000 ) | + ((in >> 8) & 0x0000ff00 ) | + ((in >> 24) & 0x000000ff ); +} + MEM_STATIC U32 MEM_swap32(U32 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -247,13 +256,22 @@ MEM_STATIC U32 MEM_swap32(U32 in) || (defined(__clang__) && __has_builtin(__builtin_bswap32)) return __builtin_bswap32(in); #else - return ((in << 24) & 0xff000000 ) | - ((in << 8) & 0x00ff0000 ) | - ((in >> 8) & 0x0000ff00 ) | - ((in >> 24) & 0x000000ff ); + return MEM_swap32_fallback(in); #endif } +MEM_STATIC U64 MEM_swap64_fallback(U64 in) +{ + return ((in << 56) & 0xff00000000000000ULL) | + ((in << 40) & 0x00ff000000000000ULL) | + ((in << 24) & 0x0000ff0000000000ULL) | + ((in << 8) & 0x000000ff00000000ULL) | + ((in >> 8) & 0x00000000ff000000ULL) | + ((in >> 24) & 0x0000000000ff0000ULL) | + ((in >> 40) & 0x000000000000ff00ULL) | + ((in >> 56) & 0x00000000000000ffULL); +} + MEM_STATIC U64 MEM_swap64(U64 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -262,14 +280,7 @@ MEM_STATIC U64 MEM_swap64(U64 in) || (defined(__clang__) && __has_builtin(__builtin_bswap64)) return __builtin_bswap64(in); #else - return ((in << 56) & 0xff00000000000000ULL) | - ((in << 40) & 0x00ff000000000000ULL) | - ((in << 24) & 0x0000ff0000000000ULL) | - ((in << 8) & 0x000000ff00000000ULL) | - ((in >> 8) & 0x00000000ff000000ULL) | - ((in >> 24) & 0x0000000000ff0000ULL) | - ((in >> 40) & 0x000000000000ff00ULL) | - ((in >> 56) & 0x00000000000000ffULL); + return MEM_swap64_fallback(in); #endif } diff --git a/src/dependencies/zstd-1.5.0/lib/common/pool.c b/src/dependencies/zstd-1.5.4/lib/common/pool.c similarity index 88% rename from src/dependencies/zstd-1.5.0/lib/common/pool.c rename to src/dependencies/zstd-1.5.4/lib/common/pool.c index ea70b8b..f3d9d08 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/pool.c +++ b/src/dependencies/zstd-1.5.4/lib/common/pool.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -12,7 +12,7 @@ /* ====== Dependencies ======= */ #include "zstd_deps.h" /* size_t */ #include "debug.h" /* assert */ -#include "zstd_internal.h" /* ZSTD_customMalloc, ZSTD_customFree */ +#include "zstd_internal.h" /* ZSTD_customCalloc, ZSTD_customFree */ #include "pool.h" /* ====== Compiler specifics ====== */ @@ -86,7 +86,7 @@ static void* POOL_thread(void* opaque) { { POOL_job const job = ctx->queue[ctx->queueHead]; ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize; ctx->numThreadsBusy++; - ctx->queueEmpty = ctx->queueHead == ctx->queueTail; + ctx->queueEmpty = (ctx->queueHead == ctx->queueTail); /* Unlock the mutex, signal a pusher, and run the job */ ZSTD_pthread_cond_signal(&ctx->queuePushCond); ZSTD_pthread_mutex_unlock(&ctx->queueMutex); @@ -96,15 +96,14 @@ static void* POOL_thread(void* opaque) { /* If the intended queue size was 0, signal after finishing job */ ZSTD_pthread_mutex_lock(&ctx->queueMutex); ctx->numThreadsBusy--; - if (ctx->queueSize == 1) { - ZSTD_pthread_cond_signal(&ctx->queuePushCond); - } + ZSTD_pthread_cond_signal(&ctx->queuePushCond); ZSTD_pthread_mutex_unlock(&ctx->queueMutex); } } /* for (;;) */ assert(0); /* Unreachable */ } +/* ZSTD_createThreadPool() : public access point */ POOL_ctx* ZSTD_createThreadPool(size_t numThreads) { return POOL_create (numThreads, 0); } @@ -114,7 +113,8 @@ POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { } POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, - ZSTD_customMem customMem) { + ZSTD_customMem customMem) +{ POOL_ctx* ctx; /* Check parameters */ if (!numThreads) { return NULL; } @@ -126,7 +126,7 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, * empty and full queues. */ ctx->queueSize = queueSize + 1; - ctx->queue = (POOL_job*)ZSTD_customMalloc(ctx->queueSize * sizeof(POOL_job), customMem); + ctx->queue = (POOL_job*)ZSTD_customCalloc(ctx->queueSize * sizeof(POOL_job), customMem); ctx->queueHead = 0; ctx->queueTail = 0; ctx->numThreadsBusy = 0; @@ -140,7 +140,7 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, } ctx->shutdown = 0; /* Allocate space for the thread handles */ - ctx->threads = (ZSTD_pthread_t*)ZSTD_customMalloc(numThreads * sizeof(ZSTD_pthread_t), customMem); + ctx->threads = (ZSTD_pthread_t*)ZSTD_customCalloc(numThreads * sizeof(ZSTD_pthread_t), customMem); ctx->threadCapacity = 0; ctx->customMem = customMem; /* Check for errors */ @@ -173,7 +173,7 @@ static void POOL_join(POOL_ctx* ctx) { /* Join all of the threads */ { size_t i; for (i = 0; i < ctx->threadCapacity; ++i) { - ZSTD_pthread_join(ctx->threads[i], NULL); /* note : could fail */ + ZSTD_pthread_join(ctx->threads[i]); /* note : could fail */ } } } @@ -188,11 +188,22 @@ void POOL_free(POOL_ctx *ctx) { ZSTD_customFree(ctx, ctx->customMem); } +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx) { + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + while(!ctx->queueEmpty || ctx->numThreadsBusy > 0) { + ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex); + } + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); +} + void ZSTD_freeThreadPool (ZSTD_threadPool* pool) { POOL_free (pool); } -size_t POOL_sizeof(POOL_ctx *ctx) { +size_t POOL_sizeof(const POOL_ctx* ctx) { if (ctx==NULL) return 0; /* supports sizeof NULL */ return sizeof(*ctx) + ctx->queueSize * sizeof(POOL_job) @@ -209,7 +220,7 @@ static int POOL_resize_internal(POOL_ctx* ctx, size_t numThreads) return 0; } /* numThreads > threadCapacity */ - { ZSTD_pthread_t* const threadPool = (ZSTD_pthread_t*)ZSTD_customMalloc(numThreads * sizeof(ZSTD_pthread_t), ctx->customMem); + { ZSTD_pthread_t* const threadPool = (ZSTD_pthread_t*)ZSTD_customCalloc(numThreads * sizeof(ZSTD_pthread_t), ctx->customMem); if (!threadPool) return 1; /* replace existing thread pool */ ZSTD_memcpy(threadPool, ctx->threads, ctx->threadCapacity * sizeof(*threadPool)); @@ -257,9 +268,12 @@ static int isQueueFull(POOL_ctx const* ctx) { } -static void POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque) +static void +POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque) { - POOL_job const job = {function, opaque}; + POOL_job job; + job.function = function; + job.opaque = opaque; assert(ctx != NULL); if (ctx->shutdown) return; @@ -313,7 +327,9 @@ POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { return POOL_create_advanced(numThreads, queueSize, ZSTD_defaultCMem); } -POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) { +POOL_ctx* +POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) +{ (void)numThreads; (void)queueSize; (void)customMem; @@ -325,6 +341,11 @@ void POOL_free(POOL_ctx* ctx) { (void)ctx; } +void POOL_joinJobs(POOL_ctx* ctx){ + assert(!ctx || ctx == &g_poolCtx); + (void)ctx; +} + int POOL_resize(POOL_ctx* ctx, size_t numThreads) { (void)ctx; (void)numThreads; return 0; @@ -341,7 +362,7 @@ int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) { return 1; } -size_t POOL_sizeof(POOL_ctx* ctx) { +size_t POOL_sizeof(const POOL_ctx* ctx) { if (ctx==NULL) return 0; /* supports sizeof NULL */ assert(ctx == &g_poolCtx); return sizeof(*ctx); diff --git a/src/dependencies/zstd-1.5.0/lib/common/pool.h b/src/dependencies/zstd-1.5.4/lib/common/pool.h similarity index 89% rename from src/dependencies/zstd-1.5.0/lib/common/pool.h rename to src/dependencies/zstd-1.5.4/lib/common/pool.h index e18aa07..eb22ff5 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/pool.h +++ b/src/dependencies/zstd-1.5.4/lib/common/pool.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -38,6 +38,12 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, */ void POOL_free(POOL_ctx* ctx); + +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx); + /*! POOL_resize() : * Expands or shrinks pool's number of threads. * This is more efficient than releasing + creating a new context, @@ -53,7 +59,7 @@ int POOL_resize(POOL_ctx* ctx, size_t numThreads); * @return threadpool memory usage * note : compatible with NULL (returns 0 in this case) */ -size_t POOL_sizeof(POOL_ctx* ctx); +size_t POOL_sizeof(const POOL_ctx* ctx); /*! POOL_function : * The function type that can be added to a thread pool. @@ -70,7 +76,7 @@ void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque); /*! POOL_tryAdd() : - * Add the job `function(opaque)` to thread pool _if_ a worker is available. + * Add the job `function(opaque)` to thread pool _if_ a queue slot is available. * Returns immediately even if not (does not block). * @return : 1 if successful, 0 if not. */ diff --git a/src/dependencies/zstd-1.5.4/lib/common/portability_macros.h b/src/dependencies/zstd-1.5.4/lib/common/portability_macros.h new file mode 100644 index 0000000..8fd6ea8 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/portability_macros.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_PORTABILITY_MACROS_H +#define ZSTD_PORTABILITY_MACROS_H + +/** + * This header file contains macro definitions to support portability. + * This header is shared between C and ASM code, so it MUST only + * contain macro definitions. It MUST not contain any C code. + * + * This header ONLY defines macros to detect platforms/feature support. + * + */ + + +/* compat. with non-clang compilers */ +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +/* detects whether we are being compiled under msan */ +#ifndef ZSTD_MEMORY_SANITIZER +# if __has_feature(memory_sanitizer) +# define ZSTD_MEMORY_SANITIZER 1 +# else +# define ZSTD_MEMORY_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under asan */ +#ifndef ZSTD_ADDRESS_SANITIZER +# if __has_feature(address_sanitizer) +# define ZSTD_ADDRESS_SANITIZER 1 +# elif defined(__SANITIZE_ADDRESS__) +# define ZSTD_ADDRESS_SANITIZER 1 +# else +# define ZSTD_ADDRESS_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under dfsan */ +#ifndef ZSTD_DATAFLOW_SANITIZER +# if __has_feature(dataflow_sanitizer) +# define ZSTD_DATAFLOW_SANITIZER 1 +# else +# define ZSTD_DATAFLOW_SANITIZER 0 +# endif +#endif + +/* Mark the internal assembly functions as hidden */ +#ifdef __ELF__ +# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func +#else +# define ZSTD_HIDE_ASM_FUNCTION(func) +#endif + +/* Enable runtime BMI2 dispatch based on the CPU. + * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. + */ +#ifndef DYNAMIC_BMI2 + #if ((defined(__clang__) && __has_attribute(__target__)) \ + || (defined(__GNUC__) \ + && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ + && (defined(__x86_64__) || defined(_M_X64)) \ + && !defined(__BMI2__) + # define DYNAMIC_BMI2 1 + #else + # define DYNAMIC_BMI2 0 + #endif +#endif + +/** + * Only enable assembly for GNUC compatible compilers, + * because other platforms may not support GAS assembly syntax. + * + * Only enable assembly for Linux / MacOS, other platforms may + * work, but they haven't been tested. This could likely be + * extended to BSD systems. + * + * Disable assembly when MSAN is enabled, because MSAN requires + * 100% of code to be instrumented to work. + */ +#if defined(__GNUC__) +# if defined(__linux__) || defined(__linux) || defined(__APPLE__) +# if ZSTD_MEMORY_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# elif ZSTD_DATAFLOW_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# else +# define ZSTD_ASM_SUPPORTED 1 +# endif +# else +# define ZSTD_ASM_SUPPORTED 0 +# endif +#else +# define ZSTD_ASM_SUPPORTED 0 +#endif + +/** + * Determines whether we should enable assembly for x86-64 + * with BMI2. + * + * Enable if all of the following conditions hold: + * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM + * - Assembly is supported + * - We are compiling for x86-64 and either: + * - DYNAMIC_BMI2 is enabled + * - BMI2 is supported at compile time + */ +#if !defined(ZSTD_DISABLE_ASM) && \ + ZSTD_ASM_SUPPORTED && \ + defined(__x86_64__) && \ + (DYNAMIC_BMI2 || defined(__BMI2__)) +# define ZSTD_ENABLE_ASM_X86_64_BMI2 1 +#else +# define ZSTD_ENABLE_ASM_X86_64_BMI2 0 +#endif + +/* + * For x86 ELF targets, add .note.gnu.property section for Intel CET in + * assembly sources when CET is enabled. + * + * Additionally, any function that may be called indirectly must begin + * with ZSTD_CET_ENDBRANCH. + */ +#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \ + && defined(__has_include) +# if __has_include() +# include +# define ZSTD_CET_ENDBRANCH _CET_ENDBR +# endif +#endif + +#ifndef ZSTD_CET_ENDBRANCH +# define ZSTD_CET_ENDBRANCH +#endif + +#endif /* ZSTD_PORTABILITY_MACROS_H */ diff --git a/src/dependencies/zstd-1.5.4/lib/common/threading.c b/src/dependencies/zstd-1.5.4/lib/common/threading.c new file mode 100644 index 0000000..f234110 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/threading.c @@ -0,0 +1,176 @@ +/** + * Copyright (c) 2016 Tino Reichardt + * All rights reserved. + * + * You can contact the author at: + * - zstdmt source repository: https://github.com/mcmilk/zstdmt + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/** + * This file will hold wrapper for systems, which do not support pthreads + */ + +#include "threading.h" + +/* create fake symbol to avoid empty translation unit warning */ +int g_ZSTD_threading_useless_symbol; + +#if defined(ZSTD_MULTITHREAD) && defined(_WIN32) + +/** + * Windows minimalist Pthread Wrapper + */ + + +/* === Dependencies === */ +#include +#include + + +/* === Implementation === */ + +typedef struct { + void* (*start_routine)(void*); + void* arg; + int initialized; + ZSTD_pthread_cond_t initialized_cond; + ZSTD_pthread_mutex_t initialized_mutex; +} ZSTD_thread_params_t; + +static unsigned __stdcall worker(void *arg) +{ + void* (*start_routine)(void*); + void* thread_arg; + + /* Inialized thread_arg and start_routine and signal main thread that we don't need it + * to wait any longer. + */ + { + ZSTD_thread_params_t* thread_param = (ZSTD_thread_params_t*)arg; + thread_arg = thread_param->arg; + start_routine = thread_param->start_routine; + + /* Signal main thread that we are running and do not depend on its memory anymore */ + ZSTD_pthread_mutex_lock(&thread_param->initialized_mutex); + thread_param->initialized = 1; + ZSTD_pthread_cond_signal(&thread_param->initialized_cond); + ZSTD_pthread_mutex_unlock(&thread_param->initialized_mutex); + } + + start_routine(thread_arg); + + return 0; +} + +int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, + void* (*start_routine) (void*), void* arg) +{ + ZSTD_thread_params_t thread_param; + (void)unused; + + thread_param.start_routine = start_routine; + thread_param.arg = arg; + thread_param.initialized = 0; + *thread = NULL; + + /* Setup thread initialization synchronization */ + if(ZSTD_pthread_cond_init(&thread_param.initialized_cond, NULL)) { + /* Should never happen on Windows */ + return -1; + } + if(ZSTD_pthread_mutex_init(&thread_param.initialized_mutex, NULL)) { + /* Should never happen on Windows */ + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + return -1; + } + + /* Spawn thread */ + *thread = (HANDLE)_beginthreadex(NULL, 0, worker, &thread_param, 0, NULL); + if (!thread) { + ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex); + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + return errno; + } + + /* Wait for thread to be initialized */ + ZSTD_pthread_mutex_lock(&thread_param.initialized_mutex); + while(!thread_param.initialized) { + ZSTD_pthread_cond_wait(&thread_param.initialized_cond, &thread_param.initialized_mutex); + } + ZSTD_pthread_mutex_unlock(&thread_param.initialized_mutex); + ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex); + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + + return 0; +} + +int ZSTD_pthread_join(ZSTD_pthread_t thread) +{ + DWORD result; + + if (!thread) return 0; + + result = WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + + switch (result) { + case WAIT_OBJECT_0: + return 0; + case WAIT_ABANDONED: + return EINVAL; + default: + return GetLastError(); + } +} + +#endif /* ZSTD_MULTITHREAD */ + +#if defined(ZSTD_MULTITHREAD) && DEBUGLEVEL >= 1 && !defined(_WIN32) + +#define ZSTD_DEPS_NEED_MALLOC +#include "zstd_deps.h" + +int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr) +{ + *mutex = (pthread_mutex_t*)ZSTD_malloc(sizeof(pthread_mutex_t)); + if (!*mutex) + return 1; + return pthread_mutex_init(*mutex, attr); +} + +int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex) +{ + if (!*mutex) + return 0; + { + int const ret = pthread_mutex_destroy(*mutex); + ZSTD_free(*mutex); + return ret; + } +} + +int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr) +{ + *cond = (pthread_cond_t*)ZSTD_malloc(sizeof(pthread_cond_t)); + if (!*cond) + return 1; + return pthread_cond_init(*cond, attr); +} + +int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond) +{ + if (!*cond) + return 0; + { + int const ret = pthread_cond_destroy(*cond); + ZSTD_free(*cond); + return ret; + } +} + +#endif diff --git a/src/dependencies/zstd-1.5.0/lib/common/threading.h b/src/dependencies/zstd-1.5.4/lib/common/threading.h similarity index 92% rename from src/dependencies/zstd-1.5.0/lib/common/threading.h rename to src/dependencies/zstd-1.5.4/lib/common/threading.h index fd0060d..fb5c1c8 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/threading.h +++ b/src/dependencies/zstd-1.5.4/lib/common/threading.h @@ -23,8 +23,7 @@ extern "C" { #if defined(ZSTD_MULTITHREAD) && defined(_WIN32) /** - * Windows minimalist Pthread Wrapper, based on : - * http://www.cse.wustl.edu/~schmidt/win32-cv-1.html + * Windows minimalist Pthread Wrapper */ #ifdef WINVER # undef WINVER @@ -62,16 +61,12 @@ extern "C" { #define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a)) /* ZSTD_pthread_create() and ZSTD_pthread_join() */ -typedef struct { - HANDLE handle; - void* (*start_routine)(void*); - void* arg; -} ZSTD_pthread_t; +typedef HANDLE ZSTD_pthread_t; int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, void* (*start_routine) (void*), void* arg); -int ZSTD_pthread_join(ZSTD_pthread_t thread, void** value_ptr); +int ZSTD_pthread_join(ZSTD_pthread_t thread); /** * add here more wrappers as required @@ -99,7 +94,7 @@ int ZSTD_pthread_join(ZSTD_pthread_t thread, void** value_ptr); #define ZSTD_pthread_t pthread_t #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) -#define ZSTD_pthread_join(a, b) pthread_join((a),(b)) +#define ZSTD_pthread_join(a) pthread_join((a),NULL) #else /* DEBUGLEVEL >= 1 */ @@ -124,7 +119,7 @@ int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond); #define ZSTD_pthread_t pthread_t #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) -#define ZSTD_pthread_join(a, b) pthread_join((a),(b)) +#define ZSTD_pthread_join(a) pthread_join((a),NULL) #endif diff --git a/src/dependencies/zstd-1.5.4/lib/common/xxhash.c b/src/dependencies/zstd-1.5.4/lib/common/xxhash.c new file mode 100644 index 0000000..fd237c9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/xxhash.c @@ -0,0 +1,24 @@ +/* + * xxHash - Fast Hash algorithm + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - xxHash homepage: https://cyan4973.github.io/xxHash/ + * - xxHash source repository : https://github.com/Cyan4973/xxHash + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +*/ + + + +/* + * xxhash.c instantiates functions defined in xxhash.h + */ + +#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ +#define XXH_IMPLEMENTATION /* access definitions */ + +#include "xxhash.h" diff --git a/src/dependencies/zstd-1.5.4/lib/common/xxhash.h b/src/dependencies/zstd-1.5.4/lib/common/xxhash.h new file mode 100644 index 0000000..b8b7329 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/common/xxhash.h @@ -0,0 +1,5686 @@ +/* + * xxHash - Fast Hash algorithm + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - xxHash homepage: https://cyan4973.github.io/xxHash/ + * - xxHash source repository : https://github.com/Cyan4973/xxHash + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +*/ + + +#ifndef XXH_NO_XXH3 +# define XXH_NO_XXH3 +#endif + +#ifndef XXH_NAMESPACE +# define XXH_NAMESPACE ZSTD_ +#endif + +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ +/* TODO: update */ +/* Notice extracted from xxHash homepage: + +xxHash is an extremely fast hash algorithm, running at RAM speed limits. +It also successfully passes all tests from the SMHasher suite. + +Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) + +Name Speed Q.Score Author +xxHash 5.4 GB/s 10 +CrapWow 3.2 GB/s 2 Andrew +MurmurHash 3a 2.7 GB/s 10 Austin Appleby +SpookyHash 2.0 GB/s 10 Bob Jenkins +SBox 1.4 GB/s 9 Bret Mulvey +Lookup3 1.2 GB/s 9 Bob Jenkins +SuperFastHash 1.2 GB/s 1 Paul Hsieh +CityHash64 1.05 GB/s 10 Pike & Alakuijala +FNV 0.55 GB/s 5 Fowler, Noll, Vo +CRC32 0.43 GB/s 9 +MD5-32 0.33 GB/s 10 Ronald L. Rivest +SHA1-32 0.28 GB/s 10 + +Q.Score is a measure of quality of the hash function. +It depends on successfully passing SMHasher test set. +10 is a perfect score. + +Note: SMHasher's CRC32 implementation is not the fastest one. +Other speed-oriented implementations can be faster, +especially in combination with PCLMUL instruction: +https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735 + +A 64-bit version, named XXH64, is available since r35. +It offers much better speed, but for 64-bit applications only. +Name Speed on 64 bits Speed on 32 bits +XXH64 13.8 GB/s 1.9 GB/s +XXH32 6.8 GB/s 6.0 GB/s +*/ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* **************************** + * INLINE mode + ******************************/ +/*! + * XXH_INLINE_ALL (and XXH_PRIVATE_API) + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API +# if defined(__GNUC__) +# define XXH_PUBLIC_API static __inline __attribute__((unused)) +# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define XXH_PUBLIC_API static inline +# elif defined(_MSC_VER) +# define XXH_PUBLIC_API static __inline +# else + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static +# endif + + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ + + + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + +#ifdef XXH_NAMESPACE +# define XXH_CAT(A,B) A##B +# define XXH_NAME2(A,B) XXH_CAT(A,B) +# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) +# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) +# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) +# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) +# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) +# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) +# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) +# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) +# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) +# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) +#endif + + +/* ************************************* +* Version +***************************************/ +#define XXH_VERSION_MAJOR 0 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 1 +#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void); + + +/* **************************** +* Common basic types +******************************/ +#include /* size_t */ +typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; + + +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint32_t XXH32_hash_t; + +#else +# include +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# else +# if ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +# endif +#endif + +/*! + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +/*! + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include + * #include + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); + +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); + +/******* Canonical representation *******/ + +/* + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + */ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); + + +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif + +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough +*/ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif + +/*! + * @} + * @ingroup public + * @{ + */ + +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint64_t XXH64_hash_t; +#else +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif +#endif + +/*! + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * This function usually runs faster on 64-bit systems, but slower on 32-bit + * systems (see benchmark). + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); + +/******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); +XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); + +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); + +#ifndef XXH_NO_XXH3 +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. + * + * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ + +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/* XXH3_64bits(): + * default 64-bit variant, using default secret and default seed of 0. + * It's the fastest variant. */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); + +/* + * XXH3_64bits_withSeed(): + * This variant generates a custom secret on the fly + * based on default secret altered using the `seed` value. + * While this operation is decently fast, note that it's not completely free. + * Note: seed==0 produces the same results as XXH3_64bits(). + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/* + * XXH3_64bits_withSecret(): + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); +XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state); + +/* + * XXH3_64bits_reset(): + * Initialize with default parameters. + * digest will be equivalent to `XXH3_64bits()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr); +/* + * XXH3_64bits_reset_withSeed(): + * Generate a custom secret from `seed`, and store it into `statePtr`. + * digest will be equivalent to `XXH3_64bits_withSeed()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +/* + * XXH3_64bits_reset_withSecret(): + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr); + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * XXH128_isEqual(): + * Return: 1 if `h1` and `h2` are equal, 0 if they are not. + */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * XXH128_cmp(): + * + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * return: >0 if *h128_1 > *h128_2 + * =0 if *h128_1 == *h128_2 + * <0 if *h128_1 < *h128_2 + */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash); +XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ +#endif /* XXHASH_H_5627135585666179 */ + + + +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# include +# define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } + + +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/* + * XXH3_generateSecret(): + * + * Derive a high-entropy secret from any user-defined content, named customSeed. + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed, + * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN + * + * The generated secret can then be used with any `*_withSecret()` variant. + * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, + * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so + * XXH3_generateSecret() can be employed to ensure proper quality. + * + * customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. + * + * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); + + +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); + +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); + +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + + +#endif /* XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64 & arm64, + * which are platforms known to offer good unaligned memory accesses performance. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using + * -fno-inline with GCC or Clang, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ + || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +/* Modify the local functions below should you wish to use some other memory routines */ +/* for ZSTD_malloc(), ZSTD_free() */ +#define ZSTD_DEPS_NEED_MALLOC +#include "zstd_deps.h" /* size_t, ZSTD_malloc, ZSTD_free, ZSTD_memcpy */ +static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } +static void XXH_free (void* p) { ZSTD_free(p); } +static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((unused)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + + + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# define XXH_ASSERT(c) ((void)0) +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (e.g. eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign; + return ((const xxh_unalign*)ptr)->u32; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 h32) +{ + h32 ^= h32 >> 15; + h32 *= XXH_PRIME32_2; + h32 ^= h32 >> 13; + h32 *= XXH_PRIME32_3; + h32 ^= h32 >> 16; + return(h32); +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ +static xxh_u32 +XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + h32 += (*ptr++) * XXH_PRIME32_5; \ + h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(h32); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 4: XXH_PROCESS4; + return XXH32_avalanche(h32); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 0: return XXH32_avalanche(h32); + } + XXH_ASSERT(0); + return h32; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + xxh_u32 v2 = seed + XXH_PRIME32_2; + xxh_u32 v3 = seed + 0; + xxh_u32 v4 = seed - XXH_PRIME32_1; + + do { + v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; + v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; + v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; + v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; + } while (input < limit); + + h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if 0 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +/*! + * @ingroup xxh32_family + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + statePtr->v[1] = seed + XXH_PRIME32_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME32_1; + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + if (state->memsize + len < 16) { /* fill in tmp buffer */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); + state->memsize += (XXH32_hash_t)len; + return XXH_OK; + } + + if (state->memsize) { /* some data left from previous update */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); + { const xxh_u32* p32 = state->mem32; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); + } + p += 16-state->memsize; + state->memsize = 0; + } + + if (p <= bEnd-16) { + const xxh_u8* const limit = bEnd - 16; + + do { + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); + } else { + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! + * @ingroup xxh32_family + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * + * The canonical representation uses big endian convention, the same convention + * as human-readable numbers (large digits first). + * + * This way, hash values can be written into a file or buffer, remaining + * comparable across different systems. + * + * The following functions allow transformation of hash values to and from their + * canonical format. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer, but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64; + return ((const xxh_unalign64*)ptr)->u64; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +static xxh_u64 XXH64_avalanche(xxh_u64 h64) +{ + h64 ^= h64 >> 33; + h64 *= XXH_PRIME64_2; + h64 ^= h64 >> 29; + h64 *= XXH_PRIME64_3; + h64 ^= h64 >> 32; + return h64; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +static xxh_u64 +XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(h64); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + xxh_u64 v2 = seed + XXH_PRIME64_2; + xxh_u64 v3 = seed + 0; + xxh_u64 v4 = seed - XXH_PRIME64_1; + + do { + v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; + v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; + v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; + v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; + } while (inputv[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + statePtr->v[1] = seed + XXH_PRIME64_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME64_1; + return XXH_OK; +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH64_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len += len; + + if (state->memsize + len < 32) { /* fill in tmp buffer */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); + state->memsize += (xxh_u32)len; + return XXH_OK; + } + + if (state->memsize) { /* tmp buffer is full */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; + state->memsize = 0; + } + + if (p+32 <= bEnd) { + const xxh_u8* const limit = bEnd - 32; + + do { + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); + } else { + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#else +/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ +# define XXH_RESTRICT /* disable */ +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || defined(__aarch64__) || defined(_M_ARM) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) +# define inline __inline__ /* circumvent a clang bug */ +# include +# undef inline +# elif defined(__AVX2__) +# include +# elif defined(__SSE2__) +# include +# endif +#endif + +#if defined(_MSC_VER) +# include +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment required for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + + +#if XXH_VECTOR == XXH_NEON +/* + * NEON's setup for vmlal_u32 is a little more complicated than it is on + * SSE2, AVX2, and VSX. + * + * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast. + * + * To do the same operation, the 128-bit 'Q' register needs to be split into + * two 64-bit 'D' registers, performing this operation:: + * + * [ a | b ] + * | '---------. .--------' | + * | x | + * | .---------' '--------. | + * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ] + * + * Due to significant changes in aarch64, the fastest method for aarch64 is + * completely different than the fastest method for ARMv7-A. + * + * ARMv7-A treats D registers as unions overlaying Q registers, so modifying + * D11 will modify the high half of Q5. This is similar to how modifying AH + * will only affect bits 8-15 of AX on x86. + * + * VZIP takes two registers, and puts even lanes in one register and odd lanes + * in the other. + * + * On ARMv7-A, this strangely modifies both parameters in place instead of + * taking the usual 3-operand form. + * + * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the + * lower and upper halves of the Q register to end up with the high and low + * halves where we want - all in one instruction. + * + * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] } + * + * Unfortunately we need inline assembly for this: Instructions modifying two + * registers at once is not possible in GCC or Clang's IR, and they have to + * create a copy. + * + * aarch64 requires a different approach. + * + * In order to make it easier to write a decent compiler for aarch64, many + * quirks were removed, such as conditional execution. + * + * NEON was also affected by this. + * + * aarch64 cannot access the high bits of a Q-form register, and writes to a + * D-form register zero the high bits, similar to how writes to W-form scalar + * registers (or DWORD registers on x86_64) work. + * + * The formerly free vget_high intrinsics now require a vext (with a few + * exceptions) + * + * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent + * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one + * operand. + * + * The equivalent of the VZIP.32 on the lower and upper halves would be this + * mess: + * + * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] } + * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] } + * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] } + * + * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN): + * + * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32); + * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF); + * + * This is available on ARMv7-A, but is less efficient than a single VZIP.32. + */ + +/*! + * Function-like macro: + * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) + * { + * outLo = (uint32x2_t)(in & 0xFFFFFFFF); + * outHi = (uint32x2_t)(in >> 32); + * in = UNDEFINED; + * } + */ +# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ + && (defined(__GNUC__) || defined(__clang__)) \ + && (defined(__arm__) || defined(__thumb__) || defined(_M_ARM)) +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ + /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \ + /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \ + __asm__("vzip.32 %e0, %f0" : "+w" (in)); \ + (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \ + (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \ + } while (0) +# else +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + (outLo) = vmovn_u64 (in); \ + (outHi) = vshrn_n_u64 ((in), 32); \ + } while (0) +# endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * On AArch64 when not optimizing for size, XXH3 will run 6 lanes using NEON and + * 2 lanes on scalar by default. + * + * This can be set to 2, 4, 6, or 8. ARMv7 will default to all 8 NEON lanes, as the + * emulated 64-bit arithmetic is too slow. + * + * Modern ARM CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but it can't + * have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions, + * you are only using 2/3 of the CPU bandwidth. + * + * This is even more noticeable on the more advanced cores like the A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the + * remaining lanes will use scalar instructions. This improves the bandwidth + * and also gives the integer pipelines something to do besides twiddling loop + * counters and pointers. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__OPTIMIZE_SIZE__) +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +# if defined(__s390x__) +# include +# else +/* gcc's altivec.h can have the unwanted consequence to unconditionally + * #define bool, vector, and pixel keywords, + * with bad consequences for programs already using these keywords for other purposes. + * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined. + * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler, + * but it seems that, in some cases, it isn't. + * Force the build macro to be defined, so that keywords are not altered. + */ +# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__) +# define __APPLE_ALTIVEC__ +# endif +# include +# endif + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= 0x165667919E3779F9ULL; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= 0x9FB21C651E98DF25ULL; + h64 ^= (h64 >> 35) + len ; + h64 *= 0x9FB21C651E98DF25ULL; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); + + return XXH3_avalanche(acc); + } +} + +#define XXH3_MIDSIZE_MAX 240 + +XXH_NO_INLINE XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + int const nbRounds = (int)len / 16; + int i; + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + acc = XXH3_avalanche(acc); + XXH_ASSERT(nbRounds >= 8); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + /* last bytes */ + acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + return XXH3_avalanche(acc); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', + * this will warn "discards 'const' qualifier". */ + union { + const __m512i* cp; + void* p; + } remote_const_void; + remote_const_void.cp = src + i; + dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { + uint64x2_t* const xacc = (uint64x2_t *) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* const xinput = (const uint8_t *) input; + uint8_t const* const xsecret = (const uint8_t *) secret; + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint8x16_t data_vec = vld1q_u8(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); + uint64x2_t data_key; + uint32x2_t data_key_lo, data_key_hi; + /* xacc[i] += swap(data_vec); */ + uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); + uint64x2_t const swapped = vextq_u64(data64, data64, 1); + xacc[i] = vaddq_u64 (xacc[i], swapped); + /* data_key = data_vec ^ key_vec; */ + data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec)); + /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (data_key >> 32); + * data_key = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */ + xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi); + + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { uint64x2_t* xacc = (uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1); + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47); + uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); + + /* xacc[i] *= XXH_PRIME32_1 */ + uint32x2_t data_key_lo, data_key_hi; + /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (xacc[i] >> 32); + * xacc[i] = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + { /* + * prod_hi = (data_key >> 32) * XXH_PRIME32_1; + * + * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will + * incorrectly "optimize" this: + * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b)); + * shifted = vshll_n_u32(tmp, 32); + * to this: + * tmp = "vmulq_u64"(a, b); // no such thing! + * shifted = vshlq_n_u64(tmp, 32); + * + * However, unlike SSE, Clang lacks a 64-bit multiply routine + * for NEON, and it scalarizes two 64-bit multiplies instead. + * + * vmull_u32 has the same timing as vmul_u32, and it avoids + * this bug completely. + * See https://bugs.llvm.org/show_bug.cgi?id=39967 + */ + uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime); + /* xacc[i] = prod_hi << 32; */ + xacc[i] = vshlq_n_u64(prod_hi, 32); + /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime); + } + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + unsigned int* const xacc = (unsigned int*) acc; + xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ + xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = (xxh_u64x2)vec_xl(0, xacc + 4 * i); + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + /* xacc[i] = acc_vec; */ + vec_xst((xxh_u32x4)acc_vec, 0, xacc + 4 * i); + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_u64x2* const xacc = (xxh_u64x2*) acc; + const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +/* scalar variants - universal */ + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} + +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__clang__) && defined(__aarch64__) + /* + * UGLY HACK: + * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes Clang to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + /* + * Note: in debug mode, this overrides the asm optimization + * and Clang will emit MOVK chains again. + */ + XXH_ASSERT(kSecretPtr == XXH3_kSecret); + + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes Clang to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + + + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * XXH3_accumulate() + * Loops over XXH3_accumulate_512(). + * Assumption: nbStripes will not overflow the secret size + */ +XXH_FORCE_INLINE void +XXH3_accumulate( xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes, + XXH3_f_accumulate_512 f_acc512) +{ + size_t n; + for (n = 0; n < nbStripes; n++ ) { + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; + XXH_PREFETCH(in + XXH_PREFETCH_DIST); + f_acc512(acc, + in, + secret + n*XXH_SECRET_CONSUME_RATE); + } +} + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + /* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* input, size_t len, + XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ + +/* + * Malloc's a pointer that is always aligned to align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/* Note : when XXH3_consumeStripes() is invoked, + * there must be a guarantee that at least one more byte must be consumed from input + * so that the function can blindly consume all stripes using the "normal" secret segment */ +XXH_FORCE_INLINE void +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */ + XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock); + if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) { + /* need a scrambling operation */ + size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr; + size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock; + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512); + f_scramble(acc, secret + secretLimit); + XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512); + *nbStripesSoFarPtr = nbStripesAfterBlock; + } else { + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512); + *nbStripesSoFarPtr += nbStripes; + } +} + +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripesToEnd <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (inputbuffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } + } + + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate_512, XXH3_scrambleAcc); + /* last stripe */ + XXH3_accumulate_512(acc, + state->buffer + state->bufferedSize - XXH_STRIPE_LEN, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } else { /* bufferedSize < XXH_STRIPE_LEN */ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH3_accumulate_512(acc, + lastStripe, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= 0x9FB21C651E98DF25ULL; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + int const nbRounds = (int)len / 32; + int i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + for (i=0; i<4; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + (32 * i), + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + XXH_ASSERT(nbRounds >= 4); + for (i=4 ; i < nbRounds; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)), + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + 0ULL - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)len * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + secretSize + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)len * XXH_PRIME64_2)); + return h128; + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ + +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + state->secretLimit + XXH_STRIPE_LEN + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)state->totalLen * XXH_PRIME64_2)); + return h128; + } + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->seed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + +/* 128-bit utility functions */ + +#include /* memcmp, memcpy */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n -#endif #include "compiler.h" +#include "cpu.h" #include "mem.h" #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */ #include "error_private.h" @@ -30,7 +28,6 @@ #include "../zstd.h" #define FSE_STATIC_LINKING_ONLY #include "fse.h" -#define HUF_STATIC_LINKING_ONLY #include "huf.h" #ifndef XXH_STATIC_LINKING_ONLY # define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */ @@ -60,81 +57,7 @@ extern "C" { #undef MAX #define MIN(a,b) ((a)<(b) ? (a) : (b)) #define MAX(a,b) ((a)>(b) ? (a) : (b)) - -/** - * Ignore: this is an internal helper. - * - * This is a helper function to help force C99-correctness during compilation. - * Under strict compilation modes, variadic macro arguments can't be empty. - * However, variadic function arguments can be. Using a function therefore lets - * us statically check that at least one (string) argument was passed, - * independent of the compilation flags. - */ -static INLINE_KEYWORD UNUSED_ATTR -void _force_has_format_string(const char *format, ...) { - (void)format; -} - -/** - * Ignore: this is an internal helper. - * - * We want to force this function invocation to be syntactically correct, but - * we don't want to force runtime evaluation of its arguments. - */ -#define _FORCE_HAS_FORMAT_STRING(...) \ - if (0) { \ - _force_has_format_string(__VA_ARGS__); \ - } - -/** - * Return the specified error if the condition evaluates to true. - * - * In debug modes, prints additional information. - * In order to do that (particularly, printing the conditional that failed), - * this can't just wrap RETURN_ERROR(). - */ -#define RETURN_ERROR_IF(cond, err, ...) \ - if (cond) { \ - RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return ERROR(err); \ - } - -/** - * Unconditionally return the specified error. - * - * In debug modes, prints additional information. - */ -#define RETURN_ERROR(err, ...) \ - do { \ - RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return ERROR(err); \ - } while(0); - -/** - * If the provided expression evaluates to an error code, returns that error code. - * - * In debug modes, prints additional information. - */ -#define FORWARD_IF_ERROR(err, ...) \ - do { \ - size_t const err_code = (err); \ - if (ERR_isError(err_code)) { \ - RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return err_code; \ - } \ - } while(0); +#define BOUNDED(min,val,max) (MAX(min,MIN(val,max))) /*-************************************* @@ -143,7 +66,6 @@ void _force_has_format_string(const char *format, ...) { #define ZSTD_OPT_NUM (1<<12) #define ZSTD_REP_NUM 3 /* number of repcodes */ -#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1) static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 }; #define KB *(1 <<10) @@ -170,9 +92,9 @@ typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e; #define ZSTD_FRAMECHECKSUMSIZE 4 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ -#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ +#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */ +#define MIN_LITERALS_FOR_4_STREAMS 6 -#define HufLog 12 typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e; #define LONGNBSEQ 0x7F00 @@ -180,6 +102,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy #define MINMATCH 3 #define Litbits 8 +#define LitHufLog 11 #define MaxLit ((1<= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN)); - if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) { /* Handle short offset copies. */ do { @@ -303,12 +237,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e * one COPY16() in the first call. Then, do two calls per loop since * at that point it is more likely to have a high trip count. */ -#ifdef __aarch64__ - do { - COPY16(op, ip); - } - while (op < oend); -#else ZSTD_copy16(op, ip); if (16 >= length) return; op += 16; @@ -318,7 +246,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e COPY16(op, ip); } while (op < oend); -#endif } } @@ -352,9 +279,9 @@ typedef enum { * Private declarations *********************************************/ typedef struct seqDef_s { - U32 offset; /* offset == rawOffset + ZSTD_REP_NUM, or equivalently, offCode + 1 */ + U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */ U16 litLength; - U16 matchLength; + U16 mlBase; /* mlBase == matchLength - MINMATCH */ } seqDef; /* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */ @@ -367,11 +294,11 @@ typedef enum { typedef struct { seqDef* sequencesStart; seqDef* sequences; /* ptr to end of sequences */ - BYTE* litStart; - BYTE* lit; /* ptr to end of literals */ - BYTE* llCode; - BYTE* mlCode; - BYTE* ofCode; + BYTE* litStart; + BYTE* lit; /* ptr to end of literals */ + BYTE* llCode; + BYTE* mlCode; + BYTE* ofCode; size_t maxNbSeq; size_t maxNbLit; @@ -379,8 +306,8 @@ typedef struct { * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment * the existing value of the litLength or matchLength by 0x10000. */ - ZSTD_longLengthType_e longLengthType; - U32 longLengthPos; /* Index of the sequence to apply long length modification to */ + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; /* Index of the sequence to apply long length modification to */ } seqStore_t; typedef struct { @@ -396,13 +323,13 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore { ZSTD_sequenceLength seqLen; seqLen.litLength = seq->litLength; - seqLen.matchLength = seq->matchLength + MINMATCH; + seqLen.matchLength = seq->mlBase + MINMATCH; if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) { if (seqStore->longLengthType == ZSTD_llt_literalLength) { - seqLen.litLength += 0xFFFF; + seqLen.litLength += 0x10000; } if (seqStore->longLengthType == ZSTD_llt_matchLength) { - seqLen.matchLength += 0xFFFF; + seqLen.matchLength += 0x10000; } } return seqLen; @@ -415,12 +342,13 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore * `decompressedBound != ZSTD_CONTENTSIZE_ERROR` */ typedef struct { + size_t nbBlocks; size_t compressedSize; unsigned long long decompressedBound; } ZSTD_frameSizeInfo; /* decompress & legacy */ const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */ -void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */ +int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */ /* custom memory allocation functions */ void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem); @@ -428,35 +356,6 @@ void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem); void ZSTD_customFree(void* ptr, ZSTD_customMem customMem); -MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ -# if STATIC_BMI2 == 1 - return _lzcnt_u32(val)^31; -# else - unsigned long r=0; - return _BitScanReverse(&r, val) ? (unsigned)r : 0; -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ - return __builtin_clz (val) ^ 31; -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return 31 - __CLZ(val); -# else /* Software version */ - static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; - U32 v = val; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return DeBruijnClz[(v * 0x07C4ACDDU) >> 27]; -# endif - } -} - - /* ZSTD_invalidateRepCodes() : * ensures next compression will not use repcodes from previous block. * Note : only works with regular variant; @@ -482,6 +381,14 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, const void* src, size_t srcSize); +/** + * @returns true iff the CPU supports dynamic BMI2 dispatch. + */ +MEM_STATIC int ZSTD_cpuSupportsBmi2(void) +{ + ZSTD_cpuid_t cpuid = ZSTD_cpuid(); + return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid); +} #if defined (__cplusplus) } diff --git a/src/dependencies/zstd-1.5.0/lib/common/zstd_trace.h b/src/dependencies/zstd-1.5.4/lib/common/zstd_trace.h similarity index 88% rename from src/dependencies/zstd-1.5.0/lib/common/zstd_trace.h rename to src/dependencies/zstd-1.5.4/lib/common/zstd_trace.h index 2da5640..da20534 100644 --- a/src/dependencies/zstd-1.5.0/lib/common/zstd_trace.h +++ b/src/dependencies/zstd-1.5.4/lib/common/zstd_trace.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -17,10 +17,19 @@ extern "C" { #include -/* weak symbol support */ -#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && defined(__GNUC__) && \ +/* weak symbol support + * For now, enable conservatively: + * - Only GNUC + * - Only ELF + * - Only x86-64, i386 and aarch64 + * Also, explicitly disable on platforms known not to work so they aren't + * forgotten in the future. + */ +#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ + defined(__GNUC__) && defined(__ELF__) && \ + (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ - !defined(__CYGWIN__) + !defined(__CYGWIN__) && !defined(_AIX) # define ZSTD_HAVE_WEAK_SYMBOLS 1 #else # define ZSTD_HAVE_WEAK_SYMBOLS 0 diff --git a/src/dependencies/zstd-1.5.4/lib/compress/clevels.h b/src/dependencies/zstd-1.5.4/lib/compress/clevels.h new file mode 100644 index 0000000..c18da46 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/compress/clevels.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CLEVELS_H +#define ZSTD_CLEVELS_H + +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +#include "../zstd.h" + +/*-===== Pre-defined compression levels =====-*/ + +#define ZSTD_MAX_CLEVEL 22 + +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif + +static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = { +{ /* "default" - for any srcSize > 256 KB */ + /* W, C, H, S, L, TL, strat */ + { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */ + { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */ + { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */ + { 21, 16, 17, 1, 5, 0, ZSTD_dfast }, /* level 3 */ + { 21, 18, 18, 1, 5, 0, ZSTD_dfast }, /* level 4 */ + { 21, 18, 19, 3, 5, 2, ZSTD_greedy }, /* level 5 */ + { 21, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6 */ + { 21, 19, 20, 4, 5, 8, ZSTD_lazy }, /* level 7 */ + { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 8 */ + { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */ + { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 10 */ + { 22, 21, 22, 6, 5, 16, ZSTD_lazy2 }, /* level 11 */ + { 22, 22, 23, 6, 5, 32, ZSTD_lazy2 }, /* level 12 */ + { 22, 22, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */ + { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */ + { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */ + { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */ + { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */ + { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */ + { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */ + { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */ + { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */ + { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */ +}, +{ /* for srcSize <= 256 KB */ + /* W, C, H, S, L, T, strat */ + { 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 18, 14, 14, 1, 5, 0, ZSTD_dfast }, /* level 2 */ + { 18, 16, 16, 1, 4, 0, ZSTD_dfast }, /* level 3 */ + { 18, 16, 17, 3, 5, 2, ZSTD_greedy }, /* level 4.*/ + { 18, 17, 18, 5, 5, 2, ZSTD_greedy }, /* level 5.*/ + { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/ + { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */ + { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/ + { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/ + { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */ + { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 128 KB */ + /* W, C, H, S, L, T, strat */ + { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */ + { 17, 15, 16, 2, 5, 0, ZSTD_dfast }, /* level 3 */ + { 17, 17, 17, 2, 4, 0, ZSTD_dfast }, /* level 4 */ + { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */ + { 17, 16, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */ + { 17, 16, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 17, 16, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 17, 16, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 17, 16, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */ + { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */ + { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/ + { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/ + { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/ + { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 16 KB */ + /* W, C, H, S, L, T, strat */ + { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */ + { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */ + { 14, 14, 15, 2, 4, 0, ZSTD_dfast }, /* level 3 */ + { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */ + { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/ + { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */ + { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/ + { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/ + { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/ + { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/ + { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/ + { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/ + { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/ + { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/ + { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/ + { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +}; + + + +#endif /* ZSTD_CLEVELS_H */ diff --git a/src/dependencies/zstd-1.5.0/lib/compress/fse_compress.c b/src/dependencies/zstd-1.5.4/lib/compress/fse_compress.c similarity index 76% rename from src/dependencies/zstd-1.5.0/lib/compress/fse_compress.c rename to src/dependencies/zstd-1.5.4/lib/compress/fse_compress.c index b4297ec..5d37708 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/fse_compress.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/fse_compress.c @@ -1,6 +1,6 @@ /* ****************************************************************** * FSE : Finite State Entropy encoder - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -26,6 +26,7 @@ #define ZSTD_DEPS_NEED_MALLOC #define ZSTD_DEPS_NEED_MATH64 #include "../common/zstd_deps.h" /* ZSTD_malloc, ZSTD_free, ZSTD_memcpy, ZSTD_memset */ +#include "../common/bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -75,13 +76,14 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableLog ? tableSize>>1 : 1) ; FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT); U32 const step = FSE_TABLESTEP(tableSize); + U32 const maxSV1 = maxSymbolValue+1; - U32* cumul = (U32*)workSpace; - FSE_FUNCTION_TYPE* tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSymbolValue + 2)); + U16* cumul = (U16*)workSpace; /* size = maxSV1 */ + FSE_FUNCTION_TYPE* const tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSV1+1)); /* size = tableSize */ U32 highThreshold = tableSize-1; - if ((size_t)workSpace & 3) return ERROR(GENERIC); /* Must be 4 byte aligned */ + assert(((size_t)workSpace & 1) == 0); /* Must be 2 bytes-aligned */ if (FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) > wkspSize) return ERROR(tableLog_tooLarge); /* CTable header */ tableU16[-2] = (U16) tableLog; @@ -89,7 +91,7 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, assert(tableLog < 16); /* required for threshold strategy to work */ /* For explanations on how to distribute symbol values over the table : - * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */ + * https://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */ #ifdef __clang_analyzer__ ZSTD_memset(tableSymbol, 0, sizeof(*tableSymbol) * tableSize); /* useless initialization, just to keep scan-build happy */ @@ -98,20 +100,61 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, /* symbol start positions */ { U32 u; cumul[0] = 0; - for (u=1; u <= maxSymbolValue+1; u++) { + for (u=1; u <= maxSV1; u++) { if (normalizedCounter[u-1]==-1) { /* Low proba symbol */ cumul[u] = cumul[u-1] + 1; tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1); } else { - cumul[u] = cumul[u-1] + normalizedCounter[u-1]; + assert(normalizedCounter[u-1] >= 0); + cumul[u] = cumul[u-1] + (U16)normalizedCounter[u-1]; + assert(cumul[u] >= cumul[u-1]); /* no overflow */ } } - cumul[maxSymbolValue+1] = tableSize+1; + cumul[maxSV1] = (U16)(tableSize+1); } /* Spread symbols */ - { U32 position = 0; + if (highThreshold == tableSize - 1) { + /* Case for no low prob count symbols. Lay down 8 bytes at a time + * to reduce branch misses since we are operating on a small block + */ + BYTE* const spread = tableSymbol + tableSize; /* size = tableSize + 8 (may write beyond tableSize) */ + { U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s=0); + pos += (size_t)n; + } + } + /* Spread symbols across the table. Lack of lowprob symbols means that + * we don't need variable sized inner loop, so we can unroll the loop and + * reduce branch misses. + */ + { size_t position = 0; + size_t s; + size_t const unroll = 2; /* Experimentally determined optimal unroll */ + assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ + for (s = 0; s < (size_t)tableSize; s += unroll) { + size_t u; + for (u = 0; u < unroll; ++u) { + size_t const uPosition = (position + (u * step)) & tableMask; + tableSymbol[uPosition] = spread[s + u]; + } + position = (position + (unroll * step)) & tableMask; + } + assert(position == 0); /* Must have initialized all positions */ + } + } else { + U32 position = 0; U32 symbol; - for (symbol=0; symbol<=maxSymbolValue; symbol++) { + for (symbol=0; symbol highThreshold) position = (position + step) & tableMask; /* Low proba area */ } } - assert(position==0); /* Must have initialized all positions */ } @@ -144,16 +186,17 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, case -1: case 1: symbolTT[s].deltaNbBits = (tableLog << 16) - (1< 1); + { U32 const maxBitsOut = tableLog - ZSTD_highbit32 ((U32)normalizedCounter[s]-1); + U32 const minStatePlus = (U32)normalizedCounter[s] << maxBitsOut; symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus; - symbolTT[s].deltaFindState = total - normalizedCounter[s]; - total += normalizedCounter[s]; + symbolTT[s].deltaFindState = (int)(total - (unsigned)normalizedCounter[s]); + total += (unsigned)normalizedCounter[s]; } } } } #if 0 /* debug : symbol costs */ @@ -164,32 +207,26 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, symbol, normalizedCounter[symbol], FSE_getMaxNbBits(symbolTT, symbol), (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256); - } - } + } } #endif return 0; } -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) -{ - FSE_FUNCTION_TYPE tableSymbol[FSE_MAX_TABLESIZE]; /* memset() is not necessary, even if static analyzer complain about it */ - return FSE_buildCTable_wksp(ct, normalizedCounter, maxSymbolValue, tableLog, tableSymbol, sizeof(tableSymbol)); -} -#endif - #ifndef FSE_COMMONDEFS_ONLY - /*-************************************************************** * FSE NCount encoding ****************************************************************/ size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog) { - size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog) >> 3) + 3; + size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog + + 4 /* bitCount initialized at 4 */ + + 2 /* first two symbols may use one additional bit each */) / 8) + + 1 /* round up to whole nb bytes */ + + 2 /* additional two bytes for bitstream flush */; return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */ } @@ -306,21 +343,11 @@ size_t FSE_writeNCount (void* buffer, size_t bufferSize, * FSE Compression Code ****************************************************************/ -FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog) -{ - size_t size; - if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX; - size = FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32); - return (FSE_CTable*)ZSTD_malloc(size); -} - -void FSE_freeCTable (FSE_CTable* ct) { ZSTD_free(ct); } - /* provides the minimum logSize to safely represent a distribution */ static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue) { - U32 minBitsSrc = BIT_highbit32((U32)(srcSize)) + 1; - U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2; + U32 minBitsSrc = ZSTD_highbit32((U32)(srcSize)) + 1; + U32 minBitsSymbols = ZSTD_highbit32(maxSymbolValue) + 2; U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols; assert(srcSize > 1); /* Not supported, RLE should be used instead */ return minBits; @@ -328,7 +355,7 @@ static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue) unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus) { - U32 maxBitsSrc = BIT_highbit32((U32)(srcSize - 1)) - minus; + U32 maxBitsSrc = ZSTD_highbit32((U32)(srcSize - 1)) - minus; U32 tableLog = maxTableLog; U32 minBits = FSE_minTableLog(srcSize, maxSymbolValue); assert(srcSize > 1); /* Not supported, RLE should be used instead */ @@ -496,40 +523,6 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog, return tableLog; } - -/* fake FSE_CTable, for raw (uncompressed) input */ -size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits) -{ - const unsigned tableSize = 1 << nbBits; - const unsigned tableMask = tableSize - 1; - const unsigned maxSymbolValue = tableMask; - void* const ptr = ct; - U16* const tableU16 = ( (U16*) ptr) + 2; - void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableSize>>1); /* assumption : tableLog >= 1 */ - FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT); - unsigned s; - - /* Sanity checks */ - if (nbBits < 1) return ERROR(GENERIC); /* min size */ - - /* header */ - tableU16[-2] = (U16) nbBits; - tableU16[-1] = (U16) maxSymbolValue; - - /* Build table */ - for (s=0; s not compressible */ - if (maxCount < (srcSize >> 7)) return 0; /* Heuristic : not compressible enough */ - } - - tableLog = FSE_optimalTableLog(tableLog, srcSize, maxSymbolValue); - CHECK_F( FSE_normalizeCount(norm, tableLog, count, srcSize, maxSymbolValue, /* useLowProbCount */ srcSize >= 2048) ); - - /* Write table description header */ - { CHECK_V_F(nc_err, FSE_writeNCount(op, oend-op, norm, maxSymbolValue, tableLog) ); - op += nc_err; - } - - /* Compress */ - CHECK_F( FSE_buildCTable_wksp(CTable, norm, maxSymbolValue, tableLog, scratchBuffer, scratchBufferSize) ); - { CHECK_V_F(cSize, FSE_compress_usingCTable(op, oend - op, src, srcSize, CTable) ); - if (cSize == 0) return 0; /* not enough space for compressed data */ - op += cSize; - } - - /* check compressibility */ - if ( (size_t)(op-ostart) >= srcSize-1 ) return 0; - - return op-ostart; -} - -typedef struct { - FSE_CTable CTable_max[FSE_CTABLE_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)]; - union { - U32 hist_wksp[HIST_WKSP_SIZE_U32]; - BYTE scratchBuffer[1 << FSE_MAX_TABLELOG]; - } workspace; -} fseWkspMax_t; - -size_t FSE_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog) -{ - fseWkspMax_t scratchBuffer; - DEBUG_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_COMPRESS_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)); /* compilation failures here means scratchBuffer is not large enough */ - if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); - return FSE_compress_wksp(dst, dstCapacity, src, srcSize, maxSymbolValue, tableLog, &scratchBuffer, sizeof(scratchBuffer)); -} - -size_t FSE_compress (void* dst, size_t dstCapacity, const void* src, size_t srcSize) -{ - return FSE_compress2(dst, dstCapacity, src, srcSize, FSE_MAX_SYMBOL_VALUE, FSE_DEFAULT_TABLELOG); -} -#endif - #endif /* FSE_COMMONDEFS_ONLY */ diff --git a/src/dependencies/zstd-1.5.0/lib/compress/hist.c b/src/dependencies/zstd-1.5.4/lib/compress/hist.c similarity index 99% rename from src/dependencies/zstd-1.5.0/lib/compress/hist.c rename to src/dependencies/zstd-1.5.4/lib/compress/hist.c index 073c57e..e2fb431 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/hist.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/hist.c @@ -1,7 +1,7 @@ /* ****************************************************************** * hist : Histogram functions * part of Finite State Entropy project - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy diff --git a/src/dependencies/zstd-1.5.0/lib/compress/hist.h b/src/dependencies/zstd-1.5.4/lib/compress/hist.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/compress/hist.h rename to src/dependencies/zstd-1.5.4/lib/compress/hist.h index 228ed48..887896b 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/hist.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/hist.h @@ -1,7 +1,7 @@ /* ****************************************************************** * hist : Histogram functions * part of Finite State Entropy project - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy diff --git a/src/dependencies/zstd-1.5.0/lib/compress/huf_compress.c b/src/dependencies/zstd-1.5.4/lib/compress/huf_compress.c similarity index 50% rename from src/dependencies/zstd-1.5.0/lib/compress/huf_compress.c rename to src/dependencies/zstd-1.5.4/lib/compress/huf_compress.c index 485906e..2987187 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/huf_compress.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/huf_compress.c @@ -1,6 +1,6 @@ /* ****************************************************************** * Huffman encoder, part of New Generation Entropy library - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * * You can contact the author at : * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy @@ -29,9 +29,9 @@ #include "hist.h" #define FSE_STATIC_LINKING_ONLY /* FSE_optimalTableLog_internal */ #include "../common/fse.h" /* header compression */ -#define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "../common/error_private.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -42,17 +42,93 @@ /* ************************************************************** -* Utils +* Required declarations ****************************************************************/ -unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue) +typedef struct nodeElt_s { + U32 count; + U16 parent; + BYTE byte; + BYTE nbBits; +} nodeElt; + + +/* ************************************************************** +* Debug Traces +****************************************************************/ + +#if DEBUGLEVEL >= 2 + +static size_t showU32(const U32* arr, size_t size) { - return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + size_t u; + for (u=0; u= add) { + assert(add < align); + assert(((size_t)aligned & mask) == 0); + *workspaceSizePtr -= add; + return aligned; + } else { + *workspaceSizePtr = 0; + return NULL; + } +} + + /* HUF_compressWeights() : * Same as FSE_compress(), but dedicated to huff0's weights compression. * The use case needs much less stack memory. @@ -67,7 +143,10 @@ typedef struct { S16 norm[HUF_TABLELOG_MAX+1]; } HUF_CompressWeightsWksp; -static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightTable, size_t wtSize, void* workspace, size_t workspaceSize) +static size_t +HUF_compressWeights(void* dst, size_t dstSize, + const void* weightTable, size_t wtSize, + void* workspace, size_t workspaceSize) { BYTE* const ostart = (BYTE*) dst; BYTE* op = ostart; @@ -75,7 +154,7 @@ static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightT unsigned maxSymbolValue = HUF_TABLELOG_MAX; U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER; - HUF_CompressWeightsWksp* wksp = (HUF_CompressWeightsWksp*)workspace; + HUF_CompressWeightsWksp* wksp = (HUF_CompressWeightsWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); if (workspaceSize < sizeof(HUF_CompressWeightsWksp)) return ERROR(GENERIC); @@ -106,6 +185,40 @@ static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightT return (size_t)(op-ostart); } +static size_t HUF_getNbBits(HUF_CElt elt) +{ + return elt & 0xFF; +} + +static size_t HUF_getNbBitsFast(HUF_CElt elt) +{ + return elt; +} + +static size_t HUF_getValue(HUF_CElt elt) +{ + return elt & ~(size_t)0xFF; +} + +static size_t HUF_getValueFast(HUF_CElt elt) +{ + return elt; +} + +static void HUF_setNbBits(HUF_CElt* elt, size_t nbBits) +{ + assert(nbBits <= HUF_TABLELOG_ABSOLUTEMAX); + *elt = nbBits; +} + +static void HUF_setValue(HUF_CElt* elt, size_t value) +{ + size_t const nbBits = HUF_getNbBits(*elt); + if (nbBits > 0) { + assert((value >> nbBits) == 0); + *elt |= value << (sizeof(HUF_CElt) * 8 - nbBits); + } +} typedef struct { HUF_CompressWeightsWksp wksp; @@ -117,9 +230,12 @@ size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize) { + HUF_CElt const* const ct = CTable + 1; BYTE* op = (BYTE*)dst; U32 n; - HUF_WriteCTableWksp* wksp = (HUF_WriteCTableWksp*)workspace; + HUF_WriteCTableWksp* wksp = (HUF_WriteCTableWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); + + HUF_STATIC_ASSERT(HUF_CTABLE_WORKSPACE_SIZE >= sizeof(HUF_WriteCTableWksp)); /* check conditions */ if (workspaceSize < sizeof(HUF_WriteCTableWksp)) return ERROR(GENERIC); @@ -130,9 +246,10 @@ size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, for (n=1; nbitsToWeight[n] = (BYTE)(huffLog + 1 - n); for (n=0; nhuffWeight[n] = wksp->bitsToWeight[CTable[n].nbBits]; + wksp->huffWeight[n] = wksp->bitsToWeight[HUF_getNbBits(ct[n])]; /* attempt weights compression by FSE */ + if (maxDstSize < 1) return ERROR(dstSize_tooSmall); { CHECK_V_F(hSize, HUF_compressWeights(op+1, maxDstSize-1, wksp->huffWeight, maxSymbolValue, &wksp->wksp, sizeof(wksp->wksp)) ); if ((hSize>1) & (hSize < maxSymbolValue/2)) { /* FSE compressed */ op[0] = (BYTE)hSize; @@ -149,16 +266,6 @@ size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, return ((maxSymbolValue+1)/2) + 1; } -/*! HUF_writeCTable() : - `CTable` : Huffman tree to save, using huf representation. - @return : size of saved CTable */ -size_t HUF_writeCTable (void* dst, size_t maxDstSize, - const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog) -{ - HUF_WriteCTableWksp wksp; - return HUF_writeCTable_wksp(dst, maxDstSize, CTable, maxSymbolValue, huffLog, &wksp, sizeof(wksp)); -} - size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned* hasZeroWeights) { @@ -166,6 +273,7 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; /* large enough for values from 0 to 16 */ U32 tableLog = 0; U32 nbSymbols = 0; + HUF_CElt* const ct = CTable + 1; /* get symbol weights */ CHECK_V_F(readSize, HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX+1, rankVal, &nbSymbols, &tableLog, src, srcSize)); @@ -175,6 +283,8 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void if (tableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); if (nbSymbols > *maxSymbolValuePtr+1) return ERROR(maxSymbolValue_tooSmall); + CTable[0] = tableLog; + /* Prepare base value per rank */ { U32 n, nextRankStart = 0; for (n=1; n<=tableLog; n++) { @@ -186,13 +296,13 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void /* fill nbBits */ { U32 n; for (n=0; nn=tableLog+1 */ U16 valPerRank[HUF_TABLELOG_MAX+2] = {0}; - { U32 n; for (n=0; n>= 1; } } /* assign value within rank, symbol order */ - { U32 n; for (n=0; n maxNbBits to be maxNbBits. Then it adjusts - * the tree to so that it is a valid canonical Huffman tree. + * It attempts to convert all nodes with nbBits > @targetNbBits + * to employ @targetNbBits instead. Then it adjusts the tree + * so that it remains a valid canonical Huffman tree. * * @pre The sum of the ranks of each symbol == 2^largestBits, * where largestBits == huffNode[lastNonNull].nbBits. * @post The sum of the ranks of each symbol == 2^largestBits, - * where largestBits is the return value <= maxNbBits. + * where largestBits is the return value (expected <= targetNbBits). * - * @param huffNode The Huffman tree modified in place to enforce maxNbBits. + * @param huffNode The Huffman tree modified in place to enforce targetNbBits. + * It's presumed sorted, from most frequent to rarest symbol. * @param lastNonNull The symbol with the lowest count in the Huffman tree. - * @param maxNbBits The maximum allowed number of bits, which the Huffman tree + * @param targetNbBits The allowed number of bits, which the Huffman tree * may not respect. After this function the Huffman tree will - * respect maxNbBits. - * @return The maximum number of bits of the Huffman tree after adjustment, - * necessarily no more than maxNbBits. + * respect targetNbBits. + * @return The maximum number of bits of the Huffman tree after adjustment. */ -static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) +static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 targetNbBits) { const U32 largestBits = huffNode[lastNonNull].nbBits; - /* early exit : no elt > maxNbBits, so the tree is already valid. */ - if (largestBits <= maxNbBits) return largestBits; + /* early exit : no elt > targetNbBits, so the tree is already valid. */ + if (largestBits <= targetNbBits) return largestBits; + + DEBUGLOG(5, "HUF_setMaxHeight (targetNbBits = %u)", targetNbBits); /* there are several too large elements (at least >= 2) */ { int totalCost = 0; - const U32 baseCost = 1 << (largestBits - maxNbBits); + const U32 baseCost = 1 << (largestBits - targetNbBits); int n = (int)lastNonNull; - /* Adjust any ranks > maxNbBits to maxNbBits. + /* Adjust any ranks > targetNbBits to targetNbBits. * Compute totalCost, which is how far the sum of the ranks is * we are over 2^largestBits after adjust the offending ranks. */ - while (huffNode[n].nbBits > maxNbBits) { + while (huffNode[n].nbBits > targetNbBits) { totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits)); - huffNode[n].nbBits = (BYTE)maxNbBits; + huffNode[n].nbBits = (BYTE)targetNbBits; n--; } - /* n stops at huffNode[n].nbBits <= maxNbBits */ - assert(huffNode[n].nbBits <= maxNbBits); - /* n end at index of smallest symbol using < maxNbBits */ - while (huffNode[n].nbBits == maxNbBits) --n; + /* n stops at huffNode[n].nbBits <= targetNbBits */ + assert(huffNode[n].nbBits <= targetNbBits); + /* n end at index of smallest symbol using < targetNbBits */ + while (huffNode[n].nbBits == targetNbBits) --n; - /* renorm totalCost from 2^largestBits to 2^maxNbBits + /* renorm totalCost from 2^largestBits to 2^targetNbBits * note : totalCost is necessarily a multiple of baseCost */ - assert((totalCost & (baseCost - 1)) == 0); - totalCost >>= (largestBits - maxNbBits); + assert(((U32)totalCost & (baseCost - 1)) == 0); + totalCost >>= (largestBits - targetNbBits); assert(totalCost > 0); /* repay normalized cost */ @@ -281,19 +387,19 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) /* Get pos of last (smallest = lowest cum. count) symbol per rank */ ZSTD_memset(rankLast, 0xF0, sizeof(rankLast)); - { U32 currentNbBits = maxNbBits; + { U32 currentNbBits = targetNbBits; int pos; for (pos=n ; pos >= 0; pos--) { if (huffNode[pos].nbBits >= currentNbBits) continue; - currentNbBits = huffNode[pos].nbBits; /* < maxNbBits */ - rankLast[maxNbBits-currentNbBits] = (U32)pos; + currentNbBits = huffNode[pos].nbBits; /* < targetNbBits */ + rankLast[targetNbBits-currentNbBits] = (U32)pos; } } while (totalCost > 0) { /* Try to reduce the next power of 2 above totalCost because we * gain back half the rank. */ - U32 nBitsToDecrease = BIT_highbit32((U32)totalCost) + 1; + U32 nBitsToDecrease = ZSTD_highbit32((U32)totalCost) + 1; for ( ; nBitsToDecrease > 1; nBitsToDecrease--) { U32 const highPos = rankLast[nBitsToDecrease]; U32 const lowPos = rankLast[nBitsToDecrease-1]; @@ -333,7 +439,7 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) rankLast[nBitsToDecrease] = noSymbol; else { rankLast[nBitsToDecrease]--; - if (huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits-nBitsToDecrease) + if (huffNode[rankLast[nBitsToDecrease]].nbBits != targetNbBits-nBitsToDecrease) rankLast[nBitsToDecrease] = noSymbol; /* this rank is now empty */ } } /* while (totalCost > 0) */ @@ -345,11 +451,11 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) * TODO. */ while (totalCost < 0) { /* Sometimes, cost correction overshoot */ - /* special case : no rank 1 symbol (using maxNbBits-1); - * let's create one from largest rank 0 (using maxNbBits). + /* special case : no rank 1 symbol (using targetNbBits-1); + * let's create one from largest rank 0 (using targetNbBits). */ if (rankLast[1] == noSymbol) { - while (huffNode[n].nbBits == maxNbBits) n--; + while (huffNode[n].nbBits == targetNbBits) n--; huffNode[n+1].nbBits--; assert(n >= 0); rankLast[1] = (U32)(n+1); @@ -363,26 +469,122 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) } /* repay normalized cost */ } /* there are several too large elements (at least >= 2) */ - return maxNbBits; + return targetNbBits; } typedef struct { - U32 base; - U32 curr; + U16 base; + U16 curr; } rankPos; -typedef nodeElt huffNodeTable[HUF_CTABLE_WORKSPACE_SIZE_U32]; +typedef nodeElt huffNodeTable[2 * (HUF_SYMBOLVALUE_MAX + 1)]; -#define RANK_POSITION_TABLE_SIZE 32 +/* Number of buckets available for HUF_sort() */ +#define RANK_POSITION_TABLE_SIZE 192 typedef struct { huffNodeTable huffNodeTbl; rankPos rankPosition[RANK_POSITION_TABLE_SIZE]; } HUF_buildCTable_wksp_tables; +/* RANK_POSITION_DISTINCT_COUNT_CUTOFF == Cutoff point in HUF_sort() buckets for which we use log2 bucketing. + * Strategy is to use as many buckets as possible for representing distinct + * counts while using the remainder to represent all "large" counts. + * + * To satisfy this requirement for 192 buckets, we can do the following: + * Let buckets 0-166 represent distinct counts of [0, 166] + * Let buckets 166 to 192 represent all remaining counts up to RANK_POSITION_MAX_COUNT_LOG using log2 bucketing. + */ +#define RANK_POSITION_MAX_COUNT_LOG 32 +#define RANK_POSITION_LOG_BUCKETS_BEGIN ((RANK_POSITION_TABLE_SIZE - 1) - RANK_POSITION_MAX_COUNT_LOG - 1 /* == 158 */) +#define RANK_POSITION_DISTINCT_COUNT_CUTOFF (RANK_POSITION_LOG_BUCKETS_BEGIN + ZSTD_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) /* == 166 */) + +/* Return the appropriate bucket index for a given count. See definition of + * RANK_POSITION_DISTINCT_COUNT_CUTOFF for explanation of bucketing strategy. + */ +static U32 HUF_getIndex(U32 const count) { + return (count < RANK_POSITION_DISTINCT_COUNT_CUTOFF) + ? count + : ZSTD_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; +} + +/* Helper swap function for HUF_quickSortPartition() */ +static void HUF_swapNodes(nodeElt* a, nodeElt* b) { + nodeElt tmp = *a; + *a = *b; + *b = tmp; +} + +/* Returns 0 if the huffNode array is not sorted by descending count */ +MEM_STATIC int HUF_isSorted(nodeElt huffNode[], U32 const maxSymbolValue1) { + U32 i; + for (i = 1; i < maxSymbolValue1; ++i) { + if (huffNode[i].count > huffNode[i-1].count) { + return 0; + } + } + return 1; +} + +/* Insertion sort by descending order */ +HINT_INLINE void HUF_insertionSort(nodeElt huffNode[], int const low, int const high) { + int i; + int const size = high-low+1; + huffNode += low; + for (i = 1; i < size; ++i) { + nodeElt const key = huffNode[i]; + int j = i - 1; + while (j >= 0 && huffNode[j].count < key.count) { + huffNode[j + 1] = huffNode[j]; + j--; + } + huffNode[j + 1] = key; + } +} + +/* Pivot helper function for quicksort. */ +static int HUF_quickSortPartition(nodeElt arr[], int const low, int const high) { + /* Simply select rightmost element as pivot. "Better" selectors like + * median-of-three don't experimentally appear to have any benefit. + */ + U32 const pivot = arr[high].count; + int i = low - 1; + int j = low; + for ( ; j < high; j++) { + if (arr[j].count > pivot) { + i++; + HUF_swapNodes(&arr[i], &arr[j]); + } + } + HUF_swapNodes(&arr[i + 1], &arr[high]); + return i + 1; +} + +/* Classic quicksort by descending with partially iterative calls + * to reduce worst case callstack size. + */ +static void HUF_simpleQuickSort(nodeElt arr[], int low, int high) { + int const kInsertionSortThreshold = 8; + if (high - low < kInsertionSortThreshold) { + HUF_insertionSort(arr, low, high); + return; + } + while (low < high) { + int const idx = HUF_quickSortPartition(arr, low, high); + if (idx - low < high - idx) { + HUF_simpleQuickSort(arr, low, idx - 1); + low = idx + 1; + } else { + HUF_simpleQuickSort(arr, idx + 1, high); + high = idx - 1; + } + } +} + /** * HUF_sort(): * Sorts the symbols [0, maxSymbolValue] by count[symbol] in decreasing order. + * This is a typical bucket sorting strategy that uses either quicksort or insertion sort to sort each bucket. * * @param[out] huffNode Sorted symbols by decreasing count. Only members `.count` and `.byte` are filled. * Must have (maxSymbolValue + 1) entries. @@ -390,42 +592,51 @@ typedef struct { * @param[in] maxSymbolValue Maximum symbol value. * @param rankPosition This is a scratch workspace. Must have RANK_POSITION_TABLE_SIZE entries. */ -static void HUF_sort(nodeElt* huffNode, const unsigned* count, U32 maxSymbolValue, rankPos* rankPosition) -{ - int n; - int const maxSymbolValue1 = (int)maxSymbolValue + 1; +static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSymbolValue, rankPos rankPosition[]) { + U32 n; + U32 const maxSymbolValue1 = maxSymbolValue+1; /* Compute base and set curr to base. - * For symbol s let lowerRank = BIT_highbit32(count[n]+1) and rank = lowerRank + 1. - * Then 2^lowerRank <= count[n]+1 <= 2^rank. + * For symbol s let lowerRank = HUF_getIndex(count[n]) and rank = lowerRank + 1. + * See HUF_getIndex to see bucketing strategy. * We attribute each symbol to lowerRank's base value, because we want to know where * each rank begins in the output, so for rank R we want to count ranks R+1 and above. */ ZSTD_memset(rankPosition, 0, sizeof(*rankPosition) * RANK_POSITION_TABLE_SIZE); for (n = 0; n < maxSymbolValue1; ++n) { - U32 lowerRank = BIT_highbit32(count[n] + 1); + U32 lowerRank = HUF_getIndex(count[n]); + assert(lowerRank < RANK_POSITION_TABLE_SIZE - 1); rankPosition[lowerRank].base++; } + assert(rankPosition[RANK_POSITION_TABLE_SIZE - 1].base == 0); + /* Set up the rankPosition table */ for (n = RANK_POSITION_TABLE_SIZE - 1; n > 0; --n) { rankPosition[n-1].base += rankPosition[n].base; rankPosition[n-1].curr = rankPosition[n-1].base; } - /* Sort */ + + /* Insert each symbol into their appropriate bucket, setting up rankPosition table. */ for (n = 0; n < maxSymbolValue1; ++n) { U32 const c = count[n]; - U32 const r = BIT_highbit32(c+1) + 1; - U32 pos = rankPosition[r].curr++; - /* Insert into the correct position in the rank. - * We have at most 256 symbols, so this insertion should be fine. - */ - while ((pos > rankPosition[r].base) && (c > huffNode[pos-1].count)) { - huffNode[pos] = huffNode[pos-1]; - pos--; - } + U32 const r = HUF_getIndex(c) + 1; + U32 const pos = rankPosition[r].curr++; + assert(pos < maxSymbolValue1); huffNode[pos].count = c; huffNode[pos].byte = (BYTE)n; } + + /* Sort each bucket. */ + for (n = RANK_POSITION_DISTINCT_COUNT_CUTOFF; n < RANK_POSITION_TABLE_SIZE - 1; ++n) { + int const bucketSize = rankPosition[n].curr - rankPosition[n].base; + U32 const bucketStartIdx = rankPosition[n].base; + if (bucketSize > 1) { + assert(bucketStartIdx < maxSymbolValue1); + HUF_simpleQuickSort(huffNode + bucketStartIdx, 0, bucketSize-1); + } + } + + assert(HUF_isSorted(huffNode, maxSymbolValue1)); } @@ -449,6 +660,7 @@ static int HUF_buildTree(nodeElt* huffNode, U32 maxSymbolValue) int lowS, lowN; int nodeNb = STARTNODE; int n, nodeRoot; + DEBUGLOG(5, "HUF_buildTree (alphabet size = %u)", maxSymbolValue + 1); /* init for parents */ nonNullRank = (int)maxSymbolValue; while(huffNode[nonNullRank].count == 0) nonNullRank--; @@ -475,6 +687,8 @@ static int HUF_buildTree(nodeElt* huffNode, U32 maxSymbolValue) for (n=0; n<=nonNullRank; n++) huffNode[n].nbBits = huffNode[ huffNode[n].parent ].nbBits + 1; + DEBUGLOG(6, "Initial distribution of bits completed (%zu sorted symbols)", showHNodeBits(huffNode, maxSymbolValue+1)); + return nonNullRank; } @@ -490,6 +704,7 @@ static int HUF_buildTree(nodeElt* huffNode, U32 maxSymbolValue) */ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, int nonNullRank, U32 maxSymbolValue, U32 maxNbBits) { + HUF_CElt* const ct = CTable + 1; /* fill result into ctable (val, nbBits) */ int n; U16 nbPerRank[HUF_TABLELOG_MAX+1] = {0}; @@ -505,127 +720,373 @@ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, i min >>= 1; } } for (n=0; nhuffNodeTbl; nodeElt* const huffNode = huffNode0+1; int nonNullRank; + HUF_STATIC_ASSERT(HUF_CTABLE_WORKSPACE_SIZE == sizeof(HUF_buildCTable_wksp_tables)); + + DEBUGLOG(5, "HUF_buildCTable_wksp (alphabet size = %u)", maxSymbolValue+1); + /* safety checks */ - if (((size_t)workSpace & 3) != 0) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */ if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) - return ERROR(workSpace_tooSmall); + return ERROR(workSpace_tooSmall); if (maxNbBits == 0) maxNbBits = HUF_TABLELOG_DEFAULT; if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) - return ERROR(maxSymbolValue_tooLarge); + return ERROR(maxSymbolValue_tooLarge); ZSTD_memset(huffNode0, 0, sizeof(huffNodeTable)); /* sort, decreasing order */ HUF_sort(huffNode, count, maxSymbolValue, wksp_tables->rankPosition); + DEBUGLOG(6, "sorted symbols completed (%zu symbols)", showHNodeSymbols(huffNode, maxSymbolValue+1)); /* build tree */ nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); - /* enforce maxTableLog */ + /* determine and enforce maxTableLog */ maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ - HUF_buildCTableFromTree(tree, huffNode, nonNullRank, maxSymbolValue, maxNbBits); + HUF_buildCTableFromTree(CTable, huffNode, nonNullRank, maxSymbolValue, maxNbBits); return maxNbBits; } size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) { + HUF_CElt const* ct = CTable + 1; size_t nbBits = 0; int s; for (s = 0; s <= (int)maxSymbolValue; ++s) { - nbBits += CTable[s].nbBits * count[s]; + nbBits += HUF_getNbBits(ct[s]) * count[s]; } return nbBits >> 3; } int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) { + HUF_CElt const* ct = CTable + 1; int bad = 0; int s; for (s = 0; s <= (int)maxSymbolValue; ++s) { - bad |= (count[s] != 0) & (CTable[s].nbBits == 0); + bad |= (count[s] != 0) & (HUF_getNbBits(ct[s]) == 0); } return !bad; } size_t HUF_compressBound(size_t size) { return HUF_COMPRESSBOUND(size); } -FORCE_INLINE_TEMPLATE void -HUF_encodeSymbol(BIT_CStream_t* bitCPtr, U32 symbol, const HUF_CElt* CTable) +/** HUF_CStream_t: + * Huffman uses its own BIT_CStream_t implementation. + * There are three major differences from BIT_CStream_t: + * 1. HUF_addBits() takes a HUF_CElt (size_t) which is + * the pair (nbBits, value) in the format: + * format: + * - Bits [0, 4) = nbBits + * - Bits [4, 64 - nbBits) = 0 + * - Bits [64 - nbBits, 64) = value + * 2. The bitContainer is built from the upper bits and + * right shifted. E.g. to add a new value of N bits + * you right shift the bitContainer by N, then or in + * the new value into the N upper bits. + * 3. The bitstream has two bit containers. You can add + * bits to the second container and merge them into + * the first container. + */ + +#define HUF_BITS_IN_CONTAINER (sizeof(size_t) * 8) + +typedef struct { + size_t bitContainer[2]; + size_t bitPos[2]; + + BYTE* startPtr; + BYTE* ptr; + BYTE* endPtr; +} HUF_CStream_t; + +/**! HUF_initCStream(): + * Initializes the bitstream. + * @returns 0 or an error code. + */ +static size_t HUF_initCStream(HUF_CStream_t* bitC, + void* startPtr, size_t dstCapacity) { - BIT_addBitsFast(bitCPtr, CTable[symbol].val, CTable[symbol].nbBits); + ZSTD_memset(bitC, 0, sizeof(*bitC)); + bitC->startPtr = (BYTE*)startPtr; + bitC->ptr = bitC->startPtr; + bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer[0]); + if (dstCapacity <= sizeof(bitC->bitContainer[0])) return ERROR(dstSize_tooSmall); + return 0; } -#define HUF_FLUSHBITS(s) BIT_flushBits(s) +/*! HUF_addBits(): + * Adds the symbol stored in HUF_CElt elt to the bitstream. + * + * @param elt The element we're adding. This is a (nbBits, value) pair. + * See the HUF_CStream_t docs for the format. + * @param idx Insert into the bitstream at this idx. + * @param kFast This is a template parameter. If the bitstream is guaranteed + * to have at least 4 unused bits after this call it may be 1, + * otherwise it must be 0. HUF_addBits() is faster when fast is set. + */ +FORCE_INLINE_TEMPLATE void HUF_addBits(HUF_CStream_t* bitC, HUF_CElt elt, int idx, int kFast) +{ + assert(idx <= 1); + assert(HUF_getNbBits(elt) <= HUF_TABLELOG_ABSOLUTEMAX); + /* This is efficient on x86-64 with BMI2 because shrx + * only reads the low 6 bits of the register. The compiler + * knows this and elides the mask. When fast is set, + * every operation can use the same value loaded from elt. + */ + bitC->bitContainer[idx] >>= HUF_getNbBits(elt); + bitC->bitContainer[idx] |= kFast ? HUF_getValueFast(elt) : HUF_getValue(elt); + /* We only read the low 8 bits of bitC->bitPos[idx] so it + * doesn't matter that the high bits have noise from the value. + */ + bitC->bitPos[idx] += HUF_getNbBitsFast(elt); + assert((bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + /* The last 4-bits of elt are dirty if fast is set, + * so we must not be overwriting bits that have already been + * inserted into the bit container. + */ +#if DEBUGLEVEL >= 1 + { + size_t const nbBits = HUF_getNbBits(elt); + size_t const dirtyBits = nbBits == 0 ? 0 : ZSTD_highbit32((U32)nbBits) + 1; + (void)dirtyBits; + /* Middle bits are 0. */ + assert(((elt >> dirtyBits) << (dirtyBits + nbBits)) == 0); + /* We didn't overwrite any bits in the bit container. */ + assert(!kFast || (bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + (void)dirtyBits; + } +#endif +} -#define HUF_FLUSHBITS_1(stream) \ - if (sizeof((stream)->bitContainer)*8 < HUF_TABLELOG_MAX*2+7) HUF_FLUSHBITS(stream) +FORCE_INLINE_TEMPLATE void HUF_zeroIndex1(HUF_CStream_t* bitC) +{ + bitC->bitContainer[1] = 0; + bitC->bitPos[1] = 0; +} + +/*! HUF_mergeIndex1() : + * Merges the bit container @ index 1 into the bit container @ index 0 + * and zeros the bit container @ index 1. + */ +FORCE_INLINE_TEMPLATE void HUF_mergeIndex1(HUF_CStream_t* bitC) +{ + assert((bitC->bitPos[1] & 0xFF) < HUF_BITS_IN_CONTAINER); + bitC->bitContainer[0] >>= (bitC->bitPos[1] & 0xFF); + bitC->bitContainer[0] |= bitC->bitContainer[1]; + bitC->bitPos[0] += bitC->bitPos[1]; + assert((bitC->bitPos[0] & 0xFF) <= HUF_BITS_IN_CONTAINER); +} + +/*! HUF_flushBits() : +* Flushes the bits in the bit container @ index 0. +* +* @post bitPos will be < 8. +* @param kFast If kFast is set then we must know a-priori that +* the bit container will not overflow. +*/ +FORCE_INLINE_TEMPLATE void HUF_flushBits(HUF_CStream_t* bitC, int kFast) +{ + /* The upper bits of bitPos are noisy, so we must mask by 0xFF. */ + size_t const nbBits = bitC->bitPos[0] & 0xFF; + size_t const nbBytes = nbBits >> 3; + /* The top nbBits bits of bitContainer are the ones we need. */ + size_t const bitContainer = bitC->bitContainer[0] >> (HUF_BITS_IN_CONTAINER - nbBits); + /* Mask bitPos to account for the bytes we consumed. */ + bitC->bitPos[0] &= 7; + assert(nbBits > 0); + assert(nbBits <= sizeof(bitC->bitContainer[0]) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitContainer); + bitC->ptr += nbBytes; + assert(!kFast || bitC->ptr <= bitC->endPtr); + if (!kFast && bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr; + /* bitContainer doesn't need to be modified because the leftover + * bits are already the top bitPos bits. And we don't care about + * noise in the lower values. + */ +} + +/*! HUF_endMark() + * @returns The Huffman stream end mark: A 1-bit value = 1. + */ +static HUF_CElt HUF_endMark(void) +{ + HUF_CElt endMark; + HUF_setNbBits(&endMark, 1); + HUF_setValue(&endMark, 1); + return endMark; +} + +/*! HUF_closeCStream() : + * @return Size of CStream, in bytes, + * or 0 if it could not fit into dstBuffer */ +static size_t HUF_closeCStream(HUF_CStream_t* bitC) +{ + HUF_addBits(bitC, HUF_endMark(), /* idx */ 0, /* kFast */ 0); + HUF_flushBits(bitC, /* kFast */ 0); + { + size_t const nbBits = bitC->bitPos[0] & 0xFF; + if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ + return (size_t)(bitC->ptr - bitC->startPtr) + (nbBits > 0); + } +} + +FORCE_INLINE_TEMPLATE void +HUF_encodeSymbol(HUF_CStream_t* bitCPtr, U32 symbol, const HUF_CElt* CTable, int idx, int fast) +{ + HUF_addBits(bitCPtr, CTable[symbol], idx, fast); +} + +FORCE_INLINE_TEMPLATE void +HUF_compress1X_usingCTable_internal_body_loop(HUF_CStream_t* bitC, + const BYTE* ip, size_t srcSize, + const HUF_CElt* ct, + int kUnroll, int kFastFlush, int kLastFast) +{ + /* Join to kUnroll */ + int n = (int)srcSize; + int rem = n % kUnroll; + if (rem > 0) { + for (; rem > 0; --rem) { + HUF_encodeSymbol(bitC, ip[--n], ct, 0, /* fast */ 0); + } + HUF_flushBits(bitC, kFastFlush); + } + assert(n % kUnroll == 0); + + /* Join to 2 * kUnroll */ + if (n % (2 * kUnroll)) { + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, 0, 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, 0, kLastFast); + HUF_flushBits(bitC, kFastFlush); + n -= kUnroll; + } + assert(n % (2 * kUnroll) == 0); + + for (; n>0; n-= 2 * kUnroll) { + /* Encode kUnroll symbols into the bitstream @ index 0. */ + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, /* idx */ 0, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, /* idx */ 0, /* fast */ kLastFast); + HUF_flushBits(bitC, kFastFlush); + /* Encode kUnroll symbols into the bitstream @ index 1. + * This allows us to start filling the bit container + * without any data dependencies. + */ + HUF_zeroIndex1(bitC); + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - kUnroll - u], ct, /* idx */ 1, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll - kUnroll], ct, /* idx */ 1, /* fast */ kLastFast); + /* Merge bitstream @ index 1 into the bitstream @ index 0 */ + HUF_mergeIndex1(bitC); + HUF_flushBits(bitC, kFastFlush); + } + assert(n == 0); + +} + +/** + * Returns a tight upper bound on the output space needed by Huffman + * with 8 bytes buffer to handle over-writes. If the output is at least + * this large we don't need to do bounds checks during Huffman encoding. + */ +static size_t HUF_tightCompressBound(size_t srcSize, size_t tableLog) +{ + return ((srcSize * tableLog) >> 3) + 8; +} -#define HUF_FLUSHBITS_2(stream) \ - if (sizeof((stream)->bitContainer)*8 < HUF_TABLELOG_MAX*4+7) HUF_FLUSHBITS(stream) FORCE_INLINE_TEMPLATE size_t HUF_compress1X_usingCTable_internal_body(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) { + U32 const tableLog = (U32)CTable[0]; + HUF_CElt const* ct = CTable + 1; const BYTE* ip = (const BYTE*) src; BYTE* const ostart = (BYTE*)dst; BYTE* const oend = ostart + dstSize; BYTE* op = ostart; - size_t n; - BIT_CStream_t bitC; + HUF_CStream_t bitC; /* init */ if (dstSize < 8) return 0; /* not enough space to compress */ - { size_t const initErr = BIT_initCStream(&bitC, op, (size_t)(oend-op)); + { size_t const initErr = HUF_initCStream(&bitC, op, (size_t)(oend-op)); if (HUF_isError(initErr)) return 0; } - n = srcSize & ~3; /* join to mod 4 */ - switch (srcSize & 3) - { - case 3 : HUF_encodeSymbol(&bitC, ip[n+ 2], CTable); - HUF_FLUSHBITS_2(&bitC); - /* fall-through */ - case 2 : HUF_encodeSymbol(&bitC, ip[n+ 1], CTable); - HUF_FLUSHBITS_1(&bitC); - /* fall-through */ - case 1 : HUF_encodeSymbol(&bitC, ip[n+ 0], CTable); - HUF_FLUSHBITS(&bitC); - /* fall-through */ - case 0 : /* fall-through */ - default: break; + if (dstSize < HUF_tightCompressBound(srcSize, (size_t)tableLog) || tableLog > 11) + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ MEM_32bits() ? 2 : 4, /* kFast */ 0, /* kLastFast */ 0); + else { + if (MEM_32bits()) { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: ZSTD_FALLTHROUGH; + case 9: ZSTD_FALLTHROUGH; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 7: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 3, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } else { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 9: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 6, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 7, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 7: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 8, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 6: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 9, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } } + assert(bitC.ptr <= bitC.endPtr); - for (; n>0; n-=4) { /* note : n&3==0 at this stage */ - HUF_encodeSymbol(&bitC, ip[n- 1], CTable); - HUF_FLUSHBITS_1(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 2], CTable); - HUF_FLUSHBITS_2(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 3], CTable); - HUF_FLUSHBITS_1(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 4], CTable); - HUF_FLUSHBITS(&bitC); - } - - return BIT_closeCStream(&bitC); + return HUF_closeCStream(&bitC); } #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t HUF_compress1X_usingCTable_internal_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) @@ -644,9 +1105,9 @@ HUF_compress1X_usingCTable_internal_default(void* dst, size_t dstSize, static size_t HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, const void* src, size_t srcSize, - const HUF_CElt* CTable, const int bmi2) + const HUF_CElt* CTable, const int flags) { - if (bmi2) { + if (flags & HUF_flags_bmi2) { return HUF_compress1X_usingCTable_internal_bmi2(dst, dstSize, src, srcSize, CTable); } return HUF_compress1X_usingCTable_internal_default(dst, dstSize, src, srcSize, CTable); @@ -657,24 +1118,23 @@ HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, static size_t HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, const void* src, size_t srcSize, - const HUF_CElt* CTable, const int bmi2) + const HUF_CElt* CTable, const int flags) { - (void)bmi2; + (void)flags; return HUF_compress1X_usingCTable_internal_body(dst, dstSize, src, srcSize, CTable); } #endif -size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) +size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags) { - return HUF_compress1X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); + return HUF_compress1X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, flags); } - static size_t HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, const void* src, size_t srcSize, - const HUF_CElt* CTable, int bmi2) + const HUF_CElt* CTable, int flags) { size_t const segmentSize = (srcSize+3)/4; /* first 3 segments */ const BYTE* ip = (const BYTE*) src; @@ -688,27 +1148,24 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, op += 6; /* jumpTable */ assert(op <= oend); - { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart, (U16)cSize); op += cSize; } ip += segmentSize; assert(op <= oend); - { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart+2, (U16)cSize); op += cSize; } ip += segmentSize; assert(op <= oend); - { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart+4, (U16)cSize); op += cSize; } @@ -716,17 +1173,17 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, ip += segmentSize; assert(op <= oend); assert(ip <= iend); - { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, (size_t)(iend-ip), CTable, bmi2) ); - if (cSize==0) return 0; + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, (size_t)(iend-ip), CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; op += cSize; } return (size_t)(op-ostart); } -size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) +size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags) { - return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); + return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, flags); } typedef enum { HUF_singleStream, HUF_fourStreams } HUF_nbStreams_e; @@ -734,11 +1191,11 @@ typedef enum { HUF_singleStream, HUF_fourStreams } HUF_nbStreams_e; static size_t HUF_compressCTable_internal( BYTE* const ostart, BYTE* op, BYTE* const oend, const void* src, size_t srcSize, - HUF_nbStreams_e nbStreams, const HUF_CElt* CTable, const int bmi2) + HUF_nbStreams_e nbStreams, const HUF_CElt* CTable, const int flags) { size_t const cSize = (nbStreams==HUF_singleStream) ? - HUF_compress1X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, bmi2) : - HUF_compress4X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, bmi2); + HUF_compress1X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, flags) : + HUF_compress4X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, flags); if (HUF_isError(cSize)) { return cSize; } if (cSize==0) { return 0; } /* uncompressible */ op += cSize; @@ -750,35 +1207,111 @@ static size_t HUF_compressCTable_internal( typedef struct { unsigned count[HUF_SYMBOLVALUE_MAX + 1]; - HUF_CElt CTable[HUF_SYMBOLVALUE_MAX + 1]; + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(HUF_SYMBOLVALUE_MAX)]; union { HUF_buildCTable_wksp_tables buildCTable_wksp; HUF_WriteCTableWksp writeCTable_wksp; + U32 hist_wksp[HIST_WKSP_SIZE_U32]; } wksps; } HUF_compress_tables_t; +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE 4096 +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO 10 /* Must be >= 2 */ + +unsigned HUF_cardinality(const unsigned* count, unsigned maxSymbolValue) +{ + unsigned cardinality = 0; + unsigned i; + + for (i = 0; i < maxSymbolValue + 1; i++) { + if (count[i] != 0) cardinality += 1; + } + + return cardinality; +} + +unsigned HUF_minTableLog(unsigned symbolCardinality) +{ + U32 minBitsSymbols = ZSTD_highbit32(symbolCardinality) + 1; + return minBitsSymbols; +} + +unsigned HUF_optimalTableLog( + unsigned maxTableLog, + size_t srcSize, + unsigned maxSymbolValue, + void* workSpace, size_t wkspSize, + HUF_CElt* table, + const unsigned* count, + int flags) +{ + assert(srcSize > 1); /* Not supported, RLE should be used instead */ + assert(wkspSize >= sizeof(HUF_buildCTable_wksp_tables)); + + if (!(flags & HUF_flags_optimalDepth)) { + /* cheap evaluation, based on FSE */ + return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + } + + { BYTE* dst = (BYTE*)workSpace + sizeof(HUF_WriteCTableWksp); + size_t dstSize = wkspSize - sizeof(HUF_WriteCTableWksp); + size_t maxBits, hSize, newSize; + const unsigned symbolCardinality = HUF_cardinality(count, maxSymbolValue); + const unsigned minTableLog = HUF_minTableLog(symbolCardinality); + size_t optSize = ((size_t) ~0) - 1; + unsigned optLog = maxTableLog, optLogGuess; + + DEBUGLOG(6, "HUF_optimalTableLog: probing huf depth (srcSize=%zu)", srcSize); + + /* Search until size increases */ + for (optLogGuess = minTableLog; optLogGuess <= maxTableLog; optLogGuess++) { + DEBUGLOG(7, "checking for huffLog=%u", optLogGuess); + maxBits = HUF_buildCTable_wksp(table, count, maxSymbolValue, optLogGuess, workSpace, wkspSize); + if (ERR_isError(maxBits)) continue; + + if (maxBits < optLogGuess && optLogGuess > minTableLog) break; + + hSize = HUF_writeCTable_wksp(dst, dstSize, table, maxSymbolValue, (U32)maxBits, workSpace, wkspSize); + + if (ERR_isError(hSize)) continue; + + newSize = HUF_estimateCompressedSize(table, count, maxSymbolValue) + hSize; + + if (newSize > optSize + 1) { + break; + } + + if (newSize < optSize) { + optSize = newSize; + optLog = optLogGuess; + } + } + assert(optLog <= HUF_TABLELOG_MAX); + return optLog; + } +} + /* HUF_compress_internal() : * `workSpace_align4` must be aligned on 4-bytes boundaries, - * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U32 unsigned */ + * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U64 unsigned */ static size_t HUF_compress_internal (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, HUF_nbStreams_e nbStreams, - void* workSpace_align4, size_t wkspSize, - HUF_CElt* oldHufTable, HUF_repeat* repeat, int preferRepeat, - const int bmi2) + void* workSpace, size_t wkspSize, + HUF_CElt* oldHufTable, HUF_repeat* repeat, int flags) { - HUF_compress_tables_t* const table = (HUF_compress_tables_t*)workSpace_align4; + HUF_compress_tables_t* const table = (HUF_compress_tables_t*)HUF_alignUpWorkspace(workSpace, &wkspSize, ZSTD_ALIGNOF(size_t)); BYTE* const ostart = (BYTE*)dst; BYTE* const oend = ostart + dstSize; BYTE* op = ostart; - HUF_STATIC_ASSERT(sizeof(*table) <= HUF_WORKSPACE_SIZE); - assert(((size_t)workSpace_align4 & 3) == 0); /* must be aligned on 4-bytes boundaries */ + DEBUGLOG(5, "HUF_compress_internal (srcSize=%zu)", srcSize); + HUF_STATIC_ASSERT(sizeof(*table) + HUF_WORKSPACE_MAX_ALIGNMENT <= HUF_WORKSPACE_SIZE); /* checks & inits */ - if (wkspSize < HUF_WORKSPACE_SIZE) return ERROR(workSpace_tooSmall); + if (wkspSize < sizeof(*table)) return ERROR(workSpace_tooSmall); if (!srcSize) return 0; /* Uncompressed */ if (!dstSize) return 0; /* cannot fit anything within dst budget */ if (srcSize > HUF_BLOCKSIZE_MAX) return ERROR(srcSize_wrong); /* current block size limit */ @@ -788,17 +1321,34 @@ HUF_compress_internal (void* dst, size_t dstSize, if (!huffLog) huffLog = HUF_TABLELOG_DEFAULT; /* Heuristic : If old table is valid, use it for small inputs */ - if (preferRepeat && repeat && *repeat == HUF_repeat_valid) { + if ((flags & HUF_flags_preferRepeat) && repeat && *repeat == HUF_repeat_valid) { return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, - nbStreams, oldHufTable, bmi2); + nbStreams, oldHufTable, flags); + } + + /* If uncompressible data is suspected, do a smaller sampling first */ + DEBUG_STATIC_ASSERT(SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO >= 2); + if ((flags & HUF_flags_suspectUncompressible) && srcSize >= (SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE * SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO)) { + size_t largestTotal = 0; + DEBUGLOG(5, "input suspected incompressible : sampling to check"); + { unsigned maxSymbolValueBegin = maxSymbolValue; + CHECK_V_F(largestBegin, HIST_count_simple (table->count, &maxSymbolValueBegin, (const BYTE*)src, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestBegin; + } + { unsigned maxSymbolValueEnd = maxSymbolValue; + CHECK_V_F(largestEnd, HIST_count_simple (table->count, &maxSymbolValueEnd, (const BYTE*)src + srcSize - SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestEnd; + } + if (largestTotal <= ((2 * SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) >> 7)+4) return 0; /* heuristic : probably not compressible enough */ } /* Scan input and build symbol stats */ - { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, workSpace_align4, wkspSize) ); + { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, table->wksps.hist_wksp, sizeof(table->wksps.hist_wksp)) ); if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */ if (largest <= (srcSize >> 7)+4) return 0; /* heuristic : probably not compressible enough */ } + DEBUGLOG(6, "histogram detail completed (%zu symbols)", showU32(table->count, maxSymbolValue+1)); /* Check validity of previous table */ if ( repeat @@ -807,22 +1357,26 @@ HUF_compress_internal (void* dst, size_t dstSize, *repeat = HUF_repeat_none; } /* Heuristic : use existing table for small inputs */ - if (preferRepeat && repeat && *repeat != HUF_repeat_none) { + if ((flags & HUF_flags_preferRepeat) && repeat && *repeat != HUF_repeat_none) { return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, - nbStreams, oldHufTable, bmi2); + nbStreams, oldHufTable, flags); } /* Build Huffman Tree */ - huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue); + huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue, &table->wksps, sizeof(table->wksps), table->CTable, table->count, flags); { size_t const maxBits = HUF_buildCTable_wksp(table->CTable, table->count, maxSymbolValue, huffLog, &table->wksps.buildCTable_wksp, sizeof(table->wksps.buildCTable_wksp)); CHECK_F(maxBits); huffLog = (U32)maxBits; - /* Zero unused symbols in CTable, so we can check it for validity */ - ZSTD_memset(table->CTable + (maxSymbolValue + 1), 0, - sizeof(table->CTable) - ((maxSymbolValue + 1) * sizeof(HUF_CElt))); + DEBUGLOG(6, "bit distribution completed (%zu symbols)", showCTableBits(table->CTable + 1, maxSymbolValue+1)); + } + /* Zero unused symbols in CTable, so we can check it for validity */ + { + size_t const ctableSize = HUF_CTABLE_SIZE_ST(maxSymbolValue); + size_t const unusedSize = sizeof(table->CTable) - ctableSize * sizeof(HUF_CElt); + ZSTD_memset(table->CTable + ctableSize, 0, unusedSize); } /* Write table description header */ @@ -835,7 +1389,7 @@ HUF_compress_internal (void* dst, size_t dstSize, if (oldSize <= hSize + newSize || hSize + 12 >= srcSize) { return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, - nbStreams, oldHufTable, bmi2); + nbStreams, oldHufTable, flags); } } /* Use the new huffman table */ @@ -847,91 +1401,35 @@ HUF_compress_internal (void* dst, size_t dstSize, } return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, - nbStreams, table->CTable, bmi2); -} - - -size_t HUF_compress1X_wksp (void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned huffLog, - void* workSpace, size_t wkspSize) -{ - return HUF_compress_internal(dst, dstSize, src, srcSize, - maxSymbolValue, huffLog, HUF_singleStream, - workSpace, wkspSize, - NULL, NULL, 0, 0 /*bmi2*/); + nbStreams, table->CTable, flags); } size_t HUF_compress1X_repeat (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void* workSpace, size_t wkspSize, - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2) + HUF_CElt* hufTable, HUF_repeat* repeat, int flags) { + DEBUGLOG(5, "HUF_compress1X_repeat (srcSize = %zu)", srcSize); return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_singleStream, workSpace, wkspSize, hufTable, - repeat, preferRepeat, bmi2); -} - -/* HUF_compress4X_repeat(): - * compress input using 4 streams. - * provide workspace to generate compression tables */ -size_t HUF_compress4X_wksp (void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned huffLog, - void* workSpace, size_t wkspSize) -{ - return HUF_compress_internal(dst, dstSize, src, srcSize, - maxSymbolValue, huffLog, HUF_fourStreams, - workSpace, wkspSize, - NULL, NULL, 0, 0 /*bmi2*/); + repeat, flags); } /* HUF_compress4X_repeat(): * compress input using 4 streams. + * consider skipping quickly * re-use an existing huffman compression table */ size_t HUF_compress4X_repeat (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void* workSpace, size_t wkspSize, - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2) + HUF_CElt* hufTable, HUF_repeat* repeat, int flags) { + DEBUGLOG(5, "HUF_compress4X_repeat (srcSize = %zu)", srcSize); return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_fourStreams, workSpace, wkspSize, - hufTable, repeat, preferRepeat, bmi2); + hufTable, repeat, flags); } - -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -/** HUF_buildCTable() : - * @return : maxNbBits - * Note : count is used before tree is written, so they can safely overlap - */ -size_t HUF_buildCTable (HUF_CElt* tree, const unsigned* count, unsigned maxSymbolValue, unsigned maxNbBits) -{ - HUF_buildCTable_wksp_tables workspace; - return HUF_buildCTable_wksp(tree, count, maxSymbolValue, maxNbBits, &workspace, sizeof(workspace)); -} - -size_t HUF_compress1X (void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned huffLog) -{ - unsigned workSpace[HUF_WORKSPACE_SIZE_U32]; - return HUF_compress1X_wksp(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, workSpace, sizeof(workSpace)); -} - -size_t HUF_compress2 (void* dst, size_t dstSize, - const void* src, size_t srcSize, - unsigned maxSymbolValue, unsigned huffLog) -{ - unsigned workSpace[HUF_WORKSPACE_SIZE_U32]; - return HUF_compress4X_wksp(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, workSpace, sizeof(workSpace)); -} - -size_t HUF_compress (void* dst, size_t maxDstSize, const void* src, size_t srcSize) -{ - return HUF_compress2(dst, maxDstSize, src, srcSize, 255, HUF_TABLELOG_DEFAULT); -} -#endif diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress.c similarity index 78% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress.c index b7ee298..b55f684 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -12,12 +12,10 @@ * Dependencies ***************************************/ #include "../common/zstd_deps.h" /* INT_MAX, ZSTD_memset, ZSTD_memcpy */ -#include "../common/cpu.h" #include "../common/mem.h" #include "hist.h" /* HIST_countFast_wksp */ #define FSE_STATIC_LINKING_ONLY /* FSE_encodeSymbol */ #include "../common/fse.h" -#define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "zstd_compress_internal.h" #include "zstd_compress_sequences.h" @@ -28,6 +26,7 @@ #include "zstd_opt.h" #include "zstd_ldm.h" #include "zstd_compress_superblock.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /* *************************************************************** * Tuning parameters @@ -42,19 +41,34 @@ # define ZSTD_COMPRESS_HEAPMODE 0 #endif +/*! + * ZSTD_HASHLOG3_MAX : + * Maximum size of the hash table dedicated to find 3-bytes matches, + * in log format, aka 17 => 1 << 17 == 128Ki positions. + * This structure is only used in zstd_opt. + * Since allocation is centralized for all strategies, it has to be known here. + * The actual (selected) size of the hash table is then stored in ZSTD_matchState_t.hashLog3, + * so that zstd_opt.c doesn't need to know about this constant. + */ +#ifndef ZSTD_HASHLOG3_MAX +# define ZSTD_HASHLOG3_MAX 17 +#endif /*-************************************* * Helper functions ***************************************/ /* ZSTD_compressBound() - * Note that the result from this function is only compatible with the "normal" - * full-block strategy. - * When there are a lot of small blocks due to frequent flush in streaming mode - * the overhead of headers can make the compressed data to be larger than the - * return value of ZSTD_compressBound(). + * Note that the result from this function is only valid for + * the one-pass compression functions. + * When employing the streaming mode, + * if flushes are frequently altering the size of blocks, + * the overhead from block headers can make the compressed data larger + * than the return value of ZSTD_compressBound(). */ size_t ZSTD_compressBound(size_t srcSize) { - return ZSTD_COMPRESSBOUND(srcSize); + size_t const r = ZSTD_COMPRESSBOUND(srcSize); + if (r==0) return ERROR(srcSize_wrong); + return r; } @@ -72,10 +86,10 @@ struct ZSTD_CDict_s { ZSTD_customMem customMem; U32 dictID; int compressionLevel; /* 0 indicates that advanced API was used to select CDict params */ - ZSTD_useRowMatchFinderMode_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use - * row-based matchfinder. Unless the cdict is reloaded, we will use - * the same greedy/lazy matchfinder at compression time. - */ + ZSTD_paramSwitch_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use + * row-based matchfinder. Unless the cdict is reloaded, we will use + * the same greedy/lazy matchfinder at compression time. + */ }; /* typedef'd to ZSTD_CDict within "zstd.h" */ ZSTD_CCtx* ZSTD_createCCtx(void) @@ -88,7 +102,7 @@ static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager) assert(cctx != NULL); ZSTD_memset(cctx, 0, sizeof(*cctx)); cctx->customMem = memManager; - cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()); + cctx->bmi2 = ZSTD_cpuSupportsBmi2(); { size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters); assert(!ZSTD_isError(err)); (void)err; @@ -166,12 +180,9 @@ size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx) if (cctx==NULL) return 0; /* support free on NULL */ RETURN_ERROR_IF(cctx->staticSize, memory_allocation, "not compatible with static CCtx"); - { - int cctxInWorkspace = ZSTD_cwksp_owns_buffer(&cctx->workspace, cctx); + { int cctxInWorkspace = ZSTD_cwksp_owns_buffer(&cctx->workspace, cctx); ZSTD_freeCCtxContent(cctx); - if (!cctxInWorkspace) { - ZSTD_customFree(cctx, cctx->customMem); - } + if (!cctxInWorkspace) ZSTD_customFree(cctx, cctx->customMem); } return 0; } @@ -214,55 +225,84 @@ static int ZSTD_rowMatchFinderSupported(const ZSTD_strategy strategy) { /* Returns true if the strategy and useRowMatchFinder mode indicate that we will use the row based matchfinder * for this compression. */ -static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_useRowMatchFinderMode_e mode) { - assert(mode != ZSTD_urm_auto); - return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_urm_enableRowMatchFinder); +static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_paramSwitch_e mode) { + assert(mode != ZSTD_ps_auto); + return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_ps_enable); } -/* Returns row matchfinder usage enum given an initial mode and cParams */ -static ZSTD_useRowMatchFinderMode_e ZSTD_resolveRowMatchFinderMode(ZSTD_useRowMatchFinderMode_e mode, - const ZSTD_compressionParameters* const cParams) { -#if !defined(ZSTD_NO_INTRINSICS) && (defined(__SSE2__) || defined(__ARM_NEON)) +/* Returns row matchfinder usage given an initial mode and cParams */ +static ZSTD_paramSwitch_e ZSTD_resolveRowMatchFinderMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { +#if defined(ZSTD_ARCH_X86_SSE2) || defined(ZSTD_ARCH_ARM_NEON) int const kHasSIMD128 = 1; #else int const kHasSIMD128 = 0; #endif - if (mode != ZSTD_urm_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */ - mode = ZSTD_urm_disableRowMatchFinder; + if (mode != ZSTD_ps_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */ + mode = ZSTD_ps_disable; if (!ZSTD_rowMatchFinderSupported(cParams->strategy)) return mode; if (kHasSIMD128) { - if (cParams->windowLog > 14) mode = ZSTD_urm_enableRowMatchFinder; + if (cParams->windowLog > 14) mode = ZSTD_ps_enable; } else { - if (cParams->windowLog > 17) mode = ZSTD_urm_enableRowMatchFinder; + if (cParams->windowLog > 17) mode = ZSTD_ps_enable; } return mode; } +/* Returns block splitter usage (generally speaking, when using slower/stronger compression modes) */ +static ZSTD_paramSwitch_e ZSTD_resolveBlockSplitterMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17) ? ZSTD_ps_enable : ZSTD_ps_disable; +} + /* Returns 1 if the arguments indicate that we should allocate a chainTable, 0 otherwise */ static int ZSTD_allocateChainTable(const ZSTD_strategy strategy, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const U32 forDDSDict) { - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); /* We always should allocate a chaintable if we are allocating a matchstate for a DDS dictionary matchstate. * We do not allocate a chaintable if we are using ZSTD_fast, or are using the row-based matchfinder. */ return forDDSDict || ((strategy != ZSTD_fast) && !ZSTD_rowMatchFinderUsed(strategy, useRowMatchFinder)); } -/* Returns 1 if compression parameters are such that we should +/* Returns ZSTD_ps_enable if compression parameters are such that we should * enable long distance matching (wlog >= 27, strategy >= btopt). - * Returns 0 otherwise. + * Returns ZSTD_ps_disable otherwise. */ -static U32 ZSTD_CParams_shouldEnableLdm(const ZSTD_compressionParameters* const cParams) { - return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27; +static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable; } -/* Returns 1 if compression parameters are such that we should - * enable blockSplitter (wlog >= 17, strategy >= btopt). - * Returns 0 otherwise. - */ -static U32 ZSTD_CParams_useBlockSplitter(const ZSTD_compressionParameters* const cParams) { - return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17; +static int ZSTD_resolveExternalSequenceValidation(int mode) { + return mode; +} + +/* Resolves maxBlockSize to the default if no value is present. */ +static size_t ZSTD_resolveMaxBlockSize(size_t maxBlockSize) { + if (maxBlockSize == 0) { + return ZSTD_BLOCKSIZE_MAX; + } else { + return maxBlockSize; + } +} + +static ZSTD_paramSwitch_e ZSTD_resolveExternalRepcodeSearch(ZSTD_paramSwitch_e value, int cLevel) { + if (value != ZSTD_ps_auto) return value; + if (cLevel < 10) { + return ZSTD_ps_disable; + } else { + return ZSTD_ps_enable; + } +} + +/* Returns 1 if compression parameters are such that CDict hashtable and chaintable indices are tagged. + * If so, the tags need to be removed in ZSTD_resetCCtx_byCopyingCDict. */ +static int ZSTD_CDictIndicesAreTagged(const ZSTD_compressionParameters* const cParams) { + return cParams->strategy == ZSTD_fast || cParams->strategy == ZSTD_dfast; } static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( @@ -274,21 +314,18 @@ static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( cctxParams.cParams = cParams; /* Adjust advanced params according to cParams */ - if (ZSTD_CParams_shouldEnableLdm(&cParams)) { - DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including LDM into cctx params"); - cctxParams.ldmParams.enableLdm = 1; - /* LDM is enabled by default for optimal parser and window size >= 128MB */ + cctxParams.ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams.ldmParams.enableLdm, &cParams); + if (cctxParams.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_ldm_adjustParameters(&cctxParams.ldmParams, &cParams); assert(cctxParams.ldmParams.hashLog >= cctxParams.ldmParams.bucketSizeLog); assert(cctxParams.ldmParams.hashRateLog < 32); } - - if (ZSTD_CParams_useBlockSplitter(&cParams)) { - DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including block splitting into cctx params"); - cctxParams.splitBlocks = 1; - } - + cctxParams.useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams.useBlockSplitter, &cParams); cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams); + cctxParams.validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams.validateSequences); + cctxParams.maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams.maxBlockSize); + cctxParams.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams.searchForExternalRepcodes, + cctxParams.compressionLevel); assert(!ZSTD_checkCParams(cParams)); return cctxParams; } @@ -334,10 +371,13 @@ size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel) #define ZSTD_NO_CLEVEL 0 /** - * Initializes the cctxParams from params and compressionLevel. + * Initializes `cctxParams` from `params` and `compressionLevel`. * @param compressionLevel If params are derived from a compression level then that compression level, otherwise ZSTD_NO_CLEVEL. */ -static void ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, ZSTD_parameters const* params, int compressionLevel) +static void +ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, + const ZSTD_parameters* params, + int compressionLevel) { assert(!ZSTD_checkCParams(params->cParams)); ZSTD_memset(cctxParams, 0, sizeof(*cctxParams)); @@ -348,7 +388,13 @@ static void ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, ZSTD_par */ cctxParams->compressionLevel = compressionLevel; cctxParams->useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams->useRowMatchFinder, ¶ms->cParams); - DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d", cctxParams->useRowMatchFinder); + cctxParams->useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams->useBlockSplitter, ¶ms->cParams); + cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, ¶ms->cParams); + cctxParams->validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams->validateSequences); + cctxParams->maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams->maxBlockSize); + cctxParams->searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams->searchForExternalRepcodes, compressionLevel); + DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d, useBlockSplitter=%d ldm=%d", + cctxParams->useRowMatchFinder, cctxParams->useBlockSplitter, cctxParams->ldmParams.enableLdm); } size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params) @@ -361,7 +407,7 @@ size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_paramete /** * Sets cctxParams' cParams and fParams from params, but otherwise leaves them alone. - * @param param Validated zstd parameters. + * @param params Validated zstd parameters. */ static void ZSTD_CCtxParams_setZstdParams( ZSTD_CCtx_params* cctxParams, const ZSTD_parameters* params) @@ -470,8 +516,8 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) return bounds; case ZSTD_c_enableLongDistanceMatching: - bounds.lowerBound = 0; - bounds.upperBound = 1; + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_ldmHashLog: @@ -518,9 +564,9 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) return bounds; case ZSTD_c_literalCompressionMode: - ZSTD_STATIC_ASSERT(ZSTD_lcm_auto < ZSTD_lcm_huffman && ZSTD_lcm_huffman < ZSTD_lcm_uncompressed); - bounds.lowerBound = ZSTD_lcm_auto; - bounds.upperBound = ZSTD_lcm_uncompressed; + ZSTD_STATIC_ASSERT(ZSTD_ps_auto < ZSTD_ps_enable && ZSTD_ps_enable < ZSTD_ps_disable); + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_targetCBlockSize: @@ -549,14 +595,14 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = 1; return bounds; - case ZSTD_c_splitBlocks: - bounds.lowerBound = 0; - bounds.upperBound = 1; + case ZSTD_c_useBlockSplitter: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_useRowMatchFinder: - bounds.lowerBound = (int)ZSTD_urm_auto; - bounds.upperBound = (int)ZSTD_urm_enableRowMatchFinder; + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_deterministicRefPrefix: @@ -564,6 +610,26 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = 1; return bounds; + case ZSTD_c_prefetchCDictTables: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_enableSeqProducerFallback: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_maxBlockSize: + bounds.lowerBound = ZSTD_BLOCKSIZE_MAX_MIN; + bounds.upperBound = ZSTD_BLOCKSIZE_MAX; + return bounds; + + case ZSTD_c_searchForExternalRepcodes: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + default: bounds.error = ERROR(parameter_unsupported); return bounds; @@ -625,9 +691,13 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_stableOutBuffer: case ZSTD_c_blockDelimiters: case ZSTD_c_validateSequences: - case ZSTD_c_splitBlocks: + case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: + case ZSTD_c_enableSeqProducerFallback: + case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: default: return 0; } @@ -640,7 +710,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) if (ZSTD_isUpdateAuthorized(param)) { cctx->cParamsChanged = 1; } else { - RETURN_ERROR(stage_wrong, "can only set params in ctx init stage"); + RETURN_ERROR(stage_wrong, "can only set params in cctx init stage"); } } switch(param) @@ -680,9 +750,13 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_stableOutBuffer: case ZSTD_c_blockDelimiters: case ZSTD_c_validateSequences: - case ZSTD_c_splitBlocks: + case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: + case ZSTD_c_enableSeqProducerFallback: + case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); @@ -738,12 +812,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_minMatch : if (value!=0) /* 0 => use default */ BOUNDCHECK(ZSTD_c_minMatch, value); - CCtxParams->cParams.minMatch = value; + CCtxParams->cParams.minMatch = (U32)value; return CCtxParams->cParams.minMatch; case ZSTD_c_targetLength : BOUNDCHECK(ZSTD_c_targetLength, value); - CCtxParams->cParams.targetLength = value; + CCtxParams->cParams.targetLength = (U32)value; return CCtxParams->cParams.targetLength; case ZSTD_c_strategy : @@ -756,12 +830,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, /* Content size written in frame header _when known_ (default:1) */ DEBUGLOG(4, "set content size flag = %u", (value!=0)); CCtxParams->fParams.contentSizeFlag = value != 0; - return CCtxParams->fParams.contentSizeFlag; + return (size_t)CCtxParams->fParams.contentSizeFlag; case ZSTD_c_checksumFlag : /* A 32-bits content checksum will be calculated and written at end of frame (default:0) */ CCtxParams->fParams.checksumFlag = value != 0; - return CCtxParams->fParams.checksumFlag; + return (size_t)CCtxParams->fParams.checksumFlag; case ZSTD_c_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */ DEBUGLOG(4, "set dictIDFlag = %u", (value!=0)); @@ -770,18 +844,18 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_forceMaxWindow : CCtxParams->forceWindow = (value != 0); - return CCtxParams->forceWindow; + return (size_t)CCtxParams->forceWindow; case ZSTD_c_forceAttachDict : { const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value; - BOUNDCHECK(ZSTD_c_forceAttachDict, pref); + BOUNDCHECK(ZSTD_c_forceAttachDict, (int)pref); CCtxParams->attachDictPref = pref; return CCtxParams->attachDictPref; } case ZSTD_c_literalCompressionMode : { - const ZSTD_literalCompressionMode_e lcm = (ZSTD_literalCompressionMode_e)value; - BOUNDCHECK(ZSTD_c_literalCompressionMode, lcm); + const ZSTD_paramSwitch_e lcm = (ZSTD_paramSwitch_e)value; + BOUNDCHECK(ZSTD_c_literalCompressionMode, (int)lcm); CCtxParams->literalCompressionMode = lcm; return CCtxParams->literalCompressionMode; } @@ -832,47 +906,48 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_enableDedicatedDictSearch : CCtxParams->enableDedicatedDictSearch = (value!=0); - return CCtxParams->enableDedicatedDictSearch; + return (size_t)CCtxParams->enableDedicatedDictSearch; case ZSTD_c_enableLongDistanceMatching : - CCtxParams->ldmParams.enableLdm = (value!=0); + BOUNDCHECK(ZSTD_c_enableLongDistanceMatching, value); + CCtxParams->ldmParams.enableLdm = (ZSTD_paramSwitch_e)value; return CCtxParams->ldmParams.enableLdm; case ZSTD_c_ldmHashLog : if (value!=0) /* 0 ==> auto */ BOUNDCHECK(ZSTD_c_ldmHashLog, value); - CCtxParams->ldmParams.hashLog = value; + CCtxParams->ldmParams.hashLog = (U32)value; return CCtxParams->ldmParams.hashLog; case ZSTD_c_ldmMinMatch : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_ldmMinMatch, value); - CCtxParams->ldmParams.minMatchLength = value; + CCtxParams->ldmParams.minMatchLength = (U32)value; return CCtxParams->ldmParams.minMatchLength; case ZSTD_c_ldmBucketSizeLog : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_ldmBucketSizeLog, value); - CCtxParams->ldmParams.bucketSizeLog = value; + CCtxParams->ldmParams.bucketSizeLog = (U32)value; return CCtxParams->ldmParams.bucketSizeLog; case ZSTD_c_ldmHashRateLog : - RETURN_ERROR_IF(value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN, - parameter_outOfBound, "Param out of bounds!"); - CCtxParams->ldmParams.hashRateLog = value; + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_ldmHashRateLog, value); + CCtxParams->ldmParams.hashRateLog = (U32)value; return CCtxParams->ldmParams.hashRateLog; case ZSTD_c_targetCBlockSize : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_targetCBlockSize, value); - CCtxParams->targetCBlockSize = value; + CCtxParams->targetCBlockSize = (U32)value; return CCtxParams->targetCBlockSize; case ZSTD_c_srcSizeHint : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_srcSizeHint, value); CCtxParams->srcSizeHint = value; - return CCtxParams->srcSizeHint; + return (size_t)CCtxParams->srcSizeHint; case ZSTD_c_stableInBuffer: BOUNDCHECK(ZSTD_c_stableInBuffer, value); @@ -894,14 +969,14 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->validateSequences = value; return CCtxParams->validateSequences; - case ZSTD_c_splitBlocks: - BOUNDCHECK(ZSTD_c_splitBlocks, value); - CCtxParams->splitBlocks = value; - return CCtxParams->splitBlocks; + case ZSTD_c_useBlockSplitter: + BOUNDCHECK(ZSTD_c_useBlockSplitter, value); + CCtxParams->useBlockSplitter = (ZSTD_paramSwitch_e)value; + return CCtxParams->useBlockSplitter; case ZSTD_c_useRowMatchFinder: BOUNDCHECK(ZSTD_c_useRowMatchFinder, value); - CCtxParams->useRowMatchFinder = (ZSTD_useRowMatchFinderMode_e)value; + CCtxParams->useRowMatchFinder = (ZSTD_paramSwitch_e)value; return CCtxParams->useRowMatchFinder; case ZSTD_c_deterministicRefPrefix: @@ -909,6 +984,27 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->deterministicRefPrefix = !!value; return CCtxParams->deterministicRefPrefix; + case ZSTD_c_prefetchCDictTables: + BOUNDCHECK(ZSTD_c_prefetchCDictTables, value); + CCtxParams->prefetchCDictTables = (ZSTD_paramSwitch_e)value; + return CCtxParams->prefetchCDictTables; + + case ZSTD_c_enableSeqProducerFallback: + BOUNDCHECK(ZSTD_c_enableSeqProducerFallback, value); + CCtxParams->enableMatchFinderFallback = value; + return CCtxParams->enableMatchFinderFallback; + + case ZSTD_c_maxBlockSize: + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_maxBlockSize, value); + CCtxParams->maxBlockSize = value; + return CCtxParams->maxBlockSize; + + case ZSTD_c_searchForExternalRepcodes: + BOUNDCHECK(ZSTD_c_searchForExternalRepcodes, value); + CCtxParams->searchForExternalRepcodes = (ZSTD_paramSwitch_e)value; + return CCtxParams->searchForExternalRepcodes; + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } } @@ -1032,8 +1128,8 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_validateSequences : *value = (int)CCtxParams->validateSequences; break; - case ZSTD_c_splitBlocks : - *value = (int)CCtxParams->splitBlocks; + case ZSTD_c_useBlockSplitter : + *value = (int)CCtxParams->useBlockSplitter; break; case ZSTD_c_useRowMatchFinder : *value = (int)CCtxParams->useRowMatchFinder; @@ -1041,6 +1137,18 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_deterministicRefPrefix: *value = (int)CCtxParams->deterministicRefPrefix; break; + case ZSTD_c_prefetchCDictTables: + *value = (int)CCtxParams->prefetchCDictTables; + break; + case ZSTD_c_enableSeqProducerFallback: + *value = CCtxParams->enableMatchFinderFallback; + break; + case ZSTD_c_maxBlockSize: + *value = (int)CCtxParams->maxBlockSize; + break; + case ZSTD_c_searchForExternalRepcodes: + *value = (int)CCtxParams->searchForExternalRepcodes; + break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } return 0; @@ -1067,9 +1175,24 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams( return 0; } -ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize) +size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams) { - DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %u bytes", (U32)pledgedSrcSize); + DEBUGLOG(4, "ZSTD_CCtx_setCParams"); + assert(cctx != NULL); + if (cctx->streamStage != zcss_init) { + /* All parameters in @cparams are allowed to be updated during MT compression. + * This must be signaled, so that MT compression picks up the changes */ + cctx->cParamsChanged = 1; + } + /* only update if parameters are valid */ + FORWARD_IF_ERROR(ZSTD_checkCParams(cparams), ""); + cctx->requestedParams.cParams = cparams; + return 0; +} + +size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %llu bytes", pledgedSrcSize); RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, "Can't set pledgedSrcSize when not in init stage."); cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1; @@ -1147,14 +1270,14 @@ size_t ZSTD_CCtx_loadDictionary_advanced( return 0; } -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference( +size_t ZSTD_CCtx_loadDictionary_byReference( ZSTD_CCtx* cctx, const void* dict, size_t dictSize) { return ZSTD_CCtx_loadDictionary_advanced( cctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto); } -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize) +size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize) { return ZSTD_CCtx_loadDictionary_advanced( cctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto); @@ -1212,6 +1335,7 @@ size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset) RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, "Can't reset parameters only when not in init stage."); ZSTD_clearAllDicts(cctx); + ZSTD_memset(&cctx->externalMatchCtx, 0, sizeof(cctx->externalMatchCtx)); return ZSTD_CCtxParams_reset(&cctx->requestedParams); } return 0; @@ -1308,7 +1432,8 @@ static ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize, - ZSTD_cParamMode_e mode) + ZSTD_cParamMode_e mode, + ZSTD_paramSwitch_e useRowMatchFinder) { const U64 minSrcSize = 513; /* (1<<9) + 1 */ const U64 maxWindowResize = 1ULL << (ZSTD_WINDOWLOG_MAX-1); @@ -1324,7 +1449,7 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, break; case ZSTD_cpm_createCDict: /* Assume a small source size when creating a dictionary - * with an unkown source size. + * with an unknown source size. */ if (dictSize && srcSize == ZSTD_CONTENTSIZE_UNKNOWN) srcSize = minSrcSize; @@ -1342,8 +1467,8 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, } /* resize windowLog if input is small enough, to use less memory */ - if ( (srcSize < maxWindowResize) - && (dictSize < maxWindowResize) ) { + if ( (srcSize <= maxWindowResize) + && (dictSize <= maxWindowResize) ) { U32 const tSize = (U32)(srcSize + dictSize); static U32 const hashSizeMin = 1 << ZSTD_HASHLOG_MIN; U32 const srcLog = (tSize < hashSizeMin) ? ZSTD_HASHLOG_MIN : @@ -1361,6 +1486,42 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, if (cPar.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) cPar.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* minimum wlog required for valid frame header */ + /* We can't use more than 32 bits of hash in total, so that means that we require: + * (hashLog + 8) <= 32 && (chainLog + 8) <= 32 + */ + if (mode == ZSTD_cpm_createCDict && ZSTD_CDictIndicesAreTagged(&cPar)) { + U32 const maxShortCacheHashLog = 32 - ZSTD_SHORT_CACHE_TAG_BITS; + if (cPar.hashLog > maxShortCacheHashLog) { + cPar.hashLog = maxShortCacheHashLog; + } + if (cPar.chainLog > maxShortCacheHashLog) { + cPar.chainLog = maxShortCacheHashLog; + } + } + + + /* At this point, we aren't 100% sure if we are using the row match finder. + * Unless it is explicitly disabled, conservatively assume that it is enabled. + * In this case it will only be disabled for small sources, so shrinking the + * hash log a little bit shouldn't result in any ratio loss. + */ + if (useRowMatchFinder == ZSTD_ps_auto) + useRowMatchFinder = ZSTD_ps_enable; + + /* We can't hash more than 32-bits in total. So that means that we require: + * (hashLog - rowLog + 8) <= 32 + */ + if (ZSTD_rowMatchFinderUsed(cPar.strategy, useRowMatchFinder)) { + /* Switch to 32-entry rows if searchLog is 5 (or more) */ + U32 const rowLog = BOUNDED(4, cPar.searchLog, 6); + U32 const maxRowHashLog = 32 - ZSTD_ROW_HASH_TAG_BITS; + U32 const maxHashLog = maxRowHashLog + rowLog; + assert(cPar.hashLog >= rowLog); + if (cPar.hashLog > maxHashLog) { + cPar.hashLog = maxHashLog; + } + } + return cPar; } @@ -1371,7 +1532,7 @@ ZSTD_adjustCParams(ZSTD_compressionParameters cPar, { cPar = ZSTD_clampCParams(cPar); /* resulting cPar is necessarily valid (all parameters within range) */ if (srcSize == 0) srcSize = ZSTD_CONTENTSIZE_UNKNOWN; - return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize, ZSTD_cpm_unknown); + return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize, ZSTD_cpm_unknown, ZSTD_ps_auto); } static ZSTD_compressionParameters ZSTD_getCParams_internal(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode); @@ -1398,16 +1559,16 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( srcSizeHint = CCtxParams->srcSizeHint; } cParams = ZSTD_getCParams_internal(CCtxParams->compressionLevel, srcSizeHint, dictSize, mode); - if (CCtxParams->ldmParams.enableLdm) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG; + if (CCtxParams->ldmParams.enableLdm == ZSTD_ps_enable) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG; ZSTD_overrideCParams(&cParams, &CCtxParams->cParams); assert(!ZSTD_checkCParams(cParams)); /* srcSizeHint == 0 means 0 */ - return ZSTD_adjustCParams_internal(cParams, srcSizeHint, dictSize, mode); + return ZSTD_adjustCParams_internal(cParams, srcSizeHint, dictSize, mode, CCtxParams->useRowMatchFinder); } static size_t ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const U32 enableDedicatedDictSearch, const U32 forCCtx) { @@ -1440,26 +1601,34 @@ ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, /* tables are guaranteed to be sized in multiples of 64 bytes (or 16 uint32_t) */ ZSTD_STATIC_ASSERT(ZSTD_HASHLOG_MIN >= 4 && ZSTD_WINDOWLOG_MIN >= 4 && ZSTD_CHAINLOG_MIN >= 4); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u", (U32)chainSize, (U32)hSize, (U32)h3Size); return tableSpace + optSpace + slackSpace + lazyAdditionalSpace; } +/* Helper function for calculating memory requirements. + * Gives a tighter bound than ZSTD_sequenceBound() by taking minMatch into account. */ +static size_t ZSTD_maxNbSeq(size_t blockSize, unsigned minMatch, int useSequenceProducer) { + U32 const divider = (minMatch==3 || useSequenceProducer) ? 3 : 4; + return blockSize / divider; +} + static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( const ZSTD_compressionParameters* cParams, const ldmParams_t* ldmParams, const int isStatic, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const size_t buffInSize, const size_t buffOutSize, - const U64 pledgedSrcSize) + const U64 pledgedSrcSize, + int useSequenceProducer, + size_t maxBlockSize) { - size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << cParams->windowLog), pledgedSrcSize)); - size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); - U32 const divider = (cParams->minMatch==3) ? 3 : 4; - size_t const maxNbSeq = blockSize / divider; + size_t const windowSize = (size_t) BOUNDED(1ULL, 1ULL << cParams->windowLog, pledgedSrcSize); + size_t const blockSize = MIN(ZSTD_resolveMaxBlockSize(maxBlockSize), windowSize); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, cParams->minMatch, useSequenceProducer); size_t const tokenSpace = ZSTD_cwksp_alloc_size(WILDCOPY_OVERLENGTH + blockSize) + ZSTD_cwksp_aligned_alloc_size(maxNbSeq * sizeof(seqDef)) + 3 * ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(BYTE)); @@ -1469,7 +1638,7 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( size_t const ldmSpace = ZSTD_ldm_getTableSize(*ldmParams); size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(*ldmParams, blockSize); - size_t const ldmSeqSpace = ldmParams->enableLdm ? + size_t const ldmSeqSpace = ldmParams->enableLdm == ZSTD_ps_enable ? ZSTD_cwksp_aligned_alloc_size(maxNbLdmSeq * sizeof(rawSeq)) : 0; @@ -1478,6 +1647,11 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( size_t const cctxSpace = isStatic ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0; + size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); + size_t const externalSeqSpace = useSequenceProducer + ? ZSTD_cwksp_aligned_alloc_size(maxNbExternalSeq * sizeof(ZSTD_Sequence)) + : 0; + size_t const neededSpace = cctxSpace + entropySpace + @@ -1486,7 +1660,8 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( ldmSeqSpace + matchStateSize + tokenSpace + - bufferSpace; + bufferSpace + + externalSeqSpace; DEBUGLOG(5, "estimate workspace : %u", (U32)neededSpace); return neededSpace; @@ -1496,15 +1671,15 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params) { ZSTD_compressionParameters const cParams = ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, - &cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, + &cParams); RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only."); /* estimateCCtxSize is for one-shot compression. So no buffers should * be needed. However, we still allocate two 0-sized buffers, which can * take space under ASAN. */ return ZSTD_estimateCCtxSize_usingCCtxParams_internal( - &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, 0, 0, ZSTD_CONTENTSIZE_UNKNOWN); + &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, 0, 0, ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); } size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) @@ -1514,9 +1689,9 @@ size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ size_t noRowCCtxSize; size_t rowCCtxSize; - initialParams.useRowMatchFinder = ZSTD_urm_disableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_disable; noRowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); - initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_enable; rowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); return MAX(noRowCCtxSize, rowCCtxSize); } else { @@ -1554,18 +1729,18 @@ size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params) RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only."); { ZSTD_compressionParameters const cParams = ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); - size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog); + size_t const blockSize = MIN(ZSTD_resolveMaxBlockSize(params->maxBlockSize), (size_t)1 << cParams.windowLog); size_t const inBuffSize = (params->inBufferMode == ZSTD_bm_buffered) ? ((size_t)1 << cParams.windowLog) + blockSize : 0; size_t const outBuffSize = (params->outBufferMode == ZSTD_bm_buffered) ? ZSTD_compressBound(blockSize) + 1 : 0; - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams); return ZSTD_estimateCCtxSize_usingCCtxParams_internal( &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, inBuffSize, outBuffSize, - ZSTD_CONTENTSIZE_UNKNOWN); + ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); } } @@ -1576,9 +1751,9 @@ size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams) /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ size_t noRowCCtxSize; size_t rowCCtxSize; - initialParams.useRowMatchFinder = ZSTD_urm_disableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_disable; noRowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); - initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_enable; rowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); return MAX(noRowCCtxSize, rowCCtxSize); } else { @@ -1713,7 +1888,7 @@ static size_t ZSTD_reset_matchState(ZSTD_matchState_t* ms, ZSTD_cwksp* ws, const ZSTD_compressionParameters* cParams, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const ZSTD_compResetPolicy_e crp, const ZSTD_indexResetPolicy_e forceResetIndex, const ZSTD_resetTarget_e forWho) @@ -1728,7 +1903,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, size_t const h3Size = hashLog3 ? ((size_t)1) << hashLog3 : 0; DEBUGLOG(4, "reset indices : %u", forceResetIndex == ZSTDirp_reset); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); if (forceResetIndex == ZSTDirp_reset) { ZSTD_window_init(&ms->window); ZSTD_cwksp_mark_tables_dirty(ws); @@ -1774,8 +1949,8 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, if (ms->tagTable) ZSTD_memset(ms->tagTable, 0, tagTableSize); } { /* Switch to 32-entry rows if searchLog is 5 (or more) */ - U32 const rowLog = cParams->searchLog < 5 ? 4 : 5; - assert(cParams->hashLog > rowLog); + U32 const rowLog = BOUNDED(4, cParams->searchLog, 6); + assert(cParams->hashLog >= rowLog); ms->rowHashLog = cParams->hashLog - rowLog; } } @@ -1824,8 +1999,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_buffered_policy_e const zbuff) { ZSTD_cwksp* const ws = &zc->workspace; - DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d", - (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder); + DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d useBlockSplitter=%d", + (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder, (int)params->useBlockSplitter); assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams))); zc->isFirstBlock = 1; @@ -1836,8 +2011,11 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->appliedParams = *params; params = &zc->appliedParams; - assert(params->useRowMatchFinder != ZSTD_urm_auto); - if (params->ldmParams.enableLdm) { + assert(params->useRowMatchFinder != ZSTD_ps_auto); + assert(params->useBlockSplitter != ZSTD_ps_auto); + assert(params->ldmParams.enableLdm != ZSTD_ps_auto); + assert(params->maxBlockSize != 0); + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* Adjust long distance matching parameters */ ZSTD_ldm_adjustParameters(&zc->appliedParams.ldmParams, ¶ms->cParams); assert(params->ldmParams.hashLog >= params->ldmParams.bucketSizeLog); @@ -1845,9 +2023,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, } { size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params->cParams.windowLog), pledgedSrcSize)); - size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); - U32 const divider = (params->cParams.minMatch==3) ? 3 : 4; - size_t const maxNbSeq = blockSize / divider; + size_t const blockSize = MIN(params->maxBlockSize, windowSize); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, params->cParams.minMatch, params->useSequenceProducer); size_t const buffOutSize = (zbuff == ZSTDb_buffered && params->outBufferMode == ZSTD_bm_buffered) ? ZSTD_compressBound(blockSize) + 1 : 0; @@ -1864,7 +2041,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, size_t const neededSpace = ZSTD_estimateCCtxSize_usingCCtxParams_internal( ¶ms->cParams, ¶ms->ldmParams, zc->staticSize != 0, params->useRowMatchFinder, - buffInSize, buffOutSize, pledgedSrcSize); + buffInSize, buffOutSize, pledgedSrcSize, params->useSequenceProducer, params->maxBlockSize); int resizeWorkspace; FORWARD_IF_ERROR(neededSpace, "cctx size estimate failed!"); @@ -1900,13 +2077,14 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->blockState.nextCBlock = (ZSTD_compressedBlockState_t*) ZSTD_cwksp_reserve_object(ws, sizeof(ZSTD_compressedBlockState_t)); RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate nextCBlock"); zc->entropyWorkspace = (U32*) ZSTD_cwksp_reserve_object(ws, ENTROPY_WORKSPACE_SIZE); - RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate entropyWorkspace"); + RETURN_ERROR_IF(zc->entropyWorkspace == NULL, memory_allocation, "couldn't allocate entropyWorkspace"); } } ZSTD_cwksp_clear(ws); /* init params */ zc->blockState.matchState.cParams = params->cParams; + zc->blockState.matchState.prefetchCDictTables = params->prefetchCDictTables == ZSTD_ps_enable; zc->pledgedSrcSizePlusOne = pledgedSrcSize+1; zc->consumedSrcSize = 0; zc->producedCSize = 0; @@ -1937,7 +2115,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->outBuff = (char*)ZSTD_cwksp_reserve_buffer(ws, buffOutSize); /* ldm bucketOffsets table */ - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* TODO: avoid memset? */ size_t const numBuckets = ((size_t)1) << (params->ldmParams.hashLog - @@ -1964,7 +2142,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_resetTarget_CCtx), ""); /* ldm hash table */ - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* TODO: avoid memset? */ size_t const ldmHSize = ((size_t)1) << params->ldmParams.hashLog; zc->ldmState.hashTable = (ldmEntry_t*)ZSTD_cwksp_reserve_aligned(ws, ldmHSize * sizeof(ldmEntry_t)); @@ -1976,8 +2154,16 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->ldmState.loadedDictEnd = 0; } - assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace)); + /* reserve space for block-level external sequences */ + if (params->useSequenceProducer) { + size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); + zc->externalMatchCtx.seqBufferCapacity = maxNbExternalSeq; + zc->externalMatchCtx.seqBuffer = + (ZSTD_Sequence*)ZSTD_cwksp_reserve_aligned(ws, maxNbExternalSeq * sizeof(ZSTD_Sequence)); + } + DEBUGLOG(3, "wksp: finished allocating, %zd bytes remain available", ZSTD_cwksp_available_space(ws)); + assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace)); zc->initialized = 1; @@ -2049,7 +2235,8 @@ ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx, } params.cParams = ZSTD_adjustCParams_internal(adjusted_cdict_cParams, pledgedSrcSize, - cdict->dictContentSize, ZSTD_cpm_attachDict); + cdict->dictContentSize, ZSTD_cpm_attachDict, + params.useRowMatchFinder); params.cParams.windowLog = windowLog; params.useRowMatchFinder = cdict->useRowMatchFinder; /* cdict overrides */ FORWARD_IF_ERROR(ZSTD_resetCCtx_internal(cctx, ¶ms, pledgedSrcSize, @@ -2088,6 +2275,22 @@ ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx, return 0; } +static void ZSTD_copyCDictTableIntoCCtx(U32* dst, U32 const* src, size_t tableSize, + ZSTD_compressionParameters const* cParams) { + if (ZSTD_CDictIndicesAreTagged(cParams)){ + /* Remove tags from the CDict table if they are present. + * See docs on "short cache" in zstd_compress_internal.h for context. */ + size_t i; + for (i = 0; i < tableSize; i++) { + U32 const taggedIndex = src[i]; + U32 const index = taggedIndex >> ZSTD_SHORT_CACHE_TAG_BITS; + dst[i] = index; + } + } else { + ZSTD_memcpy(dst, src, tableSize * sizeof(U32)); + } +} + static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict, ZSTD_CCtx_params params, @@ -2115,7 +2318,7 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, } ZSTD_cwksp_mark_tables_dirty(&cctx->workspace); - assert(params.useRowMatchFinder != ZSTD_urm_auto); + assert(params.useRowMatchFinder != ZSTD_ps_auto); /* copy tables */ { size_t const chainSize = ZSTD_allocateChainTable(cdict_cParams->strategy, cdict->useRowMatchFinder, 0 /* DDS guaranteed disabled */) @@ -2123,14 +2326,15 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, : 0; size_t const hSize = (size_t)1 << cdict_cParams->hashLog; - ZSTD_memcpy(cctx->blockState.matchState.hashTable, - cdict->matchState.hashTable, - hSize * sizeof(U32)); + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.hashTable, + cdict->matchState.hashTable, + hSize, cdict_cParams); + /* Do not copy cdict's chainTable if cctx has parameters such that it would not use chainTable */ if (ZSTD_allocateChainTable(cctx->appliedParams.cParams.strategy, cctx->appliedParams.useRowMatchFinder, 0 /* forDDSDict */)) { - ZSTD_memcpy(cctx->blockState.matchState.chainTable, - cdict->matchState.chainTable, - chainSize * sizeof(U32)); + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.chainTable, + cdict->matchState.chainTable, + chainSize, cdict_cParams); } /* copy tag table */ if (ZSTD_rowMatchFinderUsed(cdict_cParams->strategy, cdict->useRowMatchFinder)) { @@ -2209,9 +2413,14 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, { ZSTD_CCtx_params params = dstCCtx->requestedParams; /* Copy only compression parameters related to tables. */ params.cParams = srcCCtx->appliedParams.cParams; - assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_urm_auto); + assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto); params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder; + params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter; + params.ldmParams = srcCCtx->appliedParams.ldmParams; params.fParams = fParams; + params.maxBlockSize = srcCCtx->appliedParams.maxBlockSize; ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize, /* loadedDictSize */ 0, ZSTDcrp_leaveDirty, zbuff); @@ -2296,6 +2505,8 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa int const nbRows = (int)size / ZSTD_ROWSIZE; int cellNb = 0; int rowNb; + /* Protect special index values < ZSTD_WINDOW_START_INDEX. */ + U32 const reducerThreshold = reducerValue + ZSTD_WINDOW_START_INDEX; assert((size & (ZSTD_ROWSIZE-1)) == 0); /* multiple of ZSTD_ROWSIZE */ assert(size < (1U<<31)); /* can be casted to int */ @@ -2315,12 +2526,17 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa for (rowNb=0 ; rowNb < nbRows ; rowNb++) { int column; for (column=0; columnsequencesStart; BYTE* const llCodeTable = seqStorePtr->llCode; @@ -2372,18 +2588,24 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr) BYTE* const mlCodeTable = seqStorePtr->mlCode; U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); U32 u; + int longOffsets = 0; assert(nbSeq <= seqStorePtr->maxNbSeq); for (u=0; u= STREAM_ACCUMULATOR_MIN)); + if (MEM_32bits() && ofCode >= STREAM_ACCUMULATOR_MIN) + longOffsets = 1; } if (seqStorePtr->longLengthType==ZSTD_llt_literalLength) llCodeTable[seqStorePtr->longLengthPos] = MaxLL; if (seqStorePtr->longLengthType==ZSTD_llt_matchLength) mlCodeTable[seqStorePtr->longLengthPos] = MaxML; + return longOffsets; } /* ZSTD_useTargetCBlockSize(): @@ -2399,11 +2621,13 @@ static int ZSTD_useTargetCBlockSize(const ZSTD_CCtx_params* cctxParams) /* ZSTD_blockSplitterEnabled(): * Returns if block splitting param is being used * If used, compression will do best effort to split a block in order to improve compression ratio. + * At the time this function is called, the parameter must be finalized. * Returns 1 if true, 0 otherwise. */ static int ZSTD_blockSplitterEnabled(ZSTD_CCtx_params* cctxParams) { - DEBUGLOG(5, "ZSTD_blockSplitterEnabled(splitBlocks=%d)", cctxParams->splitBlocks); - return (cctxParams->splitBlocks != 0); + DEBUGLOG(5, "ZSTD_blockSplitterEnabled (useBlockSplitter=%d)", cctxParams->useBlockSplitter); + assert(cctxParams->useBlockSplitter != ZSTD_ps_auto); + return (cctxParams->useBlockSplitter == ZSTD_ps_enable); } /* Type returned by ZSTD_buildSequencesStatistics containing finalized symbol encoding types @@ -2415,6 +2639,7 @@ typedef struct { U32 MLtype; size_t size; size_t lastCountSize; /* Accounts for bug in 1.3.4. More detail in ZSTD_entropyCompressSeqStore_internal() */ + int longOffsets; } ZSTD_symbolEncodingTypeStats_t; /* ZSTD_buildSequencesStatistics(): @@ -2425,11 +2650,13 @@ typedef struct { * entropyWkspSize must be of size at least ENTROPY_WORKSPACE_SIZE - (MaxSeq + 1)*sizeof(U32) */ static ZSTD_symbolEncodingTypeStats_t -ZSTD_buildSequencesStatistics(seqStore_t* seqStorePtr, size_t nbSeq, - const ZSTD_fseCTables_t* prevEntropy, ZSTD_fseCTables_t* nextEntropy, - BYTE* dst, const BYTE* const dstEnd, - ZSTD_strategy strategy, unsigned* countWorkspace, - void* entropyWorkspace, size_t entropyWkspSize) { +ZSTD_buildSequencesStatistics( + const seqStore_t* seqStorePtr, size_t nbSeq, + const ZSTD_fseCTables_t* prevEntropy, ZSTD_fseCTables_t* nextEntropy, + BYTE* dst, const BYTE* const dstEnd, + ZSTD_strategy strategy, unsigned* countWorkspace, + void* entropyWorkspace, size_t entropyWkspSize) +{ BYTE* const ostart = dst; const BYTE* const oend = dstEnd; BYTE* op = ostart; @@ -2443,7 +2670,7 @@ ZSTD_buildSequencesStatistics(seqStore_t* seqStorePtr, size_t nbSeq, stats.lastCountSize = 0; /* convert length/distances into codes */ - ZSTD_seqToCodes(seqStorePtr); + stats.longOffsets = ZSTD_seqToCodes(seqStorePtr); assert(op <= oend); assert(nbSeq != 0); /* ZSTD_selectEncodingType() divides by nbSeq */ /* build CTable for Literal Lengths */ @@ -2546,23 +2773,24 @@ ZSTD_buildSequencesStatistics(seqStore_t* seqStorePtr, size_t nbSeq, * compresses both literals and sequences * Returns compressed size of block, or a zstd error. */ +#define SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO 20 MEM_STATIC size_t -ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, - const ZSTD_entropyCTables_t* prevEntropy, - ZSTD_entropyCTables_t* nextEntropy, - const ZSTD_CCtx_params* cctxParams, - void* dst, size_t dstCapacity, - void* entropyWorkspace, size_t entropyWkspSize, - const int bmi2) +ZSTD_entropyCompressSeqStore_internal( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + void* entropyWorkspace, size_t entropyWkspSize, + const int bmi2) { - const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN; ZSTD_strategy const strategy = cctxParams->cParams.strategy; unsigned* count = (unsigned*)entropyWorkspace; FSE_CTable* CTable_LitLength = nextEntropy->fse.litlengthCTable; FSE_CTable* CTable_OffsetBits = nextEntropy->fse.offcodeCTable; FSE_CTable* CTable_MatchLength = nextEntropy->fse.matchlengthCTable; const seqDef* const sequences = seqStorePtr->sequencesStart; - const size_t nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart; + const size_t nbSeq = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); const BYTE* const ofCodeTable = seqStorePtr->ofCode; const BYTE* const llCodeTable = seqStorePtr->llCode; const BYTE* const mlCodeTable = seqStorePtr->mlCode; @@ -2570,25 +2798,31 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, BYTE* const oend = ostart + dstCapacity; BYTE* op = ostart; size_t lastCountSize; + int longOffsets = 0; entropyWorkspace = count + (MaxSeq + 1); entropyWkspSize -= (MaxSeq + 1) * sizeof(*count); - DEBUGLOG(4, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu)", nbSeq); + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu, dstCapacity=%zu)", nbSeq, dstCapacity); ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<= HUF_WORKSPACE_SIZE); /* Compress literals */ { const BYTE* const literals = seqStorePtr->litStart; + size_t const numSequences = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + size_t const numLiterals = (size_t)(seqStorePtr->lit - seqStorePtr->litStart); + /* Base suspicion of uncompressibility on ratio of literals to sequences */ + unsigned const suspectUncompressible = (numSequences == 0) || (numLiterals / numSequences >= SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO); size_t const litSize = (size_t)(seqStorePtr->lit - literals); + size_t const cSize = ZSTD_compressLiterals( - &prevEntropy->huf, &nextEntropy->huf, - cctxParams->cParams.strategy, - ZSTD_disableLiteralsCompression(cctxParams), op, dstCapacity, literals, litSize, entropyWorkspace, entropyWkspSize, - bmi2); + &prevEntropy->huf, &nextEntropy->huf, + cctxParams->cParams.strategy, + ZSTD_literalsCompressionIsDisabled(cctxParams), + suspectUncompressible, bmi2); FORWARD_IF_ERROR(cSize, "ZSTD_compressLiterals failed"); assert(cSize <= dstCapacity); op += cSize; @@ -2614,11 +2848,10 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, ZSTD_memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse)); return (size_t)(op - ostart); } - { - ZSTD_symbolEncodingTypeStats_t stats; - BYTE* seqHead = op++; + { BYTE* const seqHead = op++; /* build stats for sequences */ - stats = ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, + const ZSTD_symbolEncodingTypeStats_t stats = + ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, &prevEntropy->fse, &nextEntropy->fse, op, oend, strategy, count, @@ -2627,6 +2860,7 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, *seqHead = (BYTE)((stats.LLtype<<6) + (stats.Offtype<<4) + (stats.MLtype<<2)); lastCountSize = stats.lastCountSize; op += stats.size; + longOffsets = stats.longOffsets; } { size_t const bitstreamSize = ZSTD_encodeSequences( @@ -2661,14 +2895,15 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, } MEM_STATIC size_t -ZSTD_entropyCompressSeqStore(seqStore_t* seqStorePtr, - const ZSTD_entropyCTables_t* prevEntropy, - ZSTD_entropyCTables_t* nextEntropy, - const ZSTD_CCtx_params* cctxParams, - void* dst, size_t dstCapacity, - size_t srcSize, - void* entropyWorkspace, size_t entropyWkspSize, - int bmi2) +ZSTD_entropyCompressSeqStore( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + size_t srcSize, + void* entropyWorkspace, size_t entropyWkspSize, + int bmi2) { size_t const cSize = ZSTD_entropyCompressSeqStore_internal( seqStorePtr, prevEntropy, nextEntropy, cctxParams, @@ -2678,22 +2913,28 @@ ZSTD_entropyCompressSeqStore(seqStore_t* seqStorePtr, /* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block. * Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block. */ - if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity)) + if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity)) { + DEBUGLOG(4, "not enough dstCapacity (%zu) for ZSTD_entropyCompressSeqStore_internal()=> do not compress block", dstCapacity); return 0; /* block not compressed */ + } FORWARD_IF_ERROR(cSize, "ZSTD_entropyCompressSeqStore_internal failed"); /* Check compressibility */ { size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, cctxParams->cParams.strategy); if (cSize >= maxCSize) return 0; /* block not compressed */ } - DEBUGLOG(4, "ZSTD_entropyCompressSeqStore() cSize: %zu", cSize); + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore() cSize: %zu", cSize); + /* libzstd decoder before > v1.5.4 is not compatible with compressed blocks of size ZSTD_BLOCKSIZE_MAX exactly. + * This restriction is indirectly already fulfilled by respecting ZSTD_minGain() condition above. + */ + assert(cSize < ZSTD_BLOCKSIZE_MAX); return cSize; } /* ZSTD_selectBlockCompressor() : * Not static, but internal use only (used by long distance matcher) * assumption : strat is a valid strategy */ -ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRowMatchFinderMode_e useRowMatchFinder, ZSTD_dictMode_e dictMode) +ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e useRowMatchFinder, ZSTD_dictMode_e dictMode) { static const ZSTD_blockCompressor blockCompressor[4][ZSTD_STRATEGY_MAX+1] = { { ZSTD_compressBlock_fast /* default for 0 */, @@ -2758,7 +2999,7 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRow ZSTD_compressBlock_lazy2_dedicatedDictSearch_row } }; DEBUGLOG(4, "Selecting a row-based matchfinder"); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); selectedCompressor = rowBasedBlockCompressors[(int)dictMode][(int)strat - (int)ZSTD_greedy]; } else { selectedCompressor = blockCompressor[(int)dictMode][(int)strat]; @@ -2781,6 +3022,72 @@ void ZSTD_resetSeqStore(seqStore_t* ssPtr) ssPtr->longLengthType = ZSTD_llt_none; } +/* ZSTD_postProcessSequenceProducerResult() : + * Validates and post-processes sequences obtained through the external matchfinder API: + * - Checks whether nbExternalSeqs represents an error condition. + * - Appends a block delimiter to outSeqs if one is not already present. + * See zstd.h for context regarding block delimiters. + * Returns the number of sequences after post-processing, or an error code. */ +static size_t ZSTD_postProcessSequenceProducerResult( + ZSTD_Sequence* outSeqs, size_t nbExternalSeqs, size_t outSeqsCapacity, size_t srcSize +) { + RETURN_ERROR_IF( + nbExternalSeqs > outSeqsCapacity, + sequenceProducer_failed, + "External sequence producer returned error code %lu", + (unsigned long)nbExternalSeqs + ); + + RETURN_ERROR_IF( + nbExternalSeqs == 0 && srcSize > 0, + sequenceProducer_failed, + "Got zero sequences from external sequence producer for a non-empty src buffer!" + ); + + if (srcSize == 0) { + ZSTD_memset(&outSeqs[0], 0, sizeof(ZSTD_Sequence)); + return 1; + } + + { + ZSTD_Sequence const lastSeq = outSeqs[nbExternalSeqs - 1]; + + /* We can return early if lastSeq is already a block delimiter. */ + if (lastSeq.offset == 0 && lastSeq.matchLength == 0) { + return nbExternalSeqs; + } + + /* This error condition is only possible if the external matchfinder + * produced an invalid parse, by definition of ZSTD_sequenceBound(). */ + RETURN_ERROR_IF( + nbExternalSeqs == outSeqsCapacity, + sequenceProducer_failed, + "nbExternalSeqs == outSeqsCapacity but lastSeq is not a block delimiter!" + ); + + /* lastSeq is not a block delimiter, so we need to append one. */ + ZSTD_memset(&outSeqs[nbExternalSeqs], 0, sizeof(ZSTD_Sequence)); + return nbExternalSeqs + 1; + } +} + +/* ZSTD_fastSequenceLengthSum() : + * Returns sum(litLen) + sum(matchLen) + lastLits for *seqBuf*. + * Similar to another function in zstd_compress.c (determine_blockSize), + * except it doesn't check for a block delimiter to end summation. + * Removing the early exit allows the compiler to auto-vectorize (https://godbolt.org/z/cY1cajz9P). + * This function can be deleted and replaced by determine_blockSize after we resolve issue #3456. */ +static size_t ZSTD_fastSequenceLengthSum(ZSTD_Sequence const* seqBuf, size_t seqBufSize) { + size_t matchLenSum, litLenSum, i; + matchLenSum = 0; + litLenSum = 0; + for (i = 0; i < seqBufSize; i++) { + litLenSum += seqBuf[i].litLength; + matchLenSum += seqBuf[i].matchLength; + } + return litLenSum + matchLenSum; +} + typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e; static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) @@ -2790,7 +3097,9 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) assert(srcSize <= ZSTD_BLOCKSIZE_MAX); /* Assert that we have correctly flushed the ctx params into the ms's copy */ ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams); - if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { if (zc->appliedParams.cParams.strategy >= ZSTD_btopt) { ZSTD_ldm_skipRawSeqStoreBytes(&zc->externSeqStore, srcSize); } else { @@ -2825,7 +3134,16 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i]; } if (zc->externSeqStore.pos < zc->externSeqStore.size) { - assert(!zc->appliedParams.ldmParams.enableLdm); + assert(zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_disable); + + /* External matchfinder + LDM is technically possible, just not implemented yet. + * We need to revisit soon and implement it. */ + RETURN_ERROR_IF( + zc->appliedParams.useSequenceProducer, + parameter_combination_unsupported, + "Long-distance matching with external sequence producer enabled is not currently supported." + ); + /* Updates ldmSeqStore.pos */ lastLLSize = ZSTD_ldm_blockCompress(&zc->externSeqStore, @@ -2834,9 +3152,17 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, src, srcSize); assert(zc->externSeqStore.pos <= zc->externSeqStore.size); - } else if (zc->appliedParams.ldmParams.enableLdm) { + } else if (zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { rawSeqStore_t ldmSeqStore = kNullRawSeqStore; + /* External matchfinder + LDM is technically possible, just not implemented yet. + * We need to revisit soon and implement it. */ + RETURN_ERROR_IF( + zc->appliedParams.useSequenceProducer, + parameter_combination_unsupported, + "Long-distance matching with external sequence producer enabled is not currently supported." + ); + ldmSeqStore.seq = zc->ldmSequences; ldmSeqStore.capacity = zc->maxNbLdmSequences; /* Updates ldmSeqStore.size */ @@ -2851,7 +3177,68 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, src, srcSize); assert(ldmSeqStore.pos == ldmSeqStore.size); - } else { /* not long range mode */ + } else if (zc->appliedParams.useSequenceProducer) { + assert( + zc->externalMatchCtx.seqBufferCapacity >= ZSTD_sequenceBound(srcSize) + ); + assert(zc->externalMatchCtx.mFinder != NULL); + + { U32 const windowSize = (U32)1 << zc->appliedParams.cParams.windowLog; + + size_t const nbExternalSeqs = (zc->externalMatchCtx.mFinder)( + zc->externalMatchCtx.mState, + zc->externalMatchCtx.seqBuffer, + zc->externalMatchCtx.seqBufferCapacity, + src, srcSize, + NULL, 0, /* dict and dictSize, currently not supported */ + zc->appliedParams.compressionLevel, + windowSize + ); + + size_t const nbPostProcessedSeqs = ZSTD_postProcessSequenceProducerResult( + zc->externalMatchCtx.seqBuffer, + nbExternalSeqs, + zc->externalMatchCtx.seqBufferCapacity, + srcSize + ); + + /* Return early if there is no error, since we don't need to worry about last literals */ + if (!ZSTD_isError(nbPostProcessedSeqs)) { + ZSTD_sequencePosition seqPos = {0,0,0}; + size_t const seqLenSum = ZSTD_fastSequenceLengthSum(zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs); + RETURN_ERROR_IF(seqLenSum > srcSize, externalSequences_invalid, "External sequences imply too large a block!"); + FORWARD_IF_ERROR( + ZSTD_copySequencesToSeqStoreExplicitBlockDelim( + zc, &seqPos, + zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs, + src, srcSize, + zc->appliedParams.searchForExternalRepcodes + ), + "Failed to copy external sequences to seqStore!" + ); + ms->ldmSeqStore = NULL; + DEBUGLOG(5, "Copied %lu sequences from external sequence producer to internal seqStore.", (unsigned long)nbExternalSeqs); + return ZSTDbss_compress; + } + + /* Propagate the error if fallback is disabled */ + if (!zc->appliedParams.enableMatchFinderFallback) { + return nbPostProcessedSeqs; + } + + /* Fallback to software matchfinder */ + { ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, + zc->appliedParams.useRowMatchFinder, + dictMode); + ms->ldmSeqStore = NULL; + DEBUGLOG( + 5, + "External sequence producer returned error code %lu. Falling back to internal parser.", + (unsigned long)nbExternalSeqs + ); + lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); + } } + } else { /* not long range mode and no external matchfinder */ ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, zc->appliedParams.useRowMatchFinder, dictMode); @@ -2882,9 +3269,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) assert(zc->seqCollector.maxSequences >= seqStoreSeqSize + 1); ZSTD_memcpy(updatedRepcodes.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); for (i = 0; i < seqStoreSeqSize; ++i) { - U32 rawOffset = seqStoreSeqs[i].offset - ZSTD_REP_NUM; + U32 rawOffset = seqStoreSeqs[i].offBase - ZSTD_REP_NUM; outSeqs[i].litLength = seqStoreSeqs[i].litLength; - outSeqs[i].matchLength = seqStoreSeqs[i].matchLength + MINMATCH; + outSeqs[i].matchLength = seqStoreSeqs[i].mlBase + MINMATCH; outSeqs[i].rep = 0; if (i == seqStore->longLengthPos) { @@ -2895,9 +3282,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) } } - if (seqStoreSeqs[i].offset <= ZSTD_REP_NUM) { + if (seqStoreSeqs[i].offBase <= ZSTD_REP_NUM) { /* Derive the correct offset corresponding to a repcode */ - outSeqs[i].rep = seqStoreSeqs[i].offset; + outSeqs[i].rep = seqStoreSeqs[i].offBase; if (outSeqs[i].litLength != 0) { rawOffset = updatedRepcodes.rep[outSeqs[i].rep - 1]; } else { @@ -2911,9 +3298,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) outSeqs[i].offset = rawOffset; /* seqStoreSeqs[i].offset == offCode+1, and ZSTD_updateRep() expects offCode so we provide seqStoreSeqs[i].offset - 1 */ - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, - seqStoreSeqs[i].offset - 1, - seqStoreSeqs[i].litLength == 0); + ZSTD_updateRep(updatedRepcodes.rep, + seqStoreSeqs[i].offBase, + seqStoreSeqs[i].litLength == 0); literalsRead += outSeqs[i].litLength; } /* Insert last literals (if any exist) in the block as a sequence with ml == off == 0. @@ -2928,6 +3315,10 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) zc->seqCollector.seqIndex += seqStoreSeqSize; } +size_t ZSTD_sequenceBound(size_t srcSize) { + return (srcSize / ZSTD_MINMATCH_MIN) + 1; +} + size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, size_t outSeqsSize, const void* src, size_t srcSize) { @@ -2973,19 +3364,17 @@ static int ZSTD_isRLE(const BYTE* src, size_t length) { const size_t unrollMask = unrollSize - 1; const size_t prefixLength = length & unrollMask; size_t i; - size_t u; if (length == 1) return 1; /* Check if prefix is RLE first before using unrolled loop */ if (prefixLength && ZSTD_count(ip+1, ip, ip+prefixLength) != prefixLength-1) { return 0; } for (i = prefixLength; i != length; i += unrollSize) { + size_t u; for (u = 0; u < unrollSize; u += sizeof(size_t)) { if (MEM_readST(ip + i + u) != valueST) { return 0; - } - } - } + } } } return 1; } @@ -3001,7 +3390,8 @@ static int ZSTD_maybeRLE(seqStore_t const* seqStore) return nbSeqs < 4 && nbLits < 10; } -static void ZSTD_blockState_confirmRepcodesAndEntropyTables(ZSTD_blockState_t* const bs) +static void +ZSTD_blockState_confirmRepcodesAndEntropyTables(ZSTD_blockState_t* const bs) { ZSTD_compressedBlockState_t* const tmp = bs->prevCBlock; bs->prevCBlock = bs->nextCBlock; @@ -3009,7 +3399,9 @@ static void ZSTD_blockState_confirmRepcodesAndEntropyTables(ZSTD_blockState_t* c } /* Writes the block header */ -static void writeBlockHeader(void* op, size_t cSize, size_t blockSize, U32 lastBlock) { +static void +writeBlockHeader(void* op, size_t cSize, size_t blockSize, U32 lastBlock) +{ U32 const cBlockHeader = cSize == 1 ? lastBlock + (((U32)bt_rle)<<1) + (U32)(blockSize << 3) : lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3); @@ -3022,13 +3414,16 @@ static void writeBlockHeader(void* op, size_t cSize, size_t blockSize, U32 lastB * Stores literals block type (raw, rle, compressed, repeat) and * huffman description table to hufMetadata. * Requires ENTROPY_WORKSPACE_SIZE workspace - * @return : size of huffman description table or error code */ -static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSize, - const ZSTD_hufCTables_t* prevHuf, - ZSTD_hufCTables_t* nextHuf, - ZSTD_hufCTablesMetadata_t* hufMetadata, - const int disableLiteralsCompression, - void* workspace, size_t wkspSize) + * @return : size of huffman description table, or an error code + */ +static size_t +ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSize, + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_hufCTablesMetadata_t* hufMetadata, + const int literalsCompressionIsDisabled, + void* workspace, size_t wkspSize, + int hufFlags) { BYTE* const wkspStart = (BYTE*)workspace; BYTE* const wkspEnd = wkspStart + wkspSize; @@ -3036,16 +3431,16 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi unsigned* const countWksp = (unsigned*)workspace; const size_t countWkspSize = (HUF_SYMBOLVALUE_MAX + 1) * sizeof(unsigned); BYTE* const nodeWksp = countWkspStart + countWkspSize; - const size_t nodeWkspSize = wkspEnd-nodeWksp; + const size_t nodeWkspSize = (size_t)(wkspEnd - nodeWksp); unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; - unsigned huffLog = HUF_TABLELOG_DEFAULT; + unsigned huffLog = LitHufLog; HUF_repeat repeat = prevHuf->repeatMode; DEBUGLOG(5, "ZSTD_buildBlockEntropyStats_literals (srcSize=%zu)", srcSize); /* Prepare nextEntropy assuming reusing the existing table */ ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - if (disableLiteralsCompression) { + if (literalsCompressionIsDisabled) { DEBUGLOG(5, "set_basic - disabled"); hufMetadata->hType = set_basic; return 0; @@ -3053,73 +3448,77 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi /* small ? don't even attempt compression (speed opt) */ #ifndef COMPRESS_LITERALS_SIZE_MIN -#define COMPRESS_LITERALS_SIZE_MIN 63 +# define COMPRESS_LITERALS_SIZE_MIN 63 /* heuristic */ #endif { size_t const minLitSize = (prevHuf->repeatMode == HUF_repeat_valid) ? 6 : COMPRESS_LITERALS_SIZE_MIN; if (srcSize <= minLitSize) { DEBUGLOG(5, "set_basic - too small"); hufMetadata->hType = set_basic; return 0; - } - } + } } /* Scan input and build symbol stats */ - { size_t const largest = HIST_count_wksp (countWksp, &maxSymbolValue, (const BYTE*)src, srcSize, workspace, wkspSize); + { size_t const largest = + HIST_count_wksp (countWksp, &maxSymbolValue, + (const BYTE*)src, srcSize, + workspace, wkspSize); FORWARD_IF_ERROR(largest, "HIST_count_wksp failed"); if (largest == srcSize) { + /* only one literal symbol */ DEBUGLOG(5, "set_rle"); hufMetadata->hType = set_rle; return 0; } if (largest <= (srcSize >> 7)+4) { + /* heuristic: likely not compressible */ DEBUGLOG(5, "set_basic - no gain"); hufMetadata->hType = set_basic; return 0; - } - } + } } /* Validate the previous Huffman table */ - if (repeat == HUF_repeat_check && !HUF_validateCTable((HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue)) { + if (repeat == HUF_repeat_check + && !HUF_validateCTable((HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue)) { repeat = HUF_repeat_none; } /* Build Huffman Tree */ ZSTD_memset(nextHuf->CTable, 0, sizeof(nextHuf->CTable)); - huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue); + huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue, nodeWksp, nodeWkspSize, nextHuf->CTable, countWksp, hufFlags); + assert(huffLog <= LitHufLog); { size_t const maxBits = HUF_buildCTable_wksp((HUF_CElt*)nextHuf->CTable, countWksp, maxSymbolValue, huffLog, nodeWksp, nodeWkspSize); FORWARD_IF_ERROR(maxBits, "HUF_buildCTable_wksp"); huffLog = (U32)maxBits; - { /* Build and write the CTable */ - size_t const newCSize = HUF_estimateCompressedSize( - (HUF_CElt*)nextHuf->CTable, countWksp, maxSymbolValue); - size_t const hSize = HUF_writeCTable_wksp( - hufMetadata->hufDesBuffer, sizeof(hufMetadata->hufDesBuffer), - (HUF_CElt*)nextHuf->CTable, maxSymbolValue, huffLog, - nodeWksp, nodeWkspSize); - /* Check against repeating the previous CTable */ - if (repeat != HUF_repeat_none) { - size_t const oldCSize = HUF_estimateCompressedSize( - (HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue); - if (oldCSize < srcSize && (oldCSize <= hSize + newCSize || hSize + 12 >= srcSize)) { - DEBUGLOG(5, "set_repeat - smaller"); - ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - hufMetadata->hType = set_repeat; - return 0; - } - } - if (newCSize + hSize >= srcSize) { - DEBUGLOG(5, "set_basic - no gains"); + } + { /* Build and write the CTable */ + size_t const newCSize = HUF_estimateCompressedSize( + (HUF_CElt*)nextHuf->CTable, countWksp, maxSymbolValue); + size_t const hSize = HUF_writeCTable_wksp( + hufMetadata->hufDesBuffer, sizeof(hufMetadata->hufDesBuffer), + (HUF_CElt*)nextHuf->CTable, maxSymbolValue, huffLog, + nodeWksp, nodeWkspSize); + /* Check against repeating the previous CTable */ + if (repeat != HUF_repeat_none) { + size_t const oldCSize = HUF_estimateCompressedSize( + (HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue); + if (oldCSize < srcSize && (oldCSize <= hSize + newCSize || hSize + 12 >= srcSize)) { + DEBUGLOG(5, "set_repeat - smaller"); ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - hufMetadata->hType = set_basic; + hufMetadata->hType = set_repeat; return 0; - } - DEBUGLOG(5, "set_compressed (hSize=%u)", (U32)hSize); - hufMetadata->hType = set_compressed; - nextHuf->repeatMode = HUF_repeat_check; - return hSize; + } } + if (newCSize + hSize >= srcSize) { + DEBUGLOG(5, "set_basic - no gains"); + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + hufMetadata->hType = set_basic; + return 0; } + DEBUGLOG(5, "set_compressed (hSize=%u)", (U32)hSize); + hufMetadata->hType = set_compressed; + nextHuf->repeatMode = HUF_repeat_check; + return hSize; } } @@ -3129,8 +3528,9 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi * and updates nextEntropy to the appropriate repeatMode. */ static ZSTD_symbolEncodingTypeStats_t -ZSTD_buildDummySequencesStatistics(ZSTD_fseCTables_t* nextEntropy) { - ZSTD_symbolEncodingTypeStats_t stats = {set_basic, set_basic, set_basic, 0, 0}; +ZSTD_buildDummySequencesStatistics(ZSTD_fseCTables_t* nextEntropy) +{ + ZSTD_symbolEncodingTypeStats_t stats = {set_basic, set_basic, set_basic, 0, 0, 0}; nextEntropy->litlength_repeatMode = FSE_repeat_none; nextEntropy->offcode_repeatMode = FSE_repeat_none; nextEntropy->matchlength_repeatMode = FSE_repeat_none; @@ -3141,16 +3541,18 @@ ZSTD_buildDummySequencesStatistics(ZSTD_fseCTables_t* nextEntropy) { * Builds entropy for the sequences. * Stores symbol compression modes and fse table to fseMetadata. * Requires ENTROPY_WORKSPACE_SIZE wksp. - * @return : size of fse tables or error code */ -static size_t ZSTD_buildBlockEntropyStats_sequences(seqStore_t* seqStorePtr, - const ZSTD_fseCTables_t* prevEntropy, - ZSTD_fseCTables_t* nextEntropy, - const ZSTD_CCtx_params* cctxParams, - ZSTD_fseCTablesMetadata_t* fseMetadata, - void* workspace, size_t wkspSize) + * @return : size of fse tables or error code */ +static size_t +ZSTD_buildBlockEntropyStats_sequences( + const seqStore_t* seqStorePtr, + const ZSTD_fseCTables_t* prevEntropy, + ZSTD_fseCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_fseCTablesMetadata_t* fseMetadata, + void* workspace, size_t wkspSize) { ZSTD_strategy const strategy = cctxParams->cParams.strategy; - size_t const nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart; + size_t const nbSeq = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); BYTE* const ostart = fseMetadata->fseTablesBuffer; BYTE* const oend = ostart + sizeof(fseMetadata->fseTablesBuffer); BYTE* op = ostart; @@ -3177,23 +3579,28 @@ static size_t ZSTD_buildBlockEntropyStats_sequences(seqStore_t* seqStorePtr, /** ZSTD_buildBlockEntropyStats() : * Builds entropy for the block. * Requires workspace size ENTROPY_WORKSPACE_SIZE - * - * @return : 0 on success or error code + * @return : 0 on success, or an error code + * Note : also employed in superblock */ -size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, - const ZSTD_entropyCTables_t* prevEntropy, - ZSTD_entropyCTables_t* nextEntropy, - const ZSTD_CCtx_params* cctxParams, - ZSTD_entropyCTablesMetadata_t* entropyMetadata, - void* workspace, size_t wkspSize) +size_t ZSTD_buildBlockEntropyStats( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize) { - size_t const litSize = seqStorePtr->lit - seqStorePtr->litStart; + size_t const litSize = (size_t)(seqStorePtr->lit - seqStorePtr->litStart); + int const huf_useOptDepth = (cctxParams->cParams.strategy >= HUF_OPTIMAL_DEPTH_THRESHOLD); + int const hufFlags = huf_useOptDepth ? HUF_flags_optimalDepth : 0; + entropyMetadata->hufMetadata.hufDesSize = ZSTD_buildBlockEntropyStats_literals(seqStorePtr->litStart, litSize, &prevEntropy->huf, &nextEntropy->huf, &entropyMetadata->hufMetadata, - ZSTD_disableLiteralsCompression(cctxParams), - workspace, wkspSize); + ZSTD_literalsCompressionIsDisabled(cctxParams), + workspace, wkspSize, hufFlags); + FORWARD_IF_ERROR(entropyMetadata->hufMetadata.hufDesSize, "ZSTD_buildBlockEntropyStats_literals failed"); entropyMetadata->fseMetadata.fseTablesSize = ZSTD_buildBlockEntropyStats_sequences(seqStorePtr, @@ -3206,11 +3613,12 @@ size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, } /* Returns the size estimate for the literals section (header + content) of a block */ -static size_t ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSize, - const ZSTD_hufCTables_t* huf, - const ZSTD_hufCTablesMetadata_t* hufMetadata, - void* workspace, size_t wkspSize, - int writeEntropy) +static size_t +ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSize, + const ZSTD_hufCTables_t* huf, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) { unsigned* const countWksp = (unsigned*)workspace; unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; @@ -3232,12 +3640,13 @@ static size_t ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSiz } /* Returns the size estimate for the FSE-compressed symbols (of, ml, ll) of a block */ -static size_t ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type, - const BYTE* codeTable, size_t nbSeq, unsigned maxCode, - const FSE_CTable* fseCTable, - const U32* additionalBits, - short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, - void* workspace, size_t wkspSize) +static size_t +ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type, + const BYTE* codeTable, size_t nbSeq, unsigned maxCode, + const FSE_CTable* fseCTable, + const U8* additionalBits, + short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, + void* workspace, size_t wkspSize) { unsigned* const countWksp = (unsigned*)workspace; const BYTE* ctp = codeTable; @@ -3269,98 +3678,107 @@ static size_t ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type, } /* Returns the size estimate for the sequences section (header + content) of a block */ -static size_t ZSTD_estimateBlockSize_sequences(const BYTE* ofCodeTable, - const BYTE* llCodeTable, - const BYTE* mlCodeTable, - size_t nbSeq, - const ZSTD_fseCTables_t* fseTables, - const ZSTD_fseCTablesMetadata_t* fseMetadata, - void* workspace, size_t wkspSize, - int writeEntropy) +static size_t +ZSTD_estimateBlockSize_sequences(const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) { size_t sequencesSectionHeaderSize = 1 /* seqHead */ + 1 /* min seqSize size */ + (nbSeq >= 128) + (nbSeq >= LONGNBSEQ); size_t cSeqSizeEstimate = 0; cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->ofType, ofCodeTable, nbSeq, MaxOff, - fseTables->offcodeCTable, NULL, - OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff, - workspace, wkspSize); + fseTables->offcodeCTable, NULL, + OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff, + workspace, wkspSize); cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->llType, llCodeTable, nbSeq, MaxLL, - fseTables->litlengthCTable, LL_bits, - LL_defaultNorm, LL_defaultNormLog, MaxLL, - workspace, wkspSize); + fseTables->litlengthCTable, LL_bits, + LL_defaultNorm, LL_defaultNormLog, MaxLL, + workspace, wkspSize); cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->mlType, mlCodeTable, nbSeq, MaxML, - fseTables->matchlengthCTable, ML_bits, - ML_defaultNorm, ML_defaultNormLog, MaxML, - workspace, wkspSize); + fseTables->matchlengthCTable, ML_bits, + ML_defaultNorm, ML_defaultNormLog, MaxML, + workspace, wkspSize); if (writeEntropy) cSeqSizeEstimate += fseMetadata->fseTablesSize; return cSeqSizeEstimate + sequencesSectionHeaderSize; } /* Returns the size estimate for a given stream of literals, of, ll, ml */ -static size_t ZSTD_estimateBlockSize(const BYTE* literals, size_t litSize, - const BYTE* ofCodeTable, - const BYTE* llCodeTable, - const BYTE* mlCodeTable, - size_t nbSeq, - const ZSTD_entropyCTables_t* entropy, - const ZSTD_entropyCTablesMetadata_t* entropyMetadata, - void* workspace, size_t wkspSize, - int writeLitEntropy, int writeSeqEntropy) { +static size_t +ZSTD_estimateBlockSize(const BYTE* literals, size_t litSize, + const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_entropyCTables_t* entropy, + const ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize, + int writeLitEntropy, int writeSeqEntropy) +{ size_t const literalsSize = ZSTD_estimateBlockSize_literal(literals, litSize, - &entropy->huf, &entropyMetadata->hufMetadata, - workspace, wkspSize, writeLitEntropy); + &entropy->huf, &entropyMetadata->hufMetadata, + workspace, wkspSize, writeLitEntropy); size_t const seqSize = ZSTD_estimateBlockSize_sequences(ofCodeTable, llCodeTable, mlCodeTable, - nbSeq, &entropy->fse, &entropyMetadata->fseMetadata, - workspace, wkspSize, writeSeqEntropy); + nbSeq, &entropy->fse, &entropyMetadata->fseMetadata, + workspace, wkspSize, writeSeqEntropy); return seqSize + literalsSize + ZSTD_blockHeaderSize; } /* Builds entropy statistics and uses them for blocksize estimation. * - * Returns the estimated compressed size of the seqStore, or a zstd error. + * @return: estimated compressed size of the seqStore, or a zstd error. */ -static size_t ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, const ZSTD_CCtx* zc) { - ZSTD_entropyCTablesMetadata_t entropyMetadata; +static size_t +ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, ZSTD_CCtx* zc) +{ + ZSTD_entropyCTablesMetadata_t* const entropyMetadata = &zc->blockSplitCtx.entropyMetadata; + DEBUGLOG(6, "ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize()"); FORWARD_IF_ERROR(ZSTD_buildBlockEntropyStats(seqStore, &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, &zc->appliedParams, - &entropyMetadata, - zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */), ""); - return ZSTD_estimateBlockSize(seqStore->litStart, (size_t)(seqStore->lit - seqStore->litStart), + entropyMetadata, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE), ""); + return ZSTD_estimateBlockSize( + seqStore->litStart, (size_t)(seqStore->lit - seqStore->litStart), seqStore->ofCode, seqStore->llCode, seqStore->mlCode, (size_t)(seqStore->sequences - seqStore->sequencesStart), - &zc->blockState.nextCBlock->entropy, &entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE, - (int)(entropyMetadata.hufMetadata.hType == set_compressed), 1); + &zc->blockState.nextCBlock->entropy, + entropyMetadata, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE, + (int)(entropyMetadata->hufMetadata.hType == set_compressed), 1); } /* Returns literals bytes represented in a seqStore */ -static size_t ZSTD_countSeqStoreLiteralsBytes(const seqStore_t* const seqStore) { +static size_t ZSTD_countSeqStoreLiteralsBytes(const seqStore_t* const seqStore) +{ size_t literalsBytes = 0; - size_t const nbSeqs = seqStore->sequences - seqStore->sequencesStart; + size_t const nbSeqs = (size_t)(seqStore->sequences - seqStore->sequencesStart); size_t i; for (i = 0; i < nbSeqs; ++i) { - seqDef seq = seqStore->sequencesStart[i]; + seqDef const seq = seqStore->sequencesStart[i]; literalsBytes += seq.litLength; if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_literalLength) { literalsBytes += 0x10000; - } - } + } } return literalsBytes; } /* Returns match bytes represented in a seqStore */ -static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) { +static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) +{ size_t matchBytes = 0; - size_t const nbSeqs = seqStore->sequences - seqStore->sequencesStart; + size_t const nbSeqs = (size_t)(seqStore->sequences - seqStore->sequencesStart); size_t i; for (i = 0; i < nbSeqs; ++i) { seqDef seq = seqStore->sequencesStart[i]; - matchBytes += seq.matchLength + MINMATCH; + matchBytes += seq.mlBase + MINMATCH; if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_matchLength) { matchBytes += 0x10000; - } - } + } } return matchBytes; } @@ -3369,15 +3787,12 @@ static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) { */ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, const seqStore_t* originalSeqStore, - size_t startIdx, size_t endIdx) { - BYTE* const litEnd = originalSeqStore->lit; - size_t literalsBytes; - size_t literalsBytesPreceding = 0; - + size_t startIdx, size_t endIdx) +{ *resultSeqStore = *originalSeqStore; if (startIdx > 0) { resultSeqStore->sequences = originalSeqStore->sequencesStart + startIdx; - literalsBytesPreceding = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + resultSeqStore->litStart += ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); } /* Move longLengthPos into the correct position if necessary */ @@ -3390,13 +3805,12 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, } resultSeqStore->sequencesStart = originalSeqStore->sequencesStart + startIdx; resultSeqStore->sequences = originalSeqStore->sequencesStart + endIdx; - literalsBytes = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); - resultSeqStore->litStart += literalsBytesPreceding; if (endIdx == (size_t)(originalSeqStore->sequences - originalSeqStore->sequencesStart)) { /* This accounts for possible last literals if the derived chunk reaches the end of the block */ - resultSeqStore->lit = litEnd; + assert(resultSeqStore->lit == originalSeqStore->lit); } else { - resultSeqStore->lit = resultSeqStore->litStart+literalsBytes; + size_t const literalsBytes = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + resultSeqStore->lit = resultSeqStore->litStart + literalsBytes; } resultSeqStore->llCode += startIdx; resultSeqStore->mlCode += startIdx; @@ -3404,52 +3818,67 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, } /** - * Returns the raw offset represented by the combination of offCode, ll0, and repcode history. - * offCode must be an offCode representing a repcode, therefore in the range of [0, 2]. + * Returns the raw offset represented by the combination of offBase, ll0, and repcode history. + * offBase must represent a repcode in the numeric representation of ZSTD_storeSeq(). */ -static U32 ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offCode, const U32 ll0) { - U32 const adjustedOffCode = offCode + ll0; - assert(offCode < ZSTD_REP_NUM); - if (adjustedOffCode == ZSTD_REP_NUM) { - /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 */ - assert(rep[0] > 0); +static U32 +ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offBase, const U32 ll0) +{ + U32 const adjustedRepCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; /* [ 0 - 3 ] */ + assert(OFFBASE_IS_REPCODE(offBase)); + if (adjustedRepCode == ZSTD_REP_NUM) { + assert(ll0); + /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 + * This is only valid if it results in a valid offset value, aka > 0. + * Note : it may happen that `rep[0]==1` in exceptional circumstances. + * In which case this function will return 0, which is an invalid offset. + * It's not an issue though, since this value will be + * compared and discarded within ZSTD_seqStore_resolveOffCodes(). + */ return rep[0] - 1; } - return rep[adjustedOffCode]; + return rep[adjustedRepCode]; } /** * ZSTD_seqStore_resolveOffCodes() reconciles any possible divergences in offset history that may arise - * due to emission of RLE/raw blocks that disturb the offset history, and replaces any repcodes within - * the seqStore that may be invalid. + * due to emission of RLE/raw blocks that disturb the offset history, + * and replaces any repcodes within the seqStore that may be invalid. * - * dRepcodes are updated as would be on the decompression side. cRepcodes are updated exactly in - * accordance with the seqStore. + * dRepcodes are updated as would be on the decompression side. + * cRepcodes are updated exactly in accordance with the seqStore. + * + * Note : this function assumes seq->offBase respects the following numbering scheme : + * 0 : invalid + * 1-3 : repcode 1-3 + * 4+ : real_offset+3 */ -static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRepcodes, - seqStore_t* const seqStore, U32 const nbSeq) { +static void +ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRepcodes, + const seqStore_t* const seqStore, U32 const nbSeq) +{ U32 idx = 0; for (; idx < nbSeq; ++idx) { seqDef* const seq = seqStore->sequencesStart + idx; U32 const ll0 = (seq->litLength == 0); - U32 offCode = seq->offset - 1; - assert(seq->offset > 0); - if (offCode <= ZSTD_REP_MOVE) { - U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offCode, ll0); - U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offCode, ll0); + U32 const offBase = seq->offBase; + assert(offBase > 0); + if (OFFBASE_IS_REPCODE(offBase)) { + U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offBase, ll0); + U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offBase, ll0); /* Adjust simulated decompression repcode history if we come across a mismatch. Replace * the repcode with the offset it actually references, determined by the compression * repcode history. */ if (dRawOffset != cRawOffset) { - seq->offset = cRawOffset + ZSTD_REP_NUM; + seq->offBase = OFFSET_TO_OFFBASE(cRawOffset); } } /* Compression repcode history is always updated with values directly from the unmodified seqStore. * Decompression repcode history may use modified seq->offset value taken from compression repcode history. */ - *dRepcodes = ZSTD_updateRep(dRepcodes->rep, seq->offset - 1, ll0); - *cRepcodes = ZSTD_updateRep(cRepcodes->rep, offCode, ll0); + ZSTD_updateRep(dRepcodes->rep, seq->offBase, ll0); + ZSTD_updateRep(cRepcodes->rep, offBase, ll0); } } @@ -3458,11 +3887,14 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ * * Returns the total size of that block (including header) or a ZSTD error code. */ -static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const seqStore, - repcodes_t* const dRep, repcodes_t* const cRep, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - U32 lastBlock, U32 isPartition) { +static size_t +ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, + const seqStore_t* const seqStore, + repcodes_t* const dRep, repcodes_t* const cRep, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 lastBlock, U32 isPartition) +{ const U32 rleMaxLength = 25; BYTE* op = (BYTE*)dst; const BYTE* ip = (const BYTE*)src; @@ -3471,9 +3903,11 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const /* In case of an RLE or raw block, the simulated decompression repcode history must be reset */ repcodes_t const dRepOriginal = *dRep; + DEBUGLOG(5, "ZSTD_compressSeqStore_singleBlock"); if (isPartition) ZSTD_seqStore_resolveOffCodes(dRep, cRep, seqStore, (U32)(seqStore->sequences - seqStore->sequencesStart)); + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "Block header doesn't fit"); cSeqsSize = ZSTD_entropyCompressSeqStore(seqStore, &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, &zc->appliedParams, @@ -3499,9 +3933,6 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const return 0; } - if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) - zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; - if (cSeqsSize == 0) { cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock); FORWARD_IF_ERROR(cSize, "Nocompress block failed"); @@ -3518,6 +3949,10 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const cSize = ZSTD_blockHeaderSize + cSeqsSize; DEBUGLOG(4, "Writing out compressed block, size: %zu", cSize); } + + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + return cSize; } @@ -3528,45 +3963,52 @@ typedef struct { } seqStoreSplits; #define MIN_SEQUENCES_BLOCK_SPLITTING 300 -#define MAX_NB_SPLITS 196 /* Helper function to perform the recursive search for block splits. * Estimates the cost of seqStore prior to split, and estimates the cost of splitting the sequences in half. - * If advantageous to split, then we recurse down the two sub-blocks. If not, or if an error occurred in estimation, then - * we do not recurse. + * If advantageous to split, then we recurse down the two sub-blocks. + * If not, or if an error occurred in estimation, then we do not recurse. * - * Note: The recursion depth is capped by a heuristic minimum number of sequences, defined by MIN_SEQUENCES_BLOCK_SPLITTING. + * Note: The recursion depth is capped by a heuristic minimum number of sequences, + * defined by MIN_SEQUENCES_BLOCK_SPLITTING. * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING). * In practice, recursion depth usually doesn't go beyond 4. * - * Furthermore, the number of splits is capped by MAX_NB_SPLITS. At MAX_NB_SPLITS == 196 with the current existing blockSize + * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. + * At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize * maximum of 128 KB, this value is actually impossible to reach. */ -static void ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx, - const ZSTD_CCtx* zc, const seqStore_t* origSeqStore) { - seqStore_t fullSeqStoreChunk; - seqStore_t firstHalfSeqStore; - seqStore_t secondHalfSeqStore; +static void +ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx, + ZSTD_CCtx* zc, const seqStore_t* origSeqStore) +{ + seqStore_t* const fullSeqStoreChunk = &zc->blockSplitCtx.fullSeqStoreChunk; + seqStore_t* const firstHalfSeqStore = &zc->blockSplitCtx.firstHalfSeqStore; + seqStore_t* const secondHalfSeqStore = &zc->blockSplitCtx.secondHalfSeqStore; size_t estimatedOriginalSize; size_t estimatedFirstHalfSize; size_t estimatedSecondHalfSize; size_t midIdx = (startIdx + endIdx)/2; - if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= MAX_NB_SPLITS) { + DEBUGLOG(5, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx); + assert(endIdx >= startIdx); + if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= ZSTD_MAX_NB_BLOCK_SPLITS) { + DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences (%zu)", endIdx - startIdx); return; } - ZSTD_deriveSeqStoreChunk(&fullSeqStoreChunk, origSeqStore, startIdx, endIdx); - ZSTD_deriveSeqStoreChunk(&firstHalfSeqStore, origSeqStore, startIdx, midIdx); - ZSTD_deriveSeqStoreChunk(&secondHalfSeqStore, origSeqStore, midIdx, endIdx); - estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&fullSeqStoreChunk, zc); - estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&firstHalfSeqStore, zc); - estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&secondHalfSeqStore, zc); + ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx); + ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx); + ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx); + estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc); + estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc); + estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc); DEBUGLOG(5, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize); if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) { return; } if (estimatedFirstHalfSize + estimatedSecondHalfSize < estimatedOriginalSize) { + DEBUGLOG(5, "split decided at seqNb:%zu", midIdx); ZSTD_deriveBlockSplitsHelper(splits, startIdx, midIdx, zc, origSeqStore); splits->splitLocations[splits->idx] = (U32)midIdx; splits->idx++; @@ -3574,14 +4016,18 @@ static void ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx } } -/* Base recursive function. Populates a table with intra-block partition indices that can improve compression ratio. +/* Base recursive function. + * Populates a table with intra-block partition indices that can improve compression ratio. * - * Returns the number of splits made (which equals the size of the partition table - 1). + * @return: number of splits made (which equals the size of the partition table - 1). */ -static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) { - seqStoreSplits splits = {partitions, 0}; +static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) +{ + seqStoreSplits splits; + splits.splitLocations = partitions; + splits.idx = 0; if (nbSeq <= 4) { - DEBUGLOG(4, "ZSTD_deriveBlockSplits: Too few sequences to split"); + DEBUGLOG(5, "ZSTD_deriveBlockSplits: Too few sequences to split (%u <= 4)", nbSeq); /* Refuse to try and split anything with less than 4 sequences */ return 0; } @@ -3596,17 +4042,21 @@ static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) * * Returns combined size of all blocks (which includes headers), or a ZSTD error code. */ -static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, - const void* src, size_t blockSize, U32 lastBlock, U32 nbSeq) { +static size_t +ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t blockSize, + U32 lastBlock, U32 nbSeq) +{ size_t cSize = 0; const BYTE* ip = (const BYTE*)src; BYTE* op = (BYTE*)dst; - U32 partitions[MAX_NB_SPLITS]; size_t i = 0; size_t srcBytesTotal = 0; - size_t numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq); - seqStore_t nextSeqStore; - seqStore_t currSeqStore; + U32* const partitions = zc->blockSplitCtx.partitions; /* size == ZSTD_MAX_NB_BLOCK_SPLITS */ + seqStore_t* const nextSeqStore = &zc->blockSplitCtx.nextSeqStore; + seqStore_t* const currSeqStore = &zc->blockSplitCtx.currSeqStore; + size_t const numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq); /* If a block is split and some partitions are emitted as RLE/uncompressed, then repcode history * may become invalid. In order to reconcile potentially invalid repcodes, we keep track of two @@ -3626,77 +4076,81 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s repcodes_t cRep; ZSTD_memcpy(dRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); ZSTD_memcpy(cRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); + ZSTD_memset(nextSeqStore, 0, sizeof(seqStore_t)); - DEBUGLOG(4, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", + DEBUGLOG(5, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, (unsigned)zc->blockState.matchState.nextToUpdate); if (numSplits == 0) { - size_t cSizeSingleBlock = ZSTD_compressSeqStore_singleBlock(zc, &zc->seqStore, - &dRep, &cRep, - op, dstCapacity, - ip, blockSize, - lastBlock, 0 /* isPartition */); + size_t cSizeSingleBlock = + ZSTD_compressSeqStore_singleBlock(zc, &zc->seqStore, + &dRep, &cRep, + op, dstCapacity, + ip, blockSize, + lastBlock, 0 /* isPartition */); FORWARD_IF_ERROR(cSizeSingleBlock, "Compressing single block from splitBlock_internal() failed!"); DEBUGLOG(5, "ZSTD_compressBlock_splitBlock_internal: No splits"); - assert(cSizeSingleBlock <= ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize); + assert(zc->blockSize <= ZSTD_BLOCKSIZE_MAX); + assert(cSizeSingleBlock <= zc->blockSize + ZSTD_blockHeaderSize); return cSizeSingleBlock; } - ZSTD_deriveSeqStoreChunk(&currSeqStore, &zc->seqStore, 0, partitions[0]); + ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]); for (i = 0; i <= numSplits; ++i) { - size_t srcBytes; size_t cSizeChunk; U32 const lastPartition = (i == numSplits); U32 lastBlockEntireSrc = 0; - srcBytes = ZSTD_countSeqStoreLiteralsBytes(&currSeqStore) + ZSTD_countSeqStoreMatchBytes(&currSeqStore); + size_t srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore); srcBytesTotal += srcBytes; if (lastPartition) { /* This is the final partition, need to account for possible last literals */ srcBytes += blockSize - srcBytesTotal; lastBlockEntireSrc = lastBlock; } else { - ZSTD_deriveSeqStoreChunk(&nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]); + ZSTD_deriveSeqStoreChunk(nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]); } - cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, &currSeqStore, + cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, currSeqStore, &dRep, &cRep, op, dstCapacity, ip, srcBytes, lastBlockEntireSrc, 1 /* isPartition */); - DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&currSeqStore, zc), cSizeChunk); + DEBUGLOG(5, "Estimated size: %zu vs %zu : actual size", + ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(currSeqStore, zc), cSizeChunk); FORWARD_IF_ERROR(cSizeChunk, "Compressing chunk failed!"); ip += srcBytes; op += cSizeChunk; dstCapacity -= cSizeChunk; cSize += cSizeChunk; - currSeqStore = nextSeqStore; - assert(cSizeChunk <= ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize); + *currSeqStore = *nextSeqStore; + assert(cSizeChunk <= zc->blockSize + ZSTD_blockHeaderSize); } - /* cRep and dRep may have diverged during the compression. If so, we use the dRep repcodes - * for the next block. + /* cRep and dRep may have diverged during the compression. + * If so, we use the dRep repcodes for the next block. */ ZSTD_memcpy(zc->blockState.prevCBlock->rep, dRep.rep, sizeof(repcodes_t)); return cSize; } -static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, U32 lastBlock) { - const BYTE* ip = (const BYTE*)src; - BYTE* op = (BYTE*)dst; +static size_t +ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 lastBlock) +{ U32 nbSeq; size_t cSize; DEBUGLOG(4, "ZSTD_compressBlock_splitBlock"); + assert(zc->appliedParams.useBlockSplitter == ZSTD_ps_enable); { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed"); if (bss == ZSTDbss_noCompress) { if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; - cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock); + cSize = ZSTD_noCompressBlock(dst, dstCapacity, src, srcSize, lastBlock); FORWARD_IF_ERROR(cSize, "ZSTD_noCompressBlock failed"); DEBUGLOG(4, "ZSTD_compressBlock_splitBlock: Nocompress block"); return cSize; @@ -3704,19 +4158,19 @@ static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, nbSeq = (U32)(zc->seqStore.sequences - zc->seqStore.sequencesStart); } - assert(zc->appliedParams.splitBlocks == 1); cSize = ZSTD_compressBlock_splitBlock_internal(zc, dst, dstCapacity, src, srcSize, lastBlock, nbSeq); FORWARD_IF_ERROR(cSize, "Splitting blocks failed!"); return cSize; } -static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, U32 frame) +static size_t +ZSTD_compressBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 frame) { - /* This the upper bound for the length of an rle block. - * This isn't the actual upper bound. Finding the real threshold - * needs further investigation. + /* This is an estimated upper bound for the length of an rle block. + * This isn't the actual upper bound. + * Finding the real threshold needs further investigation. */ const U32 rleMaxLength = 25; size_t cSize; @@ -3746,12 +4200,6 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, zc->bmi2); - if (zc->seqCollector.collectSequences) { - ZSTD_copyBlockSequences(zc); - return 0; - } - - if (frame && /* We don't want to emit our first block as a RLE even if it qualifies because * doing so will cause the decoder (cli only) to throw a "should consume all input error." @@ -3814,10 +4262,11 @@ static size_t ZSTD_compressBlock_targetCBlockSize_body(ZSTD_CCtx* zc, * * cSize >= blockBound(srcSize): We have expanded the block too much so * emit an uncompressed block. */ - { - size_t const cSize = ZSTD_compressSuperBlock(zc, dst, dstCapacity, src, srcSize, lastBlock); + { size_t const cSize = + ZSTD_compressSuperBlock(zc, dst, dstCapacity, src, srcSize, lastBlock); if (cSize != ERROR(dstSize_tooSmall)) { - size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, zc->appliedParams.cParams.strategy); + size_t const maxCSize = + srcSize - ZSTD_minGain(srcSize, zc->appliedParams.cParams.strategy); FORWARD_IF_ERROR(cSize, "ZSTD_compressSuperBlock failed"); if (cSize != 0 && cSize < maxCSize + ZSTD_blockHeaderSize) { ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); @@ -3825,7 +4274,7 @@ static size_t ZSTD_compressBlock_targetCBlockSize_body(ZSTD_CCtx* zc, } } } - } + } /* if (bss == ZSTDbss_compress)*/ DEBUGLOG(6, "Resorting to ZSTD_noCompressBlock()"); /* Superblock compression failed, attempt to emit a single no compress block. @@ -3883,7 +4332,7 @@ static void ZSTD_overflowCorrectIfNeeded(ZSTD_matchState_t* ms, * All blocks will be terminated, all input will be consumed. * Function will issue an error if there is not enough `dstCapacity` to hold the compressed content. * Frame is supposed already started (header already produced) -* @return : compressed size, or an error code +* @return : compressed size, or an error code */ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, @@ -3907,7 +4356,9 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, ZSTD_matchState_t* const ms = &cctx->blockState.matchState; U32 const lastBlock = lastFrameChunk & (blockSize >= remaining); - RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE, + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE + 1, dstSize_tooSmall, "not enough space to store compressed block"); if (remaining < blockSize) blockSize = remaining; @@ -3915,6 +4366,7 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, ZSTD_overflowCorrectIfNeeded( ms, &cctx->workspace, &cctx->appliedParams, ip, ip + blockSize); ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + ZSTD_window_enforceMaxDist(&ms->window, ip, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); /* Ensure hash/chain table insertion resumes no sooner than lowlimit */ if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit; @@ -3945,7 +4397,7 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, MEM_writeLE24(op, cBlockHeader); cSize += ZSTD_blockHeaderSize; } - } + } /* if (ZSTD_useTargetCBlockSize(&cctx->appliedParams))*/ ip += blockSize; @@ -3991,7 +4443,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, if (!singleSegment) op[pos++] = windowLogByte; switch(dictIDSizeCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : break; case 1 : op[pos] = (BYTE)(dictID); pos++; break; case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break; @@ -3999,7 +4453,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, } switch(fcsCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break; case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break; case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break; @@ -4047,7 +4503,7 @@ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSe { RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong, "wrong cctx stage"); - RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm, + RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable, parameter_unsupported, "incompatible with ldm"); cctx->externSeqStore.seq = seq; @@ -4088,7 +4544,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, ms->forceNonContiguous = 0; ms->nextToUpdate = ms->window.dictLimit; } - if (cctx->appliedParams.ldmParams.enableLdm) { + if (cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_window_update(&cctx->ldmState.window, src, srcSize, /* forceNonContiguous */ 0); } @@ -4133,7 +4589,7 @@ size_t ZSTD_getBlockSize(const ZSTD_CCtx* cctx) { ZSTD_compressionParameters const cParams = cctx->appliedParams.cParams; assert(!ZSTD_checkCParams(cParams)); - return MIN (ZSTD_BLOCKSIZE_MAX, (U32)1 << cParams.windowLog); + return MIN(cctx->appliedParams.maxBlockSize, (size_t)1 << cParams.windowLog); } size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) @@ -4153,31 +4609,47 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, ZSTD_cwksp* ws, ZSTD_CCtx_params const* params, const void* src, size_t srcSize, - ZSTD_dictTableLoadMethod_e dtlm) + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) { const BYTE* ip = (const BYTE*) src; const BYTE* const iend = ip + srcSize; - int const loadLdmDict = params->ldmParams.enableLdm && ls != NULL; + int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL; - /* Assert that we the ms params match the params we're being given */ + /* Assert that the ms params match the params we're being given */ ZSTD_assertEqualCParams(params->cParams, ms->cParams); - if (srcSize > ZSTD_CHUNKSIZE_MAX) { + { /* Ensure large dictionaries can't cause index overflow */ + /* Allow the dictionary to set indices up to exactly ZSTD_CURRENT_MAX. * Dictionaries right at the edge will immediately trigger overflow * correction, but I don't want to insert extra constraints here. */ - U32 const maxDictSize = ZSTD_CURRENT_MAX - 1; - /* We must have cleared our windows when our source is this large. */ - assert(ZSTD_window_isEmpty(ms->window)); - if (loadLdmDict) - assert(ZSTD_window_isEmpty(ls->window)); + U32 maxDictSize = ZSTD_CURRENT_MAX - ZSTD_WINDOW_START_INDEX; + + int const CDictTaggedIndices = ZSTD_CDictIndicesAreTagged(¶ms->cParams); + if (CDictTaggedIndices && tfp == ZSTD_tfp_forCDict) { + /* Some dictionary matchfinders in zstd use "short cache", + * which treats the lower ZSTD_SHORT_CACHE_TAG_BITS of each + * CDict hashtable entry as a tag rather than as part of an index. + * When short cache is used, we need to truncate the dictionary + * so that its indices don't overlap with the tag. */ + U32 const shortCacheMaxDictSize = (1u << (32 - ZSTD_SHORT_CACHE_TAG_BITS)) - ZSTD_WINDOW_START_INDEX; + maxDictSize = MIN(maxDictSize, shortCacheMaxDictSize); + assert(!loadLdmDict); + } + /* If the dictionary is too large, only load the suffix of the dictionary. */ if (srcSize > maxDictSize) { ip = iend - maxDictSize; src = ip; srcSize = maxDictSize; - } + } } + + if (srcSize > ZSTD_CHUNKSIZE_MAX) { + /* We must have cleared our windows when our source is this large. */ + assert(ZSTD_window_isEmpty(ms->window)); + if (loadLdmDict) assert(ZSTD_window_isEmpty(ls->window)); } DEBUGLOG(4, "ZSTD_loadDictionaryContent(): useRowMatchFinder=%d", (int)params->useRowMatchFinder); @@ -4200,10 +4672,10 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, switch(params->cParams.strategy) { case ZSTD_fast: - ZSTD_fillHashTable(ms, iend, dtlm); + ZSTD_fillHashTable(ms, iend, dtlm, tfp); break; case ZSTD_dfast: - ZSTD_fillDoubleHashTable(ms, iend, dtlm); + ZSTD_fillDoubleHashTable(ms, iend, dtlm, tfp); break; case ZSTD_greedy: @@ -4214,8 +4686,8 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, assert(ms->chainTable != NULL); ZSTD_dedicatedDictSearch_lazy_loadDictionary(ms, iend-HASH_READ_SIZE); } else { - assert(params->useRowMatchFinder != ZSTD_urm_auto); - if (params->useRowMatchFinder == ZSTD_urm_enableRowMatchFinder) { + assert(params->useRowMatchFinder != ZSTD_ps_auto); + if (params->useRowMatchFinder == ZSTD_ps_enable) { size_t const tagTableSize = ((size_t)1 << params->cParams.hashLog) * sizeof(U16); ZSTD_memset(ms->tagTable, 0, tagTableSize); ZSTD_row_update(ms, iend-HASH_READ_SIZE); @@ -4369,6 +4841,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_CCtx_params const* params, const void* dict, size_t dictSize, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, void* workspace) { const BYTE* dictPtr = (const BYTE*)dict; @@ -4387,7 +4860,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, { size_t const dictContentSize = (size_t)(dictEnd - dictPtr); FORWARD_IF_ERROR(ZSTD_loadDictionaryContent( - ms, NULL, ws, params, dictPtr, dictContentSize, dtlm), ""); + ms, NULL, ws, params, dictPtr, dictContentSize, dtlm, tfp), ""); } return dictID; } @@ -4403,6 +4876,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, void* workspace) { DEBUGLOG(4, "ZSTD_compress_insertDictionary (dictSize=%u)", (U32)dictSize); @@ -4415,13 +4889,13 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, /* dict restricted modes */ if (dictContentType == ZSTD_dct_rawContent) - return ZSTD_loadDictionaryContent(ms, ls, ws, params, dict, dictSize, dtlm); + return ZSTD_loadDictionaryContent(ms, ls, ws, params, dict, dictSize, dtlm, tfp); if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) { if (dictContentType == ZSTD_dct_auto) { DEBUGLOG(4, "raw content dictionary detected"); return ZSTD_loadDictionaryContent( - ms, ls, ws, params, dict, dictSize, dtlm); + ms, ls, ws, params, dict, dictSize, dtlm, tfp); } RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, ""); assert(0); /* impossible */ @@ -4429,13 +4903,14 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, /* dict as full zstd dictionary */ return ZSTD_loadZstdDictionary( - bs, ms, ws, params, dict, dictSize, dtlm, workspace); + bs, ms, ws, params, dict, dictSize, dtlm, tfp, workspace); } #define ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF (128 KB) #define ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER (6ULL) /*! ZSTD_compressBegin_internal() : + * Assumption : either @dict OR @cdict (or none) is non-NULL, never both * @return : 0, or an error code */ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, @@ -4471,11 +4946,11 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, cctx->blockState.prevCBlock, &cctx->blockState.matchState, &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, cdict->dictContent, cdict->dictContentSize, cdict->dictContentType, dtlm, - cctx->entropyWorkspace) + ZSTD_tfp_forCCtx, cctx->entropyWorkspace) : ZSTD_compress_insertDictionary( cctx->blockState.prevCBlock, &cctx->blockState.matchState, &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, dict, dictSize, - dictContentType, dtlm, cctx->entropyWorkspace); + dictContentType, dtlm, ZSTD_tfp_forCCtx, cctx->entropyWorkspace); FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); assert(dictID <= UINT_MAX); cctx->dictID = (U32)dictID; @@ -4516,11 +4991,11 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, &cctxParams, pledgedSrcSize); } -size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) +size_t +ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) { ZSTD_CCtx_params cctxParams; - { - ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_noAttachDict); + { ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_noAttachDict); ZSTD_CCtxParams_init_internal(&cctxParams, ¶ms, (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel); } DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (unsigned)dictSize); @@ -4715,7 +5190,7 @@ size_t ZSTD_estimateCDictSize_advanced( + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE) /* enableDedicatedDictSearch == 1 ensures that CDict estimation will not be too small * in case we are using DDS with row-hash. */ - + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams), + + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams), /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void *)))); @@ -4779,7 +5254,7 @@ static size_t ZSTD_initCDict_internal( { size_t const dictID = ZSTD_compress_insertDictionary( &cdict->cBlockState, &cdict->matchState, NULL, &cdict->workspace, ¶ms, cdict->dictContent, cdict->dictContentSize, - dictContentType, ZSTD_dtlm_full, cdict->entropyWorkspace); + dictContentType, ZSTD_dtlm_full, ZSTD_tfp_forCDict, cdict->entropyWorkspace); FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); assert(dictID <= (size_t)(U32)-1); cdict->dictID = (U32)dictID; @@ -4792,7 +5267,7 @@ static size_t ZSTD_initCDict_internal( static ZSTD_CDict* ZSTD_createCDict_advanced_internal(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_compressionParameters cParams, - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, U32 enableDedicatedDictSearch, ZSTD_customMem customMem) { @@ -4842,7 +5317,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize, &cctxParams, customMem); } -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2( +ZSTD_CDict* ZSTD_createCDict_advanced2( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, @@ -4947,7 +5422,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict( ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams) { - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams); /* enableDedicatedDictSearch == 1 ensures matchstate is not too small in case this CDict will be used for DDS + row hash */ size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0); size_t const neededSize = ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict)) @@ -5267,30 +5742,41 @@ size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel) static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx) { - size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos; - if (hintInSize==0) hintInSize = cctx->blockSize; - return hintInSize; + if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { + return cctx->blockSize - cctx->stableIn_notConsumed; + } + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_buffered); + { size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos; + if (hintInSize==0) hintInSize = cctx->blockSize; + return hintInSize; + } } /** ZSTD_compressStream_generic(): * internal function for all *compressStream*() variants - * non-static, because can be called from zstdmt_compress.c - * @return : hint size for next input */ + * @return : hint size for next input to complete ongoing block */ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input, ZSTD_EndDirective const flushMode) { - const char* const istart = (const char*)input->src; - const char* const iend = input->size != 0 ? istart + input->size : istart; - const char* ip = input->pos != 0 ? istart + input->pos : istart; - char* const ostart = (char*)output->dst; - char* const oend = output->size != 0 ? ostart + output->size : ostart; - char* op = output->pos != 0 ? ostart + output->pos : ostart; + const char* const istart = (assert(input != NULL), (const char*)input->src); + const char* const iend = (istart != NULL) ? istart + input->size : istart; + const char* ip = (istart != NULL) ? istart + input->pos : istart; + char* const ostart = (assert(output != NULL), (char*)output->dst); + char* const oend = (ostart != NULL) ? ostart + output->size : ostart; + char* op = (ostart != NULL) ? ostart + output->pos : ostart; U32 someMoreWork = 1; /* check expectations */ - DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (unsigned)flushMode); + DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%i, srcSize = %zu", (int)flushMode, input->size - input->pos); + assert(zcs != NULL); + if (zcs->appliedParams.inBufferMode == ZSTD_bm_stable) { + assert(input->pos >= zcs->stableIn_notConsumed); + input->pos -= zcs->stableIn_notConsumed; + ip -= zcs->stableIn_notConsumed; + zcs->stableIn_notConsumed = 0; + } if (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered) { assert(zcs->inBuff != NULL); assert(zcs->inBuffSize > 0); @@ -5299,8 +5785,10 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, assert(zcs->outBuff != NULL); assert(zcs->outBuffSize > 0); } - assert(output->pos <= output->size); + if (input->src == NULL) assert(input->size == 0); assert(input->pos <= input->size); + if (output->dst == NULL) assert(output->size == 0); + assert(output->pos <= output->size); assert((U32)flushMode <= (U32)ZSTD_e_end); while (someMoreWork) { @@ -5332,8 +5820,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, zcs->inBuff + zcs->inBuffPos, toLoad, ip, iend-ip); zcs->inBuffPos += loaded; - if (loaded != 0) - ip += loaded; + if (ip) ip += loaded; if ( (flushMode == ZSTD_e_continue) && (zcs->inBuffPos < zcs->inBuffTarget) ) { /* not enough input to fill full block : stop here */ @@ -5344,6 +5831,20 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, /* empty */ someMoreWork = 0; break; } + } else { + assert(zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + if ( (flushMode == ZSTD_e_continue) + && ( (size_t)(iend - ip) < zcs->blockSize) ) { + /* can't compress a full block : stop here */ + zcs->stableIn_notConsumed = (size_t)(iend - ip); + ip = iend; /* pretend to have consumed input */ + someMoreWork = 0; break; + } + if ( (flushMode == ZSTD_e_flush) + && (ip == iend) ) { + /* empty */ + someMoreWork = 0; break; + } } /* compress current block (note : this stage cannot be stopped in the middle) */ DEBUGLOG(5, "stream compression stage (flushMode==%u)", flushMode); @@ -5351,9 +5852,8 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, void* cDst; size_t cSize; size_t oSize = oend-op; - size_t const iSize = inputBuffered - ? zcs->inBuffPos - zcs->inToCompress - : MIN((size_t)(iend - ip), zcs->blockSize); + size_t const iSize = inputBuffered ? zcs->inBuffPos - zcs->inToCompress + : MIN((size_t)(iend - ip), zcs->blockSize); if (oSize >= ZSTD_compressBound(iSize) || zcs->appliedParams.outBufferMode == ZSTD_bm_stable) cDst = op; /* compress into output buffer, to skip flush stage */ else @@ -5376,19 +5876,16 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, if (!lastBlock) assert(zcs->inBuffTarget <= zcs->inBuffSize); zcs->inToCompress = zcs->inBuffPos; - } else { - unsigned const lastBlock = (ip + iSize == iend); - assert(flushMode == ZSTD_e_end /* Already validated */); + } else { /* !inputBuffered, hence ZSTD_bm_stable */ + unsigned const lastBlock = (flushMode == ZSTD_e_end) && (ip + iSize == iend); cSize = lastBlock ? ZSTD_compressEnd(zcs, cDst, oSize, ip, iSize) : ZSTD_compressContinue(zcs, cDst, oSize, ip, iSize); /* Consume the input prior to error checking to mirror buffered mode. */ - if (iSize > 0) - ip += iSize; + if (ip) ip += iSize; FORWARD_IF_ERROR(cSize, "%s", lastBlock ? "ZSTD_compressEnd failed" : "ZSTD_compressContinue failed"); zcs->frameEnded = lastBlock; - if (lastBlock) - assert(ip == iend); + if (lastBlock) assert(ip == iend); } if (cDst == op) { /* no need to flush */ op += cSize; @@ -5403,7 +5900,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, zcs->outBuffFlushedSize = 0; zcs->streamStage = zcss_flush; /* pass-through to flush stage */ } - /* fall-through */ + ZSTD_FALLTHROUGH; case zcss_flush: DEBUGLOG(5, "flush stage"); assert(zcs->appliedParams.outBufferMode == ZSTD_bm_buffered); @@ -5464,8 +5961,10 @@ size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuf /* After a compression call set the expected input/output buffer. * This is validated at the start of the next compression call. */ -static void ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, ZSTD_outBuffer const* output, ZSTD_inBuffer const* input) +static void +ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const ZSTD_inBuffer* input) { + DEBUGLOG(5, "ZSTD_setBufferExpectations (for advanced stable in/out modes)"); if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { cctx->expectedInBuffer = *input; } @@ -5484,22 +5983,22 @@ static size_t ZSTD_checkBufferStability(ZSTD_CCtx const* cctx, { if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { ZSTD_inBuffer const expect = cctx->expectedInBuffer; - if (expect.src != input->src || expect.pos != input->pos || expect.size != input->size) - RETURN_ERROR(srcBuffer_wrong, "ZSTD_c_stableInBuffer enabled but input differs!"); - if (endOp != ZSTD_e_end) - RETURN_ERROR(srcBuffer_wrong, "ZSTD_c_stableInBuffer can only be used with ZSTD_e_end!"); + if (expect.src != input->src || expect.pos != input->pos) + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableInBuffer enabled but input differs!"); } + (void)endOp; if (cctx->appliedParams.outBufferMode == ZSTD_bm_stable) { size_t const outBufferSize = output->size - output->pos; if (cctx->expectedOutBufferSize != outBufferSize) - RETURN_ERROR(dstBuffer_wrong, "ZSTD_c_stableOutBuffer enabled but output size differs!"); + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableOutBuffer enabled but output size differs!"); } return 0; } static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, ZSTD_EndDirective endOp, - size_t inSize) { + size_t inSize) +{ ZSTD_CCtx_params params = cctx->requestedParams; ZSTD_prefixDict const prefixDict = cctx->prefixDict; FORWARD_IF_ERROR( ZSTD_initLocalDict(cctx) , ""); /* Init the local dict if present. */ @@ -5513,9 +6012,9 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, params.compressionLevel = cctx->cdict->compressionLevel; } DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage"); - if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = inSize + 1; /* auto-fix pledgedSrcSize */ - { - size_t const dictSize = prefixDict.dict + if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = inSize + 1; /* auto-determine pledgedSrcSize */ + + { size_t const dictSize = prefixDict.dict ? prefixDict.dictSize : (cctx->cdict ? cctx->cdict->dictContentSize : 0); ZSTD_cParamMode_e const mode = ZSTD_getCParamMode(cctx->cdict, ¶ms, cctx->pledgedSrcSizePlusOne - 1); @@ -5524,20 +6023,21 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, dictSize, mode); } - if (ZSTD_CParams_shouldEnableLdm(¶ms.cParams)) { - /* Enable LDM by default for optimal parser and window size >= 128MB */ - DEBUGLOG(4, "LDM enabled by default (window size >= 128MB, strategy >= btopt)"); - params.ldmParams.enableLdm = 1; - } - - if (ZSTD_CParams_useBlockSplitter(¶ms.cParams)) { - DEBUGLOG(4, "Block splitter enabled by default (window size >= 128K, strategy >= btopt)"); - params.splitBlocks = 1; - } - + params.useBlockSplitter = ZSTD_resolveBlockSplitterMode(params.useBlockSplitter, ¶ms.cParams); + params.ldmParams.enableLdm = ZSTD_resolveEnableLdm(params.ldmParams.enableLdm, ¶ms.cParams); params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, ¶ms.cParams); + params.validateSequences = ZSTD_resolveExternalSequenceValidation(params.validateSequences); + params.maxBlockSize = ZSTD_resolveMaxBlockSize(params.maxBlockSize); + params.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(params.searchForExternalRepcodes, params.compressionLevel); #ifdef ZSTD_MULTITHREAD + /* If external matchfinder is enabled, make sure to fail before checking job size (for consistency) */ + RETURN_ERROR_IF( + params.useSequenceProducer == 1 && params.nbWorkers >= 1, + parameter_combination_unsupported, + "External sequence producer isn't supported with nbWorkers >= 1" + ); + if ((cctx->pledgedSrcSizePlusOne-1) <= ZSTDMT_JOBSIZE_MIN) { params.nbWorkers = 0; /* do not invoke multi-threading when src size is too small */ } @@ -5565,7 +6065,7 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, cctx->streamStage = zcss_load; cctx->appliedParams = params; } else -#endif +#endif /* ZSTD_MULTITHREAD */ { U64 const pledgedSrcSize = cctx->pledgedSrcSizePlusOne - 1; assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); FORWARD_IF_ERROR( ZSTD_compressBegin_internal(cctx, @@ -5591,6 +6091,8 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, return 0; } +/* @return provides a minimum amount of data remaining to be flushed from internal buffers + */ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input, @@ -5605,8 +6107,27 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, /* transparent initialization stage */ if (cctx->streamStage == zcss_init) { - FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, input->size), "CompressStream2 initialization failed"); - ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ + size_t const inputSize = input->size - input->pos; /* no obligation to start from pos==0 */ + size_t const totalInputSize = inputSize + cctx->stableIn_notConsumed; + if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ + && (endOp == ZSTD_e_continue) /* no flush requested, more input to come */ + && (totalInputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + if (cctx->stableIn_notConsumed) { /* not the first time */ + /* check stable source guarantees */ + RETURN_ERROR_IF(input->src != cctx->expectedInBuffer.src, stabilityCondition_notRespected, "stableInBuffer condition not respected: wrong src pointer"); + RETURN_ERROR_IF(input->pos != cctx->expectedInBuffer.size, stabilityCondition_notRespected, "stableInBuffer condition not respected: externally modified pos"); + } + /* pretend input was consumed, to give a sense forward progress */ + input->pos = input->size; + /* save stable inBuffer, for later control, and flush/end */ + cctx->expectedInBuffer = *input; + /* but actually input wasn't consumed, so keep track of position from where compression shall resume */ + cctx->stableIn_notConsumed += inputSize; + /* don't initialize yet, wait for the first block of flush() order, for better parameters adaptation */ + return ZSTD_FRAMEHEADERSIZE_MIN(cctx->requestedParams.format); /* at least some header to produce */ + } + FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, totalInputSize), "compressStream2 initialization failed"); + ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ } /* end of transparent initialization stage */ @@ -5619,6 +6140,13 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTDMT_updateCParams_whileCompressing(cctx->mtctx, &cctx->requestedParams); cctx->cParamsChanged = 0; } + if (cctx->stableIn_notConsumed) { + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_stable); + /* some early data was skipped - make it available for consumption */ + assert(input->pos >= cctx->stableIn_notConsumed); + input->pos -= cctx->stableIn_notConsumed; + cctx->stableIn_notConsumed = 0; + } for (;;) { size_t const ipos = input->pos; size_t const opos = output->pos; @@ -5657,7 +6185,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_setBufferExpectations(cctx, output, input); return flushMin; } -#endif +#endif /* ZSTD_MULTITHREAD */ FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , ""); DEBUGLOG(5, "completed ZSTD_compressStream2"); ZSTD_setBufferExpectations(cctx, output, input); @@ -5670,13 +6198,20 @@ size_t ZSTD_compressStream2_simpleArgs ( const void* src, size_t srcSize, size_t* srcPos, ZSTD_EndDirective endOp) { - ZSTD_outBuffer output = { dst, dstCapacity, *dstPos }; - ZSTD_inBuffer input = { src, srcSize, *srcPos }; + ZSTD_outBuffer output; + ZSTD_inBuffer input; + output.dst = dst; + output.size = dstCapacity; + output.pos = *dstPos; + input.src = src; + input.size = srcSize; + input.pos = *srcPos; /* ZSTD_compressStream2() will check validity of dstPos and srcPos */ - size_t const cErr = ZSTD_compressStream2(cctx, &output, &input, endOp); - *dstPos = output.pos; - *srcPos = input.pos; - return cErr; + { size_t const cErr = ZSTD_compressStream2(cctx, &output, &input, endOp); + *dstPos = output.pos; + *srcPos = input.pos; + return cErr; + } } size_t ZSTD_compress2(ZSTD_CCtx* cctx, @@ -5699,6 +6234,7 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx, /* Reset to the original values. */ cctx->requestedParams.inBufferMode = originalInBufferMode; cctx->requestedParams.outBufferMode = originalOutBufferMode; + FORWARD_IF_ERROR(result, "ZSTD_compressStream2_simpleArgs failed"); if (result != 0) { /* compression not completed, due to lack of output space */ assert(oPos == dstCapacity); @@ -5709,64 +6245,60 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx, } } -typedef struct { - U32 idx; /* Index in array of ZSTD_Sequence */ - U32 posInSequence; /* Position within sequence at idx */ - size_t posInSrc; /* Number of bytes given by sequences provided so far */ -} ZSTD_sequencePosition; - -/* Returns a ZSTD error code if sequence is not valid */ -static size_t ZSTD_validateSequence(U32 offCode, U32 matchLength, - size_t posInSrc, U32 windowLog, size_t dictSize, U32 minMatch) { - size_t offsetBound; - U32 windowSize = 1 << windowLog; - /* posInSrc represents the amount of data the the decoder would decode up to this point. +/* ZSTD_validateSequence() : + * @offCode : is presumed to follow format required by ZSTD_storeSeq() + * @returns a ZSTD error code if sequence is not valid + */ +static size_t +ZSTD_validateSequence(U32 offCode, U32 matchLength, U32 minMatch, + size_t posInSrc, U32 windowLog, size_t dictSize, int useSequenceProducer) +{ + U32 const windowSize = 1u << windowLog; + /* posInSrc represents the amount of data the decoder would decode up to this point. * As long as the amount of data decoded is less than or equal to window size, offsets may be * larger than the total length of output decoded in order to reference the dict, even larger than * window size. After output surpasses windowSize, we're limited to windowSize offsets again. */ - offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; - RETURN_ERROR_IF(offCode > offsetBound + ZSTD_REP_MOVE, corruption_detected, "Offset too large!"); - RETURN_ERROR_IF(matchLength < minMatch, corruption_detected, "Matchlength too small"); + size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; + size_t const matchLenLowerBound = (minMatch == 3 || useSequenceProducer) ? 3 : 4; + RETURN_ERROR_IF(offCode > OFFSET_TO_OFFBASE(offsetBound), externalSequences_invalid, "Offset too large!"); + /* Validate maxNbSeq is large enough for the given matchLength and minMatch */ + RETURN_ERROR_IF(matchLength < matchLenLowerBound, externalSequences_invalid, "Matchlength too small for the minMatch"); return 0; } /* Returns an offset code, given a sequence's raw offset, the ongoing repcode array, and whether litLength == 0 */ -static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) { - U32 offCode = rawOffset + ZSTD_REP_MOVE; - U32 repCode = 0; +static U32 ZSTD_finalizeOffBase(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) +{ + U32 offBase = OFFSET_TO_OFFBASE(rawOffset); if (!ll0 && rawOffset == rep[0]) { - repCode = 1; + offBase = REPCODE1_TO_OFFBASE; } else if (rawOffset == rep[1]) { - repCode = 2 - ll0; + offBase = REPCODE_TO_OFFBASE(2 - ll0); } else if (rawOffset == rep[2]) { - repCode = 3 - ll0; + offBase = REPCODE_TO_OFFBASE(3 - ll0); } else if (ll0 && rawOffset == rep[0] - 1) { - repCode = 3; + offBase = REPCODE3_TO_OFFBASE; } - if (repCode) { - /* ZSTD_storeSeq expects a number in the range [0, 2] to represent a repcode */ - offCode = repCode - 1; - } - return offCode; + return offBase; } -/* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of - * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter. - */ -static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, - const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) { +size_t +ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, + ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, + ZSTD_paramSwitch_e externalRepSearch) +{ U32 idx = seqPos->idx; + U32 const startIdx = idx; BYTE const* ip = (BYTE const*)(src); const BYTE* const iend = ip + blockSize; repcodes_t updatedRepcodes; U32 dictSize; - U32 litLength; - U32 matchLength; - U32 ll0; - U32 offCode; + + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreExplicitBlockDelim (blockSize = %zu)", blockSize); if (cctx->cdict) { dictSize = (U32)cctx->cdict->dictContentSize; @@ -5776,26 +6308,55 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS dictSize = 0; } ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); - for (; (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0) && idx < inSeqsSize; ++idx) { - litLength = inSeqs[idx].litLength; - matchLength = inSeqs[idx].matchLength; - ll0 = litLength == 0; - offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0); - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + for (; idx < inSeqsSize && (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0); ++idx) { + U32 const litLength = inSeqs[idx].litLength; + U32 const matchLength = inSeqs[idx].matchLength; + U32 offBase; - DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); + if (externalRepSearch == ZSTD_ps_disable) { + offBase = OFFSET_TO_OFFBASE(inSeqs[idx].offset); + } else { + U32 const ll0 = (litLength == 0); + offBase = ZSTD_finalizeOffBase(inSeqs[idx].offset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); + } + + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; - FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, - cctx->appliedParams.cParams.minMatch), + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), "Sequence validation failed"); } - RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, + RETURN_ERROR_IF(idx - seqPos->idx >= cctx->seqStore.maxNbSeq, externalSequences_invalid, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength - MINMATCH); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); ip += matchLength + litLength; } + + /* If we skipped repcode search while parsing, we need to update repcodes now */ + assert(externalRepSearch != ZSTD_ps_auto); + assert(idx >= startIdx); + if (externalRepSearch == ZSTD_ps_disable && idx != startIdx) { + U32* const rep = updatedRepcodes.rep; + U32 lastSeqIdx = idx - 1; /* index of last non-block-delimiter sequence */ + + if (lastSeqIdx >= startIdx + 2) { + rep[2] = inSeqs[lastSeqIdx - 2].offset; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else if (lastSeqIdx == startIdx + 1) { + rep[2] = rep[0]; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else { + assert(lastSeqIdx == startIdx); + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = inSeqs[lastSeqIdx].offset; + } + } + ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); if (inSeqs[idx].litLength) { @@ -5804,25 +6365,16 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS ip += inSeqs[idx].litLength; seqPos->posInSrc += inSeqs[idx].litLength; } - RETURN_ERROR_IF(ip != iend, corruption_detected, "Blocksize doesn't agree with block delimiter!"); + RETURN_ERROR_IF(ip != iend, externalSequences_invalid, "Blocksize doesn't agree with block delimiter!"); seqPos->idx = idx+1; return 0; } -/* Returns the number of bytes to move the current read position back by. Only non-zero - * if we ended up splitting a sequence. Otherwise, it may return a ZSTD error if something - * went wrong. - * - * This function will attempt to scan through blockSize bytes represented by the sequences - * in inSeqs, storing any (partial) sequences. - * - * Occasionally, we may want to change the actual number of bytes we consumed from inSeqs to - * avoid splitting a match, or to avoid splitting a match such that it would produce a match - * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block. - */ -static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, - const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) { +size_t +ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch) +{ U32 idx = seqPos->idx; U32 startPosInSequence = seqPos->posInSequence; U32 endPosInSequence = seqPos->posInSequence + (U32)blockSize; @@ -5832,10 +6384,9 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq repcodes_t updatedRepcodes; U32 bytesAdjustment = 0; U32 finalMatchSplit = 0; - U32 litLength; - U32 matchLength; - U32 rawOffset; - U32 offCode; + + /* TODO(embg) support fast parsing mode in noBlockDelim mode */ + (void)externalRepSearch; if (cctx->cdict) { dictSize = cctx->cdict->dictContentSize; @@ -5844,14 +6395,15 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq } else { dictSize = 0; } - DEBUGLOG(5, "ZSTD_copySequencesToSeqStore: idx: %u PIS: %u blockSize: %zu", idx, startPosInSequence, blockSize); + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreNoBlockDelim: idx: %u PIS: %u blockSize: %zu", idx, startPosInSequence, blockSize); DEBUGLOG(5, "Start seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); while (endPosInSequence && idx < inSeqsSize && !finalMatchSplit) { const ZSTD_Sequence currSeq = inSeqs[idx]; - litLength = currSeq.litLength; - matchLength = currSeq.matchLength; - rawOffset = currSeq.offset; + U32 litLength = currSeq.litLength; + U32 matchLength = currSeq.matchLength; + U32 const rawOffset = currSeq.offset; + U32 offBase; /* Modify the sequence depending on where endPosInSequence lies */ if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) { @@ -5865,7 +6417,6 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq /* Move to the next sequence */ endPosInSequence -= currSeq.litLength + currSeq.matchLength; startPosInSequence = 0; - idx++; } else { /* This is the final (partial) sequence we're adding from inSeqs, and endPosInSequence does not reach the end of the match. So, we have to split the sequence */ @@ -5904,23 +6455,24 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq } } /* Check if this offset can be represented with a repcode */ - { U32 ll0 = (litLength == 0); - offCode = ZSTD_finalizeOffCode(rawOffset, updatedRepcodes.rep, ll0); - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + { U32 const ll0 = (litLength == 0); + offBase = ZSTD_finalizeOffBase(rawOffset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); } if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; - FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, - cctx->appliedParams.cParams.minMatch), + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), "Sequence validation failed"); } - DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); - RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); + RETURN_ERROR_IF(idx - seqPos->idx >= cctx->seqStore.maxNbSeq, externalSequences_invalid, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength - MINMATCH); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); ip += matchLength + litLength; + if (!finalMatchSplit) + idx++; /* Next Sequence */ } DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); assert(idx == inSeqsSize || endPosInSequence <= inSeqs[idx].litLength + inSeqs[idx].matchLength); @@ -5943,8 +6495,9 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq typedef size_t (*ZSTD_sequenceCopier) (ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize); -static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) { + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); +static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) +{ ZSTD_sequenceCopier sequenceCopier = NULL; assert(ZSTD_cParam_withinBounds(ZSTD_c_blockDelimiters, mode)); if (mode == ZSTD_sf_explicitBlockDelimiters) { @@ -5956,24 +6509,75 @@ static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) return sequenceCopier; } +/* Discover the size of next block by searching for the delimiter. + * Note that a block delimiter **must** exist in this mode, + * otherwise it's an input error. + * The block size retrieved will be later compared to ensure it remains within bounds */ +static size_t +blockSize_explicitDelimiter(const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + int end = 0; + size_t blockSize = 0; + size_t spos = seqPos.idx; + DEBUGLOG(6, "blockSize_explicitDelimiter : seq %zu / %zu", spos, inSeqsSize); + assert(spos <= inSeqsSize); + while (spos < inSeqsSize) { + end = (inSeqs[spos].offset == 0); + blockSize += inSeqs[spos].litLength + inSeqs[spos].matchLength; + if (end) { + if (inSeqs[spos].matchLength != 0) + RETURN_ERROR(externalSequences_invalid, "delimiter format error : both matchlength and offset must be == 0"); + break; + } + spos++; + } + if (!end) + RETURN_ERROR(externalSequences_invalid, "Reached end of sequences without finding a block delimiter"); + return blockSize; +} + +/* More a "target" block size */ +static size_t blockSize_noDelimiter(size_t blockSize, size_t remaining) +{ + int const lastBlock = (remaining <= blockSize); + return lastBlock ? remaining : blockSize; +} + +static size_t determine_blockSize(ZSTD_sequenceFormat_e mode, + size_t blockSize, size_t remaining, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + DEBUGLOG(6, "determine_blockSize : remainingSize = %zu", remaining); + if (mode == ZSTD_sf_noBlockDelimiters) + return blockSize_noDelimiter(blockSize, remaining); + { size_t const explicitBlockSize = blockSize_explicitDelimiter(inSeqs, inSeqsSize, seqPos); + FORWARD_IF_ERROR(explicitBlockSize, "Error while determining block size with explicit delimiters"); + if (explicitBlockSize > blockSize) + RETURN_ERROR(externalSequences_invalid, "sequences incorrectly define a too large block"); + if (explicitBlockSize > remaining) + RETURN_ERROR(externalSequences_invalid, "sequences define a frame longer than source"); + return explicitBlockSize; + } +} + /* Compress, block-by-block, all of the sequences given. * - * Returns the cumulative size of all compressed blocks (including their headers), otherwise a ZSTD error. + * Returns the cumulative size of all compressed blocks (including their headers), + * otherwise a ZSTD error. */ -static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize) { +static size_t +ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize) +{ size_t cSize = 0; - U32 lastBlock; - size_t blockSize; - size_t compressedSeqsSize; size_t remaining = srcSize; ZSTD_sequencePosition seqPos = {0, 0, 0}; BYTE const* ip = (BYTE const*)src; BYTE* op = (BYTE*)dst; - ZSTD_sequenceCopier sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters); + ZSTD_sequenceCopier const sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters); DEBUGLOG(4, "ZSTD_compressSequences_internal srcSize: %zu, inSeqsSize: %zu", srcSize, inSeqsSize); /* Special case: empty frame */ @@ -5987,22 +6591,29 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, } while (remaining) { + size_t compressedSeqsSize; size_t cBlockSize; size_t additionalByteAdjustment; - lastBlock = remaining <= cctx->blockSize; - blockSize = lastBlock ? (U32)remaining : (U32)cctx->blockSize; + size_t blockSize = determine_blockSize(cctx->appliedParams.blockDelimiters, + cctx->blockSize, remaining, + inSeqs, inSeqsSize, seqPos); + U32 const lastBlock = (blockSize == remaining); + FORWARD_IF_ERROR(blockSize, "Error while trying to determine block size"); + assert(blockSize <= remaining); ZSTD_resetSeqStore(&cctx->seqStore); - DEBUGLOG(4, "Working on new block. Blocksize: %zu", blockSize); + DEBUGLOG(5, "Working on new block. Blocksize: %zu (total:%zu)", blockSize, (ip - (const BYTE*)src) + blockSize); - additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize); + additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize, cctx->appliedParams.searchForExternalRepcodes); FORWARD_IF_ERROR(additionalByteAdjustment, "Bad sequence copy"); blockSize -= additionalByteAdjustment; /* If blocks are too small, emit as a nocompress block */ - if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); - DEBUGLOG(4, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); + DEBUGLOG(5, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); cSize += cBlockSize; ip += blockSize; op += cBlockSize; @@ -6011,6 +6622,7 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, continue; } + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "not enough dstCapacity to write a new compressed block"); compressedSeqsSize = ZSTD_entropyCompressSeqStore(&cctx->seqStore, &cctx->blockState.prevCBlock->entropy, &cctx->blockState.nextCBlock->entropy, &cctx->appliedParams, @@ -6019,11 +6631,11 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, cctx->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, cctx->bmi2); FORWARD_IF_ERROR(compressedSeqsSize, "Compressing sequences of block failed"); - DEBUGLOG(4, "Compressed sequences size: %zu", compressedSeqsSize); + DEBUGLOG(5, "Compressed sequences size: %zu", compressedSeqsSize); if (!cctx->isFirstBlock && ZSTD_maybeRLE(&cctx->seqStore) && - ZSTD_isRLE((BYTE const*)src, srcSize)) { + ZSTD_isRLE(ip, blockSize)) { /* We don't want to emit our first block as a RLE even if it qualifies because * doing so will cause the decoder (cli only) to throw a "should consume all input error." * This is only an issue for zstd <= v1.4.3 @@ -6034,12 +6646,12 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, if (compressedSeqsSize == 0) { /* ZSTD_noCompressBlock writes the block header as well */ cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); - FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); - DEBUGLOG(4, "Writing out nocompress block, size: %zu", cBlockSize); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_noCompressBlock failed"); + DEBUGLOG(5, "Writing out nocompress block, size: %zu", cBlockSize); } else if (compressedSeqsSize == 1) { cBlockSize = ZSTD_rleCompressBlock(op, dstCapacity, *ip, blockSize, lastBlock); - FORWARD_IF_ERROR(cBlockSize, "RLE compress block failed"); - DEBUGLOG(4, "Writing out RLE block, size: %zu", cBlockSize); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_rleCompressBlock failed"); + DEBUGLOG(5, "Writing out RLE block, size: %zu", cBlockSize); } else { U32 cBlockHeader; /* Error checking and repcodes update */ @@ -6051,11 +6663,10 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, cBlockHeader = lastBlock + (((U32)bt_compressed)<<1) + (U32)(compressedSeqsSize << 3); MEM_writeLE24(op, cBlockHeader); cBlockSize = ZSTD_blockHeaderSize + compressedSeqsSize; - DEBUGLOG(4, "Writing out compressed block, size: %zu", cBlockSize); + DEBUGLOG(5, "Writing out compressed block, size: %zu", cBlockSize); } cSize += cBlockSize; - DEBUGLOG(4, "cSize running total: %zu", cSize); if (lastBlock) { break; @@ -6066,21 +6677,25 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, dstCapacity -= cBlockSize; cctx->isFirstBlock = 0; } + DEBUGLOG(5, "cSize running total: %zu (remaining dstCapacity=%zu)", cSize, dstCapacity); } + DEBUGLOG(4, "cSize final total: %zu", cSize); return cSize; } -size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapacity, +size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize) { + const void* src, size_t srcSize) +{ BYTE* op = (BYTE*)dst; size_t cSize = 0; size_t compressedBlocksSize = 0; size_t frameHeaderSize = 0; /* Transparent initialization stage, same as compressStream2() */ - DEBUGLOG(3, "ZSTD_compressSequences()"); + DEBUGLOG(4, "ZSTD_compressSequences (dstCapacity=%zu)", dstCapacity); assert(cctx != NULL); FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, ZSTD_e_end, srcSize), "CCtx initialization failed"); /* Begin writing output, starting with frame header */ @@ -6108,26 +6723,34 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapaci cSize += 4; } - DEBUGLOG(3, "Final compressed size: %zu", cSize); + DEBUGLOG(4, "Final compressed size: %zu", cSize); return cSize; } /*====== Finalize ======*/ +static ZSTD_inBuffer inBuffer_forEndFlush(const ZSTD_CStream* zcs) +{ + const ZSTD_inBuffer nullInput = { NULL, 0, 0 }; + const int stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + return stableInput ? zcs->expectedInBuffer : nullInput; +} + /*! ZSTD_flushStream() : * @return : amount of data remaining to flush */ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer input = { NULL, 0, 0 }; + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); + input.size = input.pos; /* do not ingest more input during flush */ return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush); } size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer input = { NULL, 0, 0 }; + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end); - FORWARD_IF_ERROR( remainingToFlush , "ZSTD_compressStream2 failed"); + FORWARD_IF_ERROR(remainingToFlush , "ZSTD_compressStream2(,,ZSTD_e_end) failed"); if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */ /* single thread mode : attempt to calculate remaining to flush more precisely */ { size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE; @@ -6140,119 +6763,12 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) /*-===== Pre-defined compression levels =====-*/ +#include "clevels.h" -#define ZSTD_MAX_CLEVEL 22 int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; } int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; } int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; } -static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = { -{ /* "default" - for any srcSize > 256 KB */ - /* W, C, H, S, L, TL, strat */ - { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */ - { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */ - { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */ - { 21, 16, 17, 1, 5, 0, ZSTD_dfast }, /* level 3 */ - { 21, 18, 18, 1, 5, 0, ZSTD_dfast }, /* level 4 */ - { 21, 18, 19, 2, 5, 2, ZSTD_greedy }, /* level 5 */ - { 21, 19, 19, 3, 5, 4, ZSTD_greedy }, /* level 6 */ - { 21, 19, 19, 3, 5, 8, ZSTD_lazy }, /* level 7 */ - { 21, 19, 19, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */ - { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */ - { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */ - { 22, 21, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */ - { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */ - { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 13 */ - { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */ - { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */ - { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */ - { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */ - { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */ - { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */ - { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */ - { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */ - { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */ -}, -{ /* for srcSize <= 256 KB */ - /* W, C, H, S, L, T, strat */ - { 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */ - { 18, 14, 14, 1, 5, 0, ZSTD_dfast }, /* level 2 */ - { 18, 16, 16, 1, 4, 0, ZSTD_dfast }, /* level 3 */ - { 18, 16, 17, 2, 5, 2, ZSTD_greedy }, /* level 4.*/ - { 18, 18, 18, 3, 5, 2, ZSTD_greedy }, /* level 5.*/ - { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/ - { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */ - { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ - { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ - { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ - { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/ - { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/ - { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */ - { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ - { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/ - { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/ - { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/ - { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/ - { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -{ /* for srcSize <= 128 KB */ - /* W, C, H, S, L, T, strat */ - { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */ - { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */ - { 17, 15, 16, 2, 5, 0, ZSTD_dfast }, /* level 3 */ - { 17, 17, 17, 2, 4, 0, ZSTD_dfast }, /* level 4 */ - { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */ - { 17, 17, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */ - { 17, 17, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */ - { 17, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ - { 17, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ - { 17, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ - { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */ - { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */ - { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/ - { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ - { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/ - { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/ - { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/ - { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/ - { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -{ /* for srcSize <= 16 KB */ - /* W, C, H, S, L, T, strat */ - { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */ - { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */ - { 14, 14, 15, 2, 4, 0, ZSTD_dfast }, /* level 3 */ - { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */ - { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/ - { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */ - { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */ - { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/ - { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/ - { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/ - { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/ - { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/ - { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/ - { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/ - { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/ - { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/ - { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/ - { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/ - { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -}; - static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams(int const compressionLevel, size_t const dictSize) { ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, 0, dictSize, ZSTD_cpm_createCDict); @@ -6356,7 +6872,7 @@ static ZSTD_compressionParameters ZSTD_getCParams_internal(int compressionLevel, cp.targetLength = (unsigned)(-clampedCompressionLevel); } /* refine parameters based on srcSize & dictSize */ - return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize, mode); + return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize, mode, ZSTD_ps_auto); } } @@ -6391,3 +6907,21 @@ ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSizeH if (srcSizeHint == 0) srcSizeHint = ZSTD_CONTENTSIZE_UNKNOWN; return ZSTD_getParams_internal(compressionLevel, srcSizeHint, dictSize, ZSTD_cpm_unknown); } + +void ZSTD_registerSequenceProducer( + ZSTD_CCtx* zc, void* mState, + ZSTD_sequenceProducer_F* mFinder +) { + if (mFinder != NULL) { + ZSTD_externalMatchCtx emctx; + emctx.mState = mState; + emctx.mFinder = mFinder; + emctx.seqBuffer = NULL; + emctx.seqBufferCapacity = 0; + zc->externalMatchCtx = emctx; + zc->requestedParams.useSequenceProducer = 1; + } else { + ZSTD_memset(&zc->externalMatchCtx, 0, sizeof(zc->externalMatchCtx)); + zc->requestedParams.useSequenceProducer = 0; + } +} diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_internal.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_internal.h similarity index 78% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_internal.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_internal.h index 3b04fd0..cbb85e5 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_internal.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -23,6 +23,7 @@ #ifdef ZSTD_MULTITHREAD # include "zstdmt_compress.h" #endif +#include "../common/bits.h" /* ZSTD_highbit32, ZSTD_NbCommonBytes */ #if defined (__cplusplus) extern "C" { @@ -63,7 +64,7 @@ typedef struct { } ZSTD_localDict; typedef struct { - HUF_CElt CTable[HUF_CTABLE_SIZE_U32(255)]; + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(255)]; HUF_repeat repeatMode; } ZSTD_hufCTables_t; @@ -117,19 +118,20 @@ typedef struct { /** ZSTD_buildBlockEntropyStats() : * Builds entropy for the block. * @return : 0 on success or error code */ -size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, - const ZSTD_entropyCTables_t* prevEntropy, - ZSTD_entropyCTables_t* nextEntropy, - const ZSTD_CCtx_params* cctxParams, - ZSTD_entropyCTablesMetadata_t* entropyMetadata, - void* workspace, size_t wkspSize); +size_t ZSTD_buildBlockEntropyStats( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize); /********************************* * Compression internals structs * *********************************/ typedef struct { - U32 off; /* Offset code (offset + ZSTD_REP_MOVE) for the match */ + U32 off; /* Offset sumtype code for the match, using ZSTD_storeSeq() format */ U32 len; /* Raw length of match */ } ZSTD_match_t; @@ -148,6 +150,12 @@ typedef struct { size_t capacity; /* The capacity starting from `seq` pointer */ } rawSeqStore_t; +typedef struct { + U32 idx; /* Index in array of ZSTD_Sequence */ + U32 posInSequence; /* Position within sequence at idx */ + size_t posInSrc; /* Number of bytes given by sequences provided so far */ +} ZSTD_sequencePosition; + UNUSED_ATTR static const rawSeqStore_t kNullRawSeqStore = {NULL, 0, 0, 0, 0}; typedef struct { @@ -179,7 +187,7 @@ typedef struct { U32 offCodeSumBasePrice; /* to compare to log2(offreq) */ ZSTD_OptPrice_e priceType; /* prices can be determined dynamically, or follow a pre-defined cost structure */ const ZSTD_entropyCTables_t* symbolCosts; /* pre-calculated dictionary statistics */ - ZSTD_literalCompressionMode_e literalCompressionMode; + ZSTD_paramSwitch_e literalCompressionMode; } optState_t; typedef struct { @@ -199,6 +207,8 @@ typedef struct { */ } ZSTD_window_t; +#define ZSTD_WINDOW_START_INDEX 2 + typedef struct ZSTD_matchState_t ZSTD_matchState_t; #define ZSTD_ROW_HASH_CACHE_SIZE 8 /* Size of prefetching hash cache for row-based matchfinder */ @@ -232,6 +242,11 @@ struct ZSTD_matchState_t { const ZSTD_matchState_t* dictMatchState; ZSTD_compressionParameters cParams; const rawSeqStore_t* ldmSeqStore; + + /* Controls prefetching in some dictMatchState matchfinders. + * This behavior is controlled from the cctx ms. + * This parameter has no effect in the cdict ms. */ + int prefetchCDictTables; }; typedef struct { @@ -264,7 +279,7 @@ typedef struct { } ldmState_t; typedef struct { - U32 enableLdm; /* 1 if enable long distance matching */ + ZSTD_paramSwitch_e enableLdm; /* ZSTD_ps_enable to enable LDM. ZSTD_ps_auto by default */ U32 hashLog; /* Log size of hashTable */ U32 bucketSizeLog; /* Log bucket size for collision resolution, at most 8 */ U32 minMatchLength; /* Minimum match length */ @@ -295,7 +310,7 @@ struct ZSTD_CCtx_params_s { * There is no guarantee that hint is close to actual source size */ ZSTD_dictAttachPref_e attachDictPref; - ZSTD_literalCompressionMode_e literalCompressionMode; + ZSTD_paramSwitch_e literalCompressionMode; /* Multithreading: used to pass parameters to mtctx */ int nbWorkers; @@ -318,16 +333,34 @@ struct ZSTD_CCtx_params_s { int validateSequences; /* Block splitting */ - int splitBlocks; + ZSTD_paramSwitch_e useBlockSplitter; /* Param for deciding whether to use row-based matchfinder */ - ZSTD_useRowMatchFinderMode_e useRowMatchFinder; + ZSTD_paramSwitch_e useRowMatchFinder; /* Always load a dictionary in ext-dict mode (not prefix mode)? */ int deterministicRefPrefix; /* Internal use, for createCCtxParams() and freeCCtxParams() only */ ZSTD_customMem customMem; + + /* Controls prefetching in some dictMatchState matchfinders */ + ZSTD_paramSwitch_e prefetchCDictTables; + + /* Controls whether zstd will fall back to an internal matchfinder + * if the external matchfinder returns an error code. */ + int enableMatchFinderFallback; + + /* Indicates whether an external matchfinder has been referenced. + * Users can't set this externally. + * It is set internally in ZSTD_registerSequenceProducer(). */ + int useSequenceProducer; + + /* Adjust the max block size*/ + size_t maxBlockSize; + + /* Controls repcode search in external sequence parsing */ + ZSTD_paramSwitch_e searchForExternalRepcodes; }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */ #define COMPRESS_SEQUENCES_WORKSPACE_SIZE (sizeof(unsigned) * (MaxSeq + 2)) @@ -343,6 +376,30 @@ typedef enum { ZSTDb_buffered } ZSTD_buffered_policy_e; +/** + * Struct that contains all elements of block splitter that should be allocated + * in a wksp. + */ +#define ZSTD_MAX_NB_BLOCK_SPLITS 196 +typedef struct { + seqStore_t fullSeqStoreChunk; + seqStore_t firstHalfSeqStore; + seqStore_t secondHalfSeqStore; + seqStore_t currSeqStore; + seqStore_t nextSeqStore; + + U32 partitions[ZSTD_MAX_NB_BLOCK_SPLITS]; + ZSTD_entropyCTablesMetadata_t entropyMetadata; +} ZSTD_blockSplitCtx; + +/* Context for block-level external matchfinder API */ +typedef struct { + void* mState; + ZSTD_sequenceProducer_F* mFinder; + ZSTD_Sequence* seqBuffer; + size_t seqBufferCapacity; +} ZSTD_externalMatchCtx; + struct ZSTD_CCtx_s { ZSTD_compressionStage_e stage; int cParamsChanged; /* == 1 if cParams(except wlog) or compression level are changed in requestedParams. Triggers transmission of new params to ZSTDMT (if available) then reset to 0. */ @@ -374,7 +431,7 @@ struct ZSTD_CCtx_s { ZSTD_blockState_t blockState; U32* entropyWorkspace; /* entropy workspace of ENTROPY_WORKSPACE_SIZE bytes */ - /* Wether we are streaming or not */ + /* Whether we are streaming or not */ ZSTD_buffered_policy_e bufferedPolicy; /* streaming */ @@ -392,6 +449,7 @@ struct ZSTD_CCtx_s { /* Stable in/out buffer verification */ ZSTD_inBuffer expectedInBuffer; + size_t stableIn_notConsumed; /* nb bytes within stable input buffer that are said to be consumed but are not */ size_t expectedOutBufferSize; /* Dictionary */ @@ -408,9 +466,16 @@ struct ZSTD_CCtx_s { #if ZSTD_TRACE ZSTD_TraceCtx traceCtx; #endif + + /* Workspace for block splitter */ + ZSTD_blockSplitCtx blockSplitCtx; + + /* Workspace for external matchfinder */ + ZSTD_externalMatchCtx externalMatchCtx; }; typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e; +typedef enum { ZSTD_tfp_forCCtx, ZSTD_tfp_forCDict } ZSTD_tableFillPurpose_e; typedef enum { ZSTD_noDict = 0, @@ -432,7 +497,7 @@ typedef enum { * In this mode we take both the source size and the dictionary size * into account when selecting and adjusting the parameters. */ - ZSTD_cpm_unknown = 3, /* ZSTD_getCParams, ZSTD_getParams, ZSTD_adjustParams. + ZSTD_cpm_unknown = 3 /* ZSTD_getCParams, ZSTD_getParams, ZSTD_adjustParams. * We don't know what these parameters are for. We default to the legacy * behavior of taking both the source size and the dict size into account * when selecting and adjusting parameters. @@ -442,7 +507,7 @@ typedef enum { typedef size_t (*ZSTD_blockCompressor) ( ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); -ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRowMatchFinderMode_e rowMatchfinderMode, ZSTD_dictMode_e dictMode); +ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e rowMatchfinderMode, ZSTD_dictMode_e dictMode); MEM_STATIC U32 ZSTD_LLcode(U32 litLength) @@ -476,31 +541,6 @@ MEM_STATIC U32 ZSTD_MLcode(U32 mlBase) return (mlBase > 127) ? ZSTD_highbit32(mlBase) + ML_deltaCode : ML_Code[mlBase]; } -typedef struct repcodes_s { - U32 rep[3]; -} repcodes_t; - -MEM_STATIC repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 const ll0) -{ - repcodes_t newReps; - if (offset >= ZSTD_REP_NUM) { /* full offset */ - newReps.rep[2] = rep[1]; - newReps.rep[1] = rep[0]; - newReps.rep[0] = offset - ZSTD_REP_MOVE; - } else { /* repcode */ - U32 const repCode = offset + ll0; - if (repCode > 0) { /* note : if repCode==0, no change */ - U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; - newReps.rep[2] = (repCode >= 2) ? rep[1] : rep[2]; - newReps.rep[1] = rep[0]; - newReps.rep[0] = currentOffset; - } else { /* repCode == 0 */ - ZSTD_memcpy(&newReps, rep, sizeof(newReps)); - } - } - return newReps; -} - /* ZSTD_cParam_withinBounds: * @return 1 if value is within cParam bounds, * 0 otherwise */ @@ -516,9 +556,11 @@ MEM_STATIC int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value) /* ZSTD_noCompressBlock() : * Writes uncompressed block to dst buffer from given src. * Returns the size of the block */ -MEM_STATIC size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock) +MEM_STATIC size_t +ZSTD_noCompressBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock) { U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(srcSize << 3); + DEBUGLOG(5, "ZSTD_noCompressBlock (srcSize=%zu, dstCapacity=%zu)", srcSize, dstCapacity); RETURN_ERROR_IF(srcSize + ZSTD_blockHeaderSize > dstCapacity, dstSize_tooSmall, "dst buf too small for uncompressed block"); MEM_writeLE24(dst, cBlockHeader24); @@ -526,7 +568,8 @@ MEM_STATIC size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const voi return ZSTD_blockHeaderSize + srcSize; } -MEM_STATIC size_t ZSTD_rleCompressBlock (void* dst, size_t dstCapacity, BYTE src, size_t srcSize, U32 lastBlock) +MEM_STATIC size_t +ZSTD_rleCompressBlock(void* dst, size_t dstCapacity, BYTE src, size_t srcSize, U32 lastBlock) { BYTE* const op = (BYTE*)dst; U32 const cBlockHeader = lastBlock + (((U32)bt_rle)<<1) + (U32)(srcSize << 3); @@ -545,21 +588,21 @@ MEM_STATIC size_t ZSTD_minGain(size_t srcSize, ZSTD_strategy strat) { U32 const minlog = (strat>=ZSTD_btultra) ? (U32)(strat) - 1 : 6; ZSTD_STATIC_ASSERT(ZSTD_btultra == 8); - assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat)); + assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, (int)strat)); return (srcSize >> minlog) + 2; } -MEM_STATIC int ZSTD_disableLiteralsCompression(const ZSTD_CCtx_params* cctxParams) +MEM_STATIC int ZSTD_literalsCompressionIsDisabled(const ZSTD_CCtx_params* cctxParams) { switch (cctxParams->literalCompressionMode) { - case ZSTD_lcm_huffman: + case ZSTD_ps_enable: return 0; - case ZSTD_lcm_uncompressed: + case ZSTD_ps_disable: return 1; default: assert(0 /* impossible: pre-validated */); - /* fall-through */ - case ZSTD_lcm_auto: + ZSTD_FALLTHROUGH; + case ZSTD_ps_auto: return (cctxParams->cParams.strategy == ZSTD_fast) && (cctxParams->cParams.targetLength > 0); } } @@ -569,7 +612,9 @@ MEM_STATIC int ZSTD_disableLiteralsCompression(const ZSTD_CCtx_params* cctxParam * Only called when the sequence ends past ilimit_w, so it only needs to be optimized for single * large copies. */ -static void ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE const* ilimit_w) { +static void +ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE const* ilimit_w) +{ assert(iend > ilimit_w); if (ip <= ilimit_w) { ZSTD_wildcopy(op, ip, ilimit_w - ip, ZSTD_no_overlap); @@ -579,14 +624,28 @@ static void ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const ie while (ip < iend) *op++ = *ip++; } + +#define REPCODE1_TO_OFFBASE REPCODE_TO_OFFBASE(1) +#define REPCODE2_TO_OFFBASE REPCODE_TO_OFFBASE(2) +#define REPCODE3_TO_OFFBASE REPCODE_TO_OFFBASE(3) +#define REPCODE_TO_OFFBASE(r) (assert((r)>=1), assert((r)<=ZSTD_REP_NUM), (r)) /* accepts IDs 1,2,3 */ +#define OFFSET_TO_OFFBASE(o) (assert((o)>0), o + ZSTD_REP_NUM) +#define OFFBASE_IS_OFFSET(o) ((o) > ZSTD_REP_NUM) +#define OFFBASE_IS_REPCODE(o) ( 1 <= (o) && (o) <= ZSTD_REP_NUM) +#define OFFBASE_TO_OFFSET(o) (assert(OFFBASE_IS_OFFSET(o)), (o) - ZSTD_REP_NUM) +#define OFFBASE_TO_REPCODE(o) (assert(OFFBASE_IS_REPCODE(o)), (o)) /* returns ID 1,2,3 */ + /*! ZSTD_storeSeq() : - * Store a sequence (litlen, litPtr, offCode and mlBase) into seqStore_t. - * `offCode` : distance to match + ZSTD_REP_MOVE (values <= ZSTD_REP_MOVE are repCodes). - * `mlBase` : matchLength - MINMATCH - * Allowed to overread literals up to litLimit. + * Store a sequence (litlen, litPtr, offBase and matchLength) into seqStore_t. + * @offBase : Users should employ macros REPCODE_TO_OFFBASE() and OFFSET_TO_OFFBASE(). + * @matchLength : must be >= MINMATCH + * Allowed to over-read literals up to litLimit. */ -HINT_INLINE UNUSED_ATTR -void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* literals, const BYTE* litLimit, U32 offCode, size_t mlBase) +HINT_INLINE UNUSED_ATTR void +ZSTD_storeSeq(seqStore_t* seqStorePtr, + size_t litLength, const BYTE* literals, const BYTE* litLimit, + U32 offBase, + size_t matchLength) { BYTE const* const litLimit_w = litLimit - WILDCOPY_OVERLENGTH; BYTE const* const litEnd = literals + litLength; @@ -594,8 +653,8 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera static const BYTE* g_start = NULL; if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */ { U32 const pos = (U32)((const BYTE*)literals - g_start); - DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offCode%7u", - pos, (U32)litLength, (U32)mlBase+MINMATCH, (U32)offCode); + DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offBase%7u", + pos, (U32)litLength, (U32)matchLength, (U32)offBase); } #endif assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq); @@ -605,9 +664,9 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera assert(literals + litLength <= litLimit); if (litEnd <= litLimit_w) { /* Common case we can use wildcopy. - * First copy 16 bytes, because literals are likely short. - */ - assert(WILDCOPY_OVERLENGTH >= 16); + * First copy 16 bytes, because literals are likely short. + */ + ZSTD_STATIC_ASSERT(WILDCOPY_OVERLENGTH >= 16); ZSTD_copy16(seqStorePtr->lit, literals); if (litLength > 16) { ZSTD_wildcopy(seqStorePtr->lit+16, literals+16, (ptrdiff_t)litLength-16, ZSTD_no_overlap); @@ -626,96 +685,63 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera seqStorePtr->sequences[0].litLength = (U16)litLength; /* match offset */ - seqStorePtr->sequences[0].offset = offCode + 1; + seqStorePtr->sequences[0].offBase = offBase; /* match Length */ - if (mlBase>0xFFFF) { - assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ - seqStorePtr->longLengthType = ZSTD_llt_matchLength; - seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + assert(matchLength >= MINMATCH); + { size_t const mlBase = matchLength - MINMATCH; + if (mlBase>0xFFFF) { + assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ + seqStorePtr->longLengthType = ZSTD_llt_matchLength; + seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + } + seqStorePtr->sequences[0].mlBase = (U16)mlBase; } - seqStorePtr->sequences[0].matchLength = (U16)mlBase; seqStorePtr->sequences++; } +/* ZSTD_updateRep() : + * updates in-place @rep (array of repeat offsets) + * @offBase : sum-type, using numeric representation of ZSTD_storeSeq() + */ +MEM_STATIC void +ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) +{ + if (OFFBASE_IS_OFFSET(offBase)) { /* full offset */ + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = OFFBASE_TO_OFFSET(offBase); + } else { /* repcode */ + U32 const repCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; + if (repCode > 0) { /* note : if repCode==0, no change */ + U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; + rep[2] = (repCode >= 2) ? rep[1] : rep[2]; + rep[1] = rep[0]; + rep[0] = currentOffset; + } else { /* repCode == 0 */ + /* nothing to do */ + } + } +} + +typedef struct repcodes_s { + U32 rep[3]; +} repcodes_t; + +MEM_STATIC repcodes_t +ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) +{ + repcodes_t newReps; + ZSTD_memcpy(&newReps, rep, sizeof(newReps)); + ZSTD_updateRep(newReps.rep, offBase, ll0); + return newReps; +} + /*-************************************* * Match length counter ***************************************/ -static unsigned ZSTD_NbCommonBytes (size_t val) -{ - if (MEM_isLittleEndian()) { - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _tzcnt_u64(val) >> 3; -# else - unsigned long r = 0; - return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0; -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (__builtin_ctzll((U64)val) >> 3); -# else - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, - 0, 3, 1, 3, 1, 4, 2, 7, - 0, 2, 3, 6, 1, 5, 3, 5, - 1, 3, 4, 4, 2, 5, 6, 7, - 7, 0, 1, 2, 3, 3, 4, 6, - 2, 6, 5, 5, 3, 4, 5, 6, - 7, 1, 2, 4, 6, 4, 4, 5, - 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - unsigned long r=0; - return _BitScanForward( &r, (U32)val ) ? (unsigned)(r >> 3) : 0; -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_ctz((U32)val) >> 3); -# else - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, - 3, 2, 2, 1, 3, 2, 0, 1, - 3, 3, 1, 2, 2, 2, 2, 0, - 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; -# endif - } - } else { /* Big Endian CPU */ - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _lzcnt_u64(val) >> 3; -# else - unsigned long r = 0; - return _BitScanReverse64(&r, (U64)val) ? (unsigned)(r >> 3) : 0; -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (__builtin_clzll(val) >> 3); -# else - unsigned r; - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - unsigned long r = 0; - return _BitScanReverse( &r, (unsigned long)val ) ? (unsigned)(r >> 3) : 0; -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_clz((U32)val) >> 3); -# else - unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; -# endif - } } -} - - MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* const pInLimit) { const BYTE* const pStart = pIn; @@ -761,32 +787,36 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match, * Hashes ***************************************/ static const U32 prime3bytes = 506832829U; -static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes) >> (32-h) ; } +static U32 ZSTD_hash3(U32 u, U32 h) { assert(h <= 32); return ((u << (32-24)) * prime3bytes) >> (32-h) ; } MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); } /* only in zstd_opt.h */ static const U32 prime4bytes = 2654435761U; -static U32 ZSTD_hash4(U32 u, U32 h) { return (u * prime4bytes) >> (32-h) ; } -static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_read32(ptr), h); } +static U32 ZSTD_hash4(U32 u, U32 h) { assert(h <= 32); return (u * prime4bytes) >> (32-h) ; } +static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_readLE32(ptr), h); } static const U64 prime5bytes = 889523592379ULL; -static size_t ZSTD_hash5(U64 u, U32 h) { return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; } +static size_t ZSTD_hash5(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; } static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h); } static const U64 prime6bytes = 227718039650203ULL; -static size_t ZSTD_hash6(U64 u, U32 h) { return (size_t)(((u << (64-48)) * prime6bytes) >> (64-h)) ; } +static size_t ZSTD_hash6(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-48)) * prime6bytes) >> (64-h)) ; } static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h); } static const U64 prime7bytes = 58295818150454627ULL; -static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; } +static size_t ZSTD_hash7(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; } static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h); } static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL; -static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; } +static size_t ZSTD_hash8(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u) * prime8bytes) >> (64-h)) ; } static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); } MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls) { + /* Although some of these hashes do support hBits up to 64, some do not. + * To be on the safe side, always avoid hBits > 32. */ + assert(hBits <= 32); + switch(mls) { default: @@ -884,9 +914,9 @@ MEM_STATIC void ZSTD_window_clear(ZSTD_window_t* window) MEM_STATIC U32 ZSTD_window_isEmpty(ZSTD_window_t const window) { - return window.dictLimit == 1 && - window.lowLimit == 1 && - (window.nextSrc - window.base) == 1; + return window.dictLimit == ZSTD_WINDOW_START_INDEX && + window.lowLimit == ZSTD_WINDOW_START_INDEX && + (window.nextSrc - window.base) == ZSTD_WINDOW_START_INDEX; } /** @@ -937,7 +967,9 @@ MEM_STATIC U32 ZSTD_window_canOverflowCorrect(ZSTD_window_t const window, { U32 const cycleSize = 1u << cycleLog; U32 const curr = (U32)((BYTE const*)src - window.base); - U32 const minIndexToOverflowCorrect = cycleSize + MAX(maxDist, cycleSize); + U32 const minIndexToOverflowCorrect = cycleSize + + MAX(maxDist, cycleSize) + + ZSTD_WINDOW_START_INDEX; /* Adjust the min index to backoff the overflow correction frequency, * so we don't waste too much CPU in overflow correction. If this @@ -1012,10 +1044,14 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, U32 const cycleSize = 1u << cycleLog; U32 const cycleMask = cycleSize - 1; U32 const curr = (U32)((BYTE const*)src - window->base); - U32 const currentCycle0 = curr & cycleMask; - /* Exclude zero so that newCurrent - maxDist >= 1. */ - U32 const currentCycle1 = currentCycle0 == 0 ? cycleSize : currentCycle0; - U32 const newCurrent = currentCycle1 + MAX(maxDist, cycleSize); + U32 const currentCycle = curr & cycleMask; + /* Ensure newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX. */ + U32 const currentCycleCorrection = currentCycle < ZSTD_WINDOW_START_INDEX + ? MAX(cycleSize, ZSTD_WINDOW_START_INDEX) + : 0; + U32 const newCurrent = currentCycle + + currentCycleCorrection + + MAX(maxDist, cycleSize); U32 const correction = curr - newCurrent; /* maxDist must be a power of two so that: * (newCurrent & cycleMask) == (curr & cycleMask) @@ -1031,14 +1067,20 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, window->base += correction; window->dictBase += correction; - if (window->lowLimit <= correction) window->lowLimit = 1; - else window->lowLimit -= correction; - if (window->dictLimit <= correction) window->dictLimit = 1; - else window->dictLimit -= correction; + if (window->lowLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->lowLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->lowLimit -= correction; + } + if (window->dictLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->dictLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->dictLimit -= correction; + } /* Ensure we can still reference the full window. */ assert(newCurrent >= maxDist); - assert(newCurrent - maxDist >= 1); + assert(newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX); /* Ensure that lowLimit and dictLimit didn't underflow. */ assert(window->lowLimit <= newCurrent); assert(window->dictLimit <= newCurrent); @@ -1133,10 +1175,15 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window, (unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd); assert(blockEndIdx >= loadedDictEnd); - if (blockEndIdx > loadedDictEnd + maxDist) { + if (blockEndIdx > loadedDictEnd + maxDist || loadedDictEnd != window->dictLimit) { /* On reaching window size, dictionaries are invalidated. * For simplification, if window size is reached anywhere within next block, * the dictionary is invalidated for the full block. + * + * We also have to invalidate the dictionary if ZSTD_window_update() has detected + * non-contiguous segments, which means that loadedDictEnd != window->dictLimit. + * loadedDictEnd may be 0, if forceWindow is true, but in that case we never use + * dictMatchState, so setting it to NULL is not a problem. */ DEBUGLOG(6, "invalidating dictionary for current block (distance > windowSize)"); *loadedDictEndPtr = 0; @@ -1149,11 +1196,12 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window, MEM_STATIC void ZSTD_window_init(ZSTD_window_t* window) { ZSTD_memset(window, 0, sizeof(*window)); - window->base = (BYTE const*)""; - window->dictBase = (BYTE const*)""; - window->dictLimit = 1; /* start from 1, so that 1st position is valid */ - window->lowLimit = 1; /* it ensures first and later CCtx usages compress the same */ - window->nextSrc = window->base + 1; /* see issue #1241 */ + window->base = (BYTE const*)" "; + window->dictBase = (BYTE const*)" "; + ZSTD_STATIC_ASSERT(ZSTD_DUBT_UNSORTED_MARK < ZSTD_WINDOW_START_INDEX); /* Start above ZSTD_DUBT_UNSORTED_MARK */ + window->dictLimit = ZSTD_WINDOW_START_INDEX; /* start from >0, so that 1st position is valid */ + window->lowLimit = ZSTD_WINDOW_START_INDEX; /* it ensures first and later CCtx usages compress the same */ + window->nextSrc = window->base + ZSTD_WINDOW_START_INDEX; /* see issue #1241 */ window->nbOverflowCorrections = 0; } @@ -1206,15 +1254,15 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window, */ MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog) { - U32 const maxDistance = 1U << windowLog; - U32 const lowestValid = ms->window.lowLimit; - U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; - U32 const isDictionary = (ms->loadedDictEnd != 0); + U32 const maxDistance = 1U << windowLog; + U32 const lowestValid = ms->window.lowLimit; + U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + U32 const isDictionary = (ms->loadedDictEnd != 0); /* When using a dictionary the entire dictionary is valid if a single byte of the dictionary * is within the window. We invalidate the dictionary (and set loadedDictEnd to 0) when it isn't * valid for the entire block. So this check is sufficient to find the lowest valid match index. */ - U32 const matchLowest = isDictionary ? lowestValid : withinWindow; + U32 const matchLowest = isDictionary ? lowestValid : withinWindow; return matchLowest; } @@ -1267,6 +1315,42 @@ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max) #endif +/* Short Cache */ + +/* Normally, zstd matchfinders follow this flow: + * 1. Compute hash at ip + * 2. Load index from hashTable[hash] + * 3. Check if *ip == *(base + index) + * In dictionary compression, loading *(base + index) is often an L2 or even L3 miss. + * + * Short cache is an optimization which allows us to avoid step 3 most of the time + * when the data doesn't actually match. With short cache, the flow becomes: + * 1. Compute (hash, currentTag) at ip. currentTag is an 8-bit independent hash at ip. + * 2. Load (index, matchTag) from hashTable[hash]. See ZSTD_writeTaggedIndex to understand how this works. + * 3. Only if currentTag == matchTag, check *ip == *(base + index). Otherwise, continue. + * + * Currently, short cache is only implemented in CDict hashtables. Thus, its use is limited to + * dictMatchState matchfinders. + */ +#define ZSTD_SHORT_CACHE_TAG_BITS 8 +#define ZSTD_SHORT_CACHE_TAG_MASK ((1u << ZSTD_SHORT_CACHE_TAG_BITS) - 1) + +/* Helper function for ZSTD_fillHashTable and ZSTD_fillDoubleHashTable. + * Unpacks hashAndTag into (hash, tag), then packs (index, tag) into hashTable[hash]. */ +MEM_STATIC void ZSTD_writeTaggedIndex(U32* const hashTable, size_t hashAndTag, U32 index) { + size_t const hash = hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const tag = (U32)(hashAndTag & ZSTD_SHORT_CACHE_TAG_MASK); + assert(index >> (32 - ZSTD_SHORT_CACHE_TAG_BITS) == 0); + hashTable[hash] = (index << ZSTD_SHORT_CACHE_TAG_BITS) | tag; +} + +/* Helper function for short cache matchfinders. + * Unpacks tag1 and tag2 from lower bits of packedTag1 and packedTag2, then checks if the tags match. */ +MEM_STATIC int ZSTD_comparePackedTags(size_t packedTag1, size_t packedTag2) { + U32 const tag1 = packedTag1 & ZSTD_SHORT_CACHE_TAG_MASK; + U32 const tag2 = packedTag2 & ZSTD_SHORT_CACHE_TAG_MASK; + return tag1 == tag2; +} #if defined (__cplusplus) } @@ -1364,4 +1448,31 @@ U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat); */ void ZSTD_CCtx_trace(ZSTD_CCtx* cctx, size_t extraCSize); +/* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of + * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter. + * Note that the block delimiter must include the last literals of the block. + */ +size_t +ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, + ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); + +/* Returns the number of bytes to move the current read position back by. + * Only non-zero if we ended up splitting a sequence. + * Otherwise, it may return a ZSTD error if something went wrong. + * + * This function will attempt to scan through blockSize bytes + * represented by the sequences in @inSeqs, + * storing any (partial) sequences. + * + * Occasionally, we may want to change the actual number of bytes we consumed from inSeqs to + * avoid splitting a match, or to avoid splitting a match such that it would produce a match + * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block. + */ +size_t +ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); + #endif /* ZSTD_COMPRESS_H */ diff --git a/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.c new file mode 100644 index 0000000..bfd4f11 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.c @@ -0,0 +1,235 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + /*-************************************* + * Dependencies + ***************************************/ +#include "zstd_compress_literals.h" + + +/* ************************************************************** +* Debug Traces +****************************************************************/ +#if DEBUGLEVEL >= 2 + +static size_t showHexa(const void* src, size_t srcSize) +{ + const BYTE* const ip = (const BYTE*)src; + size_t u; + for (u=0; u31) + (srcSize>4095); + + DEBUGLOG(5, "ZSTD_noCompressLiterals: srcSize=%zu, dstCapacity=%zu", srcSize, dstCapacity); + + RETURN_ERROR_IF(srcSize + flSize > dstCapacity, dstSize_tooSmall, ""); + + switch(flSize) + { + case 1: /* 2 - 1 - 5 */ + ostart[0] = (BYTE)((U32)set_basic + (srcSize<<3)); + break; + case 2: /* 2 - 2 - 12 */ + MEM_writeLE16(ostart, (U16)((U32)set_basic + (1<<2) + (srcSize<<4))); + break; + case 3: /* 2 - 2 - 20 */ + MEM_writeLE32(ostart, (U32)((U32)set_basic + (3<<2) + (srcSize<<4))); + break; + default: /* not necessary : flSize is {1,2,3} */ + assert(0); + } + + ZSTD_memcpy(ostart + flSize, src, srcSize); + DEBUGLOG(5, "Raw (uncompressed) literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize)); + return srcSize + flSize; +} + +static int allBytesIdentical(const void* src, size_t srcSize) +{ + assert(srcSize >= 1); + assert(src != NULL); + { const BYTE b = ((const BYTE*)src)[0]; + size_t p; + for (p=1; p31) + (srcSize>4095); + + assert(dstCapacity >= 4); (void)dstCapacity; + assert(allBytesIdentical(src, srcSize)); + + switch(flSize) + { + case 1: /* 2 - 1 - 5 */ + ostart[0] = (BYTE)((U32)set_rle + (srcSize<<3)); + break; + case 2: /* 2 - 2 - 12 */ + MEM_writeLE16(ostart, (U16)((U32)set_rle + (1<<2) + (srcSize<<4))); + break; + case 3: /* 2 - 2 - 20 */ + MEM_writeLE32(ostart, (U32)((U32)set_rle + (3<<2) + (srcSize<<4))); + break; + default: /* not necessary : flSize is {1,2,3} */ + assert(0); + } + + ostart[flSize] = *(const BYTE*)src; + DEBUGLOG(5, "RLE : Repeated Literal (%02X: %u times) -> %u bytes encoded", ((const BYTE*)src)[0], (U32)srcSize, (U32)flSize + 1); + return flSize+1; +} + +/* ZSTD_minLiteralsToCompress() : + * returns minimal amount of literals + * for literal compression to even be attempted. + * Minimum is made tighter as compression strategy increases. + */ +static size_t +ZSTD_minLiteralsToCompress(ZSTD_strategy strategy, HUF_repeat huf_repeat) +{ + assert((int)strategy >= 0); + assert((int)strategy <= 9); + /* btultra2 : min 8 bytes; + * then 2x larger for each successive compression strategy + * max threshold 64 bytes */ + { int const shift = MIN(9-(int)strategy, 3); + size_t const mintc = (huf_repeat == HUF_repeat_valid) ? 6 : (size_t)8 << shift; + DEBUGLOG(7, "minLiteralsToCompress = %zu", mintc); + return mintc; + } +} + +size_t ZSTD_compressLiterals ( + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + void* entropyWorkspace, size_t entropyWorkspaceSize, + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_strategy strategy, + int disableLiteralCompression, + int suspectUncompressible, + int bmi2) +{ + size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB); + BYTE* const ostart = (BYTE*)dst; + U32 singleStream = srcSize < 256; + symbolEncodingType_e hType = set_compressed; + size_t cLitSize; + + DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i, srcSize=%u, dstCapacity=%zu)", + disableLiteralCompression, (U32)srcSize, dstCapacity); + + DEBUGLOG(6, "Completed literals listing (%zu bytes)", showHexa(src, srcSize)); + + /* Prepare nextEntropy assuming reusing the existing table */ + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + + if (disableLiteralCompression) + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + + /* if too small, don't even attempt compression (speed opt) */ + if (srcSize < ZSTD_minLiteralsToCompress(strategy, prevHuf->repeatMode)) + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + + RETURN_ERROR_IF(dstCapacity < lhSize+1, dstSize_tooSmall, "not enough space for compression"); + { HUF_repeat repeat = prevHuf->repeatMode; + int const flags = 0 + | (bmi2 ? HUF_flags_bmi2 : 0) + | (strategy < ZSTD_lazy && srcSize <= 1024 ? HUF_flags_preferRepeat : 0) + | (strategy >= HUF_OPTIMAL_DEPTH_THRESHOLD ? HUF_flags_optimalDepth : 0) + | (suspectUncompressible ? HUF_flags_suspectUncompressible : 0); + + typedef size_t (*huf_compress_f)(void*, size_t, const void*, size_t, unsigned, unsigned, void*, size_t, HUF_CElt*, HUF_repeat*, int); + huf_compress_f huf_compress; + if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1; + huf_compress = singleStream ? HUF_compress1X_repeat : HUF_compress4X_repeat; + cLitSize = huf_compress(ostart+lhSize, dstCapacity-lhSize, + src, srcSize, + HUF_SYMBOLVALUE_MAX, LitHufLog, + entropyWorkspace, entropyWorkspaceSize, + (HUF_CElt*)nextHuf->CTable, + &repeat, flags); + DEBUGLOG(5, "%zu literals compressed into %zu bytes (before header)", srcSize, cLitSize); + if (repeat != HUF_repeat_none) { + /* reused the existing table */ + DEBUGLOG(5, "reusing statistics from previous huffman block"); + hType = set_repeat; + } + } + + { size_t const minGain = ZSTD_minGain(srcSize, strategy); + if ((cLitSize==0) || (cLitSize >= srcSize - minGain) || ERR_isError(cLitSize)) { + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + } } + if (cLitSize==1) { + /* A return value of 1 signals that the alphabet consists of a single symbol. + * However, in some rare circumstances, it could be the compressed size (a single byte). + * For that outcome to have a chance to happen, it's necessary that `srcSize < 8`. + * (it's also necessary to not generate statistics). + * Therefore, in such a case, actively check that all bytes are identical. */ + if ((srcSize >= 8) || allBytesIdentical(src, srcSize)) { + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize); + } } + + if (hType == set_compressed) { + /* using a newly constructed table */ + nextHuf->repeatMode = HUF_repeat_check; + } + + /* Build header */ + switch(lhSize) + { + case 3: /* 2 - 2 - 10 - 10 */ + if (!singleStream) assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + ((U32)(!singleStream) << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<14); + MEM_writeLE24(ostart, lhc); + break; + } + case 4: /* 2 - 2 - 14 - 14 */ + assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + (2 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<18); + MEM_writeLE32(ostart, lhc); + break; + } + case 5: /* 2 - 2 - 18 - 18 */ + assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + (3 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<22); + MEM_writeLE32(ostart, lhc); + ostart[4] = (BYTE)(cLitSize >> 10); + break; + } + default: /* not possible : lhSize is {3,4,5} */ + assert(0); + } + DEBUGLOG(5, "Compressed literals: %u -> %u", (U32)srcSize, (U32)(lhSize+cLitSize)); + return lhSize+cLitSize; +} diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.h similarity index 61% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.h index 9904c0c..b060c8a 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_literals.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_literals.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -16,14 +16,24 @@ size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize); +/* ZSTD_compressRleLiteralsBlock() : + * Conditions : + * - All bytes in @src are identical + * - dstCapacity >= 4 */ size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize); -size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, - ZSTD_hufCTables_t* nextHuf, - ZSTD_strategy strategy, int disableLiteralCompression, - void* dst, size_t dstCapacity, +/* ZSTD_compressLiterals(): + * @entropyWorkspace: must be aligned on 4-bytes boundaries + * @entropyWorkspaceSize : must be >= HUF_WORKSPACE_SIZE + * @suspectUncompressible: sampling checks, to potentially skip huffman coding + */ +size_t ZSTD_compressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize, void* entropyWorkspace, size_t entropyWorkspaceSize, - const int bmi2); + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_strategy strategy, int disableLiteralCompression, + int suspectUncompressible, + int bmi2); #endif /* ZSTD_COMPRESS_LITERALS_H */ diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.c similarity index 93% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.c index 611eabd..8872d4d 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -58,7 +58,7 @@ static unsigned ZSTD_useLowProbCount(size_t const nbSeq) { /* Heuristic: This should cover most blocks <= 16K and * start to fade out after 16K to about 32K depending on - * comprssibility. + * compressibility. */ return nbSeq >= 2048; } @@ -166,7 +166,7 @@ ZSTD_selectEncodingType( if (mostFrequent == nbSeq) { *repeatMode = FSE_repeat_none; if (isDefaultAllowed && nbSeq <= 2) { - /* Prefer set_basic over set_rle when there are 2 or less symbols, + /* Prefer set_basic over set_rle when there are 2 or fewer symbols, * since RLE uses 1 byte, but set_basic uses 5-6 bits per symbol. * If basic encoding isn't possible, always choose RLE. */ @@ -275,10 +275,11 @@ ZSTD_buildCTable(void* dst, size_t dstCapacity, assert(nbSeq_1 > 1); assert(entropyWorkspaceSize >= sizeof(ZSTD_BuildCTableWksp)); (void)entropyWorkspaceSize; - FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), ""); - { size_t const NCountSize = FSE_writeNCount(op, oend - op, wksp->norm, max, tableLog); /* overflow protected */ + FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), "FSE_normalizeCount failed"); + assert(oend >= op); + { size_t const NCountSize = FSE_writeNCount(op, (size_t)(oend - op), wksp->norm, max, tableLog); /* overflow protected */ FORWARD_IF_ERROR(NCountSize, "FSE_writeNCount failed"); - FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), ""); + FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), "FSE_buildCTable_wksp failed"); return NCountSize; } } @@ -312,19 +313,19 @@ ZSTD_encodeSequences_body( FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]); BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]); + BIT_addBits(&blockStream, sequences[nbSeq-1].mlBase, ML_bits[mlCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); if (longOffsets) { U32 const ofBits = ofCodeTable[nbSeq-1]; unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { - BIT_addBits(&blockStream, sequences[nbSeq-1].offset, extraBits); + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, extraBits); BIT_flushBits(&blockStream); } - BIT_addBits(&blockStream, sequences[nbSeq-1].offset >> extraBits, + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase >> extraBits, ofBits - extraBits); } else { - BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]); + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, ofCodeTable[nbSeq-1]); } BIT_flushBits(&blockStream); @@ -338,8 +339,8 @@ ZSTD_encodeSequences_body( U32 const mlBits = ML_bits[mlCode]; DEBUGLOG(6, "encoding: litlen:%2u - matchlen:%2u - offCode:%7u", (unsigned)sequences[n].litLength, - (unsigned)sequences[n].matchLength + MINMATCH, - (unsigned)sequences[n].offset); + (unsigned)sequences[n].mlBase + MINMATCH, + (unsigned)sequences[n].offBase); /* 32b*/ /* 64b*/ /* (7)*/ /* (7)*/ FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */ @@ -350,18 +351,18 @@ ZSTD_encodeSequences_body( BIT_flushBits(&blockStream); /* (7)*/ BIT_addBits(&blockStream, sequences[n].litLength, llBits); if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[n].matchLength, mlBits); + BIT_addBits(&blockStream, sequences[n].mlBase, mlBits); if (MEM_32bits() || (ofBits+mlBits+llBits > 56)) BIT_flushBits(&blockStream); if (longOffsets) { unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { - BIT_addBits(&blockStream, sequences[n].offset, extraBits); + BIT_addBits(&blockStream, sequences[n].offBase, extraBits); BIT_flushBits(&blockStream); /* (7)*/ } - BIT_addBits(&blockStream, sequences[n].offset >> extraBits, + BIT_addBits(&blockStream, sequences[n].offBase >> extraBits, ofBits - extraBits); /* 31 */ } else { - BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */ + BIT_addBits(&blockStream, sequences[n].offBase, ofBits); /* 31 */ } BIT_flushBits(&blockStream); /* (7)*/ DEBUGLOG(7, "remaining space : %i", (int)(blockStream.endPtr - blockStream.ptr)); @@ -398,7 +399,7 @@ ZSTD_encodeSequences_default( #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t ZSTD_encodeSequences_bmi2( void* dst, size_t dstCapacity, FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.h similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.h index 7991364..4a3a05d 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_sequences.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_sequences.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.c similarity index 94% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.c index e4e4506..638c4ac 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -36,13 +36,14 @@ * If it is set_compressed, first sub-block's literals section will be Treeless_Literals_Block * and the following sub-blocks' literals sections will be Treeless_Literals_Block. * @return : compressed size of literals section of a sub-block - * Or 0 if it unable to compress. + * Or 0 if unable to compress. * Or error code */ -static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, - const ZSTD_hufCTablesMetadata_t* hufMetadata, - const BYTE* literals, size_t litSize, - void* dst, size_t dstSize, - const int bmi2, int writeEntropy, int* entropyWritten) +static size_t +ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + const BYTE* literals, size_t litSize, + void* dst, size_t dstSize, + const int bmi2, int writeEntropy, int* entropyWritten) { size_t const header = writeEntropy ? 200 : 0; size_t const lhSize = 3 + (litSize >= (1 KB - header)) + (litSize >= (16 KB - header)); @@ -53,8 +54,6 @@ static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, symbolEncodingType_e hType = writeEntropy ? hufMetadata->hType : set_repeat; size_t cLitSize = 0; - (void)bmi2; /* TODO bmi2... */ - DEBUGLOG(5, "ZSTD_compressSubBlock_literal (litSize=%zu, lhSize=%zu, writeEntropy=%d)", litSize, lhSize, writeEntropy); *entropyWritten = 0; @@ -76,9 +75,9 @@ static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, DEBUGLOG(5, "ZSTD_compressSubBlock_literal (hSize=%zu)", hufMetadata->hufDesSize); } - /* TODO bmi2 */ - { const size_t cSize = singleStream ? HUF_compress1X_usingCTable(op, oend-op, literals, litSize, hufTable) - : HUF_compress4X_usingCTable(op, oend-op, literals, litSize, hufTable); + { int const flags = bmi2 ? HUF_flags_bmi2 : 0; + const size_t cSize = singleStream ? HUF_compress1X_usingCTable(op, oend-op, literals, litSize, hufTable, flags) + : HUF_compress4X_usingCTable(op, oend-op, literals, litSize, hufTable, flags); op += cSize; cLitSize += cSize; if (cSize == 0 || ERR_isError(cSize)) { @@ -126,12 +125,17 @@ static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, return op-ostart; } -static size_t ZSTD_seqDecompressedSize(seqStore_t const* seqStore, const seqDef* sequences, size_t nbSeq, size_t litSize, int lastSequence) { +static size_t +ZSTD_seqDecompressedSize(seqStore_t const* seqStore, + const seqDef* sequences, size_t nbSeq, + size_t litSize, int lastSequence) +{ const seqDef* const sstart = sequences; const seqDef* const send = sequences + nbSeq; const seqDef* sp = sstart; size_t matchLengthSum = 0; size_t litLengthSum = 0; + (void)(litLengthSum); /* suppress unused variable warning on some environments */ while (send-sp > 0) { ZSTD_sequenceLength const seqLen = ZSTD_getSequenceLength(seqStore, sp); litLengthSum += seqLen.litLength; @@ -155,13 +159,14 @@ static size_t ZSTD_seqDecompressedSize(seqStore_t const* seqStore, const seqDef* * @return : compressed size of sequences section of a sub-block * Or 0 if it is unable to compress * Or error code. */ -static size_t ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, - const ZSTD_fseCTablesMetadata_t* fseMetadata, - const seqDef* sequences, size_t nbSeq, - const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, - const ZSTD_CCtx_params* cctxParams, - void* dst, size_t dstCapacity, - const int bmi2, int writeEntropy, int* entropyWritten) +static size_t +ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + const seqDef* sequences, size_t nbSeq, + const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + const int bmi2, int writeEntropy, int* entropyWritten) { const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN; BYTE* const ostart = (BYTE*)dst; @@ -324,7 +329,7 @@ static size_t ZSTD_estimateSubBlockSize_literal(const BYTE* literals, size_t lit static size_t ZSTD_estimateSubBlockSize_symbolType(symbolEncodingType_e type, const BYTE* codeTable, unsigned maxCode, size_t nbSeq, const FSE_CTable* fseCTable, - const U32* additionalBits, + const U8* additionalBits, short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, void* workspace, size_t wkspSize) { @@ -474,7 +479,7 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, /* I think there is an optimization opportunity here. * Calling ZSTD_estimateSubBlockSize for every sequence can be wasteful * since it recalculates estimate from scratch. - * For example, it would recount literal distribution and symbol codes everytime. + * For example, it would recount literal distribution and symbol codes every time. */ cBlockSizeEstimate = ZSTD_estimateSubBlockSize(lp, litSize, ofCodePtr, llCodePtr, mlCodePtr, seqCount, &nextCBlock->entropy, entropyMetadata, @@ -538,7 +543,7 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, repcodes_t rep; ZSTD_memcpy(&rep, prevCBlock->rep, sizeof(rep)); for (seq = sstart; seq < sp; ++seq) { - rep = ZSTD_updateRep(rep.rep, seq->offset - 1, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); + ZSTD_updateRep(rep.rep, seq->offBase, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); } ZSTD_memcpy(nextCBlock->rep, &rep, sizeof(rep)); } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.h similarity index 95% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.h index 176f9b1..8e494f0 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_compress_superblock.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_compress_superblock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_cwksp.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_cwksp.h similarity index 92% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_cwksp.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_cwksp.h index 2656d26..9767669 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_cwksp.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_cwksp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -219,7 +219,7 @@ MEM_STATIC size_t ZSTD_cwksp_aligned_alloc_size(size_t size) { MEM_STATIC size_t ZSTD_cwksp_slack_space_required(void) { /* For alignment, the wksp will always allocate an additional n_1=[1, 64] bytes * to align the beginning of tables section, as well as another n_2=[0, 63] bytes - * to align the beginning of the aligned secion. + * to align the beginning of the aligned section. * * n_1 + n_2 == 64 bytes if the cwksp is freshly allocated, due to tables and * aligneds being sized in multiples of 64 bytes. @@ -243,12 +243,14 @@ MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignByt /** * Internal function. Do not use directly. - * Reserves the given number of bytes within the aligned/buffer segment of the wksp, which - * counts from the end of the wksp. (as opposed to the object/table segment) + * Reserves the given number of bytes within the aligned/buffer segment of the wksp, + * which counts from the end of the wksp (as opposed to the object/table segment). * * Returns a pointer to the beginning of that space. */ -MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) { +MEM_STATIC void* +ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) +{ void* const alloc = (BYTE*)ws->allocStart - bytes; void* const bottom = ws->tableEnd; DEBUGLOG(5, "cwksp: reserving %p %zd bytes, %zd bytes remaining", @@ -260,6 +262,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t ws->allocFailed = 1; return NULL; } + /* the area is reserved from the end of wksp. + * If it overlaps with tableValidEnd, it voids guarantees on values' range */ if (alloc < ws->tableValidEnd) { ws->tableValidEnd = alloc; } @@ -269,10 +273,12 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t /** * Moves the cwksp to the next phase, and does any necessary allocations. + * cwksp initialization must necessarily go through each phase in order. * Returns a 0 on success, or zstd error */ -MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( - ZSTD_cwksp* ws, ZSTD_cwksp_alloc_phase_e phase) { +MEM_STATIC size_t +ZSTD_cwksp_internal_advance_phase(ZSTD_cwksp* ws, ZSTD_cwksp_alloc_phase_e phase) +{ assert(phase >= ws->phase); if (phase > ws->phase) { /* Going from allocating objects to allocating buffers */ @@ -295,15 +301,15 @@ MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( { /* Align the start of the tables to 64 bytes. Use [0, 63] bytes */ void* const alloc = ws->objectEnd; size_t const bytesToAlign = ZSTD_cwksp_bytes_to_align_ptr(alloc, ZSTD_CWKSP_ALIGNMENT_BYTES); - void* const end = (BYTE*)alloc + bytesToAlign; + void* const objectEnd = (BYTE*)alloc + bytesToAlign; DEBUGLOG(5, "reserving table alignment addtl space: %zu", bytesToAlign); - RETURN_ERROR_IF(end > ws->workspaceEnd, memory_allocation, + RETURN_ERROR_IF(objectEnd > ws->workspaceEnd, memory_allocation, "table phase - alignment initial allocation failed!"); - ws->objectEnd = end; - ws->tableEnd = end; - ws->tableValidEnd = end; - } - } + ws->objectEnd = objectEnd; + ws->tableEnd = objectEnd; /* table area starts being empty */ + if (ws->tableValidEnd < ws->tableEnd) { + ws->tableValidEnd = ws->tableEnd; + } } } ws->phase = phase; ZSTD_cwksp_assert_internal_consistency(ws); } @@ -313,15 +319,17 @@ MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( /** * Returns whether this object/buffer/etc was allocated in this workspace. */ -MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp* ws, const void* ptr) { +MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp* ws, const void* ptr) +{ return (ptr != NULL) && (ws->workspace <= ptr) && (ptr <= ws->workspaceEnd); } /** * Internal function. Do not use directly. */ -MEM_STATIC void* ZSTD_cwksp_reserve_internal( - ZSTD_cwksp* ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase) { +MEM_STATIC void* +ZSTD_cwksp_reserve_internal(ZSTD_cwksp* ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase) +{ void* alloc; if (ZSTD_isError(ZSTD_cwksp_internal_advance_phase(ws, phase)) || bytes == 0) { return NULL; @@ -340,7 +348,9 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal( if (alloc) { alloc = (BYTE *)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { - __asan_unpoison_memory_region(alloc, bytes); + /* We need to keep the redzone poisoned while unpoisoning the bytes that + * are actually allocated. */ + __asan_unpoison_memory_region(alloc, bytes - 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE); } } #endif @@ -351,14 +361,16 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal( /** * Reserves and returns unaligned memory. */ -MEM_STATIC BYTE* ZSTD_cwksp_reserve_buffer(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC BYTE* ZSTD_cwksp_reserve_buffer(ZSTD_cwksp* ws, size_t bytes) +{ return (BYTE*)ZSTD_cwksp_reserve_internal(ws, bytes, ZSTD_cwksp_alloc_buffers); } /** * Reserves and returns memory sized on and aligned on ZSTD_CWKSP_ALIGNMENT_BYTES (64 bytes). */ -MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) +{ void* ptr = ZSTD_cwksp_reserve_internal(ws, ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES), ZSTD_cwksp_alloc_aligned); assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0); @@ -370,7 +382,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) { * their values remain constrained, allowing us to re-use them without * memset()-ing them. */ -MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) +{ const ZSTD_cwksp_alloc_phase_e phase = ZSTD_cwksp_alloc_aligned; void* alloc; void* end; @@ -408,9 +421,11 @@ MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) { /** * Aligned on sizeof(void*). + * Note : should happen only once, at workspace first initialization */ -MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { - size_t roundedBytes = ZSTD_cwksp_align(bytes, sizeof(void*)); +MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) +{ + size_t const roundedBytes = ZSTD_cwksp_align(bytes, sizeof(void*)); void* alloc = ws->objectEnd; void* end = (BYTE*)alloc + roundedBytes; @@ -419,15 +434,15 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { end = (BYTE *)end + 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE; #endif - DEBUGLOG(5, + DEBUGLOG(4, "cwksp: reserving %p object %zd bytes (rounded to %zd), %zd bytes remaining", alloc, bytes, roundedBytes, ZSTD_cwksp_available_space(ws) - roundedBytes); - assert(((size_t)alloc & (sizeof(void*)-1)) == 0); - assert((bytes & (sizeof(void*)-1)) == 0); + assert((size_t)alloc % ZSTD_ALIGNOF(void*) == 0); + assert(bytes % ZSTD_ALIGNOF(void*) == 0); ZSTD_cwksp_assert_internal_consistency(ws); /* we must be in the first phase, no advance is possible */ if (ws->phase != ZSTD_cwksp_alloc_objects || end > ws->workspaceEnd) { - DEBUGLOG(4, "cwksp: object alloc failed!"); + DEBUGLOG(3, "cwksp: object alloc failed!"); ws->allocFailed = 1; return NULL; } @@ -438,7 +453,7 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { #if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) /* Move alloc so there's ZSTD_CWKSP_ASAN_REDZONE_SIZE unused space on * either size. */ - alloc = (BYTE *)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; + alloc = (BYTE*)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { __asan_unpoison_memory_region(alloc, bytes); } @@ -447,7 +462,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { return alloc; } -MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws) { +MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws) +{ DEBUGLOG(4, "cwksp: ZSTD_cwksp_mark_tables_dirty"); #if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE) @@ -485,7 +501,7 @@ MEM_STATIC void ZSTD_cwksp_clean_tables(ZSTD_cwksp* ws) { assert(ws->tableValidEnd >= ws->objectEnd); assert(ws->tableValidEnd <= ws->allocStart); if (ws->tableValidEnd < ws->tableEnd) { - ZSTD_memset(ws->tableValidEnd, 0, (BYTE*)ws->tableEnd - (BYTE*)ws->tableValidEnd); + ZSTD_memset(ws->tableValidEnd, 0, (size_t)((BYTE*)ws->tableEnd - (BYTE*)ws->tableValidEnd)); } ZSTD_cwksp_mark_tables_clean(ws); } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.c similarity index 51% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.c index d0d3a78..0ad88ff 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -11,8 +11,43 @@ #include "zstd_compress_internal.h" #include "zstd_double_fast.h" +static void ZSTD_fillDoubleHashTableForCDict(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashLarge = ms->hashTable; + U32 const hBitsL = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + U32* const hashSmall = ms->chainTable; + U32 const hBitsS = cParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; -void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + /* Always insert every fastHashFillStep position into the hash tables. + * Insert the other positions into the large hash table if their entry + * is empty. + */ + for (; ip + fastHashFillStep - 1 <= iend; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + U32 i; + for (i = 0; i < fastHashFillStep; ++i) { + size_t const smHashAndTag = ZSTD_hashPtr(ip + i, hBitsS, mls); + size_t const lgHashAndTag = ZSTD_hashPtr(ip + i, hBitsL, 8); + if (i == 0) { + ZSTD_writeTaggedIndex(hashSmall, smHashAndTag, curr + i); + } + if (i == 0 || hashLarge[lgHashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { + ZSTD_writeTaggedIndex(hashLarge, lgHashAndTag, curr + i); + } + /* Only load extra positions for ZSTD_dtlm_full */ + if (dtlm == ZSTD_dtlm_fast) + break; + } } +} + +static void ZSTD_fillDoubleHashTableForCCtx(ZSTD_matchState_t* ms, void const* end, ZSTD_dictTableLoadMethod_e dtlm) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -43,15 +78,26 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, /* Only load extra positions for ZSTD_dtlm_full */ if (dtlm == ZSTD_dtlm_fast) break; - } } + } } +} + +void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillDoubleHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillDoubleHashTableForCCtx(ms, end, dtlm); + } } FORCE_INLINE_TEMPLATE -size_t ZSTD_compressBlock_doubleFast_generic( +size_t ZSTD_compressBlock_doubleFast_noDict_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, - U32 const mls /* template */, ZSTD_dictMode_e const dictMode) + void const* src, size_t srcSize, U32 const mls /* template */) { ZSTD_compressionParameters const* cParams = &ms->cParams; U32* const hashLong = ms->hashTable; @@ -60,7 +106,6 @@ size_t ZSTD_compressBlock_doubleFast_generic( const U32 hBitsS = cParams->chainLog; const BYTE* const base = ms->window.base; const BYTE* const istart = (const BYTE*)src; - const BYTE* ip = istart; const BYTE* anchor = istart; const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); /* presumes that, if there is a dictionary, it must be using Attach mode */ @@ -69,188 +114,161 @@ size_t ZSTD_compressBlock_doubleFast_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; + U32 offsetSaved1 = 0, offsetSaved2 = 0; - const ZSTD_matchState_t* const dms = ms->dictMatchState; - const ZSTD_compressionParameters* const dictCParams = - dictMode == ZSTD_dictMatchState ? - &dms->cParams : NULL; - const U32* const dictHashLong = dictMode == ZSTD_dictMatchState ? - dms->hashTable : NULL; - const U32* const dictHashSmall = dictMode == ZSTD_dictMatchState ? - dms->chainTable : NULL; - const U32 dictStartIndex = dictMode == ZSTD_dictMatchState ? - dms->window.dictLimit : 0; - const BYTE* const dictBase = dictMode == ZSTD_dictMatchState ? - dms->window.base : NULL; - const BYTE* const dictStart = dictMode == ZSTD_dictMatchState ? - dictBase + dictStartIndex : NULL; - const BYTE* const dictEnd = dictMode == ZSTD_dictMatchState ? - dms->window.nextSrc : NULL; - const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ? - prefixLowestIndex - (U32)(dictEnd - dictBase) : - 0; - const U32 dictHBitsL = dictMode == ZSTD_dictMatchState ? - dictCParams->hashLog : hBitsL; - const U32 dictHBitsS = dictMode == ZSTD_dictMatchState ? - dictCParams->chainLog : hBitsS; - const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictStart)); + size_t mLength; + U32 offset; + U32 curr; - DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_generic"); + /* how many positions to search before increasing step size */ + const size_t kStepIncr = 1 << kSearchStrength; + /* the position at which to increment the step size if no match is found */ + const BYTE* nextStep; + size_t step; /* the current step size */ - assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState); + size_t hl0; /* the long hash at ip */ + size_t hl1; /* the long hash at ip1 */ - /* if a dictionary is attached, it must be within window range */ - if (dictMode == ZSTD_dictMatchState) { - assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); - } + U32 idxl0; /* the long match index for ip */ + U32 idxl1; /* the long match index for ip1 */ + + const BYTE* matchl0; /* the long match for ip */ + const BYTE* matchs0; /* the short match for ip */ + const BYTE* matchl1; /* the long match for ip1 */ + + const BYTE* ip = istart; /* the current position */ + const BYTE* ip1; /* the next position */ + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_noDict_generic"); /* init */ - ip += (dictAndPrefixLength == 0); - if (dictMode == ZSTD_noDict) { - U32 const curr = (U32)(ip - base); - U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); - U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; - if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; - } - if (dictMode == ZSTD_dictMatchState) { - /* dictMatchState repCode checks don't currently handle repCode == 0 - * disabling. */ - assert(offset_1 <= dictAndPrefixLength); - assert(offset_2 <= dictAndPrefixLength); + ip += ((ip - prefixLowest) == 0); + { + U32 const current = (U32)(ip - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, current, cParams->windowLog); + U32 const maxRep = current - windowLow; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; } - /* Main Search Loop */ - while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ - size_t mLength; - U32 offset; - size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8); - size_t const h = ZSTD_hashPtr(ip, hBitsS, mls); - size_t const dictHL = ZSTD_hashPtr(ip, dictHBitsL, 8); - size_t const dictHS = ZSTD_hashPtr(ip, dictHBitsS, mls); - U32 const curr = (U32)(ip-base); - U32 const matchIndexL = hashLong[h2]; - U32 matchIndexS = hashSmall[h]; - const BYTE* matchLong = base + matchIndexL; - const BYTE* match = base + matchIndexS; - const U32 repIndex = curr + 1 - offset_1; - const BYTE* repMatch = (dictMode == ZSTD_dictMatchState - && repIndex < prefixLowestIndex) ? - dictBase + (repIndex - dictIndexDelta) : - base + repIndex; - hashLong[h2] = hashSmall[h] = curr; /* update hash tables */ + /* Outer Loop: one iteration per match found and stored */ + while (1) { + step = 1; + nextStep = ip + kStepIncr; + ip1 = ip + step; - /* check dictMatchState repcode */ - if (dictMode == ZSTD_dictMatchState - && ((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) - && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { - const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; - mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); - goto _match_stored; + if (ip1 > ilimit) { + goto _cleanup; } - /* check noDict repcode */ - if ( dictMode == ZSTD_noDict - && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) { - mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); - goto _match_stored; - } + hl0 = ZSTD_hashPtr(ip, hBitsL, 8); + idxl0 = hashLong[hl0]; + matchl0 = base + idxl0; - if (matchIndexL > prefixLowestIndex) { - /* check prefix long match */ - if (MEM_read64(matchLong) == MEM_read64(ip)) { - mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8; - offset = (U32)(ip-matchLong); - while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ - goto _match_found; + /* Inner Loop: one iteration per search / position */ + do { + const size_t hs0 = ZSTD_hashPtr(ip, hBitsS, mls); + const U32 idxs0 = hashSmall[hs0]; + curr = (U32)(ip-base); + matchs0 = base + idxs0; + + hashLong[hl0] = hashSmall[hs0] = curr; /* update hash tables */ + + /* check noDict repcode */ + if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { + mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + goto _match_stored; } - } else if (dictMode == ZSTD_dictMatchState) { - /* check dictMatchState long match */ - U32 const dictMatchIndexL = dictHashLong[dictHL]; - const BYTE* dictMatchL = dictBase + dictMatchIndexL; - assert(dictMatchL < dictEnd); - if (dictMatchL > dictStart && MEM_read64(dictMatchL) == MEM_read64(ip)) { - mLength = ZSTD_count_2segments(ip+8, dictMatchL+8, iend, dictEnd, prefixLowest) + 8; - offset = (U32)(curr - dictMatchIndexL - dictIndexDelta); - while (((ip>anchor) & (dictMatchL>dictStart)) && (ip[-1] == dictMatchL[-1])) { ip--; dictMatchL--; mLength++; } /* catch up */ - goto _match_found; - } } + hl1 = ZSTD_hashPtr(ip1, hBitsL, 8); - if (matchIndexS > prefixLowestIndex) { - /* check prefix short match */ - if (MEM_read32(match) == MEM_read32(ip)) { - goto _search_next_long; + if (idxl0 > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchl0) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchl0+8, iend) + 8; + offset = (U32)(ip-matchl0); + while (((ip>anchor) & (matchl0>prefixLowest)) && (ip[-1] == matchl0[-1])) { ip--; matchl0--; mLength++; } /* catch up */ + goto _match_found; + } } - } else if (dictMode == ZSTD_dictMatchState) { - /* check dictMatchState short match */ - U32 const dictMatchIndexS = dictHashSmall[dictHS]; - match = dictBase + dictMatchIndexS; - matchIndexS = dictMatchIndexS + dictIndexDelta; - if (match > dictStart && MEM_read32(match) == MEM_read32(ip)) { - goto _search_next_long; - } } + idxl1 = hashLong[hl1]; + matchl1 = base + idxl1; - ip += ((ip-anchor) >> kSearchStrength) + 1; -#if defined(__aarch64__) - PREFETCH_L1(ip+256); -#endif - continue; + if (idxs0 > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(matchs0) == MEM_read32(ip)) { + goto _search_next_long; + } + } + + if (ip1 >= nextStep) { + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + step++; + nextStep += kStepIncr; + } + ip = ip1; + ip1 += step; + + hl0 = hl1; + idxl0 = idxl1; + matchl0 = matchl1; + #if defined(__aarch64__) + PREFETCH_L1(ip+256); + #endif + } while (ip1 <= ilimit); + +_cleanup: + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); _search_next_long: - { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); - size_t const dictHLNext = ZSTD_hashPtr(ip+1, dictHBitsL, 8); - U32 const matchIndexL3 = hashLong[hl3]; - const BYTE* matchL3 = base + matchIndexL3; - hashLong[hl3] = curr + 1; - - /* check prefix long +1 match */ - if (matchIndexL3 > prefixLowestIndex) { - if (MEM_read64(matchL3) == MEM_read64(ip+1)) { - mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8; - ip++; - offset = (U32)(ip-matchL3); - while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ - goto _match_found; - } - } else if (dictMode == ZSTD_dictMatchState) { - /* check dict long +1 match */ - U32 const dictMatchIndexL3 = dictHashLong[dictHLNext]; - const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; - assert(dictMatchL3 < dictEnd); - if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) { - mLength = ZSTD_count_2segments(ip+1+8, dictMatchL3+8, iend, dictEnd, prefixLowest) + 8; - ip++; - offset = (U32)(curr + 1 - dictMatchIndexL3 - dictIndexDelta); - while (((ip>anchor) & (dictMatchL3>dictStart)) && (ip[-1] == dictMatchL3[-1])) { ip--; dictMatchL3--; mLength++; } /* catch up */ - goto _match_found; - } } } + /* check prefix long +1 match */ + if (idxl1 > prefixLowestIndex) { + if (MEM_read64(matchl1) == MEM_read64(ip1)) { + ip = ip1; + mLength = ZSTD_count(ip+8, matchl1+8, iend) + 8; + offset = (U32)(ip-matchl1); + while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */ + goto _match_found; + } + } /* if no long +1 match, explore the short match we found */ - if (dictMode == ZSTD_dictMatchState && matchIndexS < prefixLowestIndex) { - mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4; - offset = (U32)(curr - matchIndexS); - while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - } else { - mLength = ZSTD_count(ip+4, match+4, iend) + 4; - offset = (U32)(ip - match); - while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - } + mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4; + offset = (U32)(ip - matchs0); + while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */ /* fall-through */ -_match_found: +_match_found: /* requires ip, offset, mLength */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + if (step < 4) { + /* It is unsafe to write this value back to the hashtable when ip1 is + * greater than or equal to the new ip we will have after we're done + * processing this match. Rather than perform that test directly + * (ip1 >= ip + mLength), which costs speed in practice, we do a simpler + * more predictable test. The minmatch even if we take a short match is + * 4 bytes, so as long as step, the distance between ip and ip1 + * (initially) is less than 4, we know ip1 < new ip. */ + hashLong[hl1] = (U32)(ip1 - base); + } + + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); _match_stored: /* match found */ @@ -268,53 +286,268 @@ _match_stored: } /* check immediate repcode */ - if (dictMode == ZSTD_dictMatchState) { - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); - U32 const repIndex2 = current2 - offset_2; - const BYTE* repMatch2 = dictMode == ZSTD_dictMatchState - && repIndex2 < prefixLowestIndex ? - dictBase + repIndex2 - dictIndexDelta : - base + repIndex2; - if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { - const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; - U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); - hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; - hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; - ip += repLength2; - anchor = ip; - continue; - } - break; - } } + while ( (ip <= ilimit) + && ( (offset_2>0) + & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; + U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, rLength); + ip += rLength; + anchor = ip; + continue; /* faster when present ... (?) */ + } + } + } +} - if (dictMode == ZSTD_noDict) { - while ( (ip <= ilimit) - && ( (offset_2>0) - & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { - /* store sequence */ - size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; - U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ - hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); - hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, rLength-MINMATCH); - ip += rLength; - anchor = ip; - continue; /* faster when present ... (?) */ + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, + U32 const mls /* template */) +{ + ZSTD_compressionParameters const* cParams = &ms->cParams; + U32* const hashLong = ms->hashTable; + const U32 hBitsL = cParams->hashLog; + U32* const hashSmall = ms->chainTable; + const U32 hBitsS = cParams->chainLog; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + /* presumes that, if there is a dictionary, it must be using Attach mode */ + const U32 prefixLowestIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixLowest = base + prefixLowestIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const ZSTD_compressionParameters* const dictCParams = &dms->cParams; + const U32* const dictHashLong = dms->hashTable; + const U32* const dictHashSmall = dms->chainTable; + const U32 dictStartIndex = dms->window.dictLimit; + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dms->window.nextSrc; + const U32 dictIndexDelta = prefixLowestIndex - (U32)(dictEnd - dictBase); + const U32 dictHBitsL = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictHBitsS = dictCParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictStart)); + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_dictMatchState_generic"); + + /* if a dictionary is attached, it must be within window range */ + assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); + + if (ms->prefetchCDictTables) { + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + size_t const chainTableBytes = (((size_t)1) << dictCParams->chainLog) * sizeof(U32); + PREFETCH_AREA(dictHashLong, hashTableBytes) + PREFETCH_AREA(dictHashSmall, chainTableBytes) + } + + /* init */ + ip += (dictAndPrefixLength == 0); + + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + + /* Main Search Loop */ + while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ + size_t mLength; + U32 offset; + size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8); + size_t const h = ZSTD_hashPtr(ip, hBitsS, mls); + size_t const dictHashAndTagL = ZSTD_hashPtr(ip, dictHBitsL, 8); + size_t const dictHashAndTagS = ZSTD_hashPtr(ip, dictHBitsS, mls); + U32 const dictMatchIndexAndTagL = dictHashLong[dictHashAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS]; + U32 const dictMatchIndexAndTagS = dictHashSmall[dictHashAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL = ZSTD_comparePackedTags(dictMatchIndexAndTagL, dictHashAndTagL); + int const dictTagsMatchS = ZSTD_comparePackedTags(dictMatchIndexAndTagS, dictHashAndTagS); + U32 const curr = (U32)(ip-base); + U32 const matchIndexL = hashLong[h2]; + U32 matchIndexS = hashSmall[h]; + const BYTE* matchLong = base + matchIndexL; + const BYTE* match = base + matchIndexS; + const U32 repIndex = curr + 1 - offset_1; + const BYTE* repMatch = (repIndex < prefixLowestIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + hashLong[h2] = hashSmall[h] = curr; /* update hash tables */ + + /* check repcode */ + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { + const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + goto _match_stored; + } + + if (matchIndexL > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchLong) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8; + offset = (U32)(ip-matchLong); + while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictTagsMatchL) { + /* check dictMatchState long match */ + U32 const dictMatchIndexL = dictMatchIndexAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatchL = dictBase + dictMatchIndexL; + assert(dictMatchL < dictEnd); + + if (dictMatchL > dictStart && MEM_read64(dictMatchL) == MEM_read64(ip)) { + mLength = ZSTD_count_2segments(ip+8, dictMatchL+8, iend, dictEnd, prefixLowest) + 8; + offset = (U32)(curr - dictMatchIndexL - dictIndexDelta); + while (((ip>anchor) & (dictMatchL>dictStart)) && (ip[-1] == dictMatchL[-1])) { ip--; dictMatchL--; mLength++; } /* catch up */ + goto _match_found; + } } + + if (matchIndexS > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(match) == MEM_read32(ip)) { + goto _search_next_long; + } + } else if (dictTagsMatchS) { + /* check dictMatchState short match */ + U32 const dictMatchIndexS = dictMatchIndexAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS; + match = dictBase + dictMatchIndexS; + matchIndexS = dictMatchIndexS + dictIndexDelta; + + if (match > dictStart && MEM_read32(match) == MEM_read32(ip)) { + goto _search_next_long; + } } + + ip += ((ip-anchor) >> kSearchStrength) + 1; +#if defined(__aarch64__) + PREFETCH_L1(ip+256); +#endif + continue; + +_search_next_long: + { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); + size_t const dictHashAndTagL3 = ZSTD_hashPtr(ip+1, dictHBitsL, 8); + U32 const matchIndexL3 = hashLong[hl3]; + U32 const dictMatchIndexAndTagL3 = dictHashLong[dictHashAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL3 = ZSTD_comparePackedTags(dictMatchIndexAndTagL3, dictHashAndTagL3); + const BYTE* matchL3 = base + matchIndexL3; + hashLong[hl3] = curr + 1; + + /* check prefix long +1 match */ + if (matchIndexL3 > prefixLowestIndex) { + if (MEM_read64(matchL3) == MEM_read64(ip+1)) { + mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8; + ip++; + offset = (U32)(ip-matchL3); + while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictTagsMatchL3) { + /* check dict long +1 match */ + U32 const dictMatchIndexL3 = dictMatchIndexAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; + assert(dictMatchL3 < dictEnd); + if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) { + mLength = ZSTD_count_2segments(ip+1+8, dictMatchL3+8, iend, dictEnd, prefixLowest) + 8; + ip++; + offset = (U32)(curr + 1 - dictMatchIndexL3 - dictIndexDelta); + while (((ip>anchor) & (dictMatchL3>dictStart)) && (ip[-1] == dictMatchL3[-1])) { ip--; dictMatchL3--; mLength++; } /* catch up */ + goto _match_found; } } } + + /* if no long +1 match, explore the short match we found */ + if (matchIndexS < prefixLowestIndex) { + mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4; + offset = (U32)(curr - matchIndexS); + while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ + } else { + mLength = ZSTD_count(ip+4, match+4, iend) + 4; + offset = (U32)(ip - match); + while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ + } + +_match_found: + offset_2 = offset_1; + offset_1 = offset; + + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + +_match_stored: + /* match found */ + ip += mLength; + anchor = ip; + + if (ip <= ilimit) { + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = curr+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + + /* check immediate repcode */ + while (ip <= ilimit) { + U32 const current2 = (U32)(ip-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ? + dictBase + repIndex2 - dictIndexDelta : + base + repIndex2; + if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; + U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; + ip += repLength2; + anchor = ip; + continue; + } + break; + } + } } /* while (ip < ilimit) */ /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = offset_1; + rep[1] = offset_2; /* Return the last literals size */ return (size_t)(iend - anchor); } +#define ZSTD_GEN_DFAST_FN(dictMode, mls) \ + static size_t ZSTD_compressBlock_doubleFast_##dictMode##_##mls( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_doubleFast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls); \ + } + +ZSTD_GEN_DFAST_FN(noDict, 4) +ZSTD_GEN_DFAST_FN(noDict, 5) +ZSTD_GEN_DFAST_FN(noDict, 6) +ZSTD_GEN_DFAST_FN(noDict, 7) + +ZSTD_GEN_DFAST_FN(dictMatchState, 4) +ZSTD_GEN_DFAST_FN(dictMatchState, 5) +ZSTD_GEN_DFAST_FN(dictMatchState, 6) +ZSTD_GEN_DFAST_FN(dictMatchState, 7) + size_t ZSTD_compressBlock_doubleFast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -325,13 +558,13 @@ size_t ZSTD_compressBlock_doubleFast( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_7(ms, seqStore, rep, src, srcSize); } } @@ -345,13 +578,13 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_7(ms, seqStore, rep, src, srcSize); } } @@ -387,7 +620,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( /* if extDict is invalidated due to maxDistance, switch to "regular" variant */ if (prefixStartIndex == dictStartIndex) - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, mls, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast(ms, seqStore, rep, src, srcSize); /* Search Loop */ while (ip < ilimit) { /* < instead of <=, because (ip+1) */ @@ -409,12 +642,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( hashSmall[hSmall] = hashLong[hLong] = curr; /* update hash table */ if ((((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex doesn't overlap dict + prefix */ - & (offset_1 < curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */ + & (offset_1 <= curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); } else { if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) { const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend; @@ -425,7 +658,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) { size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8); @@ -450,7 +683,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( } offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } else { ip += ((ip-anchor) >> kSearchStrength) + 1; @@ -477,12 +710,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( U32 const repIndex2 = current2 - offset_2; const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) /* intentional overflow : ensure repIndex2 doesn't overlap dict + prefix */ - & (offset_2 < current2 - dictStartIndex)) + & (offset_2 <= current2 - dictStartIndex)) && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; ip += repLength2; @@ -500,6 +733,10 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( return (size_t)(iend - anchor); } +ZSTD_GEN_DFAST_FN(extDict, 4) +ZSTD_GEN_DFAST_FN(extDict, 5) +ZSTD_GEN_DFAST_FN(extDict, 6) +ZSTD_GEN_DFAST_FN(extDict, 7) size_t ZSTD_compressBlock_doubleFast_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -510,12 +747,12 @@ size_t ZSTD_compressBlock_doubleFast_extDict( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 4); + return ZSTD_compressBlock_doubleFast_extDict_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 5); + return ZSTD_compressBlock_doubleFast_extDict_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 6); + return ZSTD_compressBlock_doubleFast_extDict_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 7); + return ZSTD_compressBlock_doubleFast_extDict_7(ms, seqStore, rep, src, srcSize); } } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.h similarity index 90% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.h index e16b7b0..6f0047c 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_double_fast.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_double_fast.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,8 @@ extern "C" { #include "zstd_compress_internal.h" /* ZSTD_CCtx, size_t */ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, - void const* end, ZSTD_dictTableLoadMethod_e dtlm); + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); size_t ZSTD_compressBlock_doubleFast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); diff --git a/src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.c new file mode 100644 index 0000000..5f2c6a2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.c @@ -0,0 +1,960 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "zstd_compress_internal.h" /* ZSTD_hashPtr, ZSTD_count, ZSTD_storeSeq */ +#include "zstd_fast.h" + +static void ZSTD_fillHashTableForCDict(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hBits = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Currently, we always use ZSTD_dtlm_full for filling CDict tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_full); + + /* Always insert every fastHashFillStep position into the hash table. + * Insert the other positions if their hash entry is empty. + */ + for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + { size_t const hashAndTag = ZSTD_hashPtr(ip, hBits, mls); + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr); } + + if (dtlm == ZSTD_dtlm_fast) continue; + /* Only load extra positions for ZSTD_dtlm_full */ + { U32 p; + for (p = 1; p < fastHashFillStep; ++p) { + size_t const hashAndTag = ZSTD_hashPtr(ip + p, hBits, mls); + if (hashTable[hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { /* not yet filled */ + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr + p); + } } } } +} + +static void ZSTD_fillHashTableForCCtx(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hBits = cParams->hashLog; + U32 const mls = cParams->minMatch; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Currently, we always use ZSTD_dtlm_fast for filling CCtx tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_fast); + + /* Always insert every fastHashFillStep position into the hash table. + * Insert the other positions if their hash entry is empty. + */ + for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + size_t const hash0 = ZSTD_hashPtr(ip, hBits, mls); + hashTable[hash0] = curr; + if (dtlm == ZSTD_dtlm_fast) continue; + /* Only load extra positions for ZSTD_dtlm_full */ + { U32 p; + for (p = 1; p < fastHashFillStep; ++p) { + size_t const hash = ZSTD_hashPtr(ip + p, hBits, mls); + if (hashTable[hash] == 0) { /* not yet filled */ + hashTable[hash] = curr + p; + } } } } +} + +void ZSTD_fillHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillHashTableForCCtx(ms, end, dtlm); + } +} + + +/** + * If you squint hard enough (and ignore repcodes), the search operation at any + * given position is broken into 4 stages: + * + * 1. Hash (map position to hash value via input read) + * 2. Lookup (map hash val to index via hashtable read) + * 3. Load (map index to value at that position via input read) + * 4. Compare + * + * Each of these steps involves a memory read at an address which is computed + * from the previous step. This means these steps must be sequenced and their + * latencies are cumulative. + * + * Rather than do 1->2->3->4 sequentially for a single position before moving + * onto the next, this implementation interleaves these operations across the + * next few positions: + * + * R = Repcode Read & Compare + * H = Hash + * T = Table Lookup + * M = Match Read & Compare + * + * Pos | Time --> + * ----+------------------- + * N | ... M + * N+1 | ... TM + * N+2 | R H T M + * N+3 | H TM + * N+4 | R H T M + * N+5 | H ... + * N+6 | R ... + * + * This is very much analogous to the pipelining of execution in a CPU. And just + * like a CPU, we have to dump the pipeline when we find a match (i.e., take a + * branch). + * + * When this happens, we throw away our current state, and do the following prep + * to re-enter the loop: + * + * Pos | Time --> + * ----+------------------- + * N | H T + * N+1 | H + * + * This is also the work we do at the beginning to enter the loop initially. + */ +FORCE_INLINE_TEMPLATE size_t +ZSTD_compressBlock_fast_noDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, + U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 prefixStartIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + + const BYTE* anchor = istart; + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + U32 rep_offset1 = rep[0]; + U32 rep_offset2 = rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + U32 mval; /* src value at match idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + + /* ip0 and ip1 are always adjacent. The targetLength skipping and + * uncompressibility acceleration is applied to every other position, + * matching the behavior of #1562. step therefore represents the gap + * between pairs of positions, from ip0 to ip2 or ip1 to ip3. */ + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); + + DEBUGLOG(5, "ZSTD_compressBlock_fast_generic"); + ip0 += (ip0 == prefixStart); + { U32 const curr = (U32)(ip0 - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); + U32 const maxRep = curr - windowLow; + if (rep_offset2 > maxRep) offsetSaved2 = rep_offset2, rep_offset2 = 0; + if (rep_offset1 > maxRep) offsetSaved1 = rep_offset1, rep_offset1 = 0; + } + + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + + do { + /* load repcode match for ip[2]*/ + const U32 rval = MEM_read32(ip2 - rep_offset1); + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if ((MEM_read32(ip2) == rval) & (rep_offset1 > 0)) { + ip0 = ip2; + match0 = ip0 - rep_offset1; + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 is before the + * repcode (ip2). */ + hashTable[hash1] = (U32)(ip1 - base); + + goto _match; + } + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 == ip0 + 1, so + * we know we will resume searching after ip1 */ + hashTable[hash1] = (U32)(ip1 - base); + + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + + /* first write next hash table entry; we've already calculated it */ + if (step <= 4) { + /* We need to avoid writing an index into the hash table >= the + * position at which we will pick up our searching after we've + * taken this match. + * + * The minimum possible match has length 4, so the earliest ip0 + * can be after we take this match will be the current ip0 + 4. + * ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely + * write this position. + */ + hashTable[hash1] = (U32)(ip1 - base); + } + + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ + + /* When the repcodes are outside of the prefix, we set them to zero before the loop. + * When the offsets are still zero, we need to restore them after the block to have a correct + * repcode history. If only one offset was invalid, it is easy. The tricky case is when both + * offsets were invalid. We need to figure out which offset to refill with. + * - If both offsets are zero they are in the same order. + * - If both offsets are non-zero, we won't restore the offsets from `offsetSaved[12]`. + * - If only one is zero, we need to decide which offset to restore. + * - If rep_offset1 is non-zero, then rep_offset2 must be offsetSaved1. + * - It is impossible for rep_offset2 to be non-zero. + * + * So if rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), then + * set rep[0] = rep_offset1 and rep[1] = offsetSaved1. + */ + offsetSaved2 = ((offsetSaved1 != 0) && (rep_offset1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1; + rep[1] = rep_offset2 ? rep_offset2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx */ + + /* Compute the offset code. */ + match0 = base + idx; + rep_offset2 = rep_offset1; + rep_offset1 = (U32)(ip0-match0); + offcode = OFFSET_TO_OFFBASE(rep_offset1); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>prefixStart)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } + +_match: /* Requires: ip0, match0, offcode */ + + /* Count the forward length. */ + mLength += ZSTD_count(ip0 + mLength, match0 + mLength, iend); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + if (rep_offset2 > 0) { /* rep_offset2==0 means rep_offset2 is invalidated */ + while ( (ip0 <= ilimit) && (MEM_read32(ip0) == MEM_read32(ip0 - rep_offset2)) ) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip0+4, ip0+4-rep_offset2, iend) + 4; + { U32 const tmpOff = rep_offset2; rep_offset2 = rep_offset1; rep_offset1 = tmpOff; } /* swap rep_offset2 <=> rep_offset1 */ + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += rLength; + ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, REPCODE1_TO_OFFBASE, rLength); + anchor = ip0; + continue; /* faster when present (confirmed on gcc-8) ... (?) */ + } } } + + goto _start; +} + +#define ZSTD_GEN_FAST_FN(dictMode, mls, step) \ + static size_t ZSTD_compressBlock_fast_##dictMode##_##mls##_##step( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_fast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls, step); \ + } + +ZSTD_GEN_FAST_FN(noDict, 4, 1) +ZSTD_GEN_FAST_FN(noDict, 5, 1) +ZSTD_GEN_FAST_FN(noDict, 6, 1) +ZSTD_GEN_FAST_FN(noDict, 7, 1) + +ZSTD_GEN_FAST_FN(noDict, 4, 0) +ZSTD_GEN_FAST_FN(noDict, 5, 0) +ZSTD_GEN_FAST_FN(noDict, 6, 0) +ZSTD_GEN_FAST_FN(noDict, 7, 0) + +size_t ZSTD_compressBlock_fast( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState == NULL); + if (ms->cParams.targetLength > 1) { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_1(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_1(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_1(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_1(ms, seqStore, rep, src, srcSize); + } + } else { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_0(ms, seqStore, rep, src, srcSize); + } + + } +} + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_fast_dictMatchState_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + U32 const stepSize = cParams->targetLength + !(cParams->targetLength); + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip0 = istart; + const BYTE* ip1 = ip0 + stepSize; /* we assert below that stepSize >= 1 */ + const BYTE* anchor = istart; + const U32 prefixStartIndex = ms->window.dictLimit; + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const ZSTD_compressionParameters* const dictCParams = &dms->cParams ; + const U32* const dictHashTable = dms->hashTable; + const U32 dictStartIndex = dms->window.dictLimit; + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dms->window.nextSrc; + const U32 dictIndexDelta = prefixStartIndex - (U32)(dictEnd - dictBase); + const U32 dictAndPrefixLength = (U32)(istart - prefixStart + dictEnd - dictStart); + const U32 dictHBits = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + + /* if a dictionary is still attached, it necessarily means that + * it is within window size. So we just check it. */ + const U32 maxDistance = 1U << cParams->windowLog; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + assert(endIndex - prefixStartIndex <= maxDistance); + (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ + + (void)hasStep; /* not currently specialized on whether it's accelerated */ + + /* ensure there will be no underflow + * when translating a dict index into a local index */ + assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); + + if (ms->prefetchCDictTables) { + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + PREFETCH_AREA(dictHashTable, hashTableBytes) + } + + /* init */ + DEBUGLOG(5, "ZSTD_compressBlock_fast_dictMatchState_generic"); + ip0 += (dictAndPrefixLength == 0); + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + + /* Outer search loop */ + assert(stepSize >= 1); + while (ip1 <= ilimit) { /* repcode check at (ip0 + 1) is safe because ip0 < ip1 */ + size_t mLength; + size_t hash0 = ZSTD_hashPtr(ip0, hlog, mls); + + size_t const dictHashAndTag0 = ZSTD_hashPtr(ip0, dictHBits, mls); + U32 dictMatchIndexAndTag = dictHashTable[dictHashAndTag0 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag0); + + U32 matchIndex = hashTable[hash0]; + U32 curr = (U32)(ip0 - base); + size_t step = stepSize; + const size_t kStepIncr = 1 << kSearchStrength; + const BYTE* nextStep = ip0 + kStepIncr; + + /* Inner search loop */ + while (1) { + const BYTE* match = base + matchIndex; + const U32 repIndex = curr + 1 - offset_1; + const BYTE* repMatch = (repIndex < prefixStartIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + const size_t hash1 = ZSTD_hashPtr(ip1, hlog, mls); + size_t const dictHashAndTag1 = ZSTD_hashPtr(ip1, dictHBits, mls); + hashTable[hash0] = curr; /* update hash table */ + + if (((U32) ((prefixStartIndex - 1) - repIndex) >= + 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */ + && (MEM_read32(repMatch) == MEM_read32(ip0 + 1))) { + const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip0 + 1 + 4, repMatch + 4, iend, repMatchEnd, prefixStart) + 4; + ip0++; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + break; + } + + if (dictTagsMatch) { + /* Found a possible dict match */ + const U32 dictMatchIndex = dictMatchIndexAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatch = dictBase + dictMatchIndex; + if (dictMatchIndex > dictStartIndex && + MEM_read32(dictMatch) == MEM_read32(ip0)) { + /* To replicate extDict parse behavior, we only use dict matches when the normal matchIndex is invalid */ + if (matchIndex <= prefixStartIndex) { + U32 const offset = (U32) (curr - dictMatchIndex - dictIndexDelta); + mLength = ZSTD_count_2segments(ip0 + 4, dictMatch + 4, iend, dictEnd, prefixStart) + 4; + while (((ip0 > anchor) & (dictMatch > dictStart)) + && (ip0[-1] == dictMatch[-1])) { + ip0--; + dictMatch--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } + } + } + + if (matchIndex > prefixStartIndex && MEM_read32(match) == MEM_read32(ip0)) { + /* found a regular match */ + U32 const offset = (U32) (ip0 - match); + mLength = ZSTD_count(ip0 + 4, match + 4, iend) + 4; + while (((ip0 > anchor) & (match > prefixStart)) + && (ip0[-1] == match[-1])) { + ip0--; + match--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } + + /* Prepare for next iteration */ + dictMatchIndexAndTag = dictHashTable[dictHashAndTag1 >> ZSTD_SHORT_CACHE_TAG_BITS]; + dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag1); + matchIndex = hashTable[hash1]; + + if (ip1 >= nextStep) { + step++; + nextStep += kStepIncr; + } + ip0 = ip1; + ip1 = ip1 + step; + if (ip1 > ilimit) goto _cleanup; + + curr = (U32)(ip0 - base); + hash0 = hash1; + } /* end inner search loop */ + + /* match found */ + assert(mLength); + ip0 += mLength; + anchor = ip0; + + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+curr+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; /* here because curr+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + /* check immediate repcode */ + while (ip0 <= ilimit) { + U32 const current2 = (U32)(ip0-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? + dictBase - dictIndexDelta + repIndex2 : + base + repIndex2; + if ( ((U32)((prefixStartIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch2) == MEM_read32(ip0))) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = current2; + ip0 += repLength2; + anchor = ip0; + continue; + } + break; + } + } + + /* Prepare for next iteration */ + assert(ip0 == anchor); + ip1 = ip0 + stepSize; + } + +_cleanup: + /* save reps for next block */ + rep[0] = offset_1; + rep[1] = offset_2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + + +ZSTD_GEN_FAST_FN(dictMatchState, 4, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 5, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 6, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 7, 0) + +size_t ZSTD_compressBlock_fast_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState != NULL); + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_dictMatchState_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_dictMatchState_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_dictMatchState_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_dictMatchState_7_0(ms, seqStore, rep, src, srcSize); + } +} + + +static size_t ZSTD_compressBlock_fast_extDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + size_t const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const BYTE* const istart = (const BYTE*)src; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, cParams->windowLog); + const U32 dictStartIndex = lowLimit; + const BYTE* const dictStart = dictBase + dictStartIndex; + const U32 dictLimit = ms->window.dictLimit; + const U32 prefixStartIndex = dictLimit < lowLimit ? lowLimit : dictLimit; + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const dictEnd = dictBase + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - 8; + U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + const BYTE* idxBase; /* base pointer for idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + const BYTE* matchEnd = 0; /* initialize to avoid warning, assert != 0 later */ + + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); + + (void)hasStep; /* not currently specialized on whether it's accelerated */ + + DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); + + /* switch to "regular" variant if extDict is invalidated due to maxDistance */ + if (prefixStartIndex == dictStartIndex) + return ZSTD_compressBlock_fast(ms, seqStore, rep, src, srcSize); + + { U32 const curr = (U32)(ip0 - base); + U32 const maxRep = curr - dictStartIndex; + if (offset_2 >= maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 >= maxRep) offsetSaved1 = offset_1, offset_1 = 0; + } + + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + do { + { /* load repcode match for ip[2] */ + U32 const current2 = (U32)(ip2 - base); + U32 const repIndex = current2 - offset_1; + const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; + U32 rval; + if ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ + & (offset_1 > 0) ) { + rval = MEM_read32(repBase + repIndex); + } else { + rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ + } + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if (MEM_read32(ip2) == rval) { + ip0 = ip2; + match0 = repBase + repIndex; + matchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + assert((match0 != prefixStart) & (match0 != dictStart)); + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + goto _match; + } } + + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ + + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx, idxBase */ + + /* Compute the offset code. */ + { U32 const offset = current0 - idx; + const BYTE* const lowMatchPtr = idx < prefixStartIndex ? dictStart : prefixStart; + matchEnd = idx < prefixStartIndex ? dictEnd : iend; + match0 = idxBase + idx; + offset_2 = offset_1; + offset_1 = offset; + offcode = OFFSET_TO_OFFBASE(offset); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>lowMatchPtr)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } } + +_match: /* Requires: ip0, match0, offcode, matchEnd */ + + /* Count the forward length. */ + assert(matchEnd != 0); + mLength += ZSTD_count_2segments(ip0 + mLength, match0 + mLength, iend, matchEnd, prefixStart); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* write next hash table entry */ + if (ip1 < ip0) { + hashTable[hash1] = (U32)(ip1 - base); + } + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + while (ip0 <= ilimit) { + U32 const repIndex2 = (U32)(ip0-base) - offset_2; + const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 > 0)) /* intentional underflow */ + && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += repLength2; + anchor = ip0; + continue; + } + break; + } } + + goto _start; +} + +ZSTD_GEN_FAST_FN(extDict, 4, 0) +ZSTD_GEN_FAST_FN(extDict, 5, 0) +ZSTD_GEN_FAST_FN(extDict, 6, 0) +ZSTD_GEN_FAST_FN(extDict, 7, 0) + +size_t ZSTD_compressBlock_fast_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState == NULL); + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); + } +} diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.h similarity index 90% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.h index 0d4a0c1..9e4236b 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_fast.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_fast.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,8 @@ extern "C" { #include "zstd_compress_internal.h" void ZSTD_fillHashTable(ZSTD_matchState_t* ms, - void const* end, ZSTD_dictTableLoadMethod_e dtlm); + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); size_t ZSTD_compressBlock_fast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.c similarity index 70% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.c index 3d523e8..a247342 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -10,6 +10,7 @@ #include "zstd_compress_internal.h" #include "zstd_lazy.h" +#include "../common/bits.h" /* ZSTD_countTrailingZeros64 */ /*-************************************* @@ -61,7 +62,7 @@ ZSTD_updateDUBT(ZSTD_matchState_t* ms, * assumption : curr >= btlow == (curr - btmask) * doesn't fail */ static void -ZSTD_insertDUBT1(ZSTD_matchState_t* ms, +ZSTD_insertDUBT1(const ZSTD_matchState_t* ms, U32 curr, const BYTE* inputEnd, U32 nbCompares, U32 btLow, const ZSTD_dictMode_e dictMode) @@ -93,7 +94,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, assert(curr >= btLow); assert(ip < iend); /* condition for ZSTD_count */ - while (nbCompares-- && (matchIndex > windowLow)) { + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ assert(matchIndex < curr); @@ -151,7 +152,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, static size_t ZSTD_DUBT_findBetterDictMatch ( - ZSTD_matchState_t* ms, + const ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, size_t* offsetPtr, size_t bestLength, @@ -185,7 +186,7 @@ ZSTD_DUBT_findBetterDictMatch ( (void)dictMode; assert(dictMode == ZSTD_dictMatchState); - while (nbCompares-- && (dictMatchIndex > dictLowLimit)) { + for (; nbCompares && (dictMatchIndex > dictLowLimit); --nbCompares) { U32* const nextPtr = dictBt + 2*(dictMatchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match = dictBase + dictMatchIndex; @@ -197,8 +198,8 @@ ZSTD_DUBT_findBetterDictMatch ( U32 matchIndex = dictMatchIndex + dictIndexDelta; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) { DEBUGLOG(9, "ZSTD_DUBT_findBetterDictMatch(%u) : found better match length %u -> %u and offsetCode %u -> %u (dictMatchIndex %u, matchIndex %u)", - curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, ZSTD_REP_MOVE + curr - matchIndex, dictMatchIndex, matchIndex); - bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + curr - matchIndex; + curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, OFFSET_TO_OFFBASE(curr - matchIndex), dictMatchIndex, matchIndex); + bestLength = matchLength, *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); } if (ip+matchLength == iend) { /* reached end of input : ip[matchLength] is not valid, no way to know if it's larger or smaller than match */ break; /* drop, to guarantee consistency (miss a little bit of compression) */ @@ -218,7 +219,7 @@ ZSTD_DUBT_findBetterDictMatch ( } if (bestLength >= MINMATCH) { - U32 const mIndex = curr - ((U32)*offsetPtr - ZSTD_REP_MOVE); (void)mIndex; + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offsetPtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBetterDictMatch(%u) : found match of length %u and offsetCode %u (pos %u)", curr, (U32)bestLength, (U32)*offsetPtr, mIndex); } @@ -230,7 +231,7 @@ ZSTD_DUBT_findBetterDictMatch ( static size_t ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, - size_t* offsetPtr, + size_t* offBasePtr, U32 const mls, const ZSTD_dictMode_e dictMode) { @@ -309,7 +310,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, matchIndex = hashTable[h]; hashTable[h] = curr; /* Update Hash Table */ - while (nbCompares-- && (matchIndex > windowLow)) { + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match; @@ -327,8 +328,8 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, if (matchLength > bestLength) { if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; - if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) - bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + curr - matchIndex; + if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr - matchIndex + 1) - ZSTD_highbit32((U32)*offBasePtr)) ) + bestLength = matchLength, *offBasePtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ if (dictMode == ZSTD_dictMatchState) { nbCompares = 0; /* in addition to avoiding checking any @@ -357,19 +358,20 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, *smallerPtr = *largerPtr = 0; + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dictMatchState && nbCompares) { bestLength = ZSTD_DUBT_findBetterDictMatch( ms, ip, iend, - offsetPtr, bestLength, nbCompares, + offBasePtr, bestLength, nbCompares, mls, dictMode); } assert(matchEndIdx > curr+8); /* ensure nextToUpdate is increased */ ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ if (bestLength >= MINMATCH) { - U32 const mIndex = curr - ((U32)*offsetPtr - ZSTD_REP_MOVE); (void)mIndex; + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offBasePtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBestMatch(%u) : found match of length %u and offsetCode %u (pos %u)", - curr, (U32)bestLength, (U32)*offsetPtr, mIndex); + curr, (U32)bestLength, (U32)*offBasePtr, mIndex); } return bestLength; } @@ -380,62 +382,14 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, FORCE_INLINE_TEMPLATE size_t ZSTD_BtFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, - size_t* offsetPtr, + size_t* offBasePtr, const U32 mls /* template */, const ZSTD_dictMode_e dictMode) { DEBUGLOG(7, "ZSTD_BtFindBestMatch"); if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */ ZSTD_updateDUBT(ms, ip, iLimit, mls); - return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offsetPtr, mls, dictMode); -} - - -static size_t -ZSTD_BtFindBestMatch_selectMLS ( ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict); - } -} - - -static size_t ZSTD_BtFindBestMatch_dictMatchState_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState); - } -} - - -static size_t ZSTD_BtFindBestMatch_extDict_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict); - } + return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offBasePtr, mls, dictMode); } /*********************************** @@ -450,7 +404,7 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B U32* const chainTable = ms->chainTable; U32 const chainSize = 1 << ms->cParams.chainLog; U32 idx = ms->nextToUpdate; - U32 const minChain = chainSize < target ? target - chainSize : idx; + U32 const minChain = chainSize < target - idx ? target - chainSize : idx; U32 const bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG; U32 const cacheSize = bucketSize - 1; U32 const chainAttempts = (1 << ms->cParams.searchLog) - cacheSize; @@ -464,7 +418,7 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B U32 const hashLog = ms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; U32* const tmpHashTable = hashTable; U32* const tmpChainTable = hashTable + ((size_t)1 << hashLog); - U32 const tmpChainSize = ((1 << ZSTD_LAZY_DDSS_BUCKET_LOG) - 1) << hashLog; + U32 const tmpChainSize = (U32)((1 << ZSTD_LAZY_DDSS_BUCKET_LOG) - 1) << hashLog; U32 const tmpMinChain = tmpChainSize < target ? target - tmpChainSize : idx; U32 hashIdx; @@ -608,7 +562,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + ddsIndexDelta) + ZSTD_REP_MOVE; + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) { /* best possible, avoids read overflow on next attempt */ return ml; @@ -645,7 +599,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + ddsIndexDelta) + ZSTD_REP_MOVE; + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } @@ -692,7 +646,7 @@ U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip) { /* inlining is important to hardwire a hot branch (template emulation) */ FORCE_INLINE_TEMPLATE -size_t ZSTD_HcFindBestMatch_generic ( +size_t ZSTD_HcFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, @@ -738,7 +692,8 @@ size_t ZSTD_HcFindBestMatch_generic ( if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) { const BYTE* const match = base + matchIndex; assert(matchIndex >= dictLimit); /* ensures this is true if dictMode != ZSTD_extDict */ - if (match[ml] == ip[ml]) /* potentially better */ + /* read 4B starting from (match + ml + 1 - sizeof(U32)) */ + if (MEM_read32(match + ml - 3) == MEM_read32(ip + ml - 3)) /* potentially better */ currentMl = ZSTD_count(ip, match, iLimit); } else { const BYTE* const match = dictBase + matchIndex; @@ -750,7 +705,7 @@ size_t ZSTD_HcFindBestMatch_generic ( /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - matchIndex + ZSTD_REP_MOVE; + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -758,6 +713,7 @@ size_t ZSTD_HcFindBestMatch_generic ( matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask); } + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dedicatedDictSearch) { ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts, dms, ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); @@ -784,7 +740,8 @@ size_t ZSTD_HcFindBestMatch_generic ( /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + dmsIndexDelta) + ZSTD_REP_MOVE; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -797,310 +754,49 @@ size_t ZSTD_HcFindBestMatch_generic ( return ml; } - -FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict); - } -} - - -static size_t ZSTD_HcFindBestMatch_dictMatchState_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState); - } -} - - -static size_t ZSTD_HcFindBestMatch_dedicatedDictSearch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dedicatedDictSearch); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_dedicatedDictSearch); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_dedicatedDictSearch); - } -} - - -FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict); - } -} - /* ********************************* * (SIMD) Row-based matchfinder ***********************************/ /* Constants for row-based hash */ -#define ZSTD_ROW_HASH_TAG_OFFSET 1 /* byte offset of hashes in the match state's tagTable from the beginning of a row */ -#define ZSTD_ROW_HASH_TAG_BITS 8 /* nb bits to use for the tag */ +#define ZSTD_ROW_HASH_TAG_OFFSET 16 /* byte offset of hashes in the match state's tagTable from the beginning of a row */ #define ZSTD_ROW_HASH_TAG_MASK ((1u << ZSTD_ROW_HASH_TAG_BITS) - 1) +#define ZSTD_ROW_HASH_MAX_ENTRIES 64 /* absolute maximum number of entries per row, for all configurations */ #define ZSTD_ROW_HASH_CACHE_MASK (ZSTD_ROW_HASH_CACHE_SIZE - 1) -typedef U32 ZSTD_VecMask; /* Clarifies when we are interacting with a U32 representing a mask of matches */ - -#if !defined(ZSTD_NO_INTRINSICS) && defined(__SSE2__) /* SIMD SSE version */ - -#include -typedef __m128i ZSTD_Vec128; - -/* Returns a 128-bit container with 128-bits from src */ -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - return _mm_loadu_si128((ZSTD_Vec128 const*)src); -} - -/* Returns a ZSTD_Vec128 with the byte "val" packed 16 times */ -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - return _mm_set1_epi8((char)val); -} - -/* Do byte-by-byte comparison result of x and y. Then collapse 128-bit resultant mask - * into a 32-bit mask that is the MSB of each byte. - * */ -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - return (ZSTD_VecMask)_mm_movemask_epi8(_mm_cmpeq_epi8(x, y)); -} - -typedef struct { - __m128i fst; - __m128i snd; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const ptr) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_read(ptr); - v.snd = ZSTD_Vec128_read((ZSTD_Vec128 const*)ptr + 1); - return v; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_set8(val); - v.snd = ZSTD_Vec128_set8(val); - return v; -} - -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask fstMask; - ZSTD_VecMask sndMask; - fstMask = ZSTD_Vec128_cmpMask8(x.fst, y.fst); - sndMask = ZSTD_Vec128_cmpMask8(x.snd, y.snd); - return fstMask | (sndMask << 16); -} - -#elif !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON) /* SIMD ARM NEON Version */ - -#include -typedef uint8x16_t ZSTD_Vec128; - -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - return vld1q_u8((const BYTE* const)src); -} - -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - return vdupq_n_u8(val); -} - -/* Mimics '_mm_movemask_epi8()' from SSE */ -static U32 ZSTD_vmovmaskq_u8(ZSTD_Vec128 val) { - /* Shift out everything but the MSB bits in each byte */ - uint16x8_t highBits = vreinterpretq_u16_u8(vshrq_n_u8(val, 7)); - /* Merge the even lanes together with vsra (right shift and add) */ - uint32x4_t paired16 = vreinterpretq_u32_u16(vsraq_n_u16(highBits, highBits, 7)); - uint64x2_t paired32 = vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14)); - uint8x16_t paired64 = vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28)); - /* Extract the low 8 bits from each lane, merge */ - return vgetq_lane_u8(paired64, 0) | ((U32)vgetq_lane_u8(paired64, 8) << 8); -} - -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - return (ZSTD_VecMask)ZSTD_vmovmaskq_u8(vceqq_u8(x, y)); -} - -typedef struct { - uint8x16_t fst; - uint8x16_t snd; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const ptr) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_read(ptr); - v.snd = ZSTD_Vec128_read((ZSTD_Vec128 const*)ptr + 1); - return v; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_set8(val); - v.snd = ZSTD_Vec128_set8(val); - return v; -} - -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask fstMask; - ZSTD_VecMask sndMask; - fstMask = ZSTD_Vec128_cmpMask8(x.fst, y.fst); - sndMask = ZSTD_Vec128_cmpMask8(x.snd, y.snd); - return fstMask | (sndMask << 16); -} - -#else /* Scalar fallback version */ - -#define VEC128_NB_SIZE_T (16 / sizeof(size_t)) -typedef struct { - size_t vec[VEC128_NB_SIZE_T]; -} ZSTD_Vec128; - -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - ZSTD_Vec128 ret; - ZSTD_memcpy(ret.vec, src, VEC128_NB_SIZE_T*sizeof(size_t)); - return ret; -} - -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - ZSTD_Vec128 ret = { {0} }; - int startBit = sizeof(size_t) * 8 - 8; - for (;startBit >= 0; startBit -= 8) { - unsigned j = 0; - for (;j < VEC128_NB_SIZE_T; ++j) { - ret.vec[j] |= ((size_t)val << startBit); - } - } - return ret; -} - -/* Compare x to y, byte by byte, generating a "matches" bitfield */ -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - ZSTD_VecMask res = 0; - unsigned i = 0; - unsigned l = 0; - for (; i < VEC128_NB_SIZE_T; ++i) { - const size_t cmp1 = x.vec[i]; - const size_t cmp2 = y.vec[i]; - unsigned j = 0; - for (; j < sizeof(size_t); ++j, ++l) { - if (((cmp1 >> j*8) & 0xFF) == ((cmp2 >> j*8) & 0xFF)) { - res |= ((U32)1 << (j+i*sizeof(size_t))); - } - } - } - return res; -} - -#define VEC256_NB_SIZE_T 2*VEC128_NB_SIZE_T -typedef struct { - size_t vec[VEC256_NB_SIZE_T]; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const src) { - ZSTD_Vec256 ret; - ZSTD_memcpy(ret.vec, src, VEC256_NB_SIZE_T*sizeof(size_t)); - return ret; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 ret = { {0} }; - int startBit = sizeof(size_t) * 8 - 8; - for (;startBit >= 0; startBit -= 8) { - unsigned j = 0; - for (;j < VEC256_NB_SIZE_T; ++j) { - ret.vec[j] |= ((size_t)val << startBit); - } - } - return ret; -} - -/* Compare x to y, byte by byte, generating a "matches" bitfield */ -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask res = 0; - unsigned i = 0; - unsigned l = 0; - for (; i < VEC256_NB_SIZE_T; ++i) { - const size_t cmp1 = x.vec[i]; - const size_t cmp2 = y.vec[i]; - unsigned j = 0; - for (; j < sizeof(size_t); ++j, ++l) { - if (((cmp1 >> j*8) & 0xFF) == ((cmp2 >> j*8) & 0xFF)) { - res |= ((U32)1 << (j+i*sizeof(size_t))); - } - } - } - return res; -} - -#endif /* !defined(ZSTD_NO_INTRINSICS) && defined(__SSE2__) */ +typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 representing a mask of matches */ /* ZSTD_VecMask_next(): * Starting from the LSB, returns the idx of the next non-zero bit. * Basically counting the nb of trailing zeroes. */ -static U32 ZSTD_VecMask_next(ZSTD_VecMask val) { -# if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - return _BitScanForward(&r, val) ? (U32)r : 0; -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (U32)__builtin_ctz(val); -# else - /* Software ctz version: http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup */ - static const U32 multiplyDeBruijnBitPosition[32] = - { - 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 - }; - return multiplyDeBruijnBitPosition[((U32)((v & -(int)v) * 0x077CB531U)) >> 27]; -# endif +MEM_STATIC U32 ZSTD_VecMask_next(ZSTD_VecMask val) { + return ZSTD_countTrailingZeros64(val); } -/* ZSTD_VecMask_rotateRight(): - * Rotates a bitfield to the right by "rotation" bits. - * If the rotation is greater than totalBits, the returned mask is 0. +/* ZSTD_rotateRight_*(): + * Rotates a bitfield to the right by "count" bits. + * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts */ -FORCE_INLINE_TEMPLATE ZSTD_VecMask -ZSTD_VecMask_rotateRight(ZSTD_VecMask mask, U32 const rotation, U32 const totalBits) { - if (rotation == 0) - return mask; - switch (totalBits) { - default: - assert(0); - case 16: - return (mask >> rotation) | (U16)(mask << (16 - rotation)); - case 32: - return (mask >> rotation) | (U32)(mask << (32 - rotation)); - } +FORCE_INLINE_TEMPLATE +U64 ZSTD_rotateRight_U64(U64 const value, U32 count) { + assert(count < 64); + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (U64)(value << ((0U - count) & 0x3F)); +} + +FORCE_INLINE_TEMPLATE +U32 ZSTD_rotateRight_U32(U32 const value, U32 count) { + assert(count < 32); + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (U32)(value << ((0U - count) & 0x1F)); +} + +FORCE_INLINE_TEMPLATE +U16 ZSTD_rotateRight_U16(U16 const value, U32 count) { + assert(count < 16); + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (U16)(value << ((0U - count) & 0x0F)); } /* ZSTD_row_nextIndex(): @@ -1126,20 +822,24 @@ MEM_STATIC int ZSTD_isAligned(void const* ptr, size_t align) { */ FORCE_INLINE_TEMPLATE void ZSTD_row_prefetch(U32 const* hashTable, U16 const* tagTable, U32 const relRow, U32 const rowLog) { PREFETCH_L1(hashTable + relRow); - if (rowLog == 5) { + if (rowLog >= 5) { PREFETCH_L1(hashTable + relRow + 16); + /* Note: prefetching more of the hash table does not appear to be beneficial for 128-entry rows */ } PREFETCH_L1(tagTable + relRow); - assert(rowLog == 4 || rowLog == 5); + if (rowLog == 6) { + PREFETCH_L1(tagTable + relRow + 32); + } + assert(rowLog == 4 || rowLog == 5 || rowLog == 6); assert(ZSTD_isAligned(hashTable + relRow, 64)); /* prefetched hash row always 64-byte aligned */ - assert(ZSTD_isAligned(tagTable + relRow, (size_t)1 << rowLog)); /* prefetched tagRow sits on a multiple of 32 or 64 bytes */ + assert(ZSTD_isAligned(tagTable + relRow, (size_t)1 << rowLog)); /* prefetched tagRow sits on correct multiple of bytes (32,64,128) */ } /* ZSTD_row_fillHashCache(): * Fill up the hash cache starting at idx, prefetching up to ZSTD_ROW_HASH_CACHE_SIZE entries, * but not beyond iLimit. */ -static void ZSTD_row_fillHashCache(ZSTD_matchState_t* ms, const BYTE* base, +FORCE_INLINE_TEMPLATE void ZSTD_row_fillHashCache(ZSTD_matchState_t* ms, const BYTE* base, U32 const rowLog, U32 const mls, U32 idx, const BYTE* const iLimit) { @@ -1179,35 +879,65 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_row_nextCachedHash(U32* cache, U32 const* hashTab } } -/* ZSTD_row_update_internal(): - * Inserts the byte at ip into the appropriate position in the hash table. - * Determines the relative row, and the position within the {16, 32} entry row to insert at. +/* ZSTD_row_update_internalImpl(): + * Updates the hash table with positions starting from updateStartIdx until updateEndIdx. */ -FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const BYTE* ip, - U32 const mls, U32 const rowLog, - U32 const rowMask, U32 const useCache) +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internalImpl(ZSTD_matchState_t* ms, + U32 updateStartIdx, U32 const updateEndIdx, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) { U32* const hashTable = ms->hashTable; U16* const tagTable = ms->tagTable; U32 const hashLog = ms->rowHashLog; const BYTE* const base = ms->window.base; - const U32 target = (U32)(ip - base); - U32 idx = ms->nextToUpdate; - DEBUGLOG(6, "ZSTD_row_update_internal(): nextToUpdate=%u, current=%u", idx, target); - for (; idx < target; ++idx) { - U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, idx, hashLog, rowLog, mls) - : (U32)ZSTD_hashPtr(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls); + DEBUGLOG(6, "ZSTD_row_update_internalImpl(): updateStartIdx=%u, updateEndIdx=%u", updateStartIdx, updateEndIdx); + for (; updateStartIdx < updateEndIdx; ++updateStartIdx) { + U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, updateStartIdx, hashLog, rowLog, mls) + : (U32)ZSTD_hashPtr(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls); U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); /* Though tagTable is laid out as a table of U16, each tag is only 1 byte. Explicit cast allows us to get exact desired position within each row */ U32 const pos = ZSTD_row_nextIndex(tagRow, rowMask); - assert(hash == ZSTD_hashPtr(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls)); + assert(hash == ZSTD_hashPtr(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls)); ((BYTE*)tagRow)[pos + ZSTD_ROW_HASH_TAG_OFFSET] = hash & ZSTD_ROW_HASH_TAG_MASK; - row[pos] = idx; + row[pos] = updateStartIdx; } +} + +/* ZSTD_row_update_internal(): + * Inserts the byte at ip into the appropriate position in the hash table, and updates ms->nextToUpdate. + * Skips sections of long matches as is necessary. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const BYTE* ip, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) +{ + U32 idx = ms->nextToUpdate; + const BYTE* const base = ms->window.base; + const U32 target = (U32)(ip - base); + const U32 kSkipThreshold = 384; + const U32 kMaxMatchStartPositionsToUpdate = 96; + const U32 kMaxMatchEndPositionsToUpdate = 32; + + if (useCache) { + /* Only skip positions when using hash cache, i.e. + * if we are loading a dict, don't skip anything. + * If we decide to skip, then we only update a set number + * of positions at the beginning and end of the match. + */ + if (UNLIKELY(target - idx > kSkipThreshold)) { + U32 const bound = idx + kMaxMatchStartPositionsToUpdate; + ZSTD_row_update_internalImpl(ms, idx, bound, mls, rowLog, rowMask, useCache); + idx = target - kMaxMatchEndPositionsToUpdate; + ZSTD_row_fillHashCache(ms, base, rowLog, mls, idx, ip+1); + } + } + assert(target >= idx); + ZSTD_row_update_internalImpl(ms, idx, target, mls, rowLog, rowMask, useCache); ms->nextToUpdate = target; } @@ -1216,34 +946,178 @@ FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const * processing. */ void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { - const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); const U32 rowMask = (1u << rowLog) - 1; const U32 mls = MIN(ms->cParams.minMatch, 6 /* mls caps out at 6 */); DEBUGLOG(5, "ZSTD_row_update(), rowLog=%u", rowLog); - ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* dont use cache */); + ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* don't use cache */); } -/* Returns a ZSTD_VecMask (U32) that has the nth bit set to 1 if the newly-computed "tag" matches - * the hash at the nth position in a row of the tagTable. +/* Returns the mask width of bits group of which will be set to 1. Given not all + * architectures have easy movemask instruction, this helps to iterate over + * groups of bits easier and faster. */ -FORCE_INLINE_TEMPLATE -ZSTD_VecMask ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, const U32 rowEntries) { - ZSTD_VecMask matches = 0; - if (rowEntries == 16) { - ZSTD_Vec128 hashes = ZSTD_Vec128_read(tagRow + ZSTD_ROW_HASH_TAG_OFFSET); - ZSTD_Vec128 expandedTags = ZSTD_Vec128_set8(tag); - matches = ZSTD_Vec128_cmpMask8(hashes, expandedTags); - } else if (rowEntries == 32) { - ZSTD_Vec256 hashes = ZSTD_Vec256_read(tagRow + ZSTD_ROW_HASH_TAG_OFFSET); - ZSTD_Vec256 expandedTags = ZSTD_Vec256_set8(tag); - matches = ZSTD_Vec256_cmpMask8(hashes, expandedTags); - } else { - assert(0); +FORCE_INLINE_TEMPLATE U32 +ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) +{ + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + (void)rowEntries; +#if defined(ZSTD_ARCH_ARM_NEON) + /* NEON path only works for little endian */ + if (!MEM_isLittleEndian()) { + return 1; } - /* Each row is a circular buffer beginning at the value of "head". So we must rotate the "matches" bitfield - to match up with the actual layout of the entries within the hashTable */ - return ZSTD_VecMask_rotateRight(matches, head, rowEntries); + if (rowEntries == 16) { + return 4; + } + if (rowEntries == 32) { + return 2; + } + if (rowEntries == 64) { + return 1; + } +#endif + return 1; +} + +#if defined(ZSTD_ARCH_X86_SSE2) +FORCE_INLINE_TEMPLATE ZSTD_VecMask +ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U32 head) +{ + const __m128i comparisonMask = _mm_set1_epi8((char)tag); + int matches[4] = {0}; + int i; + assert(nbChunks == 1 || nbChunks == 2 || nbChunks == 4); + for (i=0; i> chunkSize; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= (chunk * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } else { /* big endian: reverse bits during extraction */ + const size_t msb = xFF ^ (xFF >> 1); + const size_t extractMagic = (msb / 0x1FF) | msb; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= ((chunk >> 7) * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } + matches = ~matches; + if (rowEntries == 16) { + return ZSTD_rotateRight_U16((U16)matches, headGrouped); + } else if (rowEntries == 32) { + return ZSTD_rotateRight_U32((U32)matches, headGrouped); + } else { + return ZSTD_rotateRight_U64((U64)matches, headGrouped); + } + } +#endif } /* The high-level approach of the SIMD row based match finder is as follows: @@ -1262,7 +1136,7 @@ ZSTD_VecMask ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, con * - Pick the longest match. */ FORCE_INLINE_TEMPLATE -size_t ZSTD_RowFindBestMatch_generic ( +size_t ZSTD_RowFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, @@ -1288,16 +1162,19 @@ size_t ZSTD_RowFindBestMatch_generic ( const U32 rowEntries = (1U << rowLog); const U32 rowMask = rowEntries - 1; const U32 cappedSearchLog = MIN(cParams->searchLog, rowLog); /* nb of searches is capped at nb entries per row */ + const U32 groupWidth = ZSTD_row_matchMaskGroupWidth(rowEntries); U32 nbAttempts = 1U << cappedSearchLog; size_t ml=4-1; /* DMS/DDS variables that may be referenced laster */ const ZSTD_matchState_t* const dms = ms->dictMatchState; - size_t ddsIdx; - U32 ddsExtraAttempts; /* cctx hash tables are limited in searches, but allow extra searches into DDS */ - U32 dmsTag; - U32* dmsRow; - BYTE* dmsTagRow; + + /* Initialize the following variables to satisfy static analyzer */ + size_t ddsIdx = 0; + U32 ddsExtraAttempts = 0; /* cctx hash tables are limited in searches, but allow extra searches into DDS */ + U32 dmsTag = 0; + U32* dmsRow = NULL; + BYTE* dmsTagRow = NULL; if (dictMode == ZSTD_dedicatedDictSearch) { const U32 ddsHashLog = dms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; @@ -1328,15 +1205,15 @@ size_t ZSTD_RowFindBestMatch_generic ( U32 const tag = hash & ZSTD_ROW_HASH_TAG_MASK; U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); - U32 const head = *tagRow & rowMask; - U32 matchBuffer[32 /* maximum nb entries per row */]; + U32 const headGrouped = (*tagRow & rowMask) * groupWidth; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; - ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, head, rowEntries); + ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, headGrouped, rowEntries); /* Cycle through the matches and prefetch */ for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; U32 const matchIndex = row[matchPos]; assert(numMatches < rowEntries); if (matchIndex < lowLimit) @@ -1367,7 +1244,8 @@ size_t ZSTD_RowFindBestMatch_generic ( if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) { const BYTE* const match = base + matchIndex; assert(matchIndex >= dictLimit); /* ensures this is true if dictMode != ZSTD_extDict */ - if (match[ml] == ip[ml]) /* potentially better */ + /* read 4B starting from (match + ml + 1 - sizeof(U32)) */ + if (MEM_read32(match + ml - 3) == MEM_read32(ip + ml - 3)) /* potentially better */ currentMl = ZSTD_count(ip, match, iLimit); } else { const BYTE* const match = dictBase + matchIndex; @@ -1379,12 +1257,13 @@ size_t ZSTD_RowFindBestMatch_generic ( /* Save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - matchIndex + ZSTD_REP_MOVE; + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } } + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dedicatedDictSearch) { ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts + ddsExtraAttempts, dms, ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); @@ -1396,14 +1275,14 @@ size_t ZSTD_RowFindBestMatch_generic ( const U32 dmsSize = (U32)(dmsEnd - dmsBase); const U32 dmsIndexDelta = dictLimit - dmsSize; - { U32 const head = *dmsTagRow & rowMask; - U32 matchBuffer[32 /* maximum nb row entries */]; + { U32 const headGrouped = (*dmsTagRow & rowMask) * groupWidth; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; - ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, head, rowEntries); + ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, headGrouped, rowEntries); for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; U32 const matchIndex = dmsRow[matchPos]; if (matchIndex < dmsLowestIndex) break; @@ -1426,7 +1305,8 @@ size_t ZSTD_RowFindBestMatch_generic ( if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + dmsIndexDelta) + ZSTD_REP_MOVE; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; } } @@ -1435,83 +1315,183 @@ size_t ZSTD_RowFindBestMatch_generic ( return ml; } -/* Inlining is important to hardwire a hot branch (template emulation) */ -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - const ZSTD_dictMode_e dictMode, size_t* offsetPtr, const U32 rowLog) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, dictMode, rowLog); - case 5 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, dictMode, rowLog); - case 7 : - case 6 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, dictMode, rowLog); - } -} -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_selectRowLog ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_noDict, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_noDict, offsetPtr, 5); - } -} +/** + * Generate search functions templated on (dictMode, mls, rowLog). + * These functions are outlined for code size & compilation time. + * ZSTD_searchMax() dispatches to the correct implementation function. + * + * TODO: The start of the search function involves loading and calculating a + * bunch of constants from the ZSTD_matchState_t. These computations could be + * done in an initialization function, and saved somewhere in the match state. + * Then we could pass a pointer to the saved state instead of the match state, + * and avoid duplicate computations. + * + * TODO: Move the match re-winding into searchMax. This improves compression + * ratio, and unlocks further simplifications with the next TODO. + * + * TODO: Try moving the repcode search into searchMax. After the re-winding + * and repcode search are in searchMax, there is no more logic in the match + * finder loop that requires knowledge about the dictMode. So we should be + * able to avoid force inlining it, and we can join the extDict loop with + * the single segment loop. It should go in searchMax instead of its own + * function to avoid having multiple virtual function calls per search. + */ -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_dictMatchState_selectRowLog( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dictMatchState, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dictMatchState, offsetPtr, 5); - } -} +#define ZSTD_BT_SEARCH_FN(dictMode, mls) ZSTD_BtFindBestMatch_##dictMode##_##mls +#define ZSTD_HC_SEARCH_FN(dictMode, mls) ZSTD_HcFindBestMatch_##dictMode##_##mls +#define ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog) ZSTD_RowFindBestMatch_##dictMode##_##mls##_##rowLog -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_dedicatedDictSearch_selectRowLog( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dedicatedDictSearch, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dedicatedDictSearch, offsetPtr, 5); - } -} +#define ZSTD_SEARCH_FN_ATTRS FORCE_NOINLINE -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_extDict_selectRowLog ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_extDict, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_extDict, offsetPtr, 5); - } -} +#define GEN_ZSTD_BT_SEARCH_FN(dictMode, mls) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_BT_SEARCH_FN(dictMode, mls)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offBasePtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_BtFindBestMatch(ms, ip, iLimit, offBasePtr, mls, ZSTD_##dictMode); \ + } \ +#define GEN_ZSTD_HC_SEARCH_FN(dictMode, mls) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_HC_SEARCH_FN(dictMode, mls)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_HcFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode); \ + } \ + +#define GEN_ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + assert(MAX(4, MIN(6, ms->cParams.searchLog)) == rowLog); \ + return ZSTD_RowFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode, rowLog); \ + } \ + +#define ZSTD_FOR_EACH_ROWLOG(X, dictMode, mls) \ + X(dictMode, mls, 4) \ + X(dictMode, mls, 5) \ + X(dictMode, mls, 6) + +#define ZSTD_FOR_EACH_MLS_ROWLOG(X, dictMode) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 4) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 5) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 6) + +#define ZSTD_FOR_EACH_MLS(X, dictMode) \ + X(dictMode, 4) \ + X(dictMode, 5) \ + X(dictMode, 6) + +#define ZSTD_FOR_EACH_DICT_MODE(X, ...) \ + X(__VA_ARGS__, noDict) \ + X(__VA_ARGS__, extDict) \ + X(__VA_ARGS__, dictMatchState) \ + X(__VA_ARGS__, dedicatedDictSearch) + +/* Generate row search fns for each combination of (dictMode, mls, rowLog) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS_ROWLOG, GEN_ZSTD_ROW_SEARCH_FN) +/* Generate binary Tree search fns for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_BT_SEARCH_FN) +/* Generate hash chain search fns for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_HC_SEARCH_FN) + +typedef enum { search_hashChain=0, search_binaryTree=1, search_rowHash=2 } searchMethod_e; + +#define GEN_ZSTD_CALL_BT_SEARCH_FN(dictMode, mls) \ + case mls: \ + return ZSTD_BT_SEARCH_FN(dictMode, mls)(ms, ip, iend, offsetPtr); +#define GEN_ZSTD_CALL_HC_SEARCH_FN(dictMode, mls) \ + case mls: \ + return ZSTD_HC_SEARCH_FN(dictMode, mls)(ms, ip, iend, offsetPtr); +#define GEN_ZSTD_CALL_ROW_SEARCH_FN(dictMode, mls, rowLog) \ + case rowLog: \ + return ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog)(ms, ip, iend, offsetPtr); + +#define ZSTD_SWITCH_MLS(X, dictMode) \ + switch (mls) { \ + ZSTD_FOR_EACH_MLS(X, dictMode) \ + } + +#define ZSTD_SWITCH_ROWLOG(dictMode, mls) \ + case mls: \ + switch (rowLog) { \ + ZSTD_FOR_EACH_ROWLOG(GEN_ZSTD_CALL_ROW_SEARCH_FN, dictMode, mls) \ + } \ + ZSTD_UNREACHABLE; \ + break; + +#define ZSTD_SWITCH_SEARCH_METHOD(dictMode) \ + switch (searchMethod) { \ + case search_hashChain: \ + ZSTD_SWITCH_MLS(GEN_ZSTD_CALL_HC_SEARCH_FN, dictMode) \ + break; \ + case search_binaryTree: \ + ZSTD_SWITCH_MLS(GEN_ZSTD_CALL_BT_SEARCH_FN, dictMode) \ + break; \ + case search_rowHash: \ + ZSTD_SWITCH_MLS(ZSTD_SWITCH_ROWLOG, dictMode) \ + break; \ + } \ + ZSTD_UNREACHABLE; + +/** + * Searches for the longest match at @p ip. + * Dispatches to the correct implementation function based on the + * (searchMethod, dictMode, mls, rowLog). We use switch statements + * here instead of using an indirect function call through a function + * pointer because after Spectre and Meltdown mitigations, indirect + * function calls can be very costly, especially in the kernel. + * + * NOTE: dictMode and searchMethod should be templated, so those switch + * statements should be optimized out. Only the mls & rowLog switches + * should be left. + * + * @param ms The match state. + * @param ip The position to search at. + * @param iend The end of the input data. + * @param[out] offsetPtr Stores the match offset into this pointer. + * @param mls The minimum search length, in the range [4, 6]. + * @param rowLog The row log (if applicable), in the range [4, 6]. + * @param searchMethod The search method to use (templated). + * @param dictMode The dictMode (templated). + * + * @returns The length of the longest match found, or < mls if no match is found. + * If a match is found its offset is stored in @p offsetPtr. + */ +FORCE_INLINE_TEMPLATE size_t ZSTD_searchMax( + ZSTD_matchState_t* ms, + const BYTE* ip, + const BYTE* iend, + size_t* offsetPtr, + U32 const mls, + U32 const rowLog, + searchMethod_e const searchMethod, + ZSTD_dictMode_e const dictMode) +{ + if (dictMode == ZSTD_noDict) { + ZSTD_SWITCH_SEARCH_METHOD(noDict) + } else if (dictMode == ZSTD_extDict) { + ZSTD_SWITCH_SEARCH_METHOD(extDict) + } else if (dictMode == ZSTD_dictMatchState) { + ZSTD_SWITCH_SEARCH_METHOD(dictMatchState) + } else if (dictMode == ZSTD_dedicatedDictSearch) { + ZSTD_SWITCH_SEARCH_METHOD(dedicatedDictSearch) + } + ZSTD_UNREACHABLE; + return 0; +} /* ******************************* * Common parser - lazy strategy *********************************/ -typedef enum { search_hashChain=0, search_binaryTree=1, search_rowHash=2 } searchMethod_e; FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_lazy_generic( @@ -1525,47 +1505,15 @@ ZSTD_compressBlock_lazy_generic( const BYTE* ip = istart; const BYTE* anchor = istart; const BYTE* const iend = istart + srcSize; - const BYTE* const ilimit = searchMethod == search_rowHash ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; + const BYTE* const ilimit = (searchMethod == search_rowHash) ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; const BYTE* const base = ms->window.base; const U32 prefixLowestIndex = ms->window.dictLimit; const BYTE* const prefixLowest = base + prefixLowestIndex; - const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; + const U32 mls = BOUNDED(4, ms->cParams.minMatch, 6); + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); - typedef size_t (*searchMax_f)( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); - - /** - * This table is indexed first by the four ZSTD_dictMode_e values, and then - * by the two searchMethod_e values. NULLs are placed for configurations - * that should never occur (extDict modes go to the other implementation - * below and there is no DDSS for binary tree search yet). - */ - const searchMax_f searchFuncs[4][3] = { - { - ZSTD_HcFindBestMatch_selectMLS, - ZSTD_BtFindBestMatch_selectMLS, - ZSTD_RowFindBestMatch_selectRowLog - }, - { - NULL, - NULL, - NULL - }, - { - ZSTD_HcFindBestMatch_dictMatchState_selectMLS, - ZSTD_BtFindBestMatch_dictMatchState_selectMLS, - ZSTD_RowFindBestMatch_dictMatchState_selectRowLog - }, - { - ZSTD_HcFindBestMatch_dedicatedDictSearch_selectMLS, - NULL, - ZSTD_RowFindBestMatch_dedicatedDictSearch_selectRowLog - } - }; - - searchMax_f const searchMax = searchFuncs[dictMode][(int)searchMethod]; - U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0; + U32 offset_1 = rep[0], offset_2 = rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; const int isDMS = dictMode == ZSTD_dictMatchState; const int isDDS = dictMode == ZSTD_dedicatedDictSearch; @@ -1580,16 +1528,14 @@ ZSTD_compressBlock_lazy_generic( 0; const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictLowest)); - assert(searchMax != NULL); - DEBUGLOG(5, "ZSTD_compressBlock_lazy_generic (dictMode=%u) (searchFunc=%u)", (U32)dictMode, (U32)searchMethod); ip += (dictAndPrefixLength == 0); if (dictMode == ZSTD_noDict) { U32 const curr = (U32)(ip - base); U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, ms->cParams.windowLog); U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; - if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; } if (isDxS) { /* dictMatchState repCode checks don't currently handle repCode == 0 @@ -1613,8 +1559,9 @@ ZSTD_compressBlock_lazy_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offset=0; + size_t offBase = REPCODE1_TO_OFFBASE; const BYTE* start=ip+1; + DEBUGLOG(7, "search baseline (depth 0)"); /* check repCode */ if (isDxS) { @@ -1637,10 +1584,10 @@ ZSTD_compressBlock_lazy_generic( } /* first search (depth 0) */ - { size_t offsetFound = 999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); + { size_t offbaseFound = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &offbaseFound, mls, rowLog, searchMethod, dictMode); if (ml2 > matchLength) - matchLength = ml2, start = ip, offset=offsetFound; + matchLength = ml2, start = ip, offBase = offbaseFound; } if (matchLength < 4) { @@ -1651,14 +1598,15 @@ ZSTD_compressBlock_lazy_generic( /* let's try to find a better solution */ if (depth>=1) while (ip0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offBase) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1670,30 +1618,31 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } } - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4); + { size_t ofbCandidate=999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, dictMode); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; /* search a better one */ } } /* let's find an even better one */ if ((depth==2) && (ip0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offBase) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1705,46 +1654,45 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } } - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7); + { size_t ofbCandidate=999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, dictMode); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* NOTE: - * start[-offset+ZSTD_REP_MOVE-1] is undefined behavior. - * (-offset+ZSTD_REP_MOVE-1) is unsigned, and is added to start, which - * overflows the pointer, which is undefined behavior. + * Pay attention that `start[-value]` can lead to strange undefined behavior + * notably if `value` is unsigned, resulting in a large positive `-value`. */ /* catch up */ - if (offset) { + if (OFFBASE_IS_OFFSET(offBase)) { if (dictMode == ZSTD_noDict) { - while ( ((start > anchor) & (start - (offset-ZSTD_REP_MOVE) > prefixLowest)) - && (start[-1] == (start-(offset-ZSTD_REP_MOVE))[-1]) ) /* only search for offset within prefix */ + while ( ((start > anchor) & (start - OFFBASE_TO_OFFSET(offBase) > prefixLowest)) + && (start[-1] == (start-OFFBASE_TO_OFFSET(offBase))[-1]) ) /* only search for offset within prefix */ { start--; matchLength++; } } if (isDxS) { - U32 const matchIndex = (U32)((start-base) - (offset - ZSTD_REP_MOVE)); + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); const BYTE* match = (matchIndex < prefixLowestIndex) ? dictBase + matchIndex - dictIndexDelta : base + matchIndex; const BYTE* const mStart = (matchIndex < prefixLowestIndex) ? dictLowest : prefixLowest; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ } - offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE); + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); } /* store sequence */ _storeSequence: - { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offset, matchLength-MINMATCH); + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); anchor = ip = start + matchLength; } @@ -1760,8 +1708,8 @@ _storeSequence: && (MEM_read32(repMatch) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex < prefixLowestIndex ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd2, prefixLowest) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; @@ -1775,16 +1723,20 @@ _storeSequence: && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) { /* store sequence */ matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap repcodes */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ } } } - /* Save reps for next block */ - rep[0] = offset_1 ? offset_1 : savedOffset; - rep[1] = offset_2 ? offset_2 : savedOffset; + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; /* Return the last literals size */ return (size_t)(iend - anchor); @@ -1953,17 +1905,9 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const BYTE* const dictEnd = dictBase + dictLimit; const BYTE* const dictStart = dictBase + ms->window.lowLimit; const U32 windowLog = ms->cParams.windowLog; - const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; + const U32 mls = BOUNDED(4, ms->cParams.minMatch, 6); + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); - typedef size_t (*searchMax_f)( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); - const searchMax_f searchFuncs[3] = { - ZSTD_HcFindBestMatch_extDict_selectMLS, - ZSTD_BtFindBestMatch_extDict_selectMLS, - ZSTD_RowFindBestMatch_extDict_selectRowLog - }; - searchMax_f searchMax = searchFuncs[(int)searchMethod]; U32 offset_1 = rep[0], offset_2 = rep[1]; DEBUGLOG(5, "ZSTD_compressBlock_lazy_extDict_generic (searchFunc=%u)", (U32)searchMethod); @@ -1985,7 +1929,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offset=0; + size_t offBase = REPCODE1_TO_OFFBASE; const BYTE* start=ip+1; U32 curr = (U32)(ip-base); @@ -1995,7 +1939,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow */ - & (offset_1 < curr+1 - windowLow) ) /* note: we are searching at curr+1 */ + & (offset_1 <= curr+1 - windowLow) ) /* note: we are searching at curr+1 */ if (MEM_read32(ip+1) == MEM_read32(repMatch)) { /* repcode detected we should take it */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; @@ -2004,13 +1948,13 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( } } /* first search (depth 0) */ - { size_t offsetFound = 999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); if (ml2 > matchLength) - matchLength = ml2, start = ip, offset=offsetFound; + matchLength = ml2, start = ip, offBase = ofbCandidate; } - if (matchLength < 4) { + if (matchLength < 4) { ip += ((ip-anchor) >> kSearchStrength) + 1; /* jump faster over incompressible sections */ continue; } @@ -2021,30 +1965,30 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offset) { + if (offBase) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_1 < curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offset = 0, start = ip; + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; } } /* search match, depth 1 */ - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4); + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; /* search a better one */ } } @@ -2053,48 +1997,48 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offset) { + if (offBase) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_1 < curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offset = 0, start = ip; + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; } } /* search match, depth 2 */ - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7); + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* catch up */ - if (offset) { - U32 const matchIndex = (U32)((start-base) - (offset - ZSTD_REP_MOVE)); + if (OFFBASE_IS_OFFSET(offBase)) { + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); const BYTE* match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex; const BYTE* const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ - offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE); + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); } /* store sequence */ _storeSequence: - { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offset, matchLength-MINMATCH); + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); anchor = ip = start + matchLength; } @@ -2106,13 +2050,13 @@ _storeSequence: const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_2 < repCurrent - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_2 <= repCurrent - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected we should take it */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset history */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset history */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -2178,7 +2122,6 @@ size_t ZSTD_compressBlock_lazy_extDict_row( size_t ZSTD_compressBlock_lazy2_extDict_row( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize) - { return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 2); } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.h similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.h index 150f7b3..3bde673 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_lazy.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_lazy.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,6 +25,8 @@ extern "C" { */ #define ZSTD_LAZY_DDSS_BUCKET_LOG 2 +#define ZSTD_ROW_HASH_TAG_BITS 8 /* nb bits to use for the tag */ + U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip); void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip); @@ -116,7 +118,7 @@ size_t ZSTD_compressBlock_lazy2_extDict_row( size_t ZSTD_compressBlock_btlazy2_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); - + #if defined (__cplusplus) } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.c index fa4ebea..3d74ff1 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -159,12 +159,12 @@ size_t ZSTD_ldm_getTableSize(ldmParams_t params) size_t const ldmBucketSize = ((size_t)1) << (params.hashLog - ldmBucketSizeLog); size_t const totalSize = ZSTD_cwksp_alloc_size(ldmBucketSize) + ZSTD_cwksp_alloc_size(ldmHSize * sizeof(ldmEntry_t)); - return params.enableLdm ? totalSize : 0; + return params.enableLdm == ZSTD_ps_enable ? totalSize : 0; } size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize) { - return params.enableLdm ? (maxChunkSize / params.minMatchLength) : 0; + return params.enableLdm == ZSTD_ps_enable ? (maxChunkSize / params.minMatchLength) : 0; } /** ZSTD_ldm_getBucket() : @@ -242,11 +242,11 @@ static size_t ZSTD_ldm_fillFastTables(ZSTD_matchState_t* ms, switch(ms->cParams.strategy) { case ZSTD_fast: - ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast); + ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); break; case ZSTD_dfast: - ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast); + ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); break; case ZSTD_greedy: @@ -478,7 +478,7 @@ static size_t ZSTD_ldm_generateSequences_internal( */ if (anchor > ip + hashed) { ZSTD_ldm_gear_reset(&hashState, anchor - minMatchLength, minMatchLength); - /* Continue the outter loop at anchor (ip + hashed == anchor). */ + /* Continue the outer loop at anchor (ip + hashed == anchor). */ ip = anchor - hashed; break; } @@ -549,7 +549,7 @@ size_t ZSTD_ldm_generateSequences( * the window through early invalidation. * TODO: * Test the chunk size. * * Try invalidation after the sequence generation and test the - * the offset against maxDist directly. + * offset against maxDist directly. * * NOTE: Because of dictionaries + sequence splitting we MUST make sure * that any offset used is valid at the END of the sequence, since it may @@ -579,7 +579,9 @@ size_t ZSTD_ldm_generateSequences( return 0; } -void ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) { +void +ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) +{ while (srcSize > 0 && rawSeqStore->pos < rawSeqStore->size) { rawSeq* seq = rawSeqStore->seq + rawSeqStore->pos; if (srcSize <= seq->litLength) { @@ -657,7 +659,7 @@ void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) { size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, void const* src, size_t srcSize) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -709,8 +711,8 @@ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, rep[0] = sequence.offset; /* Store the sequence */ ZSTD_storeSeq(seqStore, newLitLength, ip - newLitLength, iend, - sequence.offset + ZSTD_REP_MOVE, - sequence.matchLength - MINMATCH); + OFFSET_TO_OFFBASE(sequence.offset), + sequence.matchLength); ip += sequence.matchLength; } } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.h similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.h index 393466f..f147021 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -66,7 +66,7 @@ size_t ZSTD_ldm_generateSequences( */ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, void const* src, size_t srcSize); /** diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm_geartab.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm_geartab.h similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm_geartab.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm_geartab.h index e5c24d8..ef34bc5 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_ldm_geartab.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_ldm_geartab.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -11,7 +11,10 @@ #ifndef ZSTD_LDM_GEARTAB_H #define ZSTD_LDM_GEARTAB_H -static U64 ZSTD_ldm_gearTab[256] = { +#include "../common/compiler.h" /* UNUSED_ATTR */ +#include "../common/mem.h" /* U64 */ + +static UNUSED_ATTR const U64 ZSTD_ldm_gearTab[256] = { 0xf5b8f72c5f77775c, 0x84935f266b7ac412, 0xb647ada9ca730ccc, 0xb065bb4b114fb1de, 0x34584e7e8c3a9fd0, 0x4e97e17c6ae26b05, 0x3a03d743bc99a604, 0xcecd042422c4044f, 0x76de76c58524259e, diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.c b/src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.c similarity index 75% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.c index 402a7e5..fdd7f9d 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -14,40 +14,47 @@ #define ZSTD_LITFREQ_ADD 2 /* scaling factor for litFreq, so that frequencies adapt faster to new stats */ -#define ZSTD_FREQ_DIV 4 /* log factor when using previous stats to init next stats */ #define ZSTD_MAX_PRICE (1<<30) -#define ZSTD_PREDEF_THRESHOLD 1024 /* if srcSize < ZSTD_PREDEF_THRESHOLD, symbols' cost is assumed static, directly determined by pre-defined distributions */ +#define ZSTD_PREDEF_THRESHOLD 8 /* if srcSize < ZSTD_PREDEF_THRESHOLD, symbols' cost is assumed static, directly determined by pre-defined distributions */ /*-************************************* * Price functions for optimal parser ***************************************/ -#if 0 /* approximation at bit level */ +#if 0 /* approximation at bit level (for tests) */ # define BITCOST_ACCURACY 0 # define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) -# define WEIGHT(stat) ((void)opt, ZSTD_bitWeight(stat)) -#elif 0 /* fractional bit accuracy */ +# define WEIGHT(stat, opt) ((void)(opt), ZSTD_bitWeight(stat)) +#elif 0 /* fractional bit accuracy (for tests) */ # define BITCOST_ACCURACY 8 # define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) -# define WEIGHT(stat,opt) ((void)opt, ZSTD_fracWeight(stat)) +# define WEIGHT(stat,opt) ((void)(opt), ZSTD_fracWeight(stat)) #else /* opt==approx, ultra==accurate */ # define BITCOST_ACCURACY 8 # define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) -# define WEIGHT(stat,opt) (opt ? ZSTD_fracWeight(stat) : ZSTD_bitWeight(stat)) +# define WEIGHT(stat,opt) ((opt) ? ZSTD_fracWeight(stat) : ZSTD_bitWeight(stat)) #endif +/* ZSTD_bitWeight() : + * provide estimated "cost" of a stat in full bits only */ MEM_STATIC U32 ZSTD_bitWeight(U32 stat) { return (ZSTD_highbit32(stat+1) * BITCOST_MULTIPLIER); } +/* ZSTD_fracWeight() : + * provide fractional-bit "cost" of a stat, + * using linear interpolation approximation */ MEM_STATIC U32 ZSTD_fracWeight(U32 rawStat) { U32 const stat = rawStat + 1; U32 const hb = ZSTD_highbit32(stat); U32 const BWeight = hb * BITCOST_MULTIPLIER; + /* Fweight was meant for "Fractional weight" + * but it's effectively a value between 1 and 2 + * using fixed point arithmetic */ U32 const FWeight = (stat << BITCOST_ACCURACY) >> hb; U32 const weight = BWeight + FWeight; assert(hb + BITCOST_ACCURACY < 31); @@ -58,7 +65,7 @@ MEM_STATIC U32 ZSTD_fracWeight(U32 rawStat) /* debugging function, * @return price in bytes as fractional value * for debug messages only */ -MEM_STATIC double ZSTD_fCost(U32 price) +MEM_STATIC double ZSTD_fCost(int price) { return (double)price / (BITCOST_MULTIPLIER*8); } @@ -66,7 +73,7 @@ MEM_STATIC double ZSTD_fCost(U32 price) static int ZSTD_compressedLiterals(optState_t const* const optPtr) { - return optPtr->literalCompressionMode != ZSTD_lcm_uncompressed; + return optPtr->literalCompressionMode != ZSTD_ps_disable; } static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel) @@ -79,25 +86,52 @@ static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel) } -/* ZSTD_downscaleStat() : - * reduce all elements in table by a factor 2^(ZSTD_FREQ_DIV+malus) - * return the resulting sum of elements */ -static U32 ZSTD_downscaleStat(unsigned* table, U32 lastEltIndex, int malus) +static U32 sum_u32(const unsigned table[], size_t nbElts) +{ + size_t n; + U32 total = 0; + for (n=0; n 0 && ZSTD_FREQ_DIV+malus < 31); + DEBUGLOG(5, "ZSTD_downscaleStats (nbElts=%u, shift=%u)", + (unsigned)lastEltIndex+1, (unsigned)shift ); + assert(shift < 30); for (s=0; s> (ZSTD_FREQ_DIV+malus)); - sum += table[s]; + unsigned const base = base1 ? 1 : (table[s]>0); + unsigned const newStat = base + (table[s] >> shift); + sum += newStat; + table[s] = newStat; } return sum; } +/* ZSTD_scaleStats() : + * reduce all elt frequencies in table if sum too large + * return the resulting sum of elements */ +static U32 ZSTD_scaleStats(unsigned* table, U32 lastEltIndex, U32 logTarget) +{ + U32 const prevsum = sum_u32(table, lastEltIndex+1); + U32 const factor = prevsum >> logTarget; + DEBUGLOG(5, "ZSTD_scaleStats (nbElts=%u, target=%u)", (unsigned)lastEltIndex+1, (unsigned)logTarget); + assert(logTarget < 30); + if (factor <= 1) return prevsum; + return ZSTD_downscaleStats(table, lastEltIndex, ZSTD_highbit32(factor), base_1guaranteed); +} + /* ZSTD_rescaleFreqs() : * if first block (detected by optPtr->litLengthSum == 0) : init statistics * take hints from dictionary if there is one - * or init from zero, using src for literals stats, or flat 1 for match symbols + * and init from zero if there is none, + * using src for literals stats, and baseline stats for sequence symbols * otherwise downscale existing stats, to be used as seed for next block. */ static void @@ -109,24 +143,28 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, DEBUGLOG(5, "ZSTD_rescaleFreqs (srcSize=%u)", (unsigned)srcSize); optPtr->priceType = zop_dynamic; - if (optPtr->litLengthSum == 0) { /* first block : init */ - if (srcSize <= ZSTD_PREDEF_THRESHOLD) { /* heuristic */ - DEBUGLOG(5, "(srcSize <= ZSTD_PREDEF_THRESHOLD) => zop_predef"); + if (optPtr->litLengthSum == 0) { /* no literals stats collected -> first block assumed -> init */ + + /* heuristic: use pre-defined stats for too small inputs */ + if (srcSize <= ZSTD_PREDEF_THRESHOLD) { + DEBUGLOG(5, "srcSize <= %i : use predefined stats", ZSTD_PREDEF_THRESHOLD); optPtr->priceType = zop_predef; } assert(optPtr->symbolCosts != NULL); if (optPtr->symbolCosts->huf.repeatMode == HUF_repeat_valid) { - /* huffman table presumed generated by dictionary */ + + /* huffman stats covering the full value set : table presumed generated by dictionary */ optPtr->priceType = zop_dynamic; if (compressedLiterals) { + /* generate literals statistics from huffman table */ unsigned lit; assert(optPtr->litFreq != NULL); optPtr->litSum = 0; for (lit=0; lit<=MaxLit; lit++) { U32 const scaleLog = 11; /* scale to 2K */ - U32 const bitCost = HUF_getNbBits(optPtr->symbolCosts->huf.CTable, lit); + U32 const bitCost = HUF_getNbBitsFromCTable(optPtr->symbolCosts->huf.CTable, lit); assert(bitCost <= scaleLog); optPtr->litFreq[lit] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; optPtr->litSum += optPtr->litFreq[lit]; @@ -168,20 +206,26 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, optPtr->offCodeSum += optPtr->offCodeFreq[of]; } } - } else { /* not a dictionary */ + } else { /* first block, no dictionary */ assert(optPtr->litFreq != NULL); if (compressedLiterals) { + /* base initial cost of literals on direct frequency within src */ unsigned lit = MaxLit; HIST_count_simple(optPtr->litFreq, &lit, src, srcSize); /* use raw first block to init statistics */ - optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1); + optPtr->litSum = ZSTD_downscaleStats(optPtr->litFreq, MaxLit, 8, base_0possible); } - { unsigned ll; - for (ll=0; ll<=MaxLL; ll++) - optPtr->litLengthFreq[ll] = 1; + { unsigned const baseLLfreqs[MaxLL+1] = { + 4, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->litLengthFreq, baseLLfreqs, sizeof(baseLLfreqs)); + optPtr->litLengthSum = sum_u32(baseLLfreqs, MaxLL+1); } - optPtr->litLengthSum = MaxLL+1; { unsigned ml; for (ml=0; ml<=MaxML; ml++) @@ -189,21 +233,25 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, } optPtr->matchLengthSum = MaxML+1; - { unsigned of; - for (of=0; of<=MaxOff; of++) - optPtr->offCodeFreq[of] = 1; + { unsigned const baseOFCfreqs[MaxOff+1] = { + 6, 2, 1, 1, 2, 3, 4, 4, + 4, 3, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->offCodeFreq, baseOFCfreqs, sizeof(baseOFCfreqs)); + optPtr->offCodeSum = sum_u32(baseOFCfreqs, MaxOff+1); } - optPtr->offCodeSum = MaxOff+1; } - } else { /* new block : re-use previous statistics, scaled down */ + } else { /* new block : scale down accumulated statistics */ if (compressedLiterals) - optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1); - optPtr->litLengthSum = ZSTD_downscaleStat(optPtr->litLengthFreq, MaxLL, 0); - optPtr->matchLengthSum = ZSTD_downscaleStat(optPtr->matchLengthFreq, MaxML, 0); - optPtr->offCodeSum = ZSTD_downscaleStat(optPtr->offCodeFreq, MaxOff, 0); + optPtr->litSum = ZSTD_scaleStats(optPtr->litFreq, MaxLit, 12); + optPtr->litLengthSum = ZSTD_scaleStats(optPtr->litLengthFreq, MaxLL, 11); + optPtr->matchLengthSum = ZSTD_scaleStats(optPtr->matchLengthFreq, MaxML, 11); + optPtr->offCodeSum = ZSTD_scaleStats(optPtr->offCodeFreq, MaxOff, 11); } ZSTD_setBasePrices(optPtr, optLevel); @@ -225,11 +273,14 @@ static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, return (litLength*6) * BITCOST_MULTIPLIER; /* 6 bit per literal - no statistic used */ /* dynamic statistics */ - { U32 price = litLength * optPtr->litSumBasePrice; + { U32 price = optPtr->litSumBasePrice * litLength; + U32 const litPriceMax = optPtr->litSumBasePrice - BITCOST_MULTIPLIER; U32 u; + assert(optPtr->litSumBasePrice >= BITCOST_MULTIPLIER); for (u=0; u < litLength; u++) { - assert(WEIGHT(optPtr->litFreq[literals[u]], optLevel) <= optPtr->litSumBasePrice); /* literal cost should never be negative */ - price -= WEIGHT(optPtr->litFreq[literals[u]], optLevel); + U32 litPrice = WEIGHT(optPtr->litFreq[literals[u]], optLevel); + if (UNLIKELY(litPrice > litPriceMax)) litPrice = litPriceMax; + price -= litPrice; } return price; } @@ -239,7 +290,17 @@ static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, * cost of literalLength symbol */ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optPtr, int optLevel) { - if (optPtr->priceType == zop_predef) return WEIGHT(litLength, optLevel); + assert(litLength <= ZSTD_BLOCKSIZE_MAX); + if (optPtr->priceType == zop_predef) + return WEIGHT(litLength, optLevel); + + /* ZSTD_LLcode() can't compute litLength price for sizes >= ZSTD_BLOCKSIZE_MAX + * because it isn't representable in the zstd format. + * So instead just pretend it would cost 1 bit more than ZSTD_BLOCKSIZE_MAX - 1. + * In such a case, the block would be all literals. + */ + if (litLength == ZSTD_BLOCKSIZE_MAX) + return BITCOST_MULTIPLIER + ZSTD_litLengthPrice(ZSTD_BLOCKSIZE_MAX - 1, optPtr, optLevel); /* dynamic statistics */ { U32 const llCode = ZSTD_LLcode(litLength); @@ -250,22 +311,25 @@ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optP } /* ZSTD_getMatchPrice() : - * Provides the cost of the match part (offset + matchLength) of a sequence + * Provides the cost of the match part (offset + matchLength) of a sequence. * Must be combined with ZSTD_fullLiteralsCost() to get the full cost of a sequence. - * optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) */ + * @offBase : sumtype, representing an offset or a repcode, and using numeric representation of ZSTD_storeSeq() + * @optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) + */ FORCE_INLINE_TEMPLATE U32 -ZSTD_getMatchPrice(U32 const offset, +ZSTD_getMatchPrice(U32 const offBase, U32 const matchLength, const optState_t* const optPtr, int const optLevel) { U32 price; - U32 const offCode = ZSTD_highbit32(offset+1); + U32 const offCode = ZSTD_highbit32(offBase); U32 const mlBase = matchLength - MINMATCH; assert(matchLength >= MINMATCH); - if (optPtr->priceType == zop_predef) /* fixed scheme, do not use statistics */ - return WEIGHT(mlBase, optLevel) + ((16 + offCode) * BITCOST_MULTIPLIER); + if (optPtr->priceType == zop_predef) /* fixed scheme, does not use statistics */ + return WEIGHT(mlBase, optLevel) + + ((16 + offCode) * BITCOST_MULTIPLIER); /* emulated offset cost */ /* dynamic statistics */ price = (offCode * BITCOST_MULTIPLIER) + (optPtr->offCodeSumBasePrice - WEIGHT(optPtr->offCodeFreq[offCode], optLevel)); @@ -284,10 +348,10 @@ ZSTD_getMatchPrice(U32 const offset, } /* ZSTD_updateStats() : - * assumption : literals + litLengtn <= iend */ + * assumption : literals + litLength <= iend */ static void ZSTD_updateStats(optState_t* const optPtr, U32 litLength, const BYTE* literals, - U32 offsetCode, U32 matchLength) + U32 offBase, U32 matchLength) { /* literals */ if (ZSTD_compressedLiterals(optPtr)) { @@ -303,8 +367,8 @@ static void ZSTD_updateStats(optState_t* const optPtr, optPtr->litLengthSum++; } - /* match offset code (0-2=>repCode; 3+=>offset+2) */ - { U32 const offCode = ZSTD_highbit32(offsetCode+1); + /* offset code : follows storeSeq() numeric representation */ + { U32 const offCode = ZSTD_highbit32(offBase); assert(offCode <= MaxOff); optPtr->offCodeFreq[offCode]++; optPtr->offCodeSum++; @@ -338,7 +402,7 @@ MEM_STATIC U32 ZSTD_readMINMATCH(const void* memPtr, U32 length) /* Update hashTable3 up to ip (excluded) Assumption : always within prefix (i.e. not within extDict) */ -static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, +static U32 ZSTD_insertAndFindFirstIndexHash3 (const ZSTD_matchState_t* ms, U32* nextToUpdate3, const BYTE* const ip) { @@ -364,11 +428,13 @@ static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, * Binary Tree search ***************************************/ /** ZSTD_insertBt1() : add one or multiple positions to tree. - * ip : assumed <= iend-8 . + * @param ip assumed <= iend-8 . + * @param target The target of ZSTD_updateTree_internal() - we are filling to this position * @return : nb of positions added */ static U32 ZSTD_insertBt1( - ZSTD_matchState_t* ms, + const ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, + U32 const target, U32 const mls, const int extDict) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -391,7 +457,10 @@ static U32 ZSTD_insertBt1( U32* smallerPtr = bt + 2*(curr&btMask); U32* largerPtr = smallerPtr + 1; U32 dummy32; /* to be nullified at the end */ - U32 const windowLow = ms->window.lowLimit; + /* windowLow is based on target because + * we only need positions that will be in the window at the end of the tree update. + */ + U32 const windowLow = ZSTD_getLowestMatchIndex(ms, target, cParams->windowLog); U32 matchEndIdx = curr+8+1; size_t bestLength = 8; U32 nbCompares = 1U << cParams->searchLog; @@ -404,11 +473,12 @@ static U32 ZSTD_insertBt1( DEBUGLOG(8, "ZSTD_insertBt1 (%u)", curr); + assert(curr <= target); assert(ip <= iend-8); /* required for h calculation */ hashTable[h] = curr; /* Update Hash Table */ assert(windowLow > 0); - while (nbCompares-- && (matchIndex >= windowLow)) { + for (; nbCompares && (matchIndex >= windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ assert(matchIndex < curr); @@ -492,7 +562,7 @@ void ZSTD_updateTree_internal( idx, target, dictMode); while(idx < target) { - U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, mls, dictMode == ZSTD_extDict); + U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, target, mls, dictMode == ZSTD_extDict); assert(idx < (U32)(idx + forward)); idx += forward; } @@ -505,16 +575,17 @@ void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend) { ZSTD_updateTree_internal(ms, ip, iend, ms->cParams.minMatch, ZSTD_noDict); } -FORCE_INLINE_TEMPLATE -U32 ZSTD_insertBtAndGetAllMatches ( - ZSTD_match_t* matches, /* store result (found matches) in this table (presumed large enough) */ - ZSTD_matchState_t* ms, - U32* nextToUpdate3, - const BYTE* const ip, const BYTE* const iLimit, const ZSTD_dictMode_e dictMode, - const U32 rep[ZSTD_REP_NUM], - U32 const ll0, /* tells if associated literal length is 0 or not. This value must be 0 or 1 */ - const U32 lengthToBeat, - U32 const mls /* template */) +FORCE_INLINE_TEMPLATE U32 +ZSTD_insertBtAndGetAllMatches ( + ZSTD_match_t* matches, /* store result (found matches) in this table (presumed large enough) */ + ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* const ip, const BYTE* const iLimit, + const ZSTD_dictMode_e dictMode, + const U32 rep[ZSTD_REP_NUM], + const U32 ll0, /* tells if associated literal length is 0 or not. This value must be 0 or 1 */ + const U32 lengthToBeat, + const U32 mls /* template */) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); @@ -597,7 +668,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( DEBUGLOG(8, "found repCode %u (ll0:%u, offset:%u) of length %u", repCode, ll0, repOffset, repLen); bestLength = repLen; - matches[mnum].off = repCode - ll0; + matches[mnum].off = REPCODE_TO_OFFBASE(repCode - ll0 + 1); /* expect value between 1 and 3 */ matches[mnum].len = (U32)repLen; mnum++; if ( (repLen > sufficient_len) @@ -626,7 +697,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( bestLength = mlen; assert(curr > matchIndex3); assert(mnum==0); /* no prior solution */ - matches[0].off = (curr - matchIndex3) + ZSTD_REP_MOVE; + matches[0].off = OFFSET_TO_OFFBASE(curr - matchIndex3); matches[0].len = (U32)mlen; mnum = 1; if ( (mlen > sufficient_len) | @@ -635,11 +706,11 @@ U32 ZSTD_insertBtAndGetAllMatches ( return 1; } } } /* no dictMatchState lookup: dicts don't have a populated HC3 table */ - } + } /* if (mls == 3) */ hashTable[h] = curr; /* Update Hash Table */ - while (nbCompares-- && (matchIndex >= matchLow)) { + for (; nbCompares && (matchIndex >= matchLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); const BYTE* match; size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ @@ -659,21 +730,20 @@ U32 ZSTD_insertBtAndGetAllMatches ( } if (matchLength > bestLength) { - DEBUGLOG(8, "found match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, curr - matchIndex + ZSTD_REP_MOVE); + DEBUGLOG(8, "found match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); assert(matchEndIdx > matchIndex); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = (curr - matchIndex) + ZSTD_REP_MOVE; + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { if (dictMode == ZSTD_dictMatchState) nbCompares = 0; /* break should also skip searching dms */ break; /* drop, to preserve bt consistency (miss a little bit of compression) */ - } - } + } } if (match[matchLength] < ip[matchLength]) { /* match smaller than current */ @@ -692,12 +762,13 @@ U32 ZSTD_insertBtAndGetAllMatches ( *smallerPtr = *largerPtr = 0; + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dictMatchState && nbCompares) { size_t const dmsH = ZSTD_hashPtr(ip, dmsHashLog, mls); U32 dictMatchIndex = dms->hashTable[dmsH]; const U32* const dmsBt = dms->chainTable; commonLengthSmaller = commonLengthLarger = 0; - while (nbCompares-- && (dictMatchIndex > dmsLowLimit)) { + for (; nbCompares && (dictMatchIndex > dmsLowLimit); --nbCompares) { const U32* const nextPtr = dmsBt + 2*(dictMatchIndex & dmsBtMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match = dmsBase + dictMatchIndex; @@ -707,19 +778,18 @@ U32 ZSTD_insertBtAndGetAllMatches ( if (matchLength > bestLength) { matchIndex = dictMatchIndex + dmsIndexDelta; - DEBUGLOG(8, "found dms match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, curr - matchIndex + ZSTD_REP_MOVE); + DEBUGLOG(8, "found dms match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = (curr - matchIndex) + ZSTD_REP_MOVE; + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { break; /* drop, to guarantee consistency (miss a little bit of compression) */ - } - } + } } if (dictMatchIndex <= dmsBtLow) { break; } /* beyond tree size, stop the search */ if (match[matchLength] < ip[matchLength]) { @@ -729,39 +799,91 @@ U32 ZSTD_insertBtAndGetAllMatches ( /* match is larger than current */ commonLengthLarger = matchLength; dictMatchIndex = nextPtr[0]; - } - } - } + } } } /* if (dictMode == ZSTD_dictMatchState) */ assert(matchEndIdx > curr+8); ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ return mnum; } +typedef U32 (*ZSTD_getAllMatchesFn)( + ZSTD_match_t*, + ZSTD_matchState_t*, + U32*, + const BYTE*, + const BYTE*, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat); -FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( - ZSTD_match_t* matches, /* store result (match found, increasing size) in this table */ - ZSTD_matchState_t* ms, - U32* nextToUpdate3, - const BYTE* ip, const BYTE* const iHighLimit, const ZSTD_dictMode_e dictMode, - const U32 rep[ZSTD_REP_NUM], - U32 const ll0, - U32 const lengthToBeat) +FORCE_INLINE_TEMPLATE U32 ZSTD_btGetAllMatches_internal( + ZSTD_match_t* matches, + ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* ip, + const BYTE* const iHighLimit, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat, + const ZSTD_dictMode_e dictMode, + const U32 mls) { - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32 const matchLengthSearch = cParams->minMatch; - DEBUGLOG(8, "ZSTD_BtGetAllMatches"); - if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */ - ZSTD_updateTree_internal(ms, ip, iHighLimit, matchLengthSearch, dictMode); - switch(matchLengthSearch) - { - case 3 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 3); - default : - case 4 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 4); - case 5 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 5); - case 7 : - case 6 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 6); + assert(BOUNDED(3, ms->cParams.minMatch, 6) == mls); + DEBUGLOG(8, "ZSTD_BtGetAllMatches(dictMode=%d, mls=%u)", (int)dictMode, mls); + if (ip < ms->window.base + ms->nextToUpdate) + return 0; /* skipped area */ + ZSTD_updateTree_internal(ms, ip, iHighLimit, mls, dictMode); + return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, mls); +} + +#define ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls) ZSTD_btGetAllMatches_##dictMode##_##mls + +#define GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, mls) \ + static U32 ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls)( \ + ZSTD_match_t* matches, \ + ZSTD_matchState_t* ms, \ + U32* nextToUpdate3, \ + const BYTE* ip, \ + const BYTE* const iHighLimit, \ + const U32 rep[ZSTD_REP_NUM], \ + U32 const ll0, \ + U32 const lengthToBeat) \ + { \ + return ZSTD_btGetAllMatches_internal( \ + matches, ms, nextToUpdate3, ip, iHighLimit, \ + rep, ll0, lengthToBeat, ZSTD_##dictMode, mls); \ } + +#define GEN_ZSTD_BT_GET_ALL_MATCHES(dictMode) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 3) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 4) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 5) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 6) + +GEN_ZSTD_BT_GET_ALL_MATCHES(noDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(extDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(dictMatchState) + +#define ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMode) \ + { \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 3), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 4), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 5), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 6) \ + } + +static ZSTD_getAllMatchesFn +ZSTD_selectBtGetAllMatches(ZSTD_matchState_t const* ms, ZSTD_dictMode_e const dictMode) +{ + ZSTD_getAllMatchesFn const getAllMatchesFns[3][4] = { + ZSTD_BT_GET_ALL_MATCHES_ARRAY(noDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(extDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMatchState) + }; + U32 const mls = BOUNDED(3, ms->cParams.minMatch, 6); + assert((U32)dictMode < 3); + assert(mls - 3 < 4); + return getAllMatchesFns[(int)dictMode][mls - 3]; } /************************* @@ -770,16 +892,18 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( /* Struct containing info needed to make decision about ldm inclusion */ typedef struct { - rawSeqStore_t seqStore; /* External match candidates store for this block */ - U32 startPosInBlock; /* Start position of the current match candidate */ - U32 endPosInBlock; /* End position of the current match candidate */ - U32 offset; /* Offset of the match candidate */ + rawSeqStore_t seqStore; /* External match candidates store for this block */ + U32 startPosInBlock; /* Start position of the current match candidate */ + U32 endPosInBlock; /* End position of the current match candidate */ + U32 offset; /* Offset of the match candidate */ } ZSTD_optLdm_t; /* ZSTD_optLdm_skipRawSeqStoreBytes(): - * Moves forward in rawSeqStore by nbBytes, which will update the fields 'pos' and 'posInSequence'. + * Moves forward in @rawSeqStore by @nbBytes, + * which will update the fields 'pos' and 'posInSequence'. */ -static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) { +static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) +{ U32 currPos = (U32)(rawSeqStore->posInSequence + nbBytes); while (currPos && rawSeqStore->pos < rawSeqStore->size) { rawSeq currSeq = rawSeqStore->seq[rawSeqStore->pos]; @@ -800,8 +924,10 @@ static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t * Calculates the beginning and end of the next match in the current block. * Updates 'pos' and 'posInSequence' of the ldmSeqStore. */ -static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 currPosInBlock, - U32 blockBytesRemaining) { +static void +ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 currPosInBlock, + U32 blockBytesRemaining) +{ rawSeq currSeq; U32 currBlockEndPos; U32 literalsBytesRemaining; @@ -813,8 +939,8 @@ static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 cu optLdm->endPosInBlock = UINT_MAX; return; } - /* Calculate appropriate bytes left in matchLength and litLength after adjusting - based on ldmSeqStore->posInSequence */ + /* Calculate appropriate bytes left in matchLength and litLength + * after adjusting based on ldmSeqStore->posInSequence */ currSeq = optLdm->seqStore.seq[optLdm->seqStore.pos]; assert(optLdm->seqStore.posInSequence <= currSeq.litLength + currSeq.matchLength); currBlockEndPos = currPosInBlock + blockBytesRemaining; @@ -850,15 +976,16 @@ static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 cu } /* ZSTD_optLdm_maybeAddMatch(): - * Adds a match if it's long enough, based on it's 'matchStartPosInBlock' - * and 'matchEndPosInBlock', into 'matches'. Maintains the correct ordering of 'matches' + * Adds a match if it's long enough, + * based on it's 'matchStartPosInBlock' and 'matchEndPosInBlock', + * into 'matches'. Maintains the correct ordering of 'matches'. */ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, - ZSTD_optLdm_t* optLdm, U32 currPosInBlock) { - U32 posDiff = currPosInBlock - optLdm->startPosInBlock; - /* Note: ZSTD_match_t actually contains offCode and matchLength (before subtracting MINMATCH) */ - U32 candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; - U32 candidateOffCode = optLdm->offset + ZSTD_REP_MOVE; + const ZSTD_optLdm_t* optLdm, U32 currPosInBlock) +{ + U32 const posDiff = currPosInBlock - optLdm->startPosInBlock; + /* Note: ZSTD_match_t actually contains offBase and matchLength (before subtracting MINMATCH) */ + U32 const candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; /* Ensure that current block position is not outside of the match */ if (currPosInBlock < optLdm->startPosInBlock @@ -868,10 +995,11 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, } if (*nbMatches == 0 || ((candidateMatchLength > matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM)) { - DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offCode: %u matchLength %u) at block position=%u", - candidateOffCode, candidateMatchLength, currPosInBlock); + U32 const candidateOffBase = OFFSET_TO_OFFBASE(optLdm->offset); + DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offBase: %u matchLength %u) at block position=%u", + candidateOffBase, candidateMatchLength, currPosInBlock); matches[*nbMatches].len = candidateMatchLength; - matches[*nbMatches].off = candidateOffCode; + matches[*nbMatches].off = candidateOffBase; (*nbMatches)++; } } @@ -879,8 +1007,11 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, /* ZSTD_optLdm_processMatchCandidate(): * Wrapper function to update ldm seq store and call ldm functions as necessary. */ -static void ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, ZSTD_match_t* matches, U32* nbMatches, - U32 currPosInBlock, U32 remainingBytes) { +static void +ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, + ZSTD_match_t* matches, U32* nbMatches, + U32 currPosInBlock, U32 remainingBytes) +{ if (optLdm->seqStore.size == 0 || optLdm->seqStore.pos >= optLdm->seqStore.size) { return; } @@ -891,19 +1022,19 @@ static void ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, ZSTD_match_ * at the end of a match from the ldm seq store, and will often be some bytes * over beyond matchEndPosInBlock. As such, we need to correct for these "overshoots" */ - U32 posOvershoot = currPosInBlock - optLdm->endPosInBlock; + U32 const posOvershoot = currPosInBlock - optLdm->endPosInBlock; ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, posOvershoot); - } + } ZSTD_opt_getNextMatchAndUpdateSeqStore(optLdm, currPosInBlock, remainingBytes); } ZSTD_optLdm_maybeAddMatch(matches, nbMatches, optLdm, currPosInBlock); } + /*-******************************* * Optimal parser *********************************/ - static U32 ZSTD_totalLen(ZSTD_optimal_t sol) { return sol.litlen + sol.mlen; @@ -944,6 +1075,8 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, const BYTE* const prefixStart = base + ms->window.dictLimit; const ZSTD_compressionParameters* const cParams = &ms->cParams; + ZSTD_getAllMatchesFn getAllMatches = ZSTD_selectBtGetAllMatches(ms, dictMode); + U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); U32 const minMatch = (cParams->minMatch == 3) ? 3 : 4; U32 nextToUpdate3 = ms->nextToUpdate; @@ -971,7 +1104,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* find first match */ { U32 const litlen = (U32)(ip - anchor); U32 const ll0 = !litlen; - U32 nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, ip, iend, dictMode, rep, ll0, minMatch); + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, ip, iend, rep, ll0, minMatch); ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, (U32)(ip-istart), (U32)(iend - ip)); if (!nbMatches) { ip++; continue; } @@ -985,18 +1118,18 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, * in every price. We include the literal length to avoid negative * prices when we subtract the previous literal length. */ - opt[0].price = ZSTD_litLengthPrice(litlen, optStatePtr, optLevel); + opt[0].price = (int)ZSTD_litLengthPrice(litlen, optStatePtr, optLevel); /* large match -> immediate encoding */ { U32 const maxML = matches[nbMatches-1].len; - U32 const maxOffset = matches[nbMatches-1].off; - DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffCode=%u at cPos=%u => start new series", - nbMatches, maxML, maxOffset, (U32)(ip-prefixStart)); + U32 const maxOffBase = matches[nbMatches-1].off; + DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffBase=%u at cPos=%u => start new series", + nbMatches, maxML, maxOffBase, (U32)(ip-prefixStart)); if (maxML > sufficient_len) { lastSequence.litlen = litlen; lastSequence.mlen = maxML; - lastSequence.off = maxOffset; + lastSequence.off = maxOffBase; DEBUGLOG(6, "large match (%u>%u), immediate encoding", maxML, sufficient_len); cur = 0; @@ -1005,24 +1138,25 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, } } /* set prices for first matches starting position == 0 */ - { U32 const literalsPrice = opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel); + assert(opt[0].price >= 0); + { U32 const literalsPrice = (U32)opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel); U32 pos; U32 matchNb; for (pos = 1; pos < minMatch; pos++) { opt[pos].price = ZSTD_MAX_PRICE; /* mlen, litlen and price will be fixed during forward scanning */ } for (matchNb = 0; matchNb < nbMatches; matchNb++) { - U32 const offset = matches[matchNb].off; + U32 const offBase = matches[matchNb].off; U32 const end = matches[matchNb].len; for ( ; pos <= end ; pos++ ) { - U32 const matchPrice = ZSTD_getMatchPrice(offset, pos, optStatePtr, optLevel); + U32 const matchPrice = ZSTD_getMatchPrice(offBase, pos, optStatePtr, optLevel); U32 const sequencePrice = literalsPrice + matchPrice; DEBUGLOG(7, "rPos:%u => set initial price : %.2f", - pos, ZSTD_fCost(sequencePrice)); + pos, ZSTD_fCost((int)sequencePrice)); opt[pos].mlen = pos; - opt[pos].off = offset; + opt[pos].off = offBase; opt[pos].litlen = litlen; - opt[pos].price = sequencePrice; + opt[pos].price = (int)sequencePrice; } } last_pos = pos-1; } @@ -1037,9 +1171,9 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* Fix current position with one literal if cheaper */ { U32 const litlen = (opt[cur-1].mlen == 0) ? opt[cur-1].litlen + 1 : 1; int const price = opt[cur-1].price - + ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel) - + ZSTD_litLengthPrice(litlen, optStatePtr, optLevel) - - ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel); + + (int)ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel) + + (int)ZSTD_litLengthPrice(litlen, optStatePtr, optLevel) + - (int)ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel); assert(price < 1000000000); /* overflow check */ if (price <= opt[cur].price) { DEBUGLOG(7, "cPos:%zi==rPos:%u : better price (%.2f<=%.2f) using literal (ll==%u) (hist:%u,%u,%u)", @@ -1065,7 +1199,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, assert(cur >= opt[cur].mlen); if (opt[cur].mlen != 0) { U32 const prev = cur - opt[cur].mlen; - repcodes_t newReps = ZSTD_updateRep(opt[prev].rep, opt[cur].off, opt[cur].litlen==0); + repcodes_t const newReps = ZSTD_newRep(opt[prev].rep, opt[cur].off, opt[cur].litlen==0); ZSTD_memcpy(opt[cur].rep, &newReps, sizeof(repcodes_t)); } else { ZSTD_memcpy(opt[cur].rep, opt[cur - 1].rep, sizeof(repcodes_t)); @@ -1082,11 +1216,12 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, continue; /* skip unpromising positions; about ~+6% speed, -0.01 ratio */ } + assert(opt[cur].price >= 0); { U32 const ll0 = (opt[cur].mlen != 0); U32 const litlen = (opt[cur].mlen == 0) ? opt[cur].litlen : 0; - U32 const previousPrice = opt[cur].price; + U32 const previousPrice = (U32)opt[cur].price; U32 const basePrice = previousPrice + ZSTD_litLengthPrice(0, optStatePtr, optLevel); - U32 nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, inr, iend, dictMode, opt[cur].rep, ll0, minMatch); + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, inr, iend, opt[cur].rep, ll0, minMatch); U32 matchNb; ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, @@ -1119,12 +1254,12 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, U32 const startML = (matchNb>0) ? matches[matchNb-1].len+1 : minMatch; U32 mlen; - DEBUGLOG(7, "testing match %u => offCode=%4u, mlen=%2u, llen=%2u", + DEBUGLOG(7, "testing match %u => offBase=%4u, mlen=%2u, llen=%2u", matchNb, matches[matchNb].off, lastML, litlen); for (mlen = lastML; mlen >= startML; mlen--) { /* scan downward */ U32 const pos = cur + mlen; - int const price = basePrice + ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel); + int const price = (int)basePrice + (int)ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel); if ((pos > last_pos) || (price < opt[pos].price)) { DEBUGLOG(7, "rPos:%u (ml=%2u) => new better price (%.2f<%.2f)", @@ -1154,7 +1289,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ * update them while traversing the sequences. */ if (lastSequence.mlen != 0) { - repcodes_t reps = ZSTD_updateRep(opt[cur].rep, lastSequence.off, lastSequence.litlen==0); + repcodes_t const reps = ZSTD_newRep(opt[cur].rep, lastSequence.off, lastSequence.litlen==0); ZSTD_memcpy(rep, &reps, sizeof(reps)); } else { ZSTD_memcpy(rep, opt[cur].rep, sizeof(repcodes_t)); @@ -1185,7 +1320,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ for (storePos=storeStart; storePos <= storeEnd; storePos++) { U32 const llen = opt[storePos].litlen; U32 const mlen = opt[storePos].mlen; - U32 const offCode = opt[storePos].off; + U32 const offBase = opt[storePos].off; U32 const advance = llen + mlen; DEBUGLOG(6, "considering seq starting at %zi, llen=%u, mlen=%u", anchor - istart, (unsigned)llen, (unsigned)mlen); @@ -1197,8 +1332,8 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ } assert(anchor + llen <= iend); - ZSTD_updateStats(optStatePtr, llen, anchor, offCode, mlen); - ZSTD_storeSeq(seqStore, llen, anchor, iend, offCode, mlen-MINMATCH); + ZSTD_updateStats(optStatePtr, llen, anchor, offBase, mlen); + ZSTD_storeSeq(seqStore, llen, anchor, iend, offBase, mlen); anchor += advance; ip = anchor; } } @@ -1210,43 +1345,35 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ return (size_t)(iend - anchor); } +static size_t ZSTD_compressBlock_opt0( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /* optLevel */, dictMode); +} + +static size_t ZSTD_compressBlock_opt2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /* optLevel */, dictMode); +} size_t ZSTD_compressBlock_btopt( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { DEBUGLOG(5, "ZSTD_compressBlock_btopt"); - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } -/* used in 2-pass strategy */ -static U32 ZSTD_upscaleStat(unsigned* table, U32 lastEltIndex, int bonus) -{ - U32 s, sum=0; - assert(ZSTD_FREQ_DIV+bonus >= 0); - for (s=0; slitSum = ZSTD_upscaleStat(optPtr->litFreq, MaxLit, 0); - optPtr->litLengthSum = ZSTD_upscaleStat(optPtr->litLengthFreq, MaxLL, 0); - optPtr->matchLengthSum = ZSTD_upscaleStat(optPtr->matchLengthFreq, MaxML, 0); - optPtr->offCodeSum = ZSTD_upscaleStat(optPtr->offCodeFreq, MaxOff, 0); -} /* ZSTD_initStats_ultra(): * make a first compression pass, just to seed stats with more accurate starting values. * only works on first block, with no dictionary and no ldm. - * this function cannot error, hence its contract must be respected. + * this function cannot error out, its narrow contract must be respected. */ static void ZSTD_initStats_ultra(ZSTD_matchState_t* ms, @@ -1263,17 +1390,15 @@ ZSTD_initStats_ultra(ZSTD_matchState_t* ms, assert(ms->window.dictLimit == ms->window.lowLimit); /* no dictionary */ assert(ms->window.dictLimit - ms->nextToUpdate <= 1); /* no prefix (note: intentional overflow, defined as 2-complement) */ - ZSTD_compressBlock_opt_generic(ms, seqStore, tmpRep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); /* generate stats into ms->opt*/ + ZSTD_compressBlock_opt2(ms, seqStore, tmpRep, src, srcSize, ZSTD_noDict); /* generate stats into ms->opt*/ - /* invalidate first scan from history */ + /* invalidate first scan from history, only keep entropy stats */ ZSTD_resetSeqStore(seqStore); ms->window.base -= srcSize; ms->window.dictLimit += (U32)srcSize; ms->window.lowLimit = ms->window.dictLimit; ms->nextToUpdate = ms->window.dictLimit; - /* re-inforce weight of collected statistics */ - ZSTD_upscaleStats(&ms->opt); } size_t ZSTD_compressBlock_btultra( @@ -1281,7 +1406,7 @@ size_t ZSTD_compressBlock_btultra( const void* src, size_t srcSize) { DEBUGLOG(5, "ZSTD_compressBlock_btultra (srcSize=%zu)", srcSize); - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } size_t ZSTD_compressBlock_btultra2( @@ -1291,53 +1416,53 @@ size_t ZSTD_compressBlock_btultra2( U32 const curr = (U32)((const BYTE*)src - ms->window.base); DEBUGLOG(5, "ZSTD_compressBlock_btultra2 (srcSize=%zu)", srcSize); - /* 2-pass strategy: + /* 2-passes strategy: * this strategy makes a first pass over first block to collect statistics - * and seed next round's statistics with it. - * After 1st pass, function forgets everything, and starts a new block. + * in order to seed next round's statistics with it. + * After 1st pass, function forgets history, and starts a new block. * Consequently, this can only work if no data has been previously loaded in tables, * aka, no dictionary, no prefix, no ldm preprocessing. * The compression ratio gain is generally small (~0.5% on first block), - * the cost is 2x cpu time on first block. */ + ** the cost is 2x cpu time on first block. */ assert(srcSize <= ZSTD_BLOCKSIZE_MAX); if ( (ms->opt.litLengthSum==0) /* first block */ && (seqStore->sequences == seqStore->sequencesStart) /* no ldm */ && (ms->window.dictLimit == ms->window.lowLimit) /* no dictionary */ - && (curr == ms->window.dictLimit) /* start of frame, nothing already loaded nor skipped */ - && (srcSize > ZSTD_PREDEF_THRESHOLD) + && (curr == ms->window.dictLimit) /* start of frame, nothing already loaded nor skipped */ + && (srcSize > ZSTD_PREDEF_THRESHOLD) /* input large enough to not employ default stats */ ) { ZSTD_initStats_ultra(ms, seqStore, rep, src, srcSize); } - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } size_t ZSTD_compressBlock_btopt_dictMatchState( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_dictMatchState); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); } size_t ZSTD_compressBlock_btultra_dictMatchState( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_dictMatchState); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); } size_t ZSTD_compressBlock_btopt_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_extDict); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_extDict); } size_t ZSTD_compressBlock_btultra_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_extDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_extDict); } /* note : no btultra2 variant for extDict nor dictMatchState, diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.h b/src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.h similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.h index 627255f..342e5a3 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstd_opt.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstd_opt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.c b/src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.c similarity index 94% rename from src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.c rename to src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.c index 22aa3e1..7a2c717 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.c +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -102,9 +102,8 @@ typedef struct ZSTDMT_bufferPool_s { buffer_t bTable[1]; /* variable size */ } ZSTDMT_bufferPool; -static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned nbWorkers, ZSTD_customMem cMem) +static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem) { - unsigned const maxNbBuffers = 2*nbWorkers + 3; ZSTDMT_bufferPool* const bufPool = (ZSTDMT_bufferPool*)ZSTD_customCalloc( sizeof(ZSTDMT_bufferPool) + (maxNbBuffers-1) * sizeof(buffer_t), cMem); if (bufPool==NULL) return NULL; @@ -160,9 +159,8 @@ static void ZSTDMT_setBufferSize(ZSTDMT_bufferPool* const bufPool, size_t const } -static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, U32 nbWorkers) +static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, unsigned maxNbBuffers) { - unsigned const maxNbBuffers = 2*nbWorkers + 3; if (srcBufPool==NULL) return NULL; if (srcBufPool->totalBuffers >= maxNbBuffers) /* good enough */ return srcBufPool; @@ -171,7 +169,7 @@ static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, size_t const bSize = srcBufPool->bufferSize; /* forward parameters */ ZSTDMT_bufferPool* newBufPool; ZSTDMT_freeBufferPool(srcBufPool); - newBufPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + newBufPool = ZSTDMT_createBufferPool(maxNbBuffers, cMem); if (newBufPool==NULL) return newBufPool; ZSTDMT_setBufferSize(newBufPool, bSize); return newBufPool; @@ -263,6 +261,16 @@ static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf) ZSTD_customFree(buf.start, bufPool->cMem); } +/* We need 2 output buffers per worker since each dstBuff must be flushed after it is released. + * The 3 additional buffers are as follows: + * 1 buffer for input loading + * 1 buffer for "next input" when submitting current one + * 1 buffer stuck in queue */ +#define BUF_POOL_MAX_NB_BUFFERS(nbWorkers) (2*(nbWorkers) + 3) + +/* After a worker releases its rawSeqStore, it is immediately ready for reuse. + * So we only need one seq buffer per worker. */ +#define SEQ_POOL_MAX_NB_BUFFERS(nbWorkers) (nbWorkers) /* ===== Seq Pool Wrapper ====== */ @@ -316,7 +324,7 @@ static void ZSTDMT_setNbSeq(ZSTDMT_seqPool* const seqPool, size_t const nbSeq) static ZSTDMT_seqPool* ZSTDMT_createSeqPool(unsigned nbWorkers, ZSTD_customMem cMem) { - ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(SEQ_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); if (seqPool == NULL) return NULL; ZSTDMT_setNbSeq(seqPool, 0); return seqPool; @@ -329,7 +337,7 @@ static void ZSTDMT_freeSeqPool(ZSTDMT_seqPool* seqPool) static ZSTDMT_seqPool* ZSTDMT_expandSeqPool(ZSTDMT_seqPool* pool, U32 nbWorkers) { - return ZSTDMT_expandBufferPool(pool, nbWorkers); + return ZSTDMT_expandBufferPool(pool, SEQ_POOL_MAX_NB_BUFFERS(nbWorkers)); } @@ -467,7 +475,7 @@ ZSTDMT_serialState_reset(serialState_t* serialState, ZSTD_dictContentType_e dictContentType) { /* Adjust parameters */ - if (params.ldmParams.enableLdm) { + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { DEBUGLOG(4, "LDM window size = %u KB", (1U << params.cParams.windowLog) >> 10); ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.cParams); assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog); @@ -478,7 +486,7 @@ ZSTDMT_serialState_reset(serialState_t* serialState, serialState->nextJobID = 0; if (params.fParams.checksumFlag) XXH64_reset(&serialState->xxhState, 0); - if (params.ldmParams.enableLdm) { + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_customMem cMem = params.customMem; unsigned const hashLog = params.ldmParams.hashLog; size_t const hashSize = ((size_t)1 << hashLog) * sizeof(ldmEntry_t); @@ -564,7 +572,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState, /* A future job may error and skip our job */ if (serialState->nextJobID == jobID) { /* It is now our turn, do any processing necessary */ - if (serialState->params.ldmParams.enableLdm) { + if (serialState->params.ldmParams.enableLdm == ZSTD_ps_enable) { size_t error; assert(seqStore.seq != NULL && seqStore.pos == 0 && seqStore.size == 0 && seqStore.capacity > 0); @@ -594,7 +602,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState, if (seqStore.size > 0) { size_t const err = ZSTD_referenceExternalSequences( jobCCtx, seqStore.seq, seqStore.size); - assert(serialState->params.ldmParams.enableLdm); + assert(serialState->params.ldmParams.enableLdm == ZSTD_ps_enable); assert(!ZSTD_isError(err)); (void)err; } @@ -672,7 +680,7 @@ static void ZSTDMT_compressionJob(void* jobDescription) if (dstBuff.start==NULL) JOB_ERROR(ERROR(memory_allocation)); job->dstBuff = dstBuff; /* this value can be read in ZSTDMT_flush, when it copies the whole job */ } - if (jobParams.ldmParams.enableLdm && rawSeqStore.seq == NULL) + if (jobParams.ldmParams.enableLdm == ZSTD_ps_enable && rawSeqStore.seq == NULL) JOB_ERROR(ERROR(memory_allocation)); /* Don't compute the checksum for chunks, since we compute it externally, @@ -680,7 +688,7 @@ static void ZSTDMT_compressionJob(void* jobDescription) */ if (job->jobID != 0) jobParams.fParams.checksumFlag = 0; /* Don't run LDM for the chunks, since we handle it externally */ - jobParams.ldmParams.enableLdm = 0; + jobParams.ldmParams.enableLdm = ZSTD_ps_disable; /* Correct nbWorkers to 0. */ jobParams.nbWorkers = 0; @@ -807,6 +815,15 @@ typedef struct { static const roundBuff_t kNullRoundBuff = {NULL, 0, 0}; #define RSYNC_LENGTH 32 +/* Don't create chunks smaller than the zstd block size. + * This stops us from regressing compression ratio too much, + * and ensures our output fits in ZSTD_compressBound(). + * + * If this is shrunk < ZSTD_BLOCKSIZELOG_MIN then + * ZSTD_COMPRESSBOUND() will need to be updated. + */ +#define RSYNC_MIN_BLOCK_LOG ZSTD_BLOCKSIZELOG_MAX +#define RSYNC_MIN_BLOCK_SIZE (1<jobs = ZSTDMT_createJobsTable(&nbJobs, cMem); assert(nbJobs > 0); assert((nbJobs & (nbJobs - 1)) == 0); /* ensure nbJobs is a power of 2 */ mtctx->jobIDMask = nbJobs - 1; - mtctx->bufPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + mtctx->bufPool = ZSTDMT_createBufferPool(BUF_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); mtctx->cctxPool = ZSTDMT_createCCtxPool(nbWorkers, cMem); mtctx->seqPool = ZSTDMT_createSeqPool(nbWorkers, cMem); initError = ZSTDMT_serialState_init(&mtctx->serial); @@ -1030,7 +1047,7 @@ static size_t ZSTDMT_resize(ZSTDMT_CCtx* mtctx, unsigned nbWorkers) { if (POOL_resize(mtctx->factory, nbWorkers)) return ERROR(memory_allocation); FORWARD_IF_ERROR( ZSTDMT_expandJobsTable(mtctx, nbWorkers) , ""); - mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, nbWorkers); + mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, BUF_POOL_MAX_NB_BUFFERS(nbWorkers)); if (mtctx->bufPool == NULL) return ERROR(memory_allocation); mtctx->cctxPool = ZSTDMT_expandCCtxPool(mtctx->cctxPool, nbWorkers); if (mtctx->cctxPool == NULL) return ERROR(memory_allocation); @@ -1135,7 +1152,7 @@ size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx) static unsigned ZSTDMT_computeTargetJobLog(const ZSTD_CCtx_params* params) { unsigned jobLog; - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* In Long Range Mode, the windowLog is typically oversized. * In which case, it's preferable to determine the jobSize * based on cycleLog instead. */ @@ -1179,7 +1196,7 @@ static size_t ZSTDMT_computeOverlapSize(const ZSTD_CCtx_params* params) int const overlapRLog = 9 - ZSTDMT_overlapLog(params->overlapLog, params->cParams.strategy); int ovLog = (overlapRLog >= 8) ? 0 : (params->cParams.windowLog - overlapRLog); assert(0 <= overlapRLog && overlapRLog <= 8); - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* In Long Range Mode, the windowLog is typically oversized. * In which case, it's preferable to determine the jobSize * based on chainLog instead. @@ -1252,6 +1269,9 @@ size_t ZSTDMT_initCStream_internal( /* Aim for the targetsectionSize as the average job size. */ U32 const jobSizeKB = (U32)(mtctx->targetSectionSize >> 10); U32 const rsyncBits = (assert(jobSizeKB >= 1), ZSTD_highbit32(jobSizeKB) + 10); + /* We refuse to create jobs < RSYNC_MIN_BLOCK_SIZE bytes, so make sure our + * expected job size is at least 4x larger. */ + assert(rsyncBits >= RSYNC_MIN_BLOCK_LOG + 2); DEBUGLOG(4, "rsyncLog = %u", rsyncBits); mtctx->rsync.hash = 0; mtctx->rsync.hitMask = (1ULL << rsyncBits) - 1; @@ -1263,7 +1283,7 @@ size_t ZSTDMT_initCStream_internal( ZSTDMT_setBufferSize(mtctx->bufPool, ZSTD_compressBound(mtctx->targetSectionSize)); { /* If ldm is enabled we need windowSize space. */ - size_t const windowSize = mtctx->params.ldmParams.enableLdm ? (1U << mtctx->params.cParams.windowLog) : 0; + size_t const windowSize = mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable ? (1U << mtctx->params.cParams.windowLog) : 0; /* Two buffers of slack, plus extra space for the overlap * This is the minimum slack that LDM works with. One extra because * flush might waste up to targetSectionSize-1 bytes. Another extra @@ -1538,17 +1558,21 @@ static range_t ZSTDMT_getInputDataInUse(ZSTDMT_CCtx* mtctx) static int ZSTDMT_isOverlapped(buffer_t buffer, range_t range) { BYTE const* const bufferStart = (BYTE const*)buffer.start; - BYTE const* const bufferEnd = bufferStart + buffer.capacity; BYTE const* const rangeStart = (BYTE const*)range.start; - BYTE const* const rangeEnd = range.size != 0 ? rangeStart + range.size : rangeStart; if (rangeStart == NULL || bufferStart == NULL) return 0; - /* Empty ranges cannot overlap */ - if (bufferStart == bufferEnd || rangeStart == rangeEnd) - return 0; - return bufferStart < rangeEnd && rangeStart < bufferEnd; + { + BYTE const* const bufferEnd = bufferStart + buffer.capacity; + BYTE const* const rangeEnd = rangeStart + range.size; + + /* Empty ranges cannot overlap */ + if (bufferStart == bufferEnd || rangeStart == rangeEnd) + return 0; + + return bufferStart < rangeEnd && rangeStart < bufferEnd; + } } static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window) @@ -1575,7 +1599,7 @@ static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window) static void ZSTDMT_waitForLdmComplete(ZSTDMT_CCtx* mtctx, buffer_t buffer) { - if (mtctx->params.ldmParams.enableLdm) { + if (mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_pthread_mutex_t* mutex = &mtctx->serial.ldmWindowMutex; DEBUGLOG(5, "ZSTDMT_waitForLdmComplete"); DEBUGLOG(5, "source [0x%zx, 0x%zx)", @@ -1678,6 +1702,11 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) if (!mtctx->params.rsyncable) /* Rsync is disabled. */ return syncPoint; + if (mtctx->inBuff.filled + input.size - input.pos < RSYNC_MIN_BLOCK_SIZE) + /* We don't emit synchronization points if it would produce too small blocks. + * We don't have enough input to find a synchronization point, so don't look. + */ + return syncPoint; if (mtctx->inBuff.filled + syncPoint.toLoad < RSYNC_LENGTH) /* Not enough to compute the hash. * We will miss any synchronization points in this RSYNC_LENGTH byte @@ -1688,10 +1717,28 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) */ return syncPoint; /* Initialize the loop variables. */ - if (mtctx->inBuff.filled >= RSYNC_LENGTH) { - /* We have enough bytes buffered to initialize the hash. + if (mtctx->inBuff.filled < RSYNC_MIN_BLOCK_SIZE) { + /* We don't need to scan the first RSYNC_MIN_BLOCK_SIZE positions + * because they can't possibly be a sync point. So we can start + * part way through the input buffer. + */ + pos = RSYNC_MIN_BLOCK_SIZE - mtctx->inBuff.filled; + if (pos >= RSYNC_LENGTH) { + prev = istart + pos - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); + } else { + assert(mtctx->inBuff.filled >= RSYNC_LENGTH); + prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev + pos, (RSYNC_LENGTH - pos)); + hash = ZSTD_rollingHash_append(hash, istart, pos); + } + } else { + /* We have enough bytes buffered to initialize the hash, + * and have processed enough bytes to find a sync point. * Start scanning at the beginning of the input. */ + assert(mtctx->inBuff.filled >= RSYNC_MIN_BLOCK_SIZE); + assert(RSYNC_MIN_BLOCK_SIZE >= RSYNC_LENGTH); pos = 0; prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); @@ -1705,16 +1752,6 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) syncPoint.flush = 1; return syncPoint; } - } else { - /* We don't have enough bytes buffered to initialize the hash, but - * we know we have at least RSYNC_LENGTH bytes total. - * Start scanning after the first RSYNC_LENGTH bytes less the bytes - * already buffered. - */ - pos = RSYNC_LENGTH - mtctx->inBuff.filled; - prev = (BYTE const*)mtctx->inBuff.buffer.start - pos; - hash = ZSTD_rollingHash_compute(mtctx->inBuff.buffer.start, mtctx->inBuff.filled); - hash = ZSTD_rollingHash_append(hash, istart, pos); } /* Starting with the hash of the previous RSYNC_LENGTH bytes, roll * through the input. If we hit a synchronization point, then cut the @@ -1724,16 +1761,24 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) * then a block will be emitted anyways, but this is okay, since if we * are already synchronized we will remain synchronized. */ + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); for (; pos < syncPoint.toLoad; ++pos) { BYTE const toRemove = pos < RSYNC_LENGTH ? prev[pos] : istart[pos - RSYNC_LENGTH]; - /* if (pos >= RSYNC_LENGTH) assert(ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); */ + /* This assert is very expensive, and Debian compiles with asserts enabled. + * So disable it for now. We can get similar coverage by checking it at the + * beginning & end of the loop. + * assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + */ hash = ZSTD_rollingHash_rotate(hash, toRemove, istart[pos], primePower); + assert(mtctx->inBuff.filled + pos >= RSYNC_MIN_BLOCK_SIZE); if ((hash & hitMask) == hitMask) { syncPoint.toLoad = pos + 1; syncPoint.flush = 1; + ++pos; /* for assert */ break; } } + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); return syncPoint; } diff --git a/src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.h b/src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.h similarity index 92% rename from src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.h rename to src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.h index 2fee2ec..ed4dc0e 100644 --- a/src/dependencies/zstd-1.5.0/lib/compress/zstdmt_compress.h +++ b/src/dependencies/zstd-1.5.4/lib/compress/zstdmt_compress.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -65,8 +65,11 @@ size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx); * Private use only. Init streaming operation. * expects params to be valid. * must receive dict, or cdict, or none, but not both. + * mtctx can be freshly constructed or reused from a prior compression. + * If mtctx is reused, memory allocations from the prior compression may not be freed, + * even if they are not needed for the current compression. * @return : 0, or an error code */ -size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* zcs, +size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* mtctx, const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, const ZSTD_CDict* cdict, ZSTD_CCtx_params params, unsigned long long pledgedSrcSize); diff --git a/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress.c b/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress.c new file mode 100644 index 0000000..c2d1f63 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress.c @@ -0,0 +1,1882 @@ +/* ****************************************************************** + * huff0 huffman decoder, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************************************** +* Dependencies +****************************************************************/ +#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memset */ +#include "../common/compiler.h" +#include "../common/bitstream.h" /* BIT_* */ +#include "../common/fse.h" /* to compress headers */ +#include "../common/huf.h" +#include "../common/error_private.h" +#include "../common/zstd_internal.h" +#include "../common/bits.h" /* ZSTD_highbit32, ZSTD_countTrailingZeros64 */ + +/* ************************************************************** +* Constants +****************************************************************/ + +#define HUF_DECODER_FAST_TABLELOG 11 + +/* ************************************************************** +* Macros +****************************************************************/ + +/* These two optional macros force the use one way or another of the two + * Huffman decompression implementations. You can't force in both directions + * at the same time. + */ +#if defined(HUF_FORCE_DECOMPRESS_X1) && \ + defined(HUF_FORCE_DECOMPRESS_X2) +#error "Cannot force the use of the X1 and X2 decoders at the same time!" +#endif + +/* When DYNAMIC_BMI2 is enabled, fast decoders are only called when bmi2 is + * supported at runtime, so we can add the BMI2 target attribute. + * When it is disabled, we will still get BMI2 if it is enabled statically. + */ +#if DYNAMIC_BMI2 +# define HUF_FAST_BMI2_ATTRS BMI2_TARGET_ATTRIBUTE +#else +# define HUF_FAST_BMI2_ATTRS +#endif + +#ifdef __cplusplus +# define HUF_EXTERN_C extern "C" +#else +# define HUF_EXTERN_C +#endif +#define HUF_ASM_DECL HUF_EXTERN_C + +#if DYNAMIC_BMI2 +# define HUF_NEED_BMI2_FUNCTION 1 +#else +# define HUF_NEED_BMI2_FUNCTION 0 +#endif + +/* ************************************************************** +* Error Management +****************************************************************/ +#define HUF_isError ERR_isError + + +/* ************************************************************** +* Byte alignment for workSpace management +****************************************************************/ +#define HUF_ALIGN(x, a) HUF_ALIGN_MASK((x), (a) - 1) +#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) + + +/* ************************************************************** +* BMI2 Variant Wrappers +****************************************************************/ +typedef size_t (*HUF_DecompressUsingDTableFn)(void *dst, size_t dstSize, + const void *cSrc, + size_t cSrcSize, + const HUF_DTable *DTable); + +#if DYNAMIC_BMI2 + +#define HUF_DGEN(fn) \ + \ + static size_t fn##_default( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static BMI2_TARGET_ATTRIBUTE size_t fn##_bmi2( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + if (flags & HUF_flags_bmi2) { \ + return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#else + +#define HUF_DGEN(fn) \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + (void)flags; \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#endif + + +/*-***************************/ +/* generic DTableDesc */ +/*-***************************/ +typedef struct { BYTE maxTableLog; BYTE tableType; BYTE tableLog; BYTE reserved; } DTableDesc; + +static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) +{ + DTableDesc dtd; + ZSTD_memcpy(&dtd, table, sizeof(dtd)); + return dtd; +} + +static size_t HUF_initFastDStream(BYTE const* ip) { + BYTE const lastByte = ip[7]; + size_t const bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; + size_t const value = MEM_readLEST(ip) | 1; + assert(bitsConsumed <= 8); + assert(sizeof(size_t) == 8); + return value << bitsConsumed; +} + + +/** + * The input/output arguments to the Huffman fast decoding loop: + * + * ip [in/out] - The input pointers, must be updated to reflect what is consumed. + * op [in/out] - The output pointers, must be updated to reflect what is written. + * bits [in/out] - The bitstream containers, must be updated to reflect the current state. + * dt [in] - The decoding table. + * ilimit [in] - The input limit, stop when any input pointer is below ilimit. + * oend [in] - The end of the output stream. op[3] must not cross oend. + * iend [in] - The end of each input stream. ip[i] may cross iend[i], + * as long as it is above ilimit, but that indicates corruption. + */ +typedef struct { + BYTE const* ip[4]; + BYTE* op[4]; + U64 bits[4]; + void const* dt; + BYTE const* ilimit; + BYTE* oend; + BYTE const* iend[4]; +} HUF_DecompressFastArgs; + +typedef void (*HUF_DecompressFastLoopFn)(HUF_DecompressFastArgs*); + +/** + * Initializes args for the fast decoding loop. + * @returns 1 on success + * 0 if the fallback implementation should be used. + * Or an error code on failure. + */ +static size_t HUF_DecompressFastArgs_init(HUF_DecompressFastArgs* args, void* dst, size_t dstSize, void const* src, size_t srcSize, const HUF_DTable* DTable) +{ + void const* dt = DTable + 1; + U32 const dtLog = HUF_getDTableDesc(DTable).tableLog; + + const BYTE* const ilimit = (const BYTE*)src + 6 + 8; + + BYTE* const oend = (BYTE*)dst + dstSize; + + /* The fast decoding loop assumes 64-bit little-endian. + * This condition is false on x32. + */ + if (!MEM_isLittleEndian() || MEM_32bits()) + return 0; + + /* strict minimum : jump table + 1 byte per stream */ + if (srcSize < 10) + return ERROR(corruption_detected); + + /* Must have at least 8 bytes per stream because we don't handle initializing smaller bit containers. + * If table log is not correct at this point, fallback to the old decoder. + * On small inputs we don't have enough data to trigger the fast loop, so use the old decoder. + */ + if (dtLog != HUF_DECODER_FAST_TABLELOG) + return 0; + + /* Read the jump table. */ + { + const BYTE* const istart = (const BYTE*)src; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = srcSize - (length1 + length2 + length3 + 6); + args->iend[0] = istart + 6; /* jumpTable */ + args->iend[1] = args->iend[0] + length1; + args->iend[2] = args->iend[1] + length2; + args->iend[3] = args->iend[2] + length3; + + /* HUF_initFastDStream() requires this, and this small of an input + * won't benefit from the ASM loop anyways. + * length1 must be >= 16 so that ip[0] >= ilimit before the loop + * starts. + */ + if (length1 < 16 || length2 < 8 || length3 < 8 || length4 < 8) + return 0; + if (length4 > srcSize) return ERROR(corruption_detected); /* overflow */ + } + /* ip[] contains the position that is currently loaded into bits[]. */ + args->ip[0] = args->iend[1] - sizeof(U64); + args->ip[1] = args->iend[2] - sizeof(U64); + args->ip[2] = args->iend[3] - sizeof(U64); + args->ip[3] = (BYTE const*)src + srcSize - sizeof(U64); + + /* op[] contains the output pointers. */ + args->op[0] = (BYTE*)dst; + args->op[1] = args->op[0] + (dstSize+3)/4; + args->op[2] = args->op[1] + (dstSize+3)/4; + args->op[3] = args->op[2] + (dstSize+3)/4; + + /* No point to call the ASM loop for tiny outputs. */ + if (args->op[3] >= oend) + return 0; + + /* bits[] is the bit container. + * It is read from the MSB down to the LSB. + * It is shifted left as it is read, and zeros are + * shifted in. After the lowest valid bit a 1 is + * set, so that CountTrailingZeros(bits[]) can be used + * to count how many bits we've consumed. + */ + args->bits[0] = HUF_initFastDStream(args->ip[0]); + args->bits[1] = HUF_initFastDStream(args->ip[1]); + args->bits[2] = HUF_initFastDStream(args->ip[2]); + args->bits[3] = HUF_initFastDStream(args->ip[3]); + + /* If ip[] >= ilimit, it is guaranteed to be safe to + * reload bits[]. It may be beyond its section, but is + * guaranteed to be valid (>= istart). + */ + args->ilimit = ilimit; + + args->oend = oend; + args->dt = dt; + + return 1; +} + +static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressFastArgs const* args, int stream, BYTE* segmentEnd) +{ + /* Validate that we haven't overwritten. */ + if (args->op[stream] > segmentEnd) + return ERROR(corruption_detected); + /* Validate that we haven't read beyond iend[]. + * Note that ip[] may be < iend[] because the MSB is + * the next bit to read, and we may have consumed 100% + * of the stream, so down to iend[i] - 8 is valid. + */ + if (args->ip[stream] < args->iend[stream] - 8) + return ERROR(corruption_detected); + + /* Construct the BIT_DStream_t. */ + assert(sizeof(size_t) == 8); + bit->bitContainer = MEM_readLEST(args->ip[stream]); + bit->bitsConsumed = ZSTD_countTrailingZeros64(args->bits[stream]); + bit->start = (const char*)args->iend[0]; + bit->limitPtr = bit->start + sizeof(size_t); + bit->ptr = (const char*)args->ip[stream]; + + return 0; +} + + +#ifndef HUF_FORCE_DECOMPRESS_X2 + +/*-***************************/ +/* single-symbol decoding */ +/*-***************************/ +typedef struct { BYTE nbBits; BYTE byte; } HUF_DEltX1; /* single-symbol decoding */ + +/** + * Packs 4 HUF_DEltX1 structs into a U64. This is used to lay down 4 entries at + * a time. + */ +static U64 HUF_DEltX1_set4(BYTE symbol, BYTE nbBits) { + U64 D4; + if (MEM_isLittleEndian()) { + D4 = (U64)((symbol << 8) + nbBits); + } else { + D4 = (U64)(symbol + (nbBits << 8)); + } + assert(D4 < (1U << 16)); + D4 *= 0x0001000100010001ULL; + return D4; +} + +/** + * Increase the tableLog to targetTableLog and rescales the stats. + * If tableLog > targetTableLog this is a no-op. + * @returns New tableLog + */ +static U32 HUF_rescaleStats(BYTE* huffWeight, U32* rankVal, U32 nbSymbols, U32 tableLog, U32 targetTableLog) +{ + if (tableLog > targetTableLog) + return tableLog; + if (tableLog < targetTableLog) { + U32 const scale = targetTableLog - tableLog; + U32 s; + /* Increase the weight for all non-zero probability symbols by scale. */ + for (s = 0; s < nbSymbols; ++s) { + huffWeight[s] += (BYTE)((huffWeight[s] == 0) ? 0 : scale); + } + /* Update rankVal to reflect the new weights. + * All weights except 0 get moved to weight + scale. + * Weights [1, scale] are empty. + */ + for (s = targetTableLog; s > scale; --s) { + rankVal[s] = rankVal[s - scale]; + } + for (s = scale; s > 0; --s) { + rankVal[s] = 0; + } + } + return targetTableLog; +} + +typedef struct { + U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 rankStart[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 statsWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; + BYTE symbols[HUF_SYMBOLVALUE_MAX + 1]; + BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; +} HUF_ReadDTableX1_Workspace; + +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog = 0; + U32 nbSymbols = 0; + size_t iSize; + void* const dtPtr = DTable + 1; + HUF_DEltX1* const dt = (HUF_DEltX1*)dtPtr; + HUF_ReadDTableX1_Workspace* wksp = (HUF_ReadDTableX1_Workspace*)workSpace; + + DEBUG_STATIC_ASSERT(HUF_DECOMPRESS_WORKSPACE_SIZE >= sizeof(*wksp)); + if (sizeof(*wksp) > wkspSize) return ERROR(tableLog_tooLarge); + + DEBUG_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable)); + /* ZSTD_memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->huffWeight, HUF_SYMBOLVALUE_MAX + 1, wksp->rankVal, &nbSymbols, &tableLog, src, srcSize, wksp->statsWksp, sizeof(wksp->statsWksp), flags); + if (HUF_isError(iSize)) return iSize; + + + /* Table header */ + { DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 const maxTableLog = dtd.maxTableLog + 1; + U32 const targetTableLog = MIN(maxTableLog, HUF_DECODER_FAST_TABLELOG); + tableLog = HUF_rescaleStats(wksp->huffWeight, wksp->rankVal, nbSymbols, tableLog, targetTableLog); + if (tableLog > (U32)(dtd.maxTableLog+1)) return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */ + dtd.tableType = 0; + dtd.tableLog = (BYTE)tableLog; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + } + + /* Compute symbols and rankStart given rankVal: + * + * rankVal already contains the number of values of each weight. + * + * symbols contains the symbols ordered by weight. First are the rankVal[0] + * weight 0 symbols, followed by the rankVal[1] weight 1 symbols, and so on. + * symbols[0] is filled (but unused) to avoid a branch. + * + * rankStart contains the offset where each rank belongs in the DTable. + * rankStart[0] is not filled because there are no entries in the table for + * weight 0. + */ + { int n; + U32 nextRankStart = 0; + int const unroll = 4; + int const nLimit = (int)nbSymbols - unroll + 1; + for (n=0; n<(int)tableLog+1; n++) { + U32 const curr = nextRankStart; + nextRankStart += wksp->rankVal[n]; + wksp->rankStart[n] = curr; + } + for (n=0; n < nLimit; n += unroll) { + int u; + for (u=0; u < unroll; ++u) { + size_t const w = wksp->huffWeight[n+u]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)(n+u); + } + } + for (; n < (int)nbSymbols; ++n) { + size_t const w = wksp->huffWeight[n]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)n; + } + } + + /* fill DTable + * We fill all entries of each weight in order. + * That way length is a constant for each iteration of the outer loop. + * We can switch based on the length to a different inner loop which is + * optimized for that particular case. + */ + { U32 w; + int symbol = wksp->rankVal[0]; + int rankStart = 0; + for (w=1; wrankVal[w]; + int const length = (1 << w) >> 1; + int uStart = rankStart; + BYTE const nbBits = (BYTE)(tableLog + 1 - w); + int s; + int u; + switch (length) { + case 1: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart] = D; + uStart += 1; + } + break; + case 2: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart+0] = D; + dt[uStart+1] = D; + uStart += 2; + } + break; + case 4: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + uStart += 4; + } + break; + case 8: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + MEM_write64(dt + uStart + 4, D4); + uStart += 8; + } + break; + default: + for (s=0; ssymbols[symbol + s], nbBits); + for (u=0; u < length; u += 16) { + MEM_write64(dt + uStart + u + 0, D4); + MEM_write64(dt + uStart + u + 4, D4); + MEM_write64(dt + uStart + u + 8, D4); + MEM_write64(dt + uStart + u + 12, D4); + } + assert(u == length); + uStart += length; + } + break; + } + symbol += symbolCount; + rankStart += symbolCount * length; + } + } + return iSize; +} + +FORCE_INLINE_TEMPLATE BYTE +HUF_decodeSymbolX1(BIT_DStream_t* Dstream, const HUF_DEltX1* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */ + BYTE const c = dt[val].byte; + BIT_skipBits(Dstream, dt[val].nbBits); + return c; +} + +#define HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) \ + *ptr++ = HUF_decodeSymbolX1(DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX1_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +#define HUF_DECODE_SYMBOLX1_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +HINT_INLINE size_t +HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX1* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 4 symbols at a time */ + if ((pEnd - p) > 3) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_1(p, bitDPtr); + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* [0-3] symbols remaining */ + if (MEM_32bits()) + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd)) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + /* no more data to retrieve from bitstream, no need to reload */ + while (p < pEnd) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + return (size_t)(pEnd-pStart); +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BYTE* op = (BYTE*)dst; + BYTE* const oend = op + dstSize; + const void* dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + BIT_DStream_t bitD; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + HUF_decodeStreamX1(op, &bitD, oend, dt, dtLog); + + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + return dstSize; +} + +/* HUF_decompress4X1_usingDTable_internal_body(): + * Conditions : + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + /* Check */ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - 3; + const void* const dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + const size_t segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + U32 endSignal = 1; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit) ; ) { + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_1(op1, &bitD1); + HUF_DECODE_SYMBOLX1_1(op2, &bitD2); + HUF_DECODE_SYMBOLX1_1(op3, &bitD3); + HUF_DECODE_SYMBOLX1_1(op4, &bitD4); + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_0(op1, &bitD1); + HUF_DECODE_SYMBOLX1_0(op2, &bitD2); + HUF_DECODE_SYMBOLX1_0(op3, &bitD3); + HUF_DECODE_SYMBOLX1_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + } + } + + /* check corruption */ + /* note : should not be necessary : op# advance in lock step, and we control op4. + * but curiously, binary generated by gcc 7.2 & 7.3 with -mbmi2 runs faster when >=1 test is present */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 supposed already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX1(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX1(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX1(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX1(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X1_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X1_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X1_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X1_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + U16 const* const dtable = (U16 const*)args->dt; + BYTE* const oend = args->oend; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local variables */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy(&ip, &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= (stream == 3 ? oend : op[stream + 1])); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each iteration produces 5 output symbols per stream */ + size_t const oiters = (size_t)(oend - op[3]) / 5; + /* Each iteration consumes up to 11 bits * 5 = 55 bits < 7 bytes + * per stream. + */ + size_t const iiters = (size_t)(ip[0] - ilimit) / 7; + /* We can safely run iters iterations before running bounds checks */ + size_t const iters = MIN(oiters, iiters); + size_t const symbols = iters * 5; + + /* We can simply check that op[3] < olimit, instead of checking all + * of our bounds, since we can't hit the other bounds until we've run + * iters iterations, which only happens when op[3] == olimit. + */ + olimit = op[3] + symbols; + + /* Exit fast decoding loop once we get close to the end. */ + if (op[3] + 20 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Decode 5 symbols in each of the 4 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 4; ++stream) { + int const index = (int)(bits[stream] >> 53); + int const entry = (int)dtable[index]; + bits[stream] <<= (entry & 63); + op[stream][symbol] = (BYTE)((entry >> 8) & 0xFF); + } + } + /* Reload the bitstreams */ + for (stream = 0; stream < 4; ++stream) { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + op[stream] += 5; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy(&args->ip, &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + +/** + * @returns @p dstSize on success (>= 6) + * 0 if the fallback implementation should be used + * An error if an error occurred + */ +static HUF_FAST_BMI2_ATTRS +size_t +HUF_decompress4X1_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) +{ + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init fast loop args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* Our loop guarantees that ip[] >= ilimit and that we haven't + * overwritten any op[]. + */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bit streams one by one. */ + { size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + /* Decompress and validate that we've produced exactly the expected length. */ + args.op[i] += HUF_decodeStreamX1(args.op[i], &bit, segmentEnd, (HUF_DEltX1 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) return ERROR(corruption_detected); + } + } + + /* decoded size */ + assert(dstSize != 0); + return dstSize; +} + +HUF_DGEN(HUF_decompress1X1_usingDTable_internal) + +static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X1_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X1_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X1_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X1_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +static size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X2 */ + + +#ifndef HUF_FORCE_DECOMPRESS_X1 + +/* *************************/ +/* double-symbols decoding */ +/* *************************/ + +typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */ +typedef struct { BYTE symbol; } sortedSymbol_t; +typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1]; +typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX]; + +/** + * Constructs a HUF_DEltX2 in a U32. + */ +static U32 HUF_buildDEltX2U32(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + U32 seq; + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, sequence) == 0); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, nbBits) == 2); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, length) == 3); + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U32)); + if (MEM_isLittleEndian()) { + seq = level == 1 ? symbol : (baseSeq + (symbol << 8)); + return seq + (nbBits << 16) + ((U32)level << 24); + } else { + seq = level == 1 ? (symbol << 8) : ((baseSeq << 8) + symbol); + return (seq << 16) + (nbBits << 8) + (U32)level; + } +} + +/** + * Constructs a HUF_DEltX2. + */ +static HUF_DEltX2 HUF_buildDEltX2(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + HUF_DEltX2 DElt; + U32 const val = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + DEBUG_STATIC_ASSERT(sizeof(DElt) == sizeof(val)); + ZSTD_memcpy(&DElt, &val, sizeof(val)); + return DElt; +} + +/** + * Constructs 2 HUF_DEltX2s and packs them into a U64. + */ +static U64 HUF_buildDEltX2U64(U32 symbol, U32 nbBits, U16 baseSeq, int level) +{ + U32 DElt = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + return (U64)DElt + ((U64)DElt << 32); +} + +/** + * Fills the DTable rank with all the symbols from [begin, end) that are each + * nbBits long. + * + * @param DTableRank The start of the rank in the DTable. + * @param begin The first symbol to fill (inclusive). + * @param end The last symbol to fill (exclusive). + * @param nbBits Each symbol is nbBits long. + * @param tableLog The table log. + * @param baseSeq If level == 1 { 0 } else { the first level symbol } + * @param level The level in the table. Must be 1 or 2. + */ +static void HUF_fillDTableX2ForWeight( + HUF_DEltX2* DTableRank, + sortedSymbol_t const* begin, sortedSymbol_t const* end, + U32 nbBits, U32 tableLog, + U16 baseSeq, int const level) +{ + U32 const length = 1U << ((tableLog - nbBits) & 0x1F /* quiet static-analyzer */); + const sortedSymbol_t* ptr; + assert(level >= 1 && level <= 2); + switch (length) { + case 1: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + *DTableRank++ = DElt; + } + break; + case 2: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + DTableRank[0] = DElt; + DTableRank[1] = DElt; + DTableRank += 2; + } + break; + case 4: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + DTableRank += 4; + } + break; + case 8: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + DTableRank += 8; + } + break; + default: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + HUF_DEltX2* const DTableRankEnd = DTableRank + length; + for (; DTableRank != DTableRankEnd; DTableRank += 8) { + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + } + } + break; + } +} + +/* HUF_fillDTableX2Level2() : + * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ +static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 targetLog, const U32 consumedBits, + const U32* rankVal, const int minWeight, const int maxWeight1, + const sortedSymbol_t* sortedSymbols, U32 const* rankStart, + U32 nbBitsBaseline, U16 baseSeq) +{ + /* Fill skipped values (all positions up to rankVal[minWeight]). + * These are positions only get a single symbol because the combined weight + * is too large. + */ + if (minWeight>1) { + U32 const length = 1U << ((targetLog - consumedBits) & 0x1F /* quiet static-analyzer */); + U64 const DEltX2 = HUF_buildDEltX2U64(baseSeq, consumedBits, /* baseSeq */ 0, /* level */ 1); + int const skipSize = rankVal[minWeight]; + assert(length > 1); + assert((U32)skipSize < length); + switch (length) { + case 2: + assert(skipSize == 1); + ZSTD_memcpy(DTable, &DEltX2, sizeof(DEltX2)); + break; + case 4: + assert(skipSize <= 4); + ZSTD_memcpy(DTable + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + 2, &DEltX2, sizeof(DEltX2)); + break; + default: + { + int i; + for (i = 0; i < skipSize; i += 8) { + ZSTD_memcpy(DTable + i + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 6, &DEltX2, sizeof(DEltX2)); + } + } + } + } + + /* Fill each of the second level symbols by weight. */ + { + int w; + for (w = minWeight; w < maxWeight1; ++w) { + int const begin = rankStart[w]; + int const end = rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + U32 const totalBits = nbBits + consumedBits; + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedSymbols + begin, sortedSymbols + end, + totalBits, targetLog, + baseSeq, /* level */ 2); + } + } +} + +static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog, + const sortedSymbol_t* sortedList, + const U32* rankStart, rankValCol_t* rankValOrigin, const U32 maxWeight, + const U32 nbBitsBaseline) +{ + U32* const rankVal = rankValOrigin[0]; + const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */ + const U32 minBits = nbBitsBaseline - maxWeight; + int w; + int const wEnd = (int)maxWeight + 1; + + /* Fill DTable in order of weight. */ + for (w = 1; w < wEnd; ++w) { + int const begin = (int)rankStart[w]; + int const end = (int)rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + + if (targetLog-nbBits >= minBits) { + /* Enough room for a second symbol. */ + int start = rankVal[w]; + U32 const length = 1U << ((targetLog - nbBits) & 0x1F /* quiet static-analyzer */); + int minWeight = nbBits + scaleLog; + int s; + if (minWeight < 1) minWeight = 1; + /* Fill the DTable for every symbol of weight w. + * These symbols get at least 1 second symbol. + */ + for (s = begin; s != end; ++s) { + HUF_fillDTableX2Level2( + DTable + start, targetLog, nbBits, + rankValOrigin[nbBits], minWeight, wEnd, + sortedList, rankStart, + nbBitsBaseline, sortedList[s].symbol); + start += length; + } + } else { + /* Only a single symbol. */ + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedList + begin, sortedList + end, + nbBits, targetLog, + /* baseSeq */ 0, /* level */ 1); + } + } +} + +typedef struct { + rankValCol_t rankVal[HUF_TABLELOG_MAX]; + U32 rankStats[HUF_TABLELOG_MAX + 1]; + U32 rankStart0[HUF_TABLELOG_MAX + 3]; + sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1]; + BYTE weightList[HUF_SYMBOLVALUE_MAX + 1]; + U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; +} HUF_ReadDTableX2_Workspace; + +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog, maxW, nbSymbols; + DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 maxTableLog = dtd.maxTableLog; + size_t iSize; + void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */ + HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr; + U32 *rankStart; + + HUF_ReadDTableX2_Workspace* const wksp = (HUF_ReadDTableX2_Workspace*)workSpace; + + if (sizeof(*wksp) > wkspSize) return ERROR(GENERIC); + + rankStart = wksp->rankStart0 + 1; + ZSTD_memset(wksp->rankStats, 0, sizeof(wksp->rankStats)); + ZSTD_memset(wksp->rankStart0, 0, sizeof(wksp->rankStart0)); + + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */ + if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); + /* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), flags); + if (HUF_isError(iSize)) return iSize; + + /* check result */ + if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */ + if (tableLog <= HUF_DECODER_FAST_TABLELOG && maxTableLog > HUF_DECODER_FAST_TABLELOG) maxTableLog = HUF_DECODER_FAST_TABLELOG; + + /* find maxWeight */ + for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */ + + /* Get start index of each weight */ + { U32 w, nextRankStart = 0; + for (w=1; wrankStats[w]; + rankStart[w] = curr; + } + rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/ + rankStart[maxW+1] = nextRankStart; + } + + /* sort symbols by weight */ + { U32 s; + for (s=0; sweightList[s]; + U32 const r = rankStart[w]++; + wksp->sortedSymbol[r].symbol = (BYTE)s; + } + rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */ + } + + /* Build rankVal */ + { U32* const rankVal0 = wksp->rankVal[0]; + { int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */ + U32 nextRankVal = 0; + U32 w; + for (w=1; wrankStats[w] << (w+rescale); + rankVal0[w] = curr; + } } + { U32 const minBits = tableLog+1 - maxW; + U32 consumed; + for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) { + U32* const rankValPtr = wksp->rankVal[consumed]; + U32 w; + for (w = 1; w < maxW+1; w++) { + rankValPtr[w] = rankVal0[w] >> consumed; + } } } } + + HUF_fillDTableX2(dt, maxTableLog, + wksp->sortedSymbol, + wksp->rankStart0, wksp->rankVal, maxW, + tableLog+1); + + dtd.tableLog = (BYTE)maxTableLog; + dtd.tableType = 1; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + return iSize; +} + + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 2); + BIT_skipBits(DStream, dt[val].nbBits); + return dt[val].length; +} + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 1); + if (dt[val].length==1) { + BIT_skipBits(DStream, dt[val].nbBits); + } else { + if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) { + BIT_skipBits(DStream, dt[val].nbBits); + if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8)) + /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */ + DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); + } + } + return 1; +} + +#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +HINT_INLINE size_t +HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, + const HUF_DEltX2* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 8 symbols at a time */ + if ((size_t)(pEnd - p) >= sizeof(bitDPtr->bitContainer)) { + if (dtLog <= 11 && MEM_64bits()) { + /* up to 10 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-9)) { + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } else { + /* up to 8 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_1(p, bitDPtr); + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* closer to end : up to 2 symbols at a time */ + if ((size_t)(pEnd - p) >= 2) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + + while (p <= pEnd-2) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ + } + + if (p < pEnd) + p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog); + + return p-pStart; +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BIT_DStream_t bitD; + + /* Init */ + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + /* decode */ + { BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */ + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + HUF_decodeStreamX2(ostart, &bitD, oend, dt, dtd.tableLog); + } + + /* check */ + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + /* decoded size */ + return dstSize; +} + +/* HUF_decompress4X2_usingDTable_internal_body(): + * Conditions: + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - (sizeof(size_t)-1); + const void* const dtPtr = DTable+1; + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + size_t const segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + U32 endSignal = 1; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* 16-32 symbols per loop (4-8 symbols per stream) */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit); ) { +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; +#else + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal = (U32)LIKELY((U32) + (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); +#endif + } + } + + /* check corruption */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X2_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X2_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X2_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X2_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + BYTE* oend[4]; + HUF_DEltX2 const* const dtable = (HUF_DEltX2 const*)args->dt; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local registers. */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy(&ip, &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + oend[0] = op[1]; + oend[1] = op[2]; + oend[2] = op[3]; + oend[3] = args->oend; + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= oend[stream]); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each loop does 5 table lookups for each of the 4 streams. + * Each table lookup consumes up to 11 bits of input, and produces + * up to 2 bytes of output. + */ + /* We can consume up to 7 bytes of input per iteration per stream. + * We also know that each input pointer is >= ip[0]. So we can run + * iters loops before running out of input. + */ + size_t iters = (size_t)(ip[0] - ilimit) / 7; + /* Each iteration can produce up to 10 bytes of output per stream. + * Each output stream my advance at different rates. So take the + * minimum number of safe iterations among all the output streams. + */ + for (stream = 0; stream < 4; ++stream) { + size_t const oiters = (size_t)(oend[stream] - op[stream]) / 10; + iters = MIN(iters, oiters); + } + + /* Each iteration produces at least 5 output symbols. So until + * op[3] crosses olimit, we know we haven't executed iters + * iterations yet. This saves us maintaining an iters counter, + * at the expense of computing the remaining # of iterations + * more frequently. + */ + olimit = op[3] + (iters * 5); + + /* Exit the fast decoding loop if we are too close to the end. */ + if (op[3] + 10 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Do 5 table lookups for each of the first 3 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 3; ++stream) { + int const index = (int)(bits[stream] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[stream], entry.sequence); + bits[stream] <<= (entry.nbBits); + op[stream] += (entry.length); + } + } + /* Do 1 table lookup from the final stream */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Do 4 table lookups from the final stream & reload bitstreams */ + for (stream = 0; stream < 4; ++stream) { + /* Do a table lookup from the final stream. + * This is interleaved with the reloading to reduce register + * pressure. This shouldn't be necessary, but compilers can + * struggle with codegen with high register pressure. + */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Reload the bistreams. The final bitstream must be reloaded + * after the 5th symbol was decoded. + */ + { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy(&args->ip, &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + + +static HUF_FAST_BMI2_ATTRS size_t +HUF_decompress4X2_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) { + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { + size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init asm args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* note : op4 already verified within main loop */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bitStreams one by one */ + { + size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + args.op[i] += HUF_decodeStreamX2(args.op[i], &bit, segmentEnd, (HUF_DEltX2 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) + return ERROR(corruption_detected); + } + } + + /* decoded size */ + return dstSize; +} + +static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X2_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X2_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X2_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X2_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +HUF_DGEN(HUF_decompress1X2_usingDTable_internal) + +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, flags); +} + +static size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X1 */ + + +/* ***********************************/ +/* Universal decompression selectors */ +/* ***********************************/ + + +#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) +typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t; +static const algo_time_t algoTime[16 /* Quantization */][2 /* single, double */] = +{ + /* single, double, quad */ + {{0,0}, {1,1}}, /* Q==0 : impossible */ + {{0,0}, {1,1}}, /* Q==1 : impossible */ + {{ 150,216}, { 381,119}}, /* Q == 2 : 12-18% */ + {{ 170,205}, { 514,112}}, /* Q == 3 : 18-25% */ + {{ 177,199}, { 539,110}}, /* Q == 4 : 25-32% */ + {{ 197,194}, { 644,107}}, /* Q == 5 : 32-38% */ + {{ 221,192}, { 735,107}}, /* Q == 6 : 38-44% */ + {{ 256,189}, { 881,106}}, /* Q == 7 : 44-50% */ + {{ 359,188}, {1167,109}}, /* Q == 8 : 50-56% */ + {{ 582,187}, {1570,114}}, /* Q == 9 : 56-62% */ + {{ 688,187}, {1712,122}}, /* Q ==10 : 62-69% */ + {{ 825,186}, {1965,136}}, /* Q ==11 : 69-75% */ + {{ 976,185}, {2131,150}}, /* Q ==12 : 75-81% */ + {{1180,186}, {2070,175}}, /* Q ==13 : 81-87% */ + {{1377,185}, {1731,202}}, /* Q ==14 : 87-93% */ + {{1412,185}, {1695,202}}, /* Q ==15 : 93-99% */ +}; +#endif + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize) +{ + assert(dstSize > 0); + assert(dstSize <= 128*1024); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dstSize; + (void)cSrcSize; + return 0; +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dstSize; + (void)cSrcSize; + return 1; +#else + /* decoder timing evaluation */ + { U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */ + U32 const D256 = (U32)(dstSize >> 8); + U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256); + U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256); + DTime1 += DTime1 >> 5; /* small advantage to algorithm using less memory, to reduce cache eviction */ + return DTime1 < DTime0; + } +#endif +} + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ + if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ + if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags): + HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#endif + } +} + + +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} +#endif + +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize == 0) return ERROR(corruption_detected); + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags) : + HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#endif + } +} diff --git a/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress_amd64.S b/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress_amd64.S new file mode 100644 index 0000000..671624f --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/decompress/huf_decompress_amd64.S @@ -0,0 +1,576 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "../common/portability_macros.h" + +/* Stack marking + * ref: https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart + */ +#if defined(__ELF__) && defined(__GNUC__) +.section .note.GNU-stack,"",%progbits +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +/* Calling convention: + * + * %rdi contains the first argument: HUF_DecompressAsmArgs*. + * %rbp isn't maintained (no frame pointer). + * %rsp contains the stack pointer that grows down. + * No red-zone is assumed, only addresses >= %rsp are used. + * All register contents are preserved. + * + * TODO: Support Windows calling convention. + */ + +ZSTD_HIDE_ASM_FUNCTION(HUF_decompress4X1_usingDTable_internal_fast_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(HUF_decompress4X2_usingDTable_internal_fast_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(_HUF_decompress4X2_usingDTable_internal_fast_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(_HUF_decompress4X1_usingDTable_internal_fast_asm_loop) +.global HUF_decompress4X1_usingDTable_internal_fast_asm_loop +.global HUF_decompress4X2_usingDTable_internal_fast_asm_loop +.global _HUF_decompress4X1_usingDTable_internal_fast_asm_loop +.global _HUF_decompress4X2_usingDTable_internal_fast_asm_loop +.text + +/* Sets up register mappings for clarity. + * op[], bits[], dtable & ip[0] each get their own register. + * ip[1,2,3] & olimit alias var[]. + * %rax is a scratch register. + */ + +#define op0 rsi +#define op1 rbx +#define op2 rcx +#define op3 rdi + +#define ip0 r8 +#define ip1 r9 +#define ip2 r10 +#define ip3 r11 + +#define bits0 rbp +#define bits1 rdx +#define bits2 r12 +#define bits3 r13 +#define dtable r14 +#define olimit r15 + +/* var[] aliases ip[1,2,3] & olimit + * ip[1,2,3] are saved every iteration. + * olimit is only used in compute_olimit. + */ +#define var0 r15 +#define var1 r9 +#define var2 r10 +#define var3 r11 + +/* 32-bit var registers */ +#define vard0 r15d +#define vard1 r9d +#define vard2 r10d +#define vard3 r11d + +/* Calls X(N) for each stream 0, 1, 2, 3. */ +#define FOR_EACH_STREAM(X) \ + X(0); \ + X(1); \ + X(2); \ + X(3) + +/* Calls X(N, idx) for each stream 0, 1, 2, 3. */ +#define FOR_EACH_STREAM_WITH_INDEX(X, idx) \ + X(0, idx); \ + X(1, idx); \ + X(2, idx); \ + X(3, idx) + +/* Define both _HUF_* & HUF_* symbols because MacOS + * C symbols are prefixed with '_' & Linux symbols aren't. + */ +_HUF_decompress4X1_usingDTable_internal_fast_asm_loop: +HUF_decompress4X1_usingDTable_internal_fast_asm_loop: + ZSTD_CET_ENDBRANCH + /* Save all registers - even if they are callee saved for simplicity. */ + push %rax + push %rbx + push %rcx + push %rdx + push %rbp + push %rsi + push %rdi + push %r8 + push %r9 + push %r10 + push %r11 + push %r12 + push %r13 + push %r14 + push %r15 + + /* Read HUF_DecompressAsmArgs* args from %rax */ + movq %rdi, %rax + movq 0(%rax), %ip0 + movq 8(%rax), %ip1 + movq 16(%rax), %ip2 + movq 24(%rax), %ip3 + movq 32(%rax), %op0 + movq 40(%rax), %op1 + movq 48(%rax), %op2 + movq 56(%rax), %op3 + movq 64(%rax), %bits0 + movq 72(%rax), %bits1 + movq 80(%rax), %bits2 + movq 88(%rax), %bits3 + movq 96(%rax), %dtable + push %rax /* argument */ + push 104(%rax) /* ilimit */ + push 112(%rax) /* oend */ + push %olimit /* olimit space */ + + subq $24, %rsp + +.L_4X1_compute_olimit: + /* Computes how many iterations we can do safely + * %r15, %rax may be clobbered + * rbx, rdx must be saved + * op3 & ip0 mustn't be clobbered + */ + movq %rbx, 0(%rsp) + movq %rdx, 8(%rsp) + + movq 32(%rsp), %rax /* rax = oend */ + subq %op3, %rax /* rax = oend - op3 */ + + /* r15 = (oend - op3) / 5 */ + movabsq $-3689348814741910323, %rdx + mulq %rdx + movq %rdx, %r15 + shrq $2, %r15 + + movq %ip0, %rax /* rax = ip0 */ + movq 40(%rsp), %rdx /* rdx = ilimit */ + subq %rdx, %rax /* rax = ip0 - ilimit */ + movq %rax, %rbx /* rbx = ip0 - ilimit */ + + /* rdx = (ip0 - ilimit) / 7 */ + movabsq $2635249153387078803, %rdx + mulq %rdx + subq %rdx, %rbx + shrq %rbx + addq %rbx, %rdx + shrq $2, %rdx + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + /* r15 = r15 * 5 */ + leaq (%r15, %r15, 4), %r15 + + /* olimit = op3 + r15 */ + addq %op3, %olimit + + movq 8(%rsp), %rdx + movq 0(%rsp), %rbx + + /* If (op3 + 20 > olimit) */ + movq %op3, %rax /* rax = op3 */ + addq $20, %rax /* rax = op3 + 20 */ + cmpq %rax, %olimit /* op3 + 20 > olimit */ + jb .L_4X1_exit + + /* If (ip1 < ip0) go to exit */ + cmpq %ip0, %ip1 + jb .L_4X1_exit + + /* If (ip2 < ip1) go to exit */ + cmpq %ip1, %ip2 + jb .L_4X1_exit + + /* If (ip3 < ip2) go to exit */ + cmpq %ip2, %ip3 + jb .L_4X1_exit + +/* Reads top 11 bits from bits[n] + * Loads dt[bits[n]] into var[n] + */ +#define GET_NEXT_DELT(n) \ + movq $53, %var##n; \ + shrxq %var##n, %bits##n, %var##n; \ + movzwl (%dtable,%var##n,2),%vard##n + +/* var[n] must contain the DTable entry computed with GET_NEXT_DELT + * Moves var[n] to %rax + * bits[n] <<= var[n] & 63 + * op[n][idx] = %rax >> 8 + * %ah is a way to access bits [8, 16) of %rax + */ +#define DECODE_FROM_DELT(n, idx) \ + movq %var##n, %rax; \ + shlxq %var##n, %bits##n, %bits##n; \ + movb %ah, idx(%op##n) + +/* Assumes GET_NEXT_DELT has been called. + * Calls DECODE_FROM_DELT then GET_NEXT_DELT + */ +#define DECODE_AND_GET_NEXT(n, idx) \ + DECODE_FROM_DELT(n, idx); \ + GET_NEXT_DELT(n) \ + +/* // ctz & nbBytes is stored in bits[n] + * // nbBits is stored in %rax + * ctz = CTZ[bits[n]] + * nbBits = ctz & 7 + * nbBytes = ctz >> 3 + * op[n] += 5 + * ip[n] -= nbBytes + * // Note: x86-64 is little-endian ==> no bswap + * bits[n] = MEM_readST(ip[n]) | 1 + * bits[n] <<= nbBits + */ +#define RELOAD_BITS(n) \ + bsfq %bits##n, %bits##n; \ + movq %bits##n, %rax; \ + andq $7, %rax; \ + shrq $3, %bits##n; \ + leaq 5(%op##n), %op##n; \ + subq %bits##n, %ip##n; \ + movq (%ip##n), %bits##n; \ + orq $1, %bits##n; \ + shlx %rax, %bits##n, %bits##n + + /* Store clobbered variables on the stack */ + movq %olimit, 24(%rsp) + movq %ip1, 0(%rsp) + movq %ip2, 8(%rsp) + movq %ip3, 16(%rsp) + + /* Call GET_NEXT_DELT for each stream */ + FOR_EACH_STREAM(GET_NEXT_DELT) + + .p2align 6 + +.L_4X1_loop_body: + /* Decode 5 symbols in each of the 4 streams (20 total) + * Must have called GET_NEXT_DELT for each stream + */ + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 0) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 1) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 2) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 3) + FOR_EACH_STREAM_WITH_INDEX(DECODE_FROM_DELT, 4) + + /* Load ip[1,2,3] from stack (var[] aliases them) + * ip[] is needed for RELOAD_BITS + * Each will be stored back to the stack after RELOAD + */ + movq 0(%rsp), %ip1 + movq 8(%rsp), %ip2 + movq 16(%rsp), %ip3 + + /* Reload each stream & fetch the next table entry + * to prepare for the next iteration + */ + RELOAD_BITS(0) + GET_NEXT_DELT(0) + + RELOAD_BITS(1) + movq %ip1, 0(%rsp) + GET_NEXT_DELT(1) + + RELOAD_BITS(2) + movq %ip2, 8(%rsp) + GET_NEXT_DELT(2) + + RELOAD_BITS(3) + movq %ip3, 16(%rsp) + GET_NEXT_DELT(3) + + /* If op3 < olimit: continue the loop */ + cmp %op3, 24(%rsp) + ja .L_4X1_loop_body + + /* Reload ip[1,2,3] from stack */ + movq 0(%rsp), %ip1 + movq 8(%rsp), %ip2 + movq 16(%rsp), %ip3 + + /* Re-compute olimit */ + jmp .L_4X1_compute_olimit + +#undef GET_NEXT_DELT +#undef DECODE_FROM_DELT +#undef DECODE +#undef RELOAD_BITS +.L_4X1_exit: + addq $24, %rsp + + /* Restore stack (oend & olimit) */ + pop %rax /* olimit */ + pop %rax /* oend */ + pop %rax /* ilimit */ + pop %rax /* arg */ + + /* Save ip / op / bits */ + movq %ip0, 0(%rax) + movq %ip1, 8(%rax) + movq %ip2, 16(%rax) + movq %ip3, 24(%rax) + movq %op0, 32(%rax) + movq %op1, 40(%rax) + movq %op2, 48(%rax) + movq %op3, 56(%rax) + movq %bits0, 64(%rax) + movq %bits1, 72(%rax) + movq %bits2, 80(%rax) + movq %bits3, 88(%rax) + + /* Restore registers */ + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rdi + pop %rsi + pop %rbp + pop %rdx + pop %rcx + pop %rbx + pop %rax + ret + +_HUF_decompress4X2_usingDTable_internal_fast_asm_loop: +HUF_decompress4X2_usingDTable_internal_fast_asm_loop: + ZSTD_CET_ENDBRANCH + /* Save all registers - even if they are callee saved for simplicity. */ + push %rax + push %rbx + push %rcx + push %rdx + push %rbp + push %rsi + push %rdi + push %r8 + push %r9 + push %r10 + push %r11 + push %r12 + push %r13 + push %r14 + push %r15 + + movq %rdi, %rax + movq 0(%rax), %ip0 + movq 8(%rax), %ip1 + movq 16(%rax), %ip2 + movq 24(%rax), %ip3 + movq 32(%rax), %op0 + movq 40(%rax), %op1 + movq 48(%rax), %op2 + movq 56(%rax), %op3 + movq 64(%rax), %bits0 + movq 72(%rax), %bits1 + movq 80(%rax), %bits2 + movq 88(%rax), %bits3 + movq 96(%rax), %dtable + push %rax /* argument */ + push %rax /* olimit */ + push 104(%rax) /* ilimit */ + + movq 112(%rax), %rax + push %rax /* oend3 */ + + movq %op3, %rax + push %rax /* oend2 */ + + movq %op2, %rax + push %rax /* oend1 */ + + movq %op1, %rax + push %rax /* oend0 */ + + /* Scratch space */ + subq $8, %rsp + +.L_4X2_compute_olimit: + /* Computes how many iterations we can do safely + * %r15, %rax may be clobbered + * rdx must be saved + * op[1,2,3,4] & ip0 mustn't be clobbered + */ + movq %rdx, 0(%rsp) + + /* We can consume up to 7 input bytes each iteration. */ + movq %ip0, %rax /* rax = ip0 */ + movq 40(%rsp), %rdx /* rdx = ilimit */ + subq %rdx, %rax /* rax = ip0 - ilimit */ + movq %rax, %r15 /* r15 = ip0 - ilimit */ + + /* rdx = rax / 7 */ + movabsq $2635249153387078803, %rdx + mulq %rdx + subq %rdx, %r15 + shrq %r15 + addq %r15, %rdx + shrq $2, %rdx + + /* r15 = (ip0 - ilimit) / 7 */ + movq %rdx, %r15 + + /* r15 = min(r15, min(oend0 - op0, oend1 - op1, oend2 - op2, oend3 - op3) / 10) */ + movq 8(%rsp), %rax /* rax = oend0 */ + subq %op0, %rax /* rax = oend0 - op0 */ + movq 16(%rsp), %rdx /* rdx = oend1 */ + subq %op1, %rdx /* rdx = oend1 - op1 */ + + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ + + movq 24(%rsp), %rax /* rax = oend2 */ + subq %op2, %rax /* rax = oend2 - op2 */ + + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ + + movq 32(%rsp), %rax /* rax = oend3 */ + subq %op3, %rax /* rax = oend3 - op3 */ + + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ + + movabsq $-3689348814741910323, %rax + mulq %rdx + shrq $3, %rdx /* rdx = rdx / 10 */ + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + /* olimit = op3 + 5 * r15 */ + movq %r15, %rax + leaq (%op3, %rax, 4), %olimit + addq %rax, %olimit + + movq 0(%rsp), %rdx + + /* If (op3 + 10 > olimit) */ + movq %op3, %rax /* rax = op3 */ + addq $10, %rax /* rax = op3 + 10 */ + cmpq %rax, %olimit /* op3 + 10 > olimit */ + jb .L_4X2_exit + + /* If (ip1 < ip0) go to exit */ + cmpq %ip0, %ip1 + jb .L_4X2_exit + + /* If (ip2 < ip1) go to exit */ + cmpq %ip1, %ip2 + jb .L_4X2_exit + + /* If (ip3 < ip2) go to exit */ + cmpq %ip2, %ip3 + jb .L_4X2_exit + +#define DECODE(n, idx) \ + movq %bits##n, %rax; \ + shrq $53, %rax; \ + movzwl 0(%dtable,%rax,4),%r8d; \ + movzbl 2(%dtable,%rax,4),%r15d; \ + movzbl 3(%dtable,%rax,4),%eax; \ + movw %r8w, (%op##n); \ + shlxq %r15, %bits##n, %bits##n; \ + addq %rax, %op##n + +#define RELOAD_BITS(n) \ + bsfq %bits##n, %bits##n; \ + movq %bits##n, %rax; \ + shrq $3, %bits##n; \ + andq $7, %rax; \ + subq %bits##n, %ip##n; \ + movq (%ip##n), %bits##n; \ + orq $1, %bits##n; \ + shlxq %rax, %bits##n, %bits##n + + + movq %olimit, 48(%rsp) + + .p2align 6 + +.L_4X2_loop_body: + /* We clobber r8, so store it on the stack */ + movq %r8, 0(%rsp) + + /* Decode 5 symbols from each of the 4 streams (20 symbols total). */ + FOR_EACH_STREAM_WITH_INDEX(DECODE, 0) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 1) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 2) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 3) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 4) + + /* Reload r8 */ + movq 0(%rsp), %r8 + + FOR_EACH_STREAM(RELOAD_BITS) + + cmp %op3, 48(%rsp) + ja .L_4X2_loop_body + jmp .L_4X2_compute_olimit + +#undef DECODE +#undef RELOAD_BITS +.L_4X2_exit: + addq $8, %rsp + /* Restore stack (oend & olimit) */ + pop %rax /* oend0 */ + pop %rax /* oend1 */ + pop %rax /* oend2 */ + pop %rax /* oend3 */ + pop %rax /* ilimit */ + pop %rax /* olimit */ + pop %rax /* arg */ + + /* Save ip / op / bits */ + movq %ip0, 0(%rax) + movq %ip1, 8(%rax) + movq %ip2, 16(%rax) + movq %ip3, 24(%rax) + movq %op0, 32(%rax) + movq %op1, 40(%rax) + movq %op2, 48(%rax) + movq %op3, 56(%rax) + movq %bits0, 64(%rax) + movq %bits1, 72(%rax) + movq %bits2, 80(%rax) + movq %bits3, 88(%rax) + + /* Restore registers */ + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rdi + pop %rsi + pop %rbp + pop %rdx + pop %rcx + pop %rbx + pop %rax + ret + +#endif diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.c b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.c rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.c index ce33547..ad5c34a 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.c +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,6 @@ #include "../common/mem.h" /* low level memory routines */ #define FSE_STATIC_LINKING_ONLY #include "../common/fse.h" -#define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "zstd_decompress_internal.h" #include "zstd_ddict.h" @@ -134,7 +133,7 @@ static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict, ZSTD_memcpy(internalBuffer, dict, dictSize); } ddict->dictSize = dictSize; - ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */ + ddict->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ /* parse dictionary content */ FORWARD_IF_ERROR( ZSTD_loadEntropy_intoDDict(ddict, dictContentType) , ""); @@ -240,5 +239,5 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict) unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict) { if (ddict==NULL) return 0; - return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize); + return ddict->dictID; } diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.h b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.h similarity index 95% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.h rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.h index bd03268..c4ca887 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_ddict.h +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_ddict.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress.c b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress.c similarity index 88% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress.c rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress.c index 910bc03..d487966 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress.c +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -56,17 +56,16 @@ * Dependencies *********************************************************/ #include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */ -#include "../common/cpu.h" /* bmi2 */ #include "../common/mem.h" /* low level memory routines */ #define FSE_STATIC_LINKING_ONLY #include "../common/fse.h" -#define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "../common/xxhash.h" /* XXH64_reset, XXH64_update, XXH64_digest, XXH64 */ #include "../common/zstd_internal.h" /* blockProperties_t */ #include "zstd_decompress_internal.h" /* ZSTD_DCtx */ #include "zstd_ddict.h" /* ZSTD_DDictDictContent */ #include "zstd_decompress_block.h" /* ZSTD_decompressBlock_internal */ +#include "../common/bits.h" /* ZSTD_highbit32 */ #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) # include "../legacy/zstd_legacy.h" @@ -79,11 +78,11 @@ *************************************/ #define DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT 4 -#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. - * Currently, that means a 0.75 load factor. - * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded - * the load factor of the ddict hash set. - */ +#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. + * Currently, that means a 0.75 load factor. + * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded + * the load factor of the ddict hash set. + */ #define DDICT_HASHSET_TABLE_BASE_SIZE 64 #define DDICT_HASHSET_RESIZE_FACTOR 2 @@ -177,12 +176,15 @@ static const ZSTD_DDict* ZSTD_DDictHashSet_getDDict(ZSTD_DDictHashSet* hashSet, static ZSTD_DDictHashSet* ZSTD_createDDictHashSet(ZSTD_customMem customMem) { ZSTD_DDictHashSet* ret = (ZSTD_DDictHashSet*)ZSTD_customMalloc(sizeof(ZSTD_DDictHashSet), customMem); DEBUGLOG(4, "Allocating new hash set"); + if (!ret) + return NULL; ret->ddictPtrTable = (const ZSTD_DDict**)ZSTD_customCalloc(DDICT_HASHSET_TABLE_BASE_SIZE * sizeof(ZSTD_DDict*), customMem); - ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; - ret->ddictPtrCount = 0; - if (!ret || !ret->ddictPtrTable) { + if (!ret->ddictPtrTable) { + ZSTD_customFree(ret, customMem); return NULL; } + ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; + ret->ddictPtrCount = 0; return ret; } @@ -241,6 +243,7 @@ static void ZSTD_DCtx_resetParameters(ZSTD_DCtx* dctx) dctx->outBufferMode = ZSTD_bm_buffered; dctx->forceIgnoreChecksum = ZSTD_d_validateChecksum; dctx->refMultipleDDicts = ZSTD_rmd_refSingleDDict; + dctx->disableHufAsm = 0; } static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx) @@ -255,11 +258,15 @@ static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx) dctx->inBuffSize = 0; dctx->outBuffSize = 0; dctx->streamStage = zdss_init; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) dctx->legacyContext = NULL; dctx->previousLegacyVersion = 0; +#endif dctx->noForwardProgress = 0; dctx->oversizedDuration = 0; - dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()); +#if DYNAMIC_BMI2 + dctx->bmi2 = ZSTD_cpuSupportsBmi2(); +#endif dctx->ddictSet = NULL; ZSTD_DCtx_resetParameters(dctx); #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION @@ -280,8 +287,7 @@ ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize) return dctx; } -ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) -{ +static ZSTD_DCtx* ZSTD_createDCtx_internal(ZSTD_customMem customMem) { if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_customMalloc(sizeof(*dctx), customMem); @@ -292,10 +298,15 @@ ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) } } +ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + ZSTD_DCtx* ZSTD_createDCtx(void) { DEBUGLOG(3, "ZSTD_createDCtx"); - return ZSTD_createDCtx_advanced(ZSTD_defaultCMem); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); } static void ZSTD_clearDict(ZSTD_DCtx* dctx) @@ -380,6 +391,19 @@ unsigned ZSTD_isFrame(const void* buffer, size_t size) return 0; } +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + */ +unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } + return 0; +} + /** ZSTD_frameHeaderSize_internal() : * srcSize must be large enough to reach header size fields. * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless. @@ -415,16 +439,40 @@ size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize) * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, - * or an error code, which can be tested using ZSTD_isError() */ +** or an error code, which can be tested using ZSTD_isError() */ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format) { const BYTE* ip = (const BYTE*)src; size_t const minInputSize = ZSTD_startingInputLength(format); - ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzer do not understand that zfhPtr is only going to be read only if return value is zero, since they are 2 different signals */ - if (srcSize < minInputSize) return minInputSize; - RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter"); + DEBUGLOG(5, "ZSTD_getFrameHeader_advanced: minInputSize = %zu, srcSize = %zu", minInputSize, srcSize); + if (srcSize > 0) { + /* note : technically could be considered an assert(), since it's an invalid entry */ + RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter : src==NULL, but srcSize>0"); + } + if (srcSize < minInputSize) { + if (srcSize > 0 && format != ZSTD_f_zstd1_magicless) { + /* when receiving less than @minInputSize bytes, + * control these bytes at least correspond to a supported magic number + * in order to error out early if they don't. + **/ + size_t const toCopy = MIN(4, srcSize); + unsigned char hbuf[4]; MEM_writeLE32(hbuf, ZSTD_MAGICNUMBER); + assert(src != NULL); + ZSTD_memcpy(hbuf, src, toCopy); + if ( MEM_readLE32(hbuf) != ZSTD_MAGICNUMBER ) { + /* not a zstd frame : let's check if it's a skippable frame */ + MEM_writeLE32(hbuf, ZSTD_MAGIC_SKIPPABLE_START); + ZSTD_memcpy(hbuf, src, toCopy); + if ((MEM_readLE32(hbuf) & ZSTD_MAGIC_SKIPPABLE_MASK) != ZSTD_MAGIC_SKIPPABLE_START) { + RETURN_ERROR(prefix_unknown, + "first bytes don't correspond to any supported magic number"); + } } } + return minInputSize; + } + + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzers may not understand that zfhPtr will be read only if return value is zero, since they are 2 different signals */ if ( (format != ZSTD_f_zstd1_magicless) && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) { if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { @@ -466,7 +514,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s } switch(dictIDSizeCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : break; case 1 : dictID = ip[pos]; pos++; break; case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break; @@ -474,7 +524,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s } switch(fcsID) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : if (singleSegment) frameContentSize = ip[pos]; break; case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break; case 2 : frameContentSize = MEM_readLE32(ip+pos); break; @@ -503,7 +555,6 @@ size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t src return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1); } - /** ZSTD_getFrameContentSize() : * compatible with legacy mode * @return : decompressed size of the single frame pointed to be `src` if known, otherwise @@ -544,6 +595,37 @@ static size_t readSkippableFrameSize(void const* src, size_t srcSize) } } +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize) +{ + U32 const magicNumber = MEM_readLE32(src); + size_t skippableFrameSize = readSkippableFrameSize(src, srcSize); + size_t skippableContentSize = skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE; + + /* check input validity */ + RETURN_ERROR_IF(!ZSTD_isSkippableFrame(src, srcSize), frameParameter_unsupported, ""); + RETURN_ERROR_IF(skippableFrameSize < ZSTD_SKIPPABLEHEADERSIZE || skippableFrameSize > srcSize, srcSize_wrong, ""); + RETURN_ERROR_IF(skippableContentSize > dstCapacity, dstSize_tooSmall, ""); + + /* deliver payload */ + if (skippableContentSize > 0 && dst != NULL) + ZSTD_memcpy(dst, (const BYTE *)src + ZSTD_SKIPPABLEHEADERSIZE, skippableContentSize); + if (magicVariant != NULL) + *magicVariant = magicNumber - ZSTD_MAGIC_SKIPPABLE_START; + return skippableContentSize; +} + /** ZSTD_findDecompressedSize() : * compatible with legacy mode * `srcSize` must be the exact length of some number of ZSTD compressed and/or @@ -700,10 +782,11 @@ static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize ip += 4; } + frameSizeInfo.nbBlocks = nbBlocks; frameSizeInfo.compressedSize = (size_t)(ip - ipstart); frameSizeInfo.decompressedBound = (zfh.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) ? zfh.frameContentSize - : nbBlocks * zfh.blockSizeMax; + : (unsigned long long)nbBlocks * zfh.blockSizeMax; return frameSizeInfo; } } @@ -743,6 +826,48 @@ unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize) return bound; } +size_t ZSTD_decompressionMargin(void const* src, size_t srcSize) +{ + size_t margin = 0; + unsigned maxBlockSize = 0; + + /* Iterate over each frame */ + while (srcSize > 0) { + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + size_t const compressedSize = frameSizeInfo.compressedSize; + unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; + ZSTD_frameHeader zfh; + + FORWARD_IF_ERROR(ZSTD_getFrameHeader(&zfh, src, srcSize), ""); + if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) + return ERROR(corruption_detected); + + if (zfh.frameType == ZSTD_frame) { + /* Add the frame header to our margin */ + margin += zfh.headerSize; + /* Add the checksum to our margin */ + margin += zfh.checksumFlag ? 4 : 0; + /* Add 3 bytes per block */ + margin += 3 * frameSizeInfo.nbBlocks; + + /* Compute the max block size */ + maxBlockSize = MAX(maxBlockSize, zfh.blockSizeMax); + } else { + assert(zfh.frameType == ZSTD_skippableFrame); + /* Add the entire skippable frame size to our margin. */ + margin += compressedSize; + } + + assert(srcSize >= compressedSize); + src = (const BYTE*)src + compressedSize; + srcSize -= compressedSize; + } + + /* Add the max block size back to the margin. */ + margin += maxBlockSize; + + return margin; +} /*-************************************************************* * Frame decoding @@ -768,7 +893,7 @@ static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity, if (srcSize == 0) return 0; RETURN_ERROR(dstBuffer_null, ""); } - ZSTD_memcpy(dst, src, srcSize); + ZSTD_memmove(dst, src, srcSize); return srcSize; } @@ -846,6 +971,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, /* Loop on each block */ while (1) { + BYTE* oBlockEnd = oend; size_t decodedSize; blockProperties_t blockProperties; size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSrcSize, &blockProperties); @@ -855,16 +981,34 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, remainingSrcSize -= ZSTD_blockHeaderSize; RETURN_ERROR_IF(cBlockSize > remainingSrcSize, srcSize_wrong, ""); + if (ip >= op && ip < oBlockEnd) { + /* We are decompressing in-place. Limit the output pointer so that we + * don't overwrite the block that we are currently reading. This will + * fail decompression if the input & output pointers aren't spaced + * far enough apart. + * + * This is important to set, even when the pointers are far enough + * apart, because ZSTD_decompressBlock_internal() can decide to store + * literals in the output buffer, after the block it is decompressing. + * Since we don't want anything to overwrite our input, we have to tell + * ZSTD_decompressBlock_internal to never write past ip. + * + * See ZSTD_allocateLiteralsBuffer() for reference. + */ + oBlockEnd = op + (ip - op); + } + switch(blockProperties.blockType) { case bt_compressed: - decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1); + decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oBlockEnd-op), ip, cBlockSize, /* frame */ 1, not_streaming); break; case bt_raw : + /* Use oend instead of oBlockEnd because this function is safe to overlap. It uses memmove. */ decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize); break; case bt_rle : - decodedSize = ZSTD_setRleBlock(op, (size_t)(oend-op), *ip, blockProperties.origSize); + decodedSize = ZSTD_setRleBlock(op, (size_t)(oBlockEnd-op), *ip, blockProperties.origSize); break; case bt_reserved : default: @@ -899,6 +1043,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, } ZSTD_DCtx_trace_end(dctx, (U64)(op-ostart), (U64)(ip-istart), /* streaming */ 0); /* Allow caller to get size read */ + DEBUGLOG(4, "ZSTD_decompressFrame: decompressed frame of size %zi, consuming %zi bytes of input", op-ostart, ip - (const BYTE*)*srcPtr); *srcPtr = ip; *srcSizePtr = remainingSrcSize; return (size_t)(op-ostart); @@ -1009,7 +1154,7 @@ static ZSTD_DDict const* ZSTD_getDDict(ZSTD_DCtx* dctx) switch (dctx->dictUses) { default: assert(0 /* Impossible */); - /* fall-through */ + ZSTD_FALLTHROUGH; case ZSTD_dont_use: ZSTD_clearDict(dctx); return NULL; @@ -1031,7 +1176,7 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr { #if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1) size_t regenSize; - ZSTD_DCtx* const dctx = ZSTD_createDCtx(); + ZSTD_DCtx* const dctx = ZSTD_createDCtx_internal(ZSTD_defaultCMem); RETURN_ERROR_IF(dctx==NULL, memory_allocation, "NULL pointer!"); regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize); ZSTD_freeDCtx(dctx); @@ -1051,8 +1196,8 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; } /** - * Similar to ZSTD_nextSrcSizeToDecompress(), but when when a block input can be streamed, - * we allow taking a partial block as the input. Currently only raw uncompressed blocks can + * Similar to ZSTD_nextSrcSizeToDecompress(), but when a block input can be streamed, we + * allow taking a partial block as the input. Currently only raw uncompressed blocks can * be streamed. * * For blocks that can be streamed, this allows us to reduce the latency until we produce @@ -1065,7 +1210,7 @@ static size_t ZSTD_nextSrcSizeToDecompressWithInputSize(ZSTD_DCtx* dctx, size_t return dctx->expected; if (dctx->bType != bt_raw) return dctx->expected; - return MIN(MAX(inputSize, 1), dctx->expected); + return BOUNDED(1, inputSize, dctx->expected); } ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { @@ -1073,7 +1218,9 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { { default: /* should not happen */ assert(0); + ZSTD_FALLTHROUGH; case ZSTDds_getFrameHeaderSize: + ZSTD_FALLTHROUGH; case ZSTDds_decodeFrameHeader: return ZSTDnit_frameHeader; case ZSTDds_decodeBlockHeader: @@ -1085,6 +1232,7 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { case ZSTDds_checkChecksum: return ZSTDnit_checksum; case ZSTDds_decodeSkippableHeader: + ZSTD_FALLTHROUGH; case ZSTDds_skipFrame: return ZSTDnit_skippableFrame; } @@ -1168,7 +1316,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c { case bt_compressed: DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed"); - rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1); + rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1, is_streaming); dctx->expected = 0; /* Streaming not supported */ break; case bt_raw : @@ -1249,7 +1397,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c default: assert(0); /* impossible */ - RETURN_ERROR(GENERIC, "impossible to reach"); /* some compiler require default to do something */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ } } @@ -1290,11 +1438,11 @@ ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, /* in minimal huffman, we always use X1 variants */ size_t const hSize = HUF_readDTableX1_wksp(entropy->hufTable, dictPtr, dictEnd - dictPtr, - workspace, workspaceSize); + workspace, workspaceSize, /* flags */ 0); #else size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable, dictPtr, (size_t)(dictEnd - dictPtr), - workspace, workspaceSize); + workspace, workspaceSize, /* flags */ 0); #endif RETURN_ERROR_IF(HUF_isError(hSize), dictionary_corrupted, ""); dictPtr += hSize; @@ -1393,7 +1541,7 @@ size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx) dctx->prefixStart = NULL; dctx->virtualStart = NULL; dctx->dictEnd = NULL; - dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */ + dctx->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ dctx->litEntropy = dctx->fseEntropy = 0; dctx->dictID = 0; dctx->bType = bt_reserved; @@ -1455,7 +1603,7 @@ unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize) * This could for one of the following reasons : * - The frame does not require a dictionary (most common case). * - The frame was built with dictID intentionally removed. - * Needed dictionary is a hidden information. + * Needed dictionary is a hidden piece of information. * Note : this use case also happens when using a non-conformant dictionary. * - `srcSize` is too small, and as a result, frame header could not be decoded. * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`. @@ -1464,7 +1612,7 @@ unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize) * ZSTD_getFrameHeader(), which will provide a more precise error code. */ unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize) { - ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0 }; + ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0, 0, 0 }; size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize); if (ZSTD_isError(hError)) return 0; return zfp.dictID; @@ -1493,7 +1641,7 @@ size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, ZSTD_DStream* ZSTD_createDStream(void) { DEBUGLOG(3, "ZSTD_createDStream"); - return ZSTD_createDStream_advanced(ZSTD_defaultCMem); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); } ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) @@ -1503,7 +1651,7 @@ ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem) { - return ZSTD_createDCtx_advanced(customMem); + return ZSTD_createDCtx_internal(customMem); } size_t ZSTD_freeDStream(ZSTD_DStream* zds) @@ -1571,7 +1719,9 @@ size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t di size_t ZSTD_initDStream(ZSTD_DStream* zds) { DEBUGLOG(4, "ZSTD_initDStream"); - return ZSTD_initDStream_usingDDict(zds, NULL); + FORWARD_IF_ERROR(ZSTD_DCtx_reset(zds, ZSTD_reset_session_only), ""); + FORWARD_IF_ERROR(ZSTD_DCtx_refDDict(zds, NULL), ""); + return ZSTD_startingInputLength(zds->format); } /* ZSTD_initDStream_usingDDict() : @@ -1579,6 +1729,7 @@ size_t ZSTD_initDStream(ZSTD_DStream* zds) * this function cannot fail */ size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict) { + DEBUGLOG(4, "ZSTD_initDStream_usingDDict"); FORWARD_IF_ERROR( ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only) , ""); FORWARD_IF_ERROR( ZSTD_DCtx_refDDict(dctx, ddict) , ""); return ZSTD_startingInputLength(dctx->format); @@ -1589,6 +1740,7 @@ size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict) * this function cannot fail */ size_t ZSTD_resetDStream(ZSTD_DStream* dctx) { + DEBUGLOG(4, "ZSTD_resetDStream"); FORWARD_IF_ERROR(ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only), ""); return ZSTD_startingInputLength(dctx->format); } @@ -1660,6 +1812,11 @@ ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam) bounds.lowerBound = (int)ZSTD_rmd_refSingleDDict; bounds.upperBound = (int)ZSTD_rmd_refMultipleDDicts; return bounds; + case ZSTD_d_disableHuffmanAssembly: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + default:; } bounds.error = ERROR(parameter_unsupported); @@ -1700,6 +1857,9 @@ size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value case ZSTD_d_refMultipleDDicts: *value = (int)dctx->refMultipleDDicts; return 0; + case ZSTD_d_disableHuffmanAssembly: + *value = (int)dctx->disableHufAsm; + return 0; default:; } RETURN_ERROR(parameter_unsupported, ""); @@ -1733,6 +1893,10 @@ size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter dParam, int value } dctx->refMultipleDDicts = (ZSTD_refMultipleDDicts_e)value; return 0; + case ZSTD_d_disableHuffmanAssembly: + CHECK_DBOUNDS(ZSTD_d_disableHuffmanAssembly, value); + dctx->disableHufAsm = value != 0; + return 0; default:; } RETURN_ERROR(parameter_unsupported, ""); @@ -1763,7 +1927,8 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx) size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize) { size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); - unsigned long long const neededRBSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2); + /* space is needed to store the litbuffer after the output of a given block without stomping the extDict of a previous run, as well as to cover both windows against wildcopy*/ + unsigned long long const neededRBSize = windowSize + blockSize + ZSTD_BLOCKSIZE_MAX + (WILDCOPY_OVERLENGTH * 2); unsigned long long const neededSize = MIN(frameContentSize, neededRBSize); size_t const minRBSize = (size_t) neededSize; RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize, @@ -1897,10 +2062,12 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB DEBUGLOG(5, "stage zdss_init => transparent reset "); zds->streamStage = zdss_loadHeader; zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) zds->legacyVersion = 0; +#endif zds->hostageByte = 0; zds->expectedOutBuffer = *output; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_loadHeader : DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip)); @@ -1917,7 +2084,6 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB if (zds->refMultipleDDicts && zds->ddictSet) { ZSTD_DCtx_selectFrameDDict(zds); } - DEBUGLOG(5, "header size : %u", (U32)hSize); if (ZSTD_isError(hSize)) { #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart); @@ -1949,6 +2115,11 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB zds->lhSize += remainingInput; } input->pos = input->size; + /* check first few bytes */ + FORWARD_IF_ERROR( + ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format), + "First few bytes detected incorrect" ); + /* return hint input size */ return (MAX((size_t)ZSTD_FRAMEHEADERSIZE_MIN(zds->format), hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */ } assert(ip != NULL); @@ -1966,8 +2137,9 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, (size_t)(oend-op), istart, cSize, ZSTD_getDDict(zds)); if (ZSTD_isError(decompressedSize)) return decompressedSize; DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()") + assert(istart != NULL); ip = istart + cSize; - op += decompressedSize; + op = op ? op + decompressedSize : op; /* can occur if frameContentSize = 0 (empty frame) */ zds->expected = 0; zds->streamStage = zdss_init; someMoreWork = 0; @@ -2038,7 +2210,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB zds->outBuffSize = neededOutBuffSize; } } } zds->streamStage = zdss_read; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_read: DEBUGLOG(5, "stage zdss_read"); @@ -2051,13 +2223,14 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB } if ((size_t)(iend-ip) >= neededInSize) { /* decode directly from src */ FORWARD_IF_ERROR(ZSTD_decompressContinueStream(zds, &op, oend, ip, neededInSize), ""); + assert(ip != NULL); ip += neededInSize; /* Function modifies the stage so we must break */ break; } } if (ip==iend) { someMoreWork = 0; break; } /* no more input */ zds->streamStage = zdss_load; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_load: { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds); @@ -2065,7 +2238,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB int const isSkipFrame = ZSTD_isSkipFrame(zds); size_t loadedSize; /* At this point we shouldn't be decompressing a block that we can stream. */ - assert(neededInSize == ZSTD_nextSrcSizeToDecompressWithInputSize(zds, iend - ip)); + assert(neededInSize == ZSTD_nextSrcSizeToDecompressWithInputSize(zds, (size_t)(iend - ip))); if (isSkipFrame) { loadedSize = MIN(toLoad, (size_t)(iend-ip)); } else { @@ -2074,8 +2247,11 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB "should never happen"); loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, (size_t)(iend-ip)); } - ip += loadedSize; - zds->inPos += loadedSize; + if (loadedSize != 0) { + /* ip may be NULL */ + ip += loadedSize; + zds->inPos += loadedSize; + } if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */ /* decode loaded input */ @@ -2085,14 +2261,17 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB break; } case zdss_flush: - { size_t const toFlushSize = zds->outEnd - zds->outStart; + { + size_t const toFlushSize = zds->outEnd - zds->outStart; size_t const flushedSize = ZSTD_limitCopy(op, (size_t)(oend-op), zds->outBuff + zds->outStart, toFlushSize); - op += flushedSize; + + op = op ? op + flushedSize : op; + zds->outStart += flushedSize; if (flushedSize == toFlushSize) { /* flush completed */ zds->streamStage = zdss_read; if ( (zds->outBuffSize < zds->fParams.frameContentSize) - && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) { + && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) { DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)", (int)(zds->outBuffSize - zds->outStart), (U32)zds->fParams.blockSizeMax); @@ -2106,7 +2285,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB default: assert(0); /* impossible */ - RETURN_ERROR(GENERIC, "impossible to reach"); /* some compiler require default to do something */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ } } /* result */ @@ -2119,8 +2298,8 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB if ((ip==istart) && (op==ostart)) { /* no forward progress */ zds->noForwardProgress ++; if (zds->noForwardProgress >= ZSTD_NO_FORWARD_PROGRESS_MAX) { - RETURN_ERROR_IF(op==oend, dstSize_tooSmall, ""); - RETURN_ERROR_IF(ip==iend, srcSize_wrong, ""); + RETURN_ERROR_IF(op==oend, noForwardProgress_destFull, ""); + RETURN_ERROR_IF(ip==iend, noForwardProgress_inputEmpty, ""); assert(0); } } else { @@ -2157,11 +2336,17 @@ size_t ZSTD_decompressStream_simpleArgs ( void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos) { - ZSTD_outBuffer output = { dst, dstCapacity, *dstPos }; - ZSTD_inBuffer input = { src, srcSize, *srcPos }; - /* ZSTD_compress_generic() will check validity of dstPos and srcPos */ - size_t const cErr = ZSTD_decompressStream(dctx, &output, &input); - *dstPos = output.pos; - *srcPos = input.pos; - return cErr; + ZSTD_outBuffer output; + ZSTD_inBuffer input; + output.dst = dst; + output.size = dstCapacity; + output.pos = *dstPos; + input.src = src; + input.size = srcSize; + input.pos = *srcPos; + { size_t const cErr = ZSTD_decompressStream(dctx, &output, &input); + *dstPos = output.pos; + *srcPos = input.pos; + return cErr; + } } diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.c b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.c similarity index 52% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.c rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.c index 349dcdc..0a06a02 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.c +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -20,12 +20,12 @@ #include "../common/mem.h" /* low level memory routines */ #define FSE_STATIC_LINKING_ONLY #include "../common/fse.h" -#define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "../common/zstd_internal.h" #include "zstd_decompress_internal.h" /* ZSTD_DCtx */ #include "zstd_ddict.h" /* ZSTD_DDictDictContent */ #include "zstd_decompress_block.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /*_******************************************************* * Macros @@ -69,15 +69,56 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, } } +/* Allocate buffer for literals, either overlapping current dst, or split between dst and litExtraBuffer, or stored entirely within litExtraBuffer */ +static void ZSTD_allocateLiteralsBuffer(ZSTD_DCtx* dctx, void* const dst, const size_t dstCapacity, const size_t litSize, + const streaming_operation streaming, const size_t expectedWriteSize, const unsigned splitImmediately) +{ + if (streaming == not_streaming && dstCapacity > ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH + litSize + WILDCOPY_OVERLENGTH) + { + /* room for litbuffer to fit without read faulting */ + dctx->litBuffer = (BYTE*)dst + ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_in_dst; + } + else if (litSize > ZSTD_LITBUFFEREXTRASIZE) + { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + if (splitImmediately) { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize - ZSTD_LITBUFFEREXTRASIZE; + } + else { + /* initially this will be stored entirely in dst during huffman decoding, it will partially be shifted to litExtraBuffer after */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize; + dctx->litBufferEnd = (BYTE*)dst + expectedWriteSize; + } + dctx->litBufferLocation = ZSTD_split; + } + else + { + /* fits entirely within litExtraBuffer, so no split is necessary */ + dctx->litBuffer = dctx->litExtraBuffer; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + } +} /* Hidden declaration for fullbench */ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, - const void* src, size_t srcSize); + const void* src, size_t srcSize, + void* dst, size_t dstCapacity, const streaming_operation streaming); /*! ZSTD_decodeLiteralsBlock() : + * Where it is possible to do so without being stomped by the output during decompression, the literals block will be stored + * in the dstBuffer. If there is room to do so, it will be stored in full in the excess dst space after where the current + * block will be output. Otherwise it will be stored at the end of the current dst blockspace, with a small portion being + * stored in dctx->litExtraBuffer to help keep it "ahead" of the current output write. + * * @return : nb of bytes read from src (< srcSize ) * note : symbol not declared but exposed for fullbench */ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, - const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */ + const void* src, size_t srcSize, /* note : srcSize < BLOCKSIZE */ + void* dst, size_t dstCapacity, const streaming_operation streaming) { DEBUGLOG(5, "ZSTD_decodeLiteralsBlock"); RETURN_ERROR_IF(srcSize < MIN_CBLOCK_SIZE, corruption_detected, ""); @@ -90,15 +131,19 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, case set_repeat: DEBUGLOG(5, "set_repeat flag : re-using stats from previous compressed literals block"); RETURN_ERROR_IF(dctx->litEntropy==0, dictionary_corrupted, ""); - /* fall-through */ + ZSTD_FALLTHROUGH; case set_compressed: - RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3"); + RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need up to 5 for case 3"); { size_t lhSize, litSize, litCSize; U32 singleStream=0; U32 const lhlCode = (istart[0] >> 2) & 3; U32 const lhc = MEM_readLE32(istart); size_t hufSuccess; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + int const flags = 0 + | (ZSTD_DCtx_get_bmi2(dctx) ? HUF_flags_bmi2 : 0) + | (dctx->disableHufAsm ? HUF_flags_disableAsm : 0); switch(lhlCode) { case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -121,8 +166,15 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, litCSize = (lhc >> 22) + ((size_t)istart[4] << 10); break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); + if (!singleStream) + RETURN_ERROR_IF(litSize < MIN_LITERALS_FOR_4_STREAMS, literals_headerWrong, + "Not enough literals (%zu) for the 4-streams mode (min %u)", + litSize, MIN_LITERALS_FOR_4_STREAMS); RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize , dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 0); /* prefetch huffman table if cold */ if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) { @@ -131,13 +183,14 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, if (litEncType==set_repeat) { if (singleStream) { - hufSuccess = HUF_decompress1X_usingDTable_bmi2( + hufSuccess = HUF_decompress1X_usingDTable( dctx->litBuffer, litSize, istart+lhSize, litCSize, - dctx->HUFptr, dctx->bmi2); + dctx->HUFptr, flags); } else { - hufSuccess = HUF_decompress4X_usingDTable_bmi2( + assert(litSize >= MIN_LITERALS_FOR_4_STREAMS); + hufSuccess = HUF_decompress4X_usingDTable( dctx->litBuffer, litSize, istart+lhSize, litCSize, - dctx->HUFptr, dctx->bmi2); + dctx->HUFptr, flags); } } else { if (singleStream) { @@ -145,20 +198,27 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, hufSuccess = HUF_decompress1X_DCtx_wksp( dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->workspace, - sizeof(dctx->workspace)); + sizeof(dctx->workspace), flags); #else - hufSuccess = HUF_decompress1X1_DCtx_wksp_bmi2( + hufSuccess = HUF_decompress1X1_DCtx_wksp( dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->workspace, - sizeof(dctx->workspace), dctx->bmi2); + sizeof(dctx->workspace), flags); #endif } else { - hufSuccess = HUF_decompress4X_hufOnly_wksp_bmi2( + hufSuccess = HUF_decompress4X_hufOnly_wksp( dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->workspace, - sizeof(dctx->workspace), dctx->bmi2); + sizeof(dctx->workspace), flags); } } + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litExtraBuffer, dctx->litBufferEnd - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memmove(dctx->litBuffer + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH, dctx->litBuffer, litSize - ZSTD_LITBUFFEREXTRASIZE); + dctx->litBuffer += ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd -= WILDCOPY_OVERLENGTH; + } RETURN_ERROR_IF(HUF_isError(hufSuccess), corruption_detected, ""); @@ -166,13 +226,13 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, dctx->litSize = litSize; dctx->litEntropy = 1; if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable; - ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); return litCSize + lhSize; } case set_basic: { size_t litSize, lhSize; U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); switch(lhlCode) { case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -185,27 +245,41 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, break; case 3: lhSize = 3; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize = 3"); litSize = MEM_readLE24(istart) >> 4; break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */ RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, ""); - ZSTD_memcpy(dctx->litBuffer, istart+lhSize, litSize); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memcpy(dctx->litExtraBuffer, istart + lhSize + litSize - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize); + } dctx->litPtr = dctx->litBuffer; dctx->litSize = litSize; - ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); return lhSize+litSize; } /* direct reference into compressed stream */ dctx->litPtr = istart+lhSize; dctx->litSize = litSize; + dctx->litBufferEnd = dctx->litPtr + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; return lhSize+litSize; } case set_rle: { U32 const lhlCode = ((istart[0]) >> 2) & 3; size_t litSize, lhSize; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); switch(lhlCode) { case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -214,16 +288,28 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, break; case 1: lhSize = 2; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 3"); litSize = MEM_readLE16(istart) >> 4; break; case 3: lhSize = 3; + RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 4"); litSize = MEM_readLE24(istart) >> 4; - RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4"); break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); - ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memset(dctx->litExtraBuffer, istart[lhSize], ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize); + } dctx->litPtr = dctx->litBuffer; dctx->litSize = litSize; return lhSize+1; @@ -343,7 +429,7 @@ static const ZSTD_seqSymbol ML_defaultDTable[(1<nbBits = 0; cell->nextState = 0; assert(nbAddBits < 255); - cell->nbAdditionalBits = (BYTE)nbAddBits; + cell->nbAdditionalBits = nbAddBits; cell->baseValue = baseValue; } @@ -367,7 +453,7 @@ static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddB FORCE_INLINE_TEMPLATE void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize) { ZSTD_seqSymbol* const tableDecode = dt+1; @@ -430,14 +516,15 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, for (i = 8; i < n; i += 8) { MEM_write64(spread + pos + i, sv); } - pos += n; + assert(n>=0); + pos += (size_t)n; } } /* Now we spread those positions across the table. - * The benefit of doing it in two stages is that we avoid the the + * The benefit of doing it in two stages is that we avoid the * variable size inner loop, which caused lots of branch misses. * Now we can run through all the positions without any branch misses. - * We unroll the loop twice, since that is what emperically worked best. + * We unroll the loop twice, since that is what empirically worked best. */ { size_t position = 0; @@ -464,7 +551,7 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, for (i=0; i highThreshold) position = (position + step) & tableMask; /* lowprob area */ + while (UNLIKELY(position > highThreshold)) position = (position + step) & tableMask; /* lowprob area */ } } assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ } @@ -475,10 +562,10 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, for (u=0; u max, corruption_detected, ""); { U32 const symbol = *(const BYTE*)src; U32 const baseline = baseValue[symbol]; - U32 const nbBits = nbAdditionalBits[symbol]; + U8 const nbBits = nbAdditionalBits[symbol]; ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits); } *DTablePtr = DTableSpace; @@ -620,7 +707,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, LL_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += llhSize; } @@ -632,7 +719,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, OF_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += ofhSize; } @@ -644,7 +731,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, ML_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += mlhSize; } @@ -713,7 +800,7 @@ HINT_INLINE void ZSTD_overlapCopy8(BYTE** op, BYTE const** ip, size_t offset) { * - ZSTD_overlap_src_before_dst: The src and dst may overlap and may be any distance apart. * The src buffer must be before the dst buffer. */ -static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { +static void ZSTD_safecopy(BYTE* op, const BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { ptrdiff_t const diff = op - ip; BYTE* const oend = op + length; @@ -729,6 +816,7 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ /* Copy 8 bytes and ensure the offset >= 8 when there can be overlap. */ assert(length >= 8); ZSTD_overlapCopy8(&op, &ip, diff); + length -= 8; assert(op - ip >= 8); assert(op <= oend); } @@ -743,12 +831,35 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ assert(oend > oend_w); ZSTD_wildcopy(op, ip, oend_w - op, ovtype); ip += oend_w - op; - op = oend_w; + op += oend_w - op; } /* Handle the leftovers. */ while (op < oend) *op++ = *ip++; } +/* ZSTD_safecopyDstBeforeSrc(): + * This version allows overlap with dst before src, or handles the non-overlap case with dst after src + * Kept separate from more common ZSTD_safecopy case to avoid performance impact to the safecopy common case */ +static void ZSTD_safecopyDstBeforeSrc(BYTE* op, BYTE const* ip, ptrdiff_t length) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + if (length < 8 || diff > -8) { + /* Handle short lengths, close overlaps, and dst not before src. */ + while (op < oend) *op++ = *ip++; + return; + } + + if (op <= oend - WILDCOPY_OVERLENGTH && diff < -WILDCOPY_VECLEN) { + ZSTD_wildcopy(op, ip, oend - WILDCOPY_OVERLENGTH - op, ZSTD_no_overlap); + ip += oend - WILDCOPY_OVERLENGTH - op; + op += oend - WILDCOPY_OVERLENGTH - op; + } + + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + /* ZSTD_execSequenceEnd(): * This version handles cases that are near the end of the output buffer. It requires * more careful checks to make sure there is no overflow. By separating out these hard @@ -759,9 +870,9 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ */ FORCE_NOINLINE size_t ZSTD_execSequenceEnd(BYTE* op, - BYTE* const oend, seq_t sequence, - const BYTE** litPtr, const BYTE* const litLimit, - const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) { BYTE* const oLitEnd = op + sequence.litLength; size_t const sequenceLength = sequence.litLength + sequence.matchLength; @@ -784,27 +895,76 @@ size_t ZSTD_execSequenceEnd(BYTE* op, if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { /* offset beyond prefix */ RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); - match = dictEnd - (prefixStart-match); + match = dictEnd - (prefixStart - match); if (match + sequence.matchLength <= dictEnd) { ZSTD_memmove(oLitEnd, match, sequence.matchLength); return sequenceLength; } /* span extDict & currentPrefixSegment */ { size_t const length1 = dictEnd - match; - ZSTD_memmove(oLitEnd, match, length1); - op = oLitEnd + length1; - sequence.matchLength -= length1; - match = prefixStart; - } } + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +/* ZSTD_execSequenceEndSplitLitBuffer(): + * This version is intended to be used during instances where the litBuffer is still split. It is kept separate to avoid performance impact for the good case. + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEndSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + RETURN_ERROR_IF(op > *litPtr && op < *litPtr + sequence.litLength, dstSize_tooSmall, "output should not catch up to and overwrite literal buffer"); + ZSTD_safecopyDstBeforeSrc(op, *litPtr, sequence.litLength); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); return sequenceLength; } HINT_INLINE size_t ZSTD_execSequence(BYTE* op, - BYTE* const oend, seq_t sequence, - const BYTE** litPtr, const BYTE* const litLimit, - const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) { BYTE* const oLitEnd = op + sequence.litLength; size_t const sequenceLength = sequence.litLength + sequence.matchLength; @@ -815,6 +975,103 @@ size_t ZSTD_execSequence(BYTE* op, assert(op != NULL /* Precondition */); assert(oend_w < oend /* No underflow */); + +#if defined(__aarch64__) + /* prefetch sequence starting from match that will be used for copy later */ + PREFETCH_L1(match); +#endif + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op + 16, (*litPtr) + 16, sequence.litLength - 16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequenceSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); /* Handle edge cases in a slow path: * - Read beyond end of literals * - Match end is within WILDCOPY_OVERLIMIT of oend @@ -824,7 +1081,7 @@ size_t ZSTD_execSequence(BYTE* op, iLitEnd > litLimit || oMatchEnd > oend_w || (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) - return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + return ZSTD_execSequenceEndSplitLitBuffer(op, oend, oend_w, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ assert(op <= oLitEnd /* No overflow */); @@ -892,6 +1149,7 @@ size_t ZSTD_execSequence(BYTE* op, return sequenceLength; } + static void ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt) { @@ -905,24 +1163,14 @@ ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqS } FORCE_INLINE_TEMPLATE void -ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD) +ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, U16 nextState, U32 nbBits) { - ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state]; - U32 const nbBits = DInfo.nbBits; size_t const lowBits = BIT_readBits(bitD, nbBits); - DStatePtr->state = DInfo.nextState + lowBits; -} - -FORCE_INLINE_TEMPLATE void -ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, ZSTD_seqSymbol const DInfo) -{ - U32 const nbBits = DInfo.nbBits; - size_t const lowBits = BIT_readBits(bitD, nbBits); - DStatePtr->state = DInfo.nextState + lowBits; + DStatePtr->state = nextState + lowBits; } /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum - * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1) + * offset bits. But we can only read at most STREAM_ACCUMULATOR_MIN_32 * bits before reloading. This value is the maximum number of bytes we read * after reloading when we are decoding long offsets. */ @@ -937,102 +1185,125 @@ FORCE_INLINE_TEMPLATE seq_t ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) { seq_t seq; - ZSTD_seqSymbol const llDInfo = seqState->stateLL.table[seqState->stateLL.state]; - ZSTD_seqSymbol const mlDInfo = seqState->stateML.table[seqState->stateML.state]; - ZSTD_seqSymbol const ofDInfo = seqState->stateOffb.table[seqState->stateOffb.state]; - U32 const llBase = llDInfo.baseValue; - U32 const mlBase = mlDInfo.baseValue; - U32 const ofBase = ofDInfo.baseValue; - BYTE const llBits = llDInfo.nbAdditionalBits; - BYTE const mlBits = mlDInfo.nbAdditionalBits; - BYTE const ofBits = ofDInfo.nbAdditionalBits; - BYTE const totalBits = llBits+mlBits+ofBits; - - /* sequence */ - { size_t offset; - if (ofBits > 1) { - ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); - ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); - assert(ofBits <= MaxOff); - if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { - U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed); - offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); - BIT_reloadDStream(&seqState->DStream); - if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits); - assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */ - } else { - offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); - } - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; - } else { - U32 const ll0 = (llBase == 0); - if (LIKELY((ofBits == 0))) { - if (LIKELY(!ll0)) - offset = seqState->prevOffset[0]; - else { - offset = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; - } - } else { - offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); - { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; - temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ - if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset = temp; - } } } - seq.offset = offset; - } - - seq.matchLength = mlBase; - if (mlBits > 0) - seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); - - if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) - BIT_reloadDStream(&seqState->DStream); - if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) - BIT_reloadDStream(&seqState->DStream); - /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ - ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); - - seq.litLength = llBase; - if (llBits > 0) - seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); - - if (MEM_32bits()) - BIT_reloadDStream(&seqState->DStream); - - DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", - (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); - - /* ANS state update - * gcc-9.0.0 does 2.5% worse with ZSTD_updateFseStateWithDInfo(). - * clang-9.2.0 does 7% worse with ZSTD_updateFseState(). - * Naturally it seems like ZSTD_updateFseStateWithDInfo() should be the - * better option, so it is the default for other compilers. But, if you - * measure that it is worse, please put up a pull request. + /* + * ZSTD_seqSymbol is a structure with a total of 64 bits wide. So it can be + * loaded in one operation and extracted its fields by simply shifting or + * bit-extracting on aarch64. + * GCC doesn't recognize this and generates more unnecessary ldr/ldrb/ldrh + * operations that cause performance drop. This can be avoided by using this + * ZSTD_memcpy hack. */ - { -#if defined(__GNUC__) && !defined(__clang__) - const int kUseUpdateFseState = 1; +#if defined(__aarch64__) && (defined(__GNUC__) && !defined(__clang__)) + ZSTD_seqSymbol llDInfoS, mlDInfoS, ofDInfoS; + ZSTD_seqSymbol* const llDInfo = &llDInfoS; + ZSTD_seqSymbol* const mlDInfo = &mlDInfoS; + ZSTD_seqSymbol* const ofDInfo = &ofDInfoS; + ZSTD_memcpy(llDInfo, seqState->stateLL.table + seqState->stateLL.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(mlDInfo, seqState->stateML.table + seqState->stateML.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(ofDInfo, seqState->stateOffb.table + seqState->stateOffb.state, sizeof(ZSTD_seqSymbol)); #else - const int kUseUpdateFseState = 0; + const ZSTD_seqSymbol* const llDInfo = seqState->stateLL.table + seqState->stateLL.state; + const ZSTD_seqSymbol* const mlDInfo = seqState->stateML.table + seqState->stateML.state; + const ZSTD_seqSymbol* const ofDInfo = seqState->stateOffb.table + seqState->stateOffb.state; #endif - if (kUseUpdateFseState) { - ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ - ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ - ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ - } else { - ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llDInfo); /* <= 9 bits */ - ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlDInfo); /* <= 9 bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ - ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofDInfo); /* <= 8 bits */ + seq.matchLength = mlDInfo->baseValue; + seq.litLength = llDInfo->baseValue; + { U32 const ofBase = ofDInfo->baseValue; + BYTE const llBits = llDInfo->nbAdditionalBits; + BYTE const mlBits = mlDInfo->nbAdditionalBits; + BYTE const ofBits = ofDInfo->nbAdditionalBits; + BYTE const totalBits = llBits+mlBits+ofBits; + + U16 const llNext = llDInfo->nextState; + U16 const mlNext = mlDInfo->nextState; + U16 const ofNext = ofDInfo->nextState; + U32 const llnbBits = llDInfo->nbBits; + U32 const mlnbBits = mlDInfo->nbBits; + U32 const ofnbBits = ofDInfo->nbBits; + + assert(llBits <= MaxLLBits); + assert(mlBits <= MaxMLBits); + assert(ofBits <= MaxOff); + /* + * As gcc has better branch and block analyzers, sometimes it is only + * valuable to mark likeliness for clang, it gives around 3-4% of + * performance. + */ + + /* sequence */ + { size_t offset; + #if defined(__clang__) + if (LIKELY(ofBits > 1)) { + #else + if (ofBits > 1) { + #endif + ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); + ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 > LONG_OFFSETS_MAX_EXTRA_BITS_32); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 - LONG_OFFSETS_MAX_EXTRA_BITS_32 >= MaxMLBits); + if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { + /* Always read extra bits, this keeps the logic simple, + * avoids branches, and avoids accidentally reading 0 bits. + */ + U32 const extraBits = LONG_OFFSETS_MAX_EXTRA_BITS_32; + offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); + BIT_reloadDStream(&seqState->DStream); + offset += BIT_readBitsFast(&seqState->DStream, extraBits); + } else { + offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); + } + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; + } else { + U32 const ll0 = (llDInfo->baseValue == 0); + if (LIKELY((ofBits == 0))) { + offset = seqState->prevOffset[ll0]; + seqState->prevOffset[1] = seqState->prevOffset[!ll0]; + seqState->prevOffset[0] = offset; + } else { + offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); + { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; + temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ + if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + } } } + seq.offset = offset; } + + #if defined(__clang__) + if (UNLIKELY(mlBits > 0)) + #else + if (mlBits > 0) + #endif + seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); + + if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) + BIT_reloadDStream(&seqState->DStream); + if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) + BIT_reloadDStream(&seqState->DStream); + /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ + ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); + + #if defined(__clang__) + if (UNLIKELY(llBits > 0)) + #else + if (llBits > 0) + #endif + seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); + + if (MEM_32bits()) + BIT_reloadDStream(&seqState->DStream); + + DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + + ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llNext, llnbBits); /* <= 9 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlNext, mlnbBits); /* <= 9 bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofNext, ofnbBits); /* <= 8 bits */ } return seq; @@ -1085,9 +1356,11 @@ MEM_STATIC void ZSTD_assertValidSequence( #endif #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + + FORCE_INLINE_TEMPLATE size_t DONT_VECTORIZE -ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, +ZSTD_decompressSequences_bodySplitLitBuffer( ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, const ZSTD_longOffset_e isLongOffset, @@ -1099,11 +1372,11 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, BYTE* const oend = ostart + maxDstSize; BYTE* op = ostart; const BYTE* litPtr = dctx->litPtr; - const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* litBufferEnd = dctx->litBufferEnd; const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); const BYTE* const vBase = (const BYTE*) (dctx->virtualStart); const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); - DEBUGLOG(5, "ZSTD_decompressSequences_body"); + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer"); (void)frame; /* Regen sequences */ @@ -1124,55 +1397,237 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, BIT_DStream_endOfBuffer < BIT_DStream_completed && BIT_DStream_completed < BIT_DStream_overflow); + /* decompress without overrunning litPtr begins */ + { + seq_t sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + /* Align the decompression loop to 32 + 16 bytes. + * + * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression + * speed swings based on the alignment of the decompression loop. This + * performance swing is caused by parts of the decompression loop falling + * out of the DSB. The entire decompression loop should fit in the DSB, + * when it can't we get much worse performance. You can measure if you've + * hit the good case or the bad case with this perf command for some + * compressed file test.zst: + * + * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ + * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst + * + * If you see most cycles served out of the MITE you've hit the bad case. + * If you see most cycles served out of the DSB you've hit the good case. + * If it is pretty even then you may be in an okay case. + * + * This issue has been reproduced on the following CPUs: + * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 + * Use Instruments->Counters to get DSB/MITE cycles. + * I never got performance swings, but I was able to + * go from the good case of mostly DSB to half of the + * cycles served from MITE. + * - Coffeelake: Intel i9-9900k + * - Coffeelake: Intel i7-9700k + * + * I haven't been able to reproduce the instability or DSB misses on any + * of the following CPUS: + * - Haswell + * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH + * - Skylake + * + * Alignment is done for each of the three major decompression loops: + * - ZSTD_decompressSequences_bodySplitLitBuffer - presplit section of the literal buffer + * - ZSTD_decompressSequences_bodySplitLitBuffer - postsplit section of the literal buffer + * - ZSTD_decompressSequences_body + * Alignment choices are made to minimize large swings on bad cases and influence on performance + * from changes external to this code, rather than to overoptimize on the current commit. + * + * If you are seeing performance stability this script can help test. + * It tests on 4 commits in zstd where I saw performance change. + * + * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 + */ #if defined(__GNUC__) && defined(__x86_64__) - /* Align the decompression loop to 32 + 16 bytes. - * - * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression - * speed swings based on the alignment of the decompression loop. This - * performance swing is caused by parts of the decompression loop falling - * out of the DSB. The entire decompression loop should fit in the DSB, - * when it can't we get much worse performance. You can measure if you've - * hit the good case or the bad case with this perf command for some - * compressed file test.zst: - * - * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ - * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst - * - * If you see most cycles served out of the MITE you've hit the bad case. - * If you see most cycles served out of the DSB you've hit the good case. - * If it is pretty even then you may be in an okay case. - * - * This issue has been reproduced on the following CPUs: - * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 - * Use Instruments->Counters to get DSB/MITE cycles. - * I never got performance swings, but I was able to - * go from the good case of mostly DSB to half of the - * cycles served from MITE. - * - Coffeelake: Intel i9-9900k - * - Coffeelake: Intel i7-9700k - * - * I haven't been able to reproduce the instability or DSB misses on any - * of the following CPUS: - * - Haswell - * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH - * - Skylake - * - * If you are seeing performance stability this script can help test. - * It tests on 4 commits in zstd where I saw performance change. - * - * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 - */ - __asm__(".p2align 6"); - __asm__("nop"); - __asm__(".p2align 5"); - __asm__("nop"); -# if __GNUC__ >= 9 - /* better for gcc-9 and gcc-10, worse for clang and gcc-8 */ - __asm__(".p2align 3"); -# else - __asm__(".p2align 4"); + __asm__(".p2align 6"); +# if __GNUC__ >= 7 + /* good for gcc-7, gcc-9, and gcc-11 */ + __asm__("nop"); + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 4"); +# if __GNUC__ == 8 || __GNUC__ == 10 + /* good for gcc-8 and gcc-10 */ + __asm__("nop"); + __asm__(".p2align 3"); +# endif # endif #endif + + /* Handle the initial state where litBuffer is currently split between dst and litExtraBuffer */ + for (; litPtr + sequence.litLength <= dctx->litBufferEnd; ) { + size_t const oneSeqSize = ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence.litLength - WILDCOPY_OVERLENGTH, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + } + + /* If there are more sequences, they will need to read literals from litExtraBuffer; copy over the remainder from dst and update litPtr and litEnd */ + if (nbSeq > 0) { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence.litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (--nbSeq) + BIT_reloadDStream(&(seqState.DStream)); + } + } + } + + if (nbSeq > 0) /* there is remaining lit from extra buffer */ + { + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ != 7 + /* worse for gcc-7 better for gcc-8, gcc-9, and gcc-10 and clang */ + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# elif __GNUC__ >= 11 + __asm__(".p2align 3"); +# else + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for (; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* split hasn't been reached yet, first get dst then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_body(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_not_in_dst ? ostart + maxDstSize : dctx->litBuffer; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* const prefixStart = (const BYTE*)(dctx->prefixStart); + const BYTE* const vBase = (const BYTE*)(dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*)(dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_body: nbSeq = %d", nbSeq); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend - ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ >= 7 + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# else + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + for ( ; ; ) { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd); @@ -1218,6 +1673,16 @@ ZSTD_decompressSequences_default(ZSTD_DCtx* dctx, { return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } + +static size_t +ZSTD_decompressSequencesSplitLitBuffer_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT @@ -1250,10 +1715,10 @@ ZSTD_decompressSequencesLong_body( const BYTE* ip = (const BYTE*)seqStart; const BYTE* const iend = ip + seqSize; BYTE* const ostart = (BYTE*)dst; - BYTE* const oend = ostart + maxDstSize; + BYTE* const oend = dctx->litBufferLocation == ZSTD_in_dst ? dctx->litBuffer : ostart + maxDstSize; BYTE* op = ostart; const BYTE* litPtr = dctx->litPtr; - const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* litBufferEnd = dctx->litBufferEnd; const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart); const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); @@ -1289,32 +1754,94 @@ ZSTD_decompressSequencesLong_body( } RETURN_ERROR_IF(seqNblitBufferLocation == ZSTD_split && litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength > dctx->litBufferEnd) + { + /* lit buffer is reaching split point, empty out the first buffer and transition to litExtraBuffer */ + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + else + { + /* lit buffer is either wholly contained in first or second split, or not split at all*/ + oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength - WILDCOPY_OVERLENGTH, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } } RETURN_ERROR_IF(seqNblitBufferLocation == ZSTD_split && litPtr + sequence->litLength > dctx->litBufferEnd) + { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence->litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); #if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) - assert(!ZSTD_isError(oneSeqSize)); - if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); #endif - if (ZSTD_isError(oneSeqSize)) return oneSeqSize; - op += oneSeqSize; + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + else + { + size_t const oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence->litLength - WILDCOPY_OVERLENGTH, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } } /* save reps for next block */ @@ -1322,10 +1849,21 @@ ZSTD_decompressSequencesLong_body( } /* last literal segment */ - { size_t const lastLLSize = litEnd - litPtr; + if (dctx->litBufferLocation == ZSTD_split) /* first deplete literal buffer in dst, then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + } + { size_t const lastLLSize = litBufferEnd - litPtr; RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); if (op != NULL) { - ZSTD_memcpy(op, litPtr, lastLLSize); + ZSTD_memmove(op, litPtr, lastLLSize); op += lastLLSize; } } @@ -1349,7 +1887,7 @@ ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx, #if DYNAMIC_BMI2 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t DONT_VECTORIZE ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, @@ -1359,10 +1897,20 @@ ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, { return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequencesSplitLitBuffer_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, @@ -1391,11 +1939,25 @@ ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, { DEBUGLOG(5, "ZSTD_decompressSequences"); #if DYNAMIC_BMI2 - if (dctx->bmi2) { + if (ZSTD_DCtx_get_bmi2(dctx)) { return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif - return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static size_t +ZSTD_decompressSequencesSplitLitBuffer(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesSplitLitBuffer"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesSplitLitBuffer_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesSplitLitBuffer_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ @@ -1415,7 +1977,7 @@ ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, { DEBUGLOG(5, "ZSTD_decompressSequencesLong"); #if DYNAMIC_BMI2 - if (dctx->bmi2) { + if (ZSTD_DCtx_get_bmi2(dctx)) { return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif @@ -1424,55 +1986,101 @@ ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ +/** + * @returns The total size of the history referencable by zstd, including + * both the prefix and the extDict. At @p op any offset larger than this + * is invalid. + */ +static size_t ZSTD_totalHistorySize(BYTE* op, BYTE const* virtualStart) +{ + return (size_t)(op - virtualStart); +} -#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ - !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) -/* ZSTD_getLongOffsetsShare() : +typedef struct { + unsigned longOffsetShare; + unsigned maxNbAdditionalBits; +} ZSTD_OffsetInfo; + +/* ZSTD_getOffsetInfo() : * condition : offTable must be valid * @return : "share" of long offsets (arbitrarily defined as > (1<<23)) - * compared to maximum possible of (1< 22) total += 1; + assert(max <= (1 << OffFSELog)); /* max not too large */ + for (u=0; u 22) info.longOffsetShare += 1; + } + + assert(tableLog <= OffFSELog); + info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ } - assert(tableLog <= OffFSELog); - total <<= (OffFSELog - tableLog); /* scale to OffFSELog */ - - return total; + return info; +} + +/** + * @returns The maximum offset we can decode in one read of our bitstream, without + * reloading more bits in the middle of the offset bits read. Any offsets larger + * than this must use the long offset decoder. + */ +static size_t ZSTD_maxShortOffset(void) +{ + if (MEM_64bits()) { + /* We can decode any offset without reloading bits. + * This might change if the max window size grows. + */ + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + return (size_t)-1; + } else { + /* The maximum offBase is (1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1. + * This offBase would require STREAM_ACCUMULATOR_MIN extra bits. + * Then we have to subtract ZSTD_REP_NUM to get the maximum possible offset. + */ + size_t const maxOffbase = ((size_t)1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1; + size_t const maxOffset = maxOffbase - ZSTD_REP_NUM; + assert(ZSTD_highbit32((U32)maxOffbase) == STREAM_ACCUMULATOR_MIN); + return maxOffset; + } } -#endif size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, - const void* src, size_t srcSize, const int frame) + const void* src, size_t srcSize, const int frame, const streaming_operation streaming) { /* blockType == blockCompressed */ const BYTE* ip = (const BYTE*)src; - /* isLongOffset must be true if there are long offsets. - * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN. - * We don't expect that to be the case in 64-bit mode. - * In block mode, window size is not known, so we have to be conservative. - * (note: but it could be evaluated from current-lowLimit) - */ - ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || (dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)))); DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize); - RETURN_ERROR_IF(srcSize >= ZSTD_BLOCKSIZE_MAX, srcSize_wrong, ""); + /* Note : the wording of the specification + * allows compressed block to be sized exactly ZSTD_BLOCKSIZE_MAX. + * This generally does not happen, as it makes little sense, + * since an uncompressed block would feature same size and have no decompression cost. + * Also, note that decoder from reference libzstd before < v1.5.4 + * would consider this edge case as an error. + * As a consequence, avoid generating compressed blocks of size ZSTD_BLOCKSIZE_MAX + * for broader compatibility with the deployed ecosystem of zstd decoders */ + RETURN_ERROR_IF(srcSize > ZSTD_BLOCKSIZE_MAX, srcSize_wrong, ""); /* Decode literals section */ - { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize); - DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize); + { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize, dst, dstCapacity, streaming); + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : cSize=%u, nbLiterals=%zu", (U32)litCSize, dctx->litSize); if (ZSTD_isError(litCSize)) return litCSize; ip += litCSize; srcSize -= litCSize; @@ -1480,6 +2088,23 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, /* Build Decoding Tables */ { + /* Compute the maximum block size, which must also work when !frame and fParams are unset. + * Additionally, take the min with dstCapacity to ensure that the totalHistorySize fits in a size_t. + */ + size_t const blockSizeMax = MIN(dstCapacity, (frame ? dctx->fParams.blockSizeMax : ZSTD_BLOCKSIZE_MAX)); + size_t const totalHistorySize = ZSTD_totalHistorySize((BYTE*)dst + blockSizeMax, (BYTE const*)dctx->virtualStart); + /* isLongOffset must be true if there are long offsets. + * Offsets are long if they are larger than ZSTD_maxShortOffset(). + * We don't expect that to be the case in 64-bit mode. + * + * We check here to see if our history is large enough to allow long offsets. + * If it isn't, then we can't possible have (valid) long offsets. If the offset + * is invalid, then it is okay to read it incorrectly. + * + * If isLongOffsets is true, then we will later check our decoding table to see + * if it is even possible to generate long offsets. + */ + ZSTD_longOffset_e isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (totalHistorySize > ZSTD_maxShortOffset())); /* These macros control at build-time which decompressor implementation * we use. If neither is defined, we do some inspection and dispatch at * runtime. @@ -1487,6 +2112,11 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) int usePrefetchDecoder = dctx->ddictIsCold; +#else + /* Set to 1 to avoid computing offset info if we don't need to. + * Otherwise this value is ignored. + */ + int usePrefetchDecoder = 1; #endif int nbSeq; size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize); @@ -1496,30 +2126,45 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, RETURN_ERROR_IF(dst == NULL && nbSeq > 0, dstSize_tooSmall, "NULL not handled"); -#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ - !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) - if ( !usePrefetchDecoder - && (!frame || (dctx->fParams.windowSize > (1<<24))) - && (nbSeq>ADVANCED_SEQS) ) { /* could probably use a larger nbSeq limit */ - U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr); - U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ - usePrefetchDecoder = (shareLongOffsets >= minShare); + /* If we could potentially have long offsets, or we might want to use the prefetch decoder, + * compute information about the share of long offsets, and the maximum nbAdditionalBits. + * NOTE: could probably use a larger nbSeq limit + */ + if (isLongOffset || (!usePrefetchDecoder && (totalHistorySize > (1u << 24)) && (nbSeq > 8))) { + ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr, nbSeq); + if (isLongOffset && info.maxNbAdditionalBits <= STREAM_ACCUMULATOR_MIN) { + /* If isLongOffset, but the maximum number of additional bits that we see in our table is small + * enough, then we know it is impossible to have too long an offset in this block, so we can + * use the regular offset decoder. + */ + isLongOffset = ZSTD_lo_isRegularOffset; + } + if (!usePrefetchDecoder) { + U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ + usePrefetchDecoder = (info.longOffsetShare >= minShare); + } } -#endif dctx->ddictIsCold = 0; #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) - if (usePrefetchDecoder) + if (usePrefetchDecoder) { +#else + (void)usePrefetchDecoder; + { #endif #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); #endif + } #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG /* else */ - return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + if (dctx->litBufferLocation == ZSTD_split) + return ZSTD_decompressSequencesSplitLitBuffer(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + else + return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); #endif } } @@ -1542,7 +2187,7 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, { size_t dSize; ZSTD_checkContinuity(dctx, dst, dstCapacity); - dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0); + dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0, not_streaming); dctx->previousDstEnd = (char*)dst + dSize; return dSize; } diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.h b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.h similarity index 86% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.h rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.h index 049a0cd..67791db 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_block.h +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_block.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -33,6 +33,12 @@ */ + /* Streaming state is used to inform allocation of the literal buffer */ +typedef enum { + not_streaming = 0, + is_streaming = 1 +} streaming_operation; + /* ZSTD_decompressBlock_internal() : * decompress block, starting at `src`, * into destination buffer `dst`. @@ -41,7 +47,7 @@ */ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, - const void* src, size_t srcSize, const int frame); + const void* src, size_t srcSize, const int frame, const streaming_operation streaming); /* ZSTD_buildFSETable() : * generate FSE decoding table for one symbol (ll, ml or off) @@ -54,7 +60,7 @@ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, */ void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize, int bmi2); diff --git a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_internal.h b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_internal.h similarity index 84% rename from src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_internal.h rename to src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_internal.h index ebda0c9..c2ec5d9 100644 --- a/src/dependencies/zstd-1.5.0/lib/decompress/zstd_decompress_internal.h +++ b/src/dependencies/zstd-1.5.4/lib/decompress/zstd_decompress_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -20,7 +20,7 @@ * Dependencies *********************************************************/ #include "../common/mem.h" /* BYTE, U16, U32 */ -#include "../common/zstd_internal.h" /* ZSTD_seqSymbol */ +#include "../common/zstd_internal.h" /* constants : MaxLL, MaxML, MaxOff, LLFSELog, etc. */ @@ -40,7 +40,7 @@ static UNUSED_ATTR const U32 OF_base[MaxOff+1] = { 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD }; -static UNUSED_ATTR const U32 OF_bits[MaxOff+1] = { +static UNUSED_ATTR const U8 OF_bits[MaxOff+1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -75,12 +75,13 @@ static UNUSED_ATTR const U32 ML_base[MaxML+1] = { #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 typedef struct { ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */ ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */ - HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */ + HUF_DTable hufTable[HUF_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUF_decompress4X */ U32 rep[ZSTD_REP_NUM]; U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32]; } ZSTD_entropyDTables_t; @@ -106,6 +107,22 @@ typedef struct { size_t ddictPtrCount; } ZSTD_DDictHashSet; +#ifndef ZSTD_DECODER_INTERNAL_BUFFER +# define ZSTD_DECODER_INTERNAL_BUFFER (1 << 16) +#endif + +#define ZSTD_LBMIN 64 +#define ZSTD_LBMAX (128 << 10) + +/* extra buffer, compensates when dst is not large enough to store litBuffer */ +#define ZSTD_LITBUFFEREXTRASIZE BOUNDED(ZSTD_LBMIN, ZSTD_DECODER_INTERNAL_BUFFER, ZSTD_LBMAX) + +typedef enum { + ZSTD_not_in_dst = 0, /* Stored entirely within litExtraBuffer */ + ZSTD_in_dst = 1, /* Stored entirely within dst (in memory after current output write) */ + ZSTD_split = 2 /* Split between litExtraBuffer and dst */ +} ZSTD_litLocation_e; + struct ZSTD_DCtx_s { const ZSTD_seqSymbol* LLTptr; @@ -136,7 +153,9 @@ struct ZSTD_DCtx_s size_t litSize; size_t rleSize; size_t staticSize; +#if DYNAMIC_BMI2 != 0 int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */ +#endif /* dictionary */ ZSTD_DDict* ddictLocal; @@ -146,6 +165,7 @@ struct ZSTD_DCtx_s ZSTD_dictUses_e dictUses; ZSTD_DDictHashSet* ddictSet; /* Hash set for multiple ddicts */ ZSTD_refMultipleDDicts_e refMultipleDDicts; /* User specified: if == 1, will allow references to multiple DDicts. Default == 0 (disabled) */ + int disableHufAsm; /* streaming */ ZSTD_dStreamStage streamStage; @@ -158,16 +178,21 @@ struct ZSTD_DCtx_s size_t outStart; size_t outEnd; size_t lhSize; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) void* legacyContext; U32 previousLegacyVersion; U32 legacyVersion; +#endif U32 hostageByte; int noForwardProgress; ZSTD_bufferMode_e outBufferMode; ZSTD_outBuffer expectedOutBuffer; /* workspace */ - BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH]; + BYTE* litBuffer; + const BYTE* litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[ZSTD_LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH]; /* literal buffer can be split between storage within dst and within this scratch buffer */ BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; size_t oversizedDuration; @@ -183,6 +208,14 @@ struct ZSTD_DCtx_s #endif }; /* typedef'd to ZSTD_DCtx within "zstd.h" */ +MEM_STATIC int ZSTD_DCtx_get_bmi2(const struct ZSTD_DCtx_s *dctx) { +#if DYNAMIC_BMI2 != 0 + return dctx->bmi2; +#else + (void)dctx; + return 0; +#endif +} /*-******************************************************* * Shared internal functions diff --git a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff.h b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff.h similarity index 99% rename from src/dependencies/zstd-1.5.0/lib/deprecated/zbuff.h rename to src/dependencies/zstd-1.5.4/lib/deprecated/zbuff.h index b83ea0f..a968245 100644 --- a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff.h +++ b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_common.c b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_common.c similarity index 94% rename from src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_common.c rename to src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_common.c index e7d01a0..5a2f2db 100644 --- a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_common.c +++ b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_compress.c b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_compress.c similarity index 75% rename from src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_compress.c rename to src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_compress.c index 2e72267..1d86821 100644 --- a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_compress.c +++ b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_compress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -15,6 +15,7 @@ ***************************************/ #define ZBUFF_STATIC_LINKING_ONLY #include "zbuff.h" +#include "../common/error_private.h" /*-*********************************************************** @@ -73,13 +74,32 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc, ZSTD_parameters params, unsigned long long pledgedSrcSize) { if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* preserve "0 == unknown" behavior */ - return ZSTD_initCStream_advanced(zbc, dict, dictSize, params, pledgedSrcSize); -} + FORWARD_IF_ERROR(ZSTD_CCtx_reset(zbc, ZSTD_reset_session_only), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setPledgedSrcSize(zbc, pledgedSrcSize), ""); + FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_windowLog, params.cParams.windowLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_hashLog, params.cParams.hashLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_chainLog, params.cParams.chainLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_searchLog, params.cParams.searchLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_minMatch, params.cParams.minMatch), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_targetLength, params.cParams.targetLength), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_strategy, params.cParams.strategy), ""); + + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_contentSizeFlag, params.fParams.contentSizeFlag), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_checksumFlag, params.fParams.checksumFlag), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_dictIDFlag, params.fParams.noDictIDFlag), ""); + + FORWARD_IF_ERROR(ZSTD_CCtx_loadDictionary(zbc, dict, dictSize), ""); + return 0; +} size_t ZBUFF_compressInitDictionary(ZBUFF_CCtx* zbc, const void* dict, size_t dictSize, int compressionLevel) { - return ZSTD_initCStream_usingDict(zbc, dict, dictSize, compressionLevel); + FORWARD_IF_ERROR(ZSTD_CCtx_reset(zbc, ZSTD_reset_session_only), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_compressionLevel, compressionLevel), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_loadDictionary(zbc, dict, dictSize), ""); + return 0; } size_t ZBUFF_compressInit(ZBUFF_CCtx* zbc, int compressionLevel) diff --git a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_decompress.c b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_decompress.c similarity index 89% rename from src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_decompress.c rename to src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_decompress.c index d73c0f3..12a66af 100644 --- a/src/dependencies/zstd-1.5.0/lib/deprecated/zbuff_decompress.c +++ b/src/dependencies/zstd-1.5.4/lib/deprecated/zbuff_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -13,6 +13,8 @@ /* ************************************* * Dependencies ***************************************/ +#define ZSTD_DISABLE_DEPRECATE_WARNINGS /* suppress warning on ZSTD_initDStream_usingDict */ +#include "../zstd.h" /* ZSTD_CStream, ZSTD_DStream, ZSTDLIB_API */ #define ZBUFF_STATIC_LINKING_ONLY #include "zbuff.h" diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.c b/src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.c rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.c index 8364444..9e5e7d5 100644 --- a/src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.c +++ b/src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -34,12 +34,20 @@ #include "../common/pool.h" #include "../common/threading.h" #include "../common/zstd_internal.h" /* includes zstd.h */ +#include "../common/bits.h" /* ZSTD_highbit32 */ #include "../zdict.h" #include "cover.h" /*-************************************* * Constants ***************************************/ +/** +* There are 32bit indexes used to ref samples, so limit samples size to 4GB +* on 64bit builds. +* For 32bit builds we choose 1 GB. +* Most 32bit platforms have 2GB user-mode addressable space and we allocate a large +* contiguous buffer, so 1GB is already a high limit. +*/ #define COVER_MAX_SAMPLES_SIZE (sizeof(size_t) == 8 ? ((unsigned)-1) : ((unsigned)1 GB)) #define COVER_DEFAULT_SPLITPOINT 1.0 @@ -47,7 +55,7 @@ * Console display ***************************************/ #ifndef LOCALDISPLAYLEVEL -static int g_displayLevel = 2; +static int g_displayLevel = 0; #endif #undef DISPLAY #define DISPLAY(...) \ @@ -534,7 +542,7 @@ static void COVER_ctx_destroy(COVER_ctx_t *ctx) { /** * Prepare a context for dictionary building. - * The context is only dependent on the parameter `d` and can used multiple + * The context is only dependent on the parameter `d` and can be used multiple * times. * Returns 0 on success or error code on error. * The context must be destroyed with `COVER_ctx_destroy()`. @@ -639,7 +647,7 @@ static size_t COVER_ctx_init(COVER_ctx_t *ctx, const void *samplesBuffer, void COVER_warnOnSmallCorpus(size_t maxDictSize, size_t nbDmers, int displayLevel) { - const double ratio = (double)nbDmers / maxDictSize; + const double ratio = (double)nbDmers / (double)maxDictSize; if (ratio >= 10) { return; } @@ -735,7 +743,7 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover( COVER_map_t activeDmers; parameters.splitPoint = 1.0; /* Initialize global data */ - g_displayLevel = parameters.zParams.notificationLevel; + g_displayLevel = (int)parameters.zParams.notificationLevel; /* Checks */ if (!COVER_checkParameters(parameters, dictBufferCapacity)) { DISPLAYLEVEL(1, "Cover parameters incorrect\n"); @@ -943,9 +951,17 @@ void COVER_best_finish(COVER_best_t *best, ZDICT_cover_params_t parameters, } } +static COVER_dictSelection_t setDictSelection(BYTE* buf, size_t s, size_t csz) +{ + COVER_dictSelection_t ds; + ds.dictContent = buf; + ds.dictSize = s; + ds.totalCompressedSize = csz; + return ds; +} + COVER_dictSelection_t COVER_dictSelectionError(size_t error) { - COVER_dictSelection_t selection = { NULL, 0, error }; - return selection; + return setDictSelection(NULL, 0, error); } unsigned COVER_dictSelectionIsError(COVER_dictSelection_t selection) { @@ -998,9 +1014,8 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBuffe } if (params.shrinkDict == 0) { - COVER_dictSelection_t selection = { largestDictbuffer, dictContentSize, totalCompressedSize }; free(candidateDictBuffer); - return selection; + return setDictSelection(largestDictbuffer, dictContentSize, totalCompressedSize); } largestDict = dictContentSize; @@ -1032,20 +1047,16 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBuffe return COVER_dictSelectionError(totalCompressedSize); } - if (totalCompressedSize <= largestCompressed * regressionTolerance) { - COVER_dictSelection_t selection = { candidateDictBuffer, dictContentSize, totalCompressedSize }; + if ((double)totalCompressedSize <= (double)largestCompressed * regressionTolerance) { free(largestDictbuffer); - return selection; + return setDictSelection( candidateDictBuffer, dictContentSize, totalCompressedSize ); } dictContentSize *= 2; } dictContentSize = largestDict; totalCompressedSize = largestCompressed; - { - COVER_dictSelection_t selection = { largestDictbuffer, dictContentSize, totalCompressedSize }; - free(candidateDictBuffer); - return selection; - } + free(candidateDictBuffer); + return setDictSelection( largestDictbuffer, dictContentSize, totalCompressedSize ); } /** diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.h b/src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.h rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.h index 1aacddd..252624b 100644 --- a/src/dependencies/zstd-1.5.0/lib/dictBuilder/cover.h +++ b/src/dependencies/zstd-1.5.4/lib/dictBuilder/cover.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/divsufsort.c b/src/dependencies/zstd-1.5.4/lib/dictBuilder/divsufsort.c similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/divsufsort.c rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/divsufsort.c diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/divsufsort.h b/src/dependencies/zstd-1.5.4/lib/dictBuilder/divsufsort.h similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/divsufsort.h rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/divsufsort.h diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/fastcover.c b/src/dependencies/zstd-1.5.4/lib/dictBuilder/fastcover.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/fastcover.c rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/fastcover.c index ed789f9..46bba01 100644 --- a/src/dependencies/zstd-1.5.0/lib/dictBuilder/fastcover.c +++ b/src/dependencies/zstd-1.5.4/lib/dictBuilder/fastcover.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -32,6 +32,13 @@ /*-************************************* * Constants ***************************************/ +/** +* There are 32bit indexes used to ref samples, so limit samples size to 4GB +* on 64bit builds. +* For 32bit builds we choose 1 GB. +* Most 32bit platforms have 2GB user-mode addressable space and we allocate a large +* contiguous buffer, so 1GB is already a high limit. +*/ #define FASTCOVER_MAX_SAMPLES_SIZE (sizeof(size_t) == 8 ? ((unsigned)-1) : ((unsigned)1 GB)) #define FASTCOVER_MAX_F 31 #define FASTCOVER_MAX_ACCEL 10 @@ -44,7 +51,7 @@ * Console display ***************************************/ #ifndef LOCALDISPLAYLEVEL -static int g_displayLevel = 2; +static int g_displayLevel = 0; #endif #undef DISPLAY #define DISPLAY(...) \ @@ -297,7 +304,7 @@ FASTCOVER_computeFrequency(U32* freqs, const FASTCOVER_ctx_t* ctx) /** * Prepare a context for dictionary building. - * The context is only dependent on the parameter `d` and can used multiple + * The context is only dependent on the parameter `d` and can be used multiple * times. * Returns 0 on success or error code on error. * The context must be destroyed with `FASTCOVER_ctx_destroy()`. @@ -549,7 +556,7 @@ ZDICT_trainFromBuffer_fastCover(void* dictBuffer, size_t dictBufferCapacity, ZDICT_cover_params_t coverParams; FASTCOVER_accel_t accelParams; /* Initialize global data */ - g_displayLevel = parameters.zParams.notificationLevel; + g_displayLevel = (int)parameters.zParams.notificationLevel; /* Assign splitPoint and f if not provided */ parameters.splitPoint = 1.0; parameters.f = parameters.f == 0 ? DEFAULT_F : parameters.f; @@ -632,7 +639,7 @@ ZDICT_optimizeTrainFromBuffer_fastCover( const unsigned accel = parameters->accel == 0 ? DEFAULT_ACCEL : parameters->accel; const unsigned shrinkDict = 0; /* Local variables */ - const int displayLevel = parameters->zParams.notificationLevel; + const int displayLevel = (int)parameters->zParams.notificationLevel; unsigned iteration = 1; unsigned d; unsigned k; @@ -716,7 +723,7 @@ ZDICT_optimizeTrainFromBuffer_fastCover( data->parameters.splitPoint = splitPoint; data->parameters.steps = kSteps; data->parameters.shrinkDict = shrinkDict; - data->parameters.zParams.notificationLevel = g_displayLevel; + data->parameters.zParams.notificationLevel = (unsigned)g_displayLevel; /* Check the parameters */ if (!FASTCOVER_checkParameters(data->parameters, dictBufferCapacity, data->ctx->f, accel)) { diff --git a/src/dependencies/zstd-1.5.0/lib/dictBuilder/zdict.c b/src/dependencies/zstd-1.5.4/lib/dictBuilder/zdict.c similarity index 91% rename from src/dependencies/zstd-1.5.0/lib/dictBuilder/zdict.c rename to src/dependencies/zstd-1.5.4/lib/dictBuilder/zdict.c index 459cbe4..f22e04d 100644 --- a/src/dependencies/zstd-1.5.0/lib/dictBuilder/zdict.c +++ b/src/dependencies/zstd-1.5.4/lib/dictBuilder/zdict.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -44,7 +44,6 @@ #ifndef ZDICT_STATIC_LINKING_ONLY # define ZDICT_STATIC_LINKING_ONLY #endif -#define HUF_STATIC_LINKING_ONLY #include "../common/mem.h" /* read */ #include "../common/fse.h" /* FSE_normalizeCount, FSE_writeNCount */ @@ -54,6 +53,7 @@ #include "../compress/zstd_compress_internal.h" /* ZSTD_loadCEntropy() */ #include "../zdict.h" #include "divsufsort.h" +#include "../common/bits.h" /* ZSTD_NbCommonBytes */ /*-************************************* @@ -130,65 +130,6 @@ size_t ZDICT_getDictHeaderSize(const void* dictBuffer, size_t dictSize) /*-******************************************************** * Dictionary training functions **********************************************************/ -static unsigned ZDICT_NbCommonBytes (size_t val) -{ - if (MEM_isLittleEndian()) { - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) - unsigned long r = 0; - _BitScanForward64( &r, (U64)val ); - return (unsigned)(r>>3); -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_ctzll((U64)val) >> 3); -# else - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - unsigned long r=0; - _BitScanForward( &r, (U32)val ); - return (unsigned)(r>>3); -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_ctz((U32)val) >> 3); -# else - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; -# endif - } - } else { /* Big Endian CPU */ - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) - unsigned long r = 0; - _BitScanReverse64( &r, val ); - return (unsigned)(r>>3); -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_clzll(val) >> 3); -# else - unsigned r; - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - unsigned long r = 0; - _BitScanReverse( &r, (unsigned long)val ); - return (unsigned)(r>>3); -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_clz((U32)val) >> 3); -# else - unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; -# endif - } } -} - - /*! ZDICT_count() : Count the nb of common bytes between 2 pointers. Note : this function presumes end of buffer followed by noisy guard band. @@ -203,7 +144,7 @@ static size_t ZDICT_count(const void* pIn, const void* pMatch) pMatch = (const char*)pMatch+sizeof(size_t); continue; } - pIn = (const char*)pIn+ZDICT_NbCommonBytes(diff); + pIn = (const char*)pIn+ZSTD_NbCommonBytes(diff); return (size_t)((const char*)pIn - pStart); } } @@ -235,7 +176,7 @@ static dictItem ZDICT_analyzePos( U32 savings[LLIMIT] = {0}; const BYTE* b = (const BYTE*)buffer; size_t maxLength = LLIMIT; - size_t pos = suffix[start]; + size_t pos = (size_t)suffix[start]; U32 end = start; dictItem solution; @@ -369,7 +310,7 @@ static dictItem ZDICT_analyzePos( savings[i] = savings[i-1] + (lengthList[i] * (i-3)); DISPLAYLEVEL(4, "Selected dict at position %u, of length %u : saves %u (ratio: %.2f) \n", - (unsigned)pos, (unsigned)maxLength, (unsigned)savings[maxLength], (double)savings[maxLength] / maxLength); + (unsigned)pos, (unsigned)maxLength, (unsigned)savings[maxLength], (double)savings[maxLength] / (double)maxLength); solution.pos = (U32)pos; solution.length = (U32)maxLength; @@ -379,7 +320,7 @@ static dictItem ZDICT_analyzePos( { U32 id; for (id=start; id1) && (table[u-1].savings < elt.savings)) - table[u] = table[u-1], u--; + table[u] = table[u-1], u--; table[u] = elt; return u; } } @@ -442,7 +383,7 @@ static U32 ZDICT_tryMerge(dictItem* table, dictItem elt, U32 eltNbToSkip, const if ((table[u].pos + table[u].length >= elt.pos) && (table[u].pos < elt.pos)) { /* overlap, existing < new */ /* append */ - int const addedLength = (int)eltEnd - (table[u].pos + table[u].length); + int const addedLength = (int)eltEnd - (int)(table[u].pos + table[u].length); table[u].savings += elt.length / 8; /* rough approx bonus */ if (addedLength > 0) { /* otherwise, elt fully included into existing */ table[u].length += addedLength; @@ -582,7 +523,7 @@ static size_t ZDICT_trainBuffer_legacy(dictItem* dictList, U32 dictListSize, if (solution.length==0) { cursor++; continue; } ZDICT_insertDictItem(dictList, dictListSize, solution, buffer); cursor += solution.length; - DISPLAYUPDATE(2, "\r%4.2f %% \r", (double)cursor / bufferSize * 100); + DISPLAYUPDATE(2, "\r%4.2f %% \r", (double)cursor / (double)bufferSize * 100.0); } } _cleanup: @@ -662,8 +603,8 @@ static void ZDICT_countEStats(EStats_ress_t esr, const ZSTD_parameters* params, if (nbSeq >= 2) { /* rep offsets */ const seqDef* const seq = seqStorePtr->sequencesStart; - U32 offset1 = seq[0].offset - 3; - U32 offset2 = seq[1].offset - 3; + U32 offset1 = seq[0].offBase - ZSTD_REP_NUM; + U32 offset2 = seq[1].offBase - ZSTD_REP_NUM; if (offset1 >= MAXREPOFFSET) offset1 = 0; if (offset2 >= MAXREPOFFSET) offset2 = 0; repOffsets[offset1] += 3; @@ -734,6 +675,7 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, size_t const totalSrcSize = ZDICT_totalSampleSize(fileSizes, nbFiles); size_t const averageSampleSize = totalSrcSize / (nbFiles + !nbFiles); BYTE* dstPtr = (BYTE*)dstBuffer; + U32 wksp[HUF_CTABLE_WORKSPACE_SIZE_U32]; /* init */ DEBUGLOG(4, "ZDICT_analyzeEntropy"); @@ -766,8 +708,15 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, pos += fileSizes[u]; } + if (notificationLevel >= 4) { + /* writeStats */ + DISPLAYLEVEL(4, "Offset Code Frequencies : \n"); + for (u=0; u<=offcodeMax; u++) { + DISPLAYLEVEL(4, "%2u :%7u \n", u, offcodeCount[u]); + } } + /* analyze, build stats, starting with literals */ - { size_t maxNbBits = HUF_buildCTable (hufTable, countLit, 255, huffLog); + { size_t maxNbBits = HUF_buildCTable_wksp(hufTable, countLit, 255, huffLog, wksp, sizeof(wksp)); if (HUF_isError(maxNbBits)) { eSize = maxNbBits; DISPLAYLEVEL(1, " HUF_buildCTable error \n"); @@ -776,7 +725,7 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, if (maxNbBits==8) { /* not compressible : will fail on HUF_writeCTable() */ DISPLAYLEVEL(2, "warning : pathological dataset : literals are not compressible : samples are noisy or too regular \n"); ZDICT_flatLit(countLit); /* replace distribution by a fake "mostly flat but still compressible" distribution, that HUF_writeCTable() can encode */ - maxNbBits = HUF_buildCTable (hufTable, countLit, 255, huffLog); + maxNbBits = HUF_buildCTable_wksp(hufTable, countLit, 255, huffLog, wksp, sizeof(wksp)); assert(maxNbBits==9); } huffLog = (U32)maxNbBits; @@ -817,7 +766,7 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, llLog = (U32)errorCode; /* write result to buffer */ - { size_t const hhSize = HUF_writeCTable(dstPtr, maxDstSize, hufTable, 255, huffLog); + { size_t const hhSize = HUF_writeCTable_wksp(dstPtr, maxDstSize, hufTable, 255, huffLog, wksp, sizeof(wksp)); if (HUF_isError(hhSize)) { eSize = hhSize; DISPLAYLEVEL(1, "HUF_writeCTable error \n"); @@ -872,7 +821,7 @@ static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, MEM_writeLE32(dstPtr+8, bestRepOffset[2].offset); #else /* at this stage, we don't use the result of "most common first offset", - as the impact of statistics is not properly evaluated */ + * as the impact of statistics is not properly evaluated */ MEM_writeLE32(dstPtr+0, repStartValue[0]); MEM_writeLE32(dstPtr+4, repStartValue[1]); MEM_writeLE32(dstPtr+8, repStartValue[2]); @@ -888,6 +837,17 @@ _cleanup: } +/** + * @returns the maximum repcode value + */ +static U32 ZDICT_maxRep(U32 const reps[ZSTD_REP_NUM]) +{ + U32 maxRep = reps[0]; + int r; + for (r = 1; r < ZSTD_REP_NUM; ++r) + maxRep = MAX(maxRep, reps[r]); + return maxRep; +} size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity, const void* customDictContent, size_t dictContentSize, @@ -899,11 +859,13 @@ size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity, BYTE header[HBUFFSIZE]; int const compressionLevel = (params.compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : params.compressionLevel; U32 const notificationLevel = params.notificationLevel; + /* The final dictionary content must be at least as large as the largest repcode */ + size_t const minContentSize = (size_t)ZDICT_maxRep(repStartValue); + size_t paddingSize; /* check conditions */ DEBUGLOG(4, "ZDICT_finalizeDictionary"); if (dictBufferCapacity < dictContentSize) return ERROR(dstSize_tooSmall); - if (dictContentSize < ZDICT_CONTENTSIZE_MIN) return ERROR(srcSize_wrong); if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) return ERROR(dstSize_tooSmall); /* dictionary header */ @@ -927,12 +889,43 @@ size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity, hSize += eSize; } - /* copy elements in final buffer ; note : src and dst buffer can overlap */ - if (hSize + dictContentSize > dictBufferCapacity) dictContentSize = dictBufferCapacity - hSize; - { size_t const dictSize = hSize + dictContentSize; - char* dictEnd = (char*)dictBuffer + dictSize; - memmove(dictEnd - dictContentSize, customDictContent, dictContentSize); - memcpy(dictBuffer, header, hSize); + /* Shrink the content size if it doesn't fit in the buffer */ + if (hSize + dictContentSize > dictBufferCapacity) { + dictContentSize = dictBufferCapacity - hSize; + } + + /* Pad the dictionary content with zeros if it is too small */ + if (dictContentSize < minContentSize) { + RETURN_ERROR_IF(hSize + minContentSize > dictBufferCapacity, dstSize_tooSmall, + "dictBufferCapacity too small to fit max repcode"); + paddingSize = minContentSize - dictContentSize; + } else { + paddingSize = 0; + } + + { + size_t const dictSize = hSize + paddingSize + dictContentSize; + + /* The dictionary consists of the header, optional padding, and the content. + * The padding comes before the content because the "best" position in the + * dictionary is the last byte. + */ + BYTE* const outDictHeader = (BYTE*)dictBuffer; + BYTE* const outDictPadding = outDictHeader + hSize; + BYTE* const outDictContent = outDictPadding + paddingSize; + + assert(dictSize <= dictBufferCapacity); + assert(outDictContent + dictContentSize == (BYTE*)dictBuffer + dictSize); + + /* First copy the customDictContent into its final location. + * `customDictContent` and `dictBuffer` may overlap, so we must + * do this before any other writes into the output buffer. + * Then copy the header & padding into the output buffer. + */ + memmove(outDictContent, customDictContent, dictContentSize); + memcpy(outDictHeader, header, hSize); + memset(outDictPadding, 0, paddingSize); + return dictSize; } } diff --git a/src/dependencies/zstd-1.5.0/lib/dll/example/Makefile b/src/dependencies/zstd-1.5.4/lib/dll/example/Makefile similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/dll/example/Makefile rename to src/dependencies/zstd-1.5.4/lib/dll/example/Makefile index 03b034d..86cf690 100644 --- a/src/dependencies/zstd-1.5.0/lib/dll/example/Makefile +++ b/src/dependencies/zstd-1.5.4/lib/dll/example/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/dll/example/README.md b/src/dependencies/zstd-1.5.4/lib/dll/example/README.md similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/dll/example/README.md rename to src/dependencies/zstd-1.5.4/lib/dll/example/README.md index 9e30fd5..46aec79 100644 --- a/src/dependencies/zstd-1.5.0/lib/dll/example/README.md +++ b/src/dependencies/zstd-1.5.4/lib/dll/example/README.md @@ -46,7 +46,7 @@ The compiled executable will require ZSTD DLL which is available at `dll\libzstd Open `example\fullbench-dll.sln` to compile `fullbench-dll` that uses a dynamic ZSTD library from the `dll` directory. The solution works with Visual C++ 2010 or newer. When one will open the solution with Visual C++ newer than 2010 -then the solution will upgraded to the current version. +then the solution will be upgraded to the current version. ## Using ZSTD DLL with Visual C++ diff --git a/src/dependencies/zstd-1.5.0/lib/dll/example/build_package.bat b/src/dependencies/zstd-1.5.4/lib/dll/example/build_package.bat similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/dll/example/build_package.bat rename to src/dependencies/zstd-1.5.4/lib/dll/example/build_package.bat diff --git a/src/dependencies/zstd-1.5.0/lib/dll/example/fullbench-dll.sln b/src/dependencies/zstd-1.5.4/lib/dll/example/fullbench-dll.sln similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/dll/example/fullbench-dll.sln rename to src/dependencies/zstd-1.5.4/lib/dll/example/fullbench-dll.sln diff --git a/src/dependencies/zstd-1.5.0/lib/dll/example/fullbench-dll.vcxproj b/src/dependencies/zstd-1.5.4/lib/dll/example/fullbench-dll.vcxproj similarity index 100% rename from src/dependencies/zstd-1.5.0/lib/dll/example/fullbench-dll.vcxproj rename to src/dependencies/zstd-1.5.4/lib/dll/example/fullbench-dll.vcxproj diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_legacy.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_legacy.h similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_legacy.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_legacy.h index a6f1174..dd17325 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_legacy.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_legacy.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -242,6 +242,13 @@ MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size frameSizeInfo.compressedSize = ERROR(srcSize_wrong); frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; } + /* In all cases, decompressedBound == nbBlocks * ZSTD_BLOCKSIZE_MAX. + * So we can compute nbBlocks without having to change every function. + */ + if (frameSizeInfo.decompressedBound != ZSTD_CONTENTSIZE_ERROR) { + assert((frameSizeInfo.decompressedBound & (ZSTD_BLOCKSIZE_MAX - 1)) == 0); + frameSizeInfo.nbBlocks = (size_t)(frameSizeInfo.decompressedBound / ZSTD_BLOCKSIZE_MAX); + } return frameSizeInfo; } diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.c similarity index 95% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.c index 7ab5547..1a3aad0 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -190,28 +190,6 @@ typedef signed long long S64; /**************************************************************** * Memory I/O *****************************************************************/ -/* FSE_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets generating assembly depending on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef FSE_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define FSE_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define FSE_FORCE_MEMORY_ACCESS 1 -# endif -#endif - static unsigned FSE_32bits(void) { @@ -224,24 +202,6 @@ static unsigned FSE_isLittleEndian(void) return one.c[0]; } -#if defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==2) - -static U16 FSE_read16(const void* memPtr) { return *(const U16*) memPtr; } -static U32 FSE_read32(const void* memPtr) { return *(const U32*) memPtr; } -static U64 FSE_read64(const void* memPtr) { return *(const U64*) memPtr; } - -#elif defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -static U16 FSE_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -static U32 FSE_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -static U64 FSE_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -#else - static U16 FSE_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -257,8 +217,6 @@ static U64 FSE_read64(const void* memPtr) U64 val; memcpy(&val, memPtr, sizeof(val)); return val; } -#endif /* FSE_FORCE_MEMORY_ACCESS */ - static U16 FSE_readLE16(const void* memPtr) { if (FSE_isLittleEndian()) @@ -343,8 +301,7 @@ FORCE_INLINE unsigned FSE_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ unsigned long r; - _BitScanReverse ( &r, val ); - return (unsigned) r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (GCC_VERSION >= 304) /* GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -1194,7 +1151,7 @@ static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, si zstd - standard compression library Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1763,20 +1720,26 @@ static size_t ZSTD_execSequence(BYTE* op, static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */ static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */ const BYTE* const ostart = op; + BYTE* const oLitEnd = op + sequence.litLength; const size_t litLength = sequence.litLength; BYTE* const endMatch = op + litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */ const BYTE* const litEnd = *litPtr + litLength; - /* check */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (endMatch > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); - if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ + if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */ /* copy Literals */ - if (((size_t)(*litPtr - op) < 8) || ((size_t)(oend-litEnd) < 8) || (op+litLength > oend-8)) - memmove(op, *litPtr, litLength); /* overwrite risk */ - else - ZSTD_wildcopy(op, *litPtr, litLength); + ZSTD_memmove(op, *litPtr, sequence.litLength); /* note : v0.1 seems to allow scenarios where output or input are close to end of buffer */ + op += litLength; *litPtr = litEnd; /* update for next sequence */ diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.h index f777eb6..6ac8769 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v01.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v01.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.c similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.c index 89fdc71..e09bb4a 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,7 +28,7 @@ low-level memory access routines Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -115,27 +115,6 @@ extern "C" { /**************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets generating assembly depending on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -146,33 +125,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -193,9 +145,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value) memcpy(memPtr, &value, sizeof(value)); } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - - MEM_STATIC U16 MEM_readLE16(const void* memPtr) { if (MEM_isLittleEndian()) @@ -272,7 +221,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) header file (to include) Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -353,9 +302,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BIT_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -437,7 +385,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -457,7 +405,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -514,7 +462,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream) Error codes and messages Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -613,7 +561,7 @@ typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be mor header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -757,7 +705,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr) header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -826,7 +774,7 @@ static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, si Header File Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -886,7 +834,7 @@ typedef struct ZSTD_CCtx_s ZSTD_CCtx; /* incomplete type */ Header File for static linking only Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -950,7 +898,7 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx; FSE : Finite State Entropy coder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1454,7 +1402,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz Huff0 : Huffman coder, part of New Generation Entropy library Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2613,7 +2561,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_ zstd - standard compression library Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -3118,12 +3066,19 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; /* checks */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.h index 1b37195..dab0260 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v02.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v02.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.c similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.c index 5262d51..b0d7f52 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -29,7 +29,7 @@ low-level memory access routines Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -116,27 +116,6 @@ extern "C" { /**************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets generating assembly depending on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -147,33 +126,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -194,10 +146,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value) memcpy(memPtr, &value, sizeof(value)); } - -#endif /* MEM_FORCE_MEMORY_ACCESS */ - - MEM_STATIC U16 MEM_readLE16(const void* memPtr) { if (MEM_isLittleEndian()) @@ -274,7 +222,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) header file (to include) Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -356,9 +304,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BIT_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -439,7 +386,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -459,7 +406,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -516,7 +463,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream) Error codes and messages Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -615,7 +562,7 @@ typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be mor header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -759,7 +706,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr) header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -827,7 +774,7 @@ static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, si Header File Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -887,7 +834,7 @@ typedef struct ZSTD_CCtx_s ZSTD_CCtx; /* incomplete type */ Header File for static linking only Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -951,7 +898,7 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx; FSE : Finite State Entropy coder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1455,7 +1402,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz Huff0 : Huffman coder, part of New Generation Entropy library Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2252,7 +2199,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_ zstd - standard compression library Copyright (C) 2014-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2759,18 +2706,24 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; /* checks */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ /* copy Match */ - { - const BYTE* match = op - sequence.offset; + { const BYTE* match = op - sequence.offset; /* check */ if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */ diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.h index 7a00d43..9bf3cce 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v03.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v03.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.c index bee1b99..57be832 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -87,27 +87,6 @@ extern "C" { /**************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets generating assembly depending on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -118,33 +97,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -165,9 +117,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value) memcpy(memPtr, &value, sizeof(value)); } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - - MEM_STATIC U16 MEM_readLE16(const void* memPtr) { if (MEM_isLittleEndian()) @@ -545,7 +494,7 @@ If there is an error, the function will return an error code, which can be teste header file (to include) Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -627,9 +576,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BIT_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -704,7 +652,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -724,7 +672,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); @@ -785,7 +733,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream) header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -934,7 +882,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr) FSE : Finite State Entropy coder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1440,7 +1388,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz header file Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1518,7 +1466,7 @@ static unsigned HUF_isError(size_t code); /* tells if a return value i header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1605,7 +1553,7 @@ static size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const Huff0 : Huffman coder, part of New Generation Entropy library Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2405,7 +2353,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_ zstd - decompression module fo v0.4 legacy format Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2880,13 +2828,19 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ @@ -3287,7 +3241,7 @@ static void ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* dict, s Buffered version of Zstd compression library Copyright (C) 2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.h similarity index 98% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.h index 66b97ab..640240d 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v04.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v04.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.c similarity index 96% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.c index eb8966b..93a1169 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -19,7 +19,7 @@ low-level memory access routines Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -106,27 +106,6 @@ extern "C" { /*-************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets depending on alignment. - * In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; } @@ -137,37 +116,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } -MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } -MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } -MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } -MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign*)memPtr)->u64 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -198,9 +146,6 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) memcpy(memPtr, &value, sizeof(value)); } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - - MEM_STATIC U16 MEM_readLE16(const void* memPtr) { if (MEM_isLittleEndian()) @@ -265,7 +210,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) Header File for static linking only Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -289,7 +234,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net + - zstd homepage : https://facebook.github.io/zstd */ #ifndef ZSTD_STATIC_H #define ZSTD_STATIC_H @@ -401,7 +346,7 @@ size_t ZSTDv05_decompressBlock(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity Header File for include Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -488,7 +433,7 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5; #define FSEv05_ENCODING_DYNAMIC 3 -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ @@ -556,7 +501,7 @@ typedef struct { header file Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -675,7 +620,7 @@ size_t FSEv05_decompress_usingDTable(void* dst, size_t dstCapacity, const void* header file (to include) Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -756,9 +701,8 @@ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BITv05_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -830,7 +774,7 @@ MEM_STATIC size_t BITv05_lookBits(BITv05_DStream_t* bitD, U32 nbBits) } /*! BITv05_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv05_lookBitsFast(BITv05_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -850,7 +794,7 @@ MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, unsigned nbBits) } /*!BITv05_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits) { size_t value = BITv05_lookBitsFast(bitD, nbBits); @@ -905,7 +849,7 @@ MEM_STATIC unsigned BITv05_endOfDStream(const BITv05_DStream_t* DStream) header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1055,7 +999,7 @@ MEM_STATIC unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr) FSEv05 : Finite State Entropy coder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1541,7 +1485,7 @@ size_t FSEv05_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t header file Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1614,7 +1558,7 @@ const char* HUFv05_getErrorName(size_t code); /* provides error code string (u header file, for static linking only Copyright (C) 2013-2016, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1706,7 +1650,7 @@ size_t HUFv05_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void Huff0 : Huffman coder, part of New Generation Entropy library Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2551,7 +2495,7 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS zstd - standard compression library Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2649,7 +2593,7 @@ struct ZSTDv05_DCtx_s FSEv05_DTable LLTable[FSEv05_DTABLE_SIZE_U32(LLFSEv05Log)]; FSEv05_DTable OffTable[FSEv05_DTABLE_SIZE_U32(OffFSEv05Log)]; FSEv05_DTable MLTable[FSEv05_DTABLE_SIZE_U32(MLFSEv05Log)]; - unsigned hufTableX4[HUFv05_DTABLE_SIZE(HufLog)]; + unsigned hufTableX4[HUFv05_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; const void* previousDstEnd; const void* base; const void* vBase; @@ -2677,7 +2621,7 @@ size_t ZSTDv05_decompressBegin(ZSTDv05_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTableX4[0] = HufLog; + dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG; dctx->flagStaticTables = 0; return 0; } @@ -3238,13 +3182,19 @@ static size_t ZSTDv05_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTDv05_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTDv05_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ @@ -3750,7 +3700,7 @@ size_t ZSTDv05_decompressBegin_usingDict(ZSTDv05_DCtx* dctx, const void* dict, s Buffered version of Zstd compression library Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.h similarity index 99% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.h index bd423bf..2dcffc9 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v05.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v05.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.c index fcb16d4..175f7cc 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -23,7 +23,7 @@ low-level memory access routines Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -108,27 +108,6 @@ extern "C" { /*-************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets depending on alignment. - * In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } @@ -139,33 +118,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -186,9 +138,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value) memcpy(memPtr, &value, sizeof(value)); } - -#endif /* MEM_FORCE_MEMORY_ACCESS */ - MEM_STATIC U32 MEM_swap32(U32 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -284,7 +233,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) Header File for static linking only Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -308,7 +257,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net + - zstd homepage : https://facebook.github.io/zstd */ #ifndef ZSTDv06_STATIC_H #define ZSTDv06_STATIC_H @@ -415,7 +364,7 @@ ZSTDLIBv06_API size_t ZSTDv06_decompressBlock(ZSTDv06_DCtx* dctx, void* dst, siz Header File for include Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -482,7 +431,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t; #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 #define IS_HUF 0 #define IS_PCH 1 @@ -622,7 +571,7 @@ void ZSTDv06_seqToCodes(const seqStore_t* seqStorePtr, size_t const nbSeq); Public Prototypes declaration Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -770,7 +719,7 @@ If there is an error, the function will return an error code, which can be teste header file (to include) Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -860,9 +809,8 @@ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BITv06_highbit32 ( U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -932,7 +880,7 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff } /*! BITv06_lookBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv06_lookBitsFast(const BITv06_DStream_t* bitD, U32 nbBits) { U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -952,7 +900,7 @@ MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits) } /*! BITv06_readBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits) { size_t const value = BITv06_lookBitsFast(bitD, nbBits); @@ -1006,7 +954,7 @@ MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* DStream) header file for static linking (only) Copyright (C) 2013-2015, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1214,7 +1162,7 @@ MEM_STATIC BYTE FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_DStre Common functions of New Generation Entropy library Copyright (C) 2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1359,7 +1307,7 @@ size_t FSEv06_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned FSE : Finite State Entropy decoder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1683,7 +1631,7 @@ size_t FSEv06_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t header file Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1753,7 +1701,7 @@ size_t HUFv06_compressBound(size_t size); /**< maximum compressed size */ header file, for static linking only Copyright (C) 2013-2016, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1935,7 +1883,7 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta Huffman decoder, part of New Generation Entropy library Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2680,7 +2628,7 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS Common functions of Zstd compression library Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2704,7 +2652,7 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net/ + - zstd homepage : https://facebook.github.io/zstd/ */ @@ -2734,7 +2682,7 @@ const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(er zstd - standard compression library Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2758,7 +2706,7 @@ const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(er OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net + - zstd homepage : https://facebook.github.io/zstd */ /* *************************************************************** @@ -2810,7 +2758,7 @@ struct ZSTDv06_DCtx_s FSEv06_DTable LLTable[FSEv06_DTABLE_SIZE_U32(LLFSELog)]; FSEv06_DTable OffTable[FSEv06_DTABLE_SIZE_U32(OffFSELog)]; FSEv06_DTable MLTable[FSEv06_DTABLE_SIZE_U32(MLFSELog)]; - unsigned hufTableX4[HUFv06_DTABLE_SIZE(HufLog)]; + unsigned hufTableX4[HUFv06_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; const void* previousDstEnd; const void* base; const void* vBase; @@ -2838,7 +2786,7 @@ size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTableX4[0] = HufLog; + dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG; dctx->flagRepeatTable = 0; return 0; } @@ -3374,13 +3322,19 @@ static size_t ZSTDv06_execSequence(BYTE* op, const BYTE* const iLitEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */ + if (iLitEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTDv06_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTDv06_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ @@ -3893,7 +3847,7 @@ size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, s Buffered version of Zstd compression library Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -3917,7 +3871,7 @@ size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, s OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net/ + - zstd homepage : https://facebook.github.io/zstd/ */ @@ -4039,7 +3993,8 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd, size_t const toLoad = hSize - zbd->lhSize; /* if hSize!=0, hSize > zbd->lhSize */ if (ZSTDv06_isError(hSize)) return hSize; if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */ - memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); + if (ip != NULL) + memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); zbd->lhSize += iend-ip; *dstCapacityPtr = 0; return (hSize - zbd->lhSize) + ZSTDv06_blockHeaderSize; /* remaining header bytes + next block header */ diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.h similarity index 99% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.h index 9e32b76..6338910 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v06.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v06.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.c b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.c similarity index 97% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.c rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.c index 0d0e466..15dc3ef 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.c +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -184,7 +184,7 @@ ZSTDLIBv07_API size_t ZSTDv07_insertBlock(ZSTDv07_DCtx* dctx, const void* blockS low-level memory access routines Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -268,27 +268,6 @@ extern "C" { /*-************************************************************** * Memory I/O *****************************************************************/ -/* MEM_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets depending on alignment. - * In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define MEM_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) -# define MEM_FORCE_MEMORY_ACCESS 1 -# endif -#endif MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; } MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } @@ -299,33 +278,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void) return one.c[0]; } -#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) - -/* violates C standard, by lying on structure alignment. -Only use if no other choice to achieve best performance on target platform */ -MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } -MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } -MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } - -#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign; - -MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } - -#else - -/* default method, safe and standard. - can sometimes prove slower */ - MEM_STATIC U16 MEM_read16(const void* memPtr) { U16 val; memcpy(&val, memPtr, sizeof(val)); return val; @@ -346,8 +298,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value) memcpy(memPtr, &value, sizeof(value)); } -#endif /* MEM_FORCE_MEMORY_ACCESS */ - MEM_STATIC U32 MEM_swap32(U32 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -442,7 +392,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr) header file (to include) Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -530,9 +480,8 @@ MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, unsigned nbBits); MEM_STATIC unsigned BITv07_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - _BitScanReverse ( &r, val ); - return (unsigned) r; + unsigned long r; + return _BitScanReverse(&r, val) ? (unsigned)r : 0; # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; # else /* Software version */ @@ -600,7 +549,7 @@ MEM_STATIC size_t BITv07_initDStream(BITv07_DStream_t* bitD, const void* srcBuff } /*! BITv07_lookBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv07_lookBitsFast(const BITv07_DStream_t* bitD, U32 nbBits) { U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -620,7 +569,7 @@ MEM_STATIC size_t BITv07_readBits(BITv07_DStream_t* bitD, U32 nbBits) } /*! BITv07_readBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, U32 nbBits) { size_t const value = BITv07_lookBitsFast(bitD, nbBits); @@ -674,7 +623,7 @@ MEM_STATIC unsigned BITv07_endOfDStream(const BITv07_DStream_t* DStream) Public Prototypes declaration Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -982,7 +931,7 @@ MEM_STATIC BYTE FSEv07_decodeSymbolFast(FSEv07_DState_t* DStatePtr, BITv07_DStre header file Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1155,7 +1104,7 @@ size_t HUFv07_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void Common functions of New Generation Entropy library Copyright (C) 2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1379,7 +1328,7 @@ size_t HUFv07_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats, FSE : Finite State Entropy decoder Copyright (C) 2013-2015, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -1703,7 +1652,7 @@ size_t FSEv07_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t Huffman decoder, part of New Generation Entropy library Copyright (C) 2013-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2581,7 +2530,7 @@ size_t HUFv07_decompress1X_DCtx (HUFv07_DTable* dctx, void* dst, size_t dstSize, Common functions of Zstd compression library Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2605,7 +2554,7 @@ size_t HUFv07_decompress1X_DCtx (HUFv07_DTable* dctx, void* dst, size_t dstSize, OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net/ + - zstd homepage : https://facebook.github.io/zstd/ */ @@ -2651,7 +2600,7 @@ static void ZSTDv07_defaultFreeFunction(void* opaque, void* address) Header File for include Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2721,7 +2670,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t; #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 typedef enum { lbt_huffman, lbt_repeat, lbt_raw, lbt_rle } litBlockType_t; #define LONGNBSEQ 0x7F00 @@ -2858,7 +2807,7 @@ static const ZSTDv07_customMem defaultCustomMem = { ZSTDv07_defaultAllocFunction zstd - standard compression library Copyright (C) 2014-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -2882,7 +2831,7 @@ static const ZSTDv07_customMem defaultCustomMem = { ZSTDv07_defaultAllocFunction OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net + - zstd homepage : https://facebook.github.io/zstd */ /* *************************************************************** @@ -2935,7 +2884,7 @@ struct ZSTDv07_DCtx_s FSEv07_DTable LLTable[FSEv07_DTABLE_SIZE_U32(LLFSELog)]; FSEv07_DTable OffTable[FSEv07_DTABLE_SIZE_U32(OffFSELog)]; FSEv07_DTable MLTable[FSEv07_DTABLE_SIZE_U32(MLFSELog)]; - HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(HufLog)]; /* can accommodate HUFv07_decompress4X */ + HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUFv07_decompress4X */ const void* previousDstEnd; const void* base; const void* vBase; @@ -2971,7 +2920,7 @@ size_t ZSTDv07_decompressBegin(ZSTDv07_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTable[0] = (HUFv07_DTable)((HufLog)*0x1000001); + dctx->hufTable[0] = (HUFv07_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); dctx->litEntropy = dctx->fseEntropy = 0; dctx->dictID = 0; { int i; for (i=0; irep[i] = repStartValue[i]; } @@ -3603,11 +3552,14 @@ size_t ZSTDv07_execSequence(BYTE* op, const BYTE* match = oLitEnd - sequence.offset; /* check */ - if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ - if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */ + assert(oend >= op); + if (sequence.litLength + WILDCOPY_OVERLENGTH > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequenceLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + assert(litLimit >= *litPtr); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);; /* copy Literals */ - ZSTDv07_wildcopy(op, *litPtr, sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + ZSTDv07_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ @@ -3621,7 +3573,7 @@ size_t ZSTDv07_execSequence(BYTE* op, return sequenceLength; } /* span extDict & currentPrefixSegment */ - { size_t const length1 = dictEnd - match; + { size_t const length1 = (size_t)(dictEnd - match); memmove(oLitEnd, match, length1); op = oLitEnd + length1; sequence.matchLength -= length1; @@ -4257,7 +4209,7 @@ ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx, Buffered version of Zstd compression library Copyright (C) 2015-2016, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -4281,7 +4233,7 @@ ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx, OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - zstd homepage : http://www.zstd.net/ + - zstd homepage : https://facebook.github.io/zstd/ */ @@ -4421,7 +4373,8 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd, if (hSize != 0) { size_t const toLoad = hSize - zbd->lhSize; /* if hSize!=0, hSize > zbd->lhSize */ if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */ - memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); + if (ip != NULL) + memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); zbd->lhSize += iend-ip; *dstCapacityPtr = 0; return (hSize - zbd->lhSize) + ZSTDv07_blockHeaderSize; /* remaining header bytes + next block header */ diff --git a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.h b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.h similarity index 99% rename from src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.h rename to src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.h index bc35cfa..1ff3904 100644 --- a/src/dependencies/zstd-1.5.0/lib/legacy/zstd_v07.h +++ b/src/dependencies/zstd-1.5.4/lib/legacy/zstd_v07.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/lib/libzstd.mk b/src/dependencies/zstd-1.5.4/lib/libzstd.mk new file mode 100644 index 0000000..5e11d5d --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/libzstd.mk @@ -0,0 +1,214 @@ +# ################################################################ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# You may select, at your option, one of the above-listed licenses. +# ################################################################ + +################################################################## +# Input Variables +################################################################## + +# Zstd lib directory +LIBZSTD ?= ./ + +# ZSTD_LIB_MINIFY is a helper variable that +# configures a bunch of other variables to space-optimized defaults. +ZSTD_LIB_MINIFY ?= 0 + +# Legacy support +ifneq ($(ZSTD_LIB_MINIFY), 0) + ZSTD_LEGACY_SUPPORT ?= 0 +else + ZSTD_LEGACY_SUPPORT ?= 5 +endif +ZSTD_LEGACY_MULTITHREADED_API ?= 0 + +# Build size optimizations +ifneq ($(ZSTD_LIB_MINIFY), 0) + HUF_FORCE_DECOMPRESS_X1 ?= 1 + HUF_FORCE_DECOMPRESS_X2 ?= 0 + ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1 + ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 + ZSTD_NO_INLINE ?= 1 + ZSTD_STRIP_ERROR_STRINGS ?= 1 +else + HUF_FORCE_DECOMPRESS_X1 ?= 0 + HUF_FORCE_DECOMPRESS_X2 ?= 0 + ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0 + ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 + ZSTD_NO_INLINE ?= 0 + ZSTD_STRIP_ERROR_STRINGS ?= 0 +endif + +# Assembly support +ZSTD_NO_ASM ?= 0 + +################################################################## +# libzstd helpers +################################################################## + +VOID ?= /dev/null + +# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/) +NUM_SYMBOL := \# + +# define silent mode as default (verbose mode with V=1 or VERBOSE=1) +$(V)$(VERBOSE).SILENT: + +# When cross-compiling from linux to windows, +# one might need to specify TARGET_SYSTEM as "Windows." +# Building from Fedora fails without it. +# (but Ubuntu and Debian don't need to set anything) +TARGET_SYSTEM ?= $(OS) + +# Version numbers +LIBVER_SRC := $(LIBZSTD)/zstd.h +LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` +LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` +LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` +LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) +LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) +LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) +LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) +LIBVER := $(shell echo $(LIBVER_SCRIPT)) +CCVER := $(shell $(CC) --version) +ZSTD_VERSION?= $(LIBVER) + +ifneq ($(ZSTD_LIB_MINIFY), 0) + HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0) +ifneq ($(HAVE_CC_OZ), 0) + # Some compilers (clang) support an even more space-optimized setting. + CFLAGS += -Oz +else + CFLAGS += -Os +endif + CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \ + -DDYNAMIC_BMI2=0 -DNDEBUG +else + CFLAGS ?= -O3 +endif + +DEBUGLEVEL ?= 0 +CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) +ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed + CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting +endif +DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ + -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ + -Wstrict-prototypes -Wundef -Wpointer-arith \ + -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ + -Wredundant-decls -Wmissing-prototypes -Wc++-compat +CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) +ASFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS) +LDFLAGS += $(MOREFLAGS) +FLAGS = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS) + +ifndef ALREADY_APPENDED_NOEXECSTACK +export ALREADY_APPENDED_NOEXECSTACK := 1 +ifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z noexecstack -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) +LDFLAGS += -z noexecstack +endif +ifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) +CFLAGS += -Wa,--noexecstack +# CFLAGS are also added to ASFLAGS +else ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) +# See e.g.: https://github.com/android/ndk/issues/171 +CFLAGS += -Qunused-arguments -Wa,--noexecstack +# CFLAGS are also added to ASFLAGS +endif +endif + +ifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z cet-report=error -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) +LDFLAGS += -z cet-report=error +endif + +HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) +GREP_OPTIONS ?= +ifeq ($(HAVE_COLORNEVER), 1) + GREP_OPTIONS += --color=never +endif +GREP = grep $(GREP_OPTIONS) + +ZSTD_COMMON_FILES := $(sort $(wildcard $(LIBZSTD)/common/*.c)) +ZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/compress/*.c)) +ZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*.c)) +ZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIBZSTD)/dictBuilder/*.c)) +ZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIBZSTD)/deprecated/*.c)) +ZSTD_LEGACY_FILES := + +ZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*_amd64.S)) + +ifneq ($(ZSTD_NO_ASM), 0) + CPPFLAGS += -DZSTD_DISABLE_ASM +else + # Unconditionally add the ASM files they are disabled by + # macros in the .S file. + ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES) +endif + +ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0) + CFLAGS += -DHUF_FORCE_DECOMPRESS_X1 +endif + +ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0) + CFLAGS += -DHUF_FORCE_DECOMPRESS_X2 +endif + +ifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0) + CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT +endif + +ifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0) + CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG +endif + +ifneq ($(ZSTD_NO_INLINE), 0) + CFLAGS += -DZSTD_NO_INLINE +endif + +ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0) + CFLAGS += -DZSTD_STRIP_ERROR_STRINGS +endif + +ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0) + CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API +endif + +ifneq ($(ZSTD_LEGACY_SUPPORT), 0) +ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) + ZSTD_LEGACY_FILES += $(shell ls $(LIBZSTD)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') +endif +endif +CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) + +UNAME := $(shell uname) + +ifndef BUILD_DIR +ifeq ($(UNAME), Darwin) + ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0) + HASH ?= md5 + endif +else ifeq ($(UNAME), FreeBSD) + HASH ?= gmd5sum +else ifeq ($(UNAME), NetBSD) + HASH ?= md5 -n +else ifeq ($(UNAME), OpenBSD) + HASH ?= md5 +endif +HASH ?= md5sum + +HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " ) +HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) +ifeq ($(HAVE_HASH),0) + $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) + BUILD_DIR := obj/generic_noconf +endif +endif # BUILD_DIR + +ZSTD_SUBDIR := $(LIBZSTD)/common $(LIBZSTD)/compress $(LIBZSTD)/decompress $(LIBZSTD)/dictBuilder $(LIBZSTD)/legacy $(LIBZSTD)/deprecated +vpath %.c $(ZSTD_SUBDIR) +vpath %.S $(ZSTD_SUBDIR) diff --git a/src/dependencies/zstd-1.5.0/lib/libzstd.pc.in b/src/dependencies/zstd-1.5.4/lib/libzstd.pc.in similarity index 57% rename from src/dependencies/zstd-1.5.0/lib/libzstd.pc.in rename to src/dependencies/zstd-1.5.4/lib/libzstd.pc.in index 8465c97..d5cc027 100644 --- a/src/dependencies/zstd-1.5.0/lib/libzstd.pc.in +++ b/src/dependencies/zstd-1.5.4/lib/libzstd.pc.in @@ -1,6 +1,6 @@ # ZSTD - standard compression algorithm -# Copyright (C) 2014-2016, Yann Collet, Facebook -# BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +# Copyright (c) Meta Platforms, Inc. and affiliates. +# BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php) prefix=@PREFIX@ exec_prefix=@EXEC_PREFIX@ @@ -9,7 +9,8 @@ libdir=@LIBDIR@ Name: zstd Description: fast lossless compression algorithm library -URL: http://www.zstd.net/ +URL: https://facebook.github.io/zstd/ Version: @VERSION@ Libs: -L${libdir} -lzstd +Libs.private: @LIBS_PRIVATE@ Cflags: -I${includedir} diff --git a/src/dependencies/zstd-1.5.4/lib/module.modulemap b/src/dependencies/zstd-1.5.4/lib/module.modulemap new file mode 100644 index 0000000..eff98df --- /dev/null +++ b/src/dependencies/zstd-1.5.4/lib/module.modulemap @@ -0,0 +1,35 @@ +module libzstd [extern_c] { + header "zstd.h" + export * + config_macros [exhaustive] \ + /* zstd.h */ \ + ZSTD_STATIC_LINKING_ONLY, \ + ZSTDLIB_VISIBILITY, \ + ZSTDLIB_VISIBLE, \ + ZSTDLIB_HIDDEN, \ + ZSTD_DLL_EXPORT, \ + ZSTDLIB_STATIC_API, \ + ZSTD_DISABLE_DEPRECATE_WARNINGS, \ + ZSTD_CLEVEL_DEFAULT, \ + /* zdict.h */ \ + ZDICT_STATIC_LINKING_ONLY, \ + ZDICTLIB_VISIBLE, \ + ZDICTLIB_HIDDEN, \ + ZDICTLIB_VISIBILITY, \ + ZDICTLIB_STATIC_API, \ + ZDICT_DISABLE_DEPRECATE_WARNINGS, \ + /* zstd_errors.h */ \ + ZSTDERRORLIB_VISIBLE, \ + ZSTDERRORLIB_HIDDEN, \ + ZSTDERRORLIB_VISIBILITY + + module dictbuilder [extern_c] { + header "zdict.h" + export * + } + + module errors [extern_c] { + header "zstd_errors.h" + export * + } +} diff --git a/src/dependencies/zstd-1.5.0/lib/zdict.h b/src/dependencies/zstd-1.5.4/lib/zdict.h similarity index 89% rename from src/dependencies/zstd-1.5.0/lib/zdict.h rename to src/dependencies/zstd-1.5.4/lib/zdict.h index 75b05db..2268f94 100644 --- a/src/dependencies/zstd-1.5.0/lib/zdict.h +++ b/src/dependencies/zstd-1.5.4/lib/zdict.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -8,32 +8,43 @@ * You may select, at your option, one of the above-listed licenses. */ -#ifndef DICTBUILDER_H_001 -#define DICTBUILDER_H_001 - #if defined (__cplusplus) extern "C" { #endif +#ifndef ZSTD_ZDICT_H +#define ZSTD_ZDICT_H /*====== Dependencies ======*/ #include /* size_t */ /* ===== ZDICTLIB_API : control library symbols visibility ===== */ -#ifndef ZDICTLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define ZDICTLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#ifndef ZDICTLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZDICTLIB_VISIBILITY +# define ZDICTLIB_VISIBLE ZDICTLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZDICTLIB_VISIBLE __attribute__ ((visibility ("default"))) # else -# define ZDICTLIB_VISIBILITY +# define ZDICTLIB_VISIBLE # endif #endif + +#ifndef ZDICTLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZDICTLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZDICTLIB_HIDDEN +# endif +#endif + #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) -# define ZDICTLIB_API __declspec(dllexport) ZDICTLIB_VISIBILITY +# define ZDICTLIB_API __declspec(dllexport) ZDICTLIB_VISIBLE #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) -# define ZDICTLIB_API __declspec(dllimport) ZDICTLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +# define ZDICTLIB_API __declspec(dllimport) ZDICTLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ #else -# define ZDICTLIB_API ZDICTLIB_VISIBILITY +# define ZDICTLIB_API ZDICTLIB_VISIBLE #endif /******************************************************************************* @@ -46,7 +57,7 @@ extern "C" { * * Zstd can use dictionaries to improve compression ratio of small data. * Traditionally small files don't compress well because there is very little - * repetion in a single sample, since it is small. But, if you are compressing + * repetition in a single sample, since it is small. But, if you are compressing * many similar files, like a bunch of JSON records that share the same * structure, you can train a dictionary on ahead of time on some samples of * these files. Then, zstd can use the dictionary to find repetitions that are @@ -110,8 +121,8 @@ extern "C" { * The zstd CLI defaults to a 110KB dictionary. You likely don't need a * dictionary larger than that. But, most use cases can get away with a * smaller dictionary. The advanced dictionary builders can automatically - * shrink the dictionary for you, and select a the smallest size that - * doesn't hurt compression ratio too much. See the `shrinkDict` parameter. + * shrink the dictionary for you, and select the smallest size that doesn't + * hurt compression ratio too much. See the `shrinkDict` parameter. * A smaller dictionary can save memory, and potentially speed up * compression. * @@ -132,7 +143,7 @@ extern "C" { * * # Benchmark levels 1-3 without a dictionary * zstd -b1e3 -r /path/to/my/files - * # Benchmark levels 1-3 with a dictioanry + * # Benchmark levels 1-3 with a dictionary * zstd -b1e3 -r /path/to/my/files -D /path/to/my/dictionary * * When should I retrain a dictionary? @@ -201,9 +212,9 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCap const size_t* samplesSizes, unsigned nbSamples); typedef struct { - int compressionLevel; /*< optimize for a specific zstd compression level; 0 means default */ - unsigned notificationLevel; /*< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */ - unsigned dictID; /*< force dictID value; 0 means auto mode (32-bits random value) + int compressionLevel; /**< optimize for a specific zstd compression level; 0 means default */ + unsigned notificationLevel; /**< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */ + unsigned dictID; /**< force dictID value; 0 means auto mode (32-bits random value) * NOTE: The zstd format reserves some dictionary IDs for future use. * You may use them in private settings, but be warned that they * may be used by zstd in a public dictionary registry in the future. @@ -237,7 +248,6 @@ typedef struct { * is presumed that the most profitable content is at the end of the dictionary, * since that is the cheapest to reference. * - * `dictContentSize` must be >= ZDICT_CONTENTSIZE_MIN bytes. * `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN). * * @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`), @@ -261,9 +271,21 @@ ZDICTLIB_API size_t ZDICT_getDictHeaderSize(const void* dictBuffer, size_t dictS ZDICTLIB_API unsigned ZDICT_isError(size_t errorCode); ZDICTLIB_API const char* ZDICT_getErrorName(size_t errorCode); +#endif /* ZSTD_ZDICT_H */ +#if defined(ZDICT_STATIC_LINKING_ONLY) && !defined(ZSTD_ZDICT_H_STATIC) +#define ZSTD_ZDICT_H_STATIC -#ifdef ZDICT_STATIC_LINKING_ONLY +/* This can be overridden externally to hide static symbols. */ +#ifndef ZDICTLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZDICTLIB_STATIC_API __declspec(dllexport) ZDICTLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZDICTLIB_STATIC_API __declspec(dllimport) ZDICTLIB_VISIBLE +# else +# define ZDICTLIB_STATIC_API ZDICTLIB_VISIBLE +# endif +#endif /* ==================================================================================== * The definitions in this section are considered experimental. @@ -272,8 +294,9 @@ ZDICTLIB_API const char* ZDICT_getErrorName(size_t errorCode); * Use them only in association with static linking. * ==================================================================================== */ -#define ZDICT_CONTENTSIZE_MIN 128 #define ZDICT_DICTSIZE_MIN 256 +/* Deprecated: Remove in v1.6.0 */ +#define ZDICT_CONTENTSIZE_MIN 128 /*! ZDICT_cover_params_t: * k and d are the only required parameters. @@ -318,7 +341,7 @@ typedef struct { * In general, it's recommended to provide a few thousands samples, though this can vary a lot. * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. */ -ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover( +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_cover( void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer, const size_t *samplesSizes, unsigned nbSamples, ZDICT_cover_params_t parameters); @@ -340,7 +363,7 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover( * See ZDICT_trainFromBuffer() for details on failure modes. * Note: ZDICT_optimizeTrainFromBuffer_cover() requires about 8 bytes of memory for each input byte and additionally another 5 bytes of memory for each byte of memory for each thread. */ -ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_cover( +ZDICTLIB_STATIC_API size_t ZDICT_optimizeTrainFromBuffer_cover( void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, ZDICT_cover_params_t* parameters); @@ -361,7 +384,7 @@ ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_cover( * In general, it's recommended to provide a few thousands samples, though this can vary a lot. * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. */ -ZDICTLIB_API size_t ZDICT_trainFromBuffer_fastCover(void *dictBuffer, +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_fastCover(void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer, const size_t *samplesSizes, unsigned nbSamples, ZDICT_fastCover_params_t parameters); @@ -384,7 +407,7 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer_fastCover(void *dictBuffer, * See ZDICT_trainFromBuffer() for details on failure modes. * Note: ZDICT_optimizeTrainFromBuffer_fastCover() requires about 6 * 2^f bytes of memory for each thread. */ -ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_fastCover(void* dictBuffer, +ZDICTLIB_STATIC_API size_t ZDICT_optimizeTrainFromBuffer_fastCover(void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, ZDICT_fastCover_params_t* parameters); @@ -409,7 +432,7 @@ typedef struct { * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. * Note: ZDICT_trainFromBuffer_legacy() will send notifications into stderr if instructed to, using notificationLevel>0. */ -ZDICTLIB_API size_t ZDICT_trainFromBuffer_legacy( +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_legacy( void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, ZDICT_legacy_params_t parameters); @@ -421,32 +444,31 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer_legacy( or _CRT_SECURE_NO_WARNINGS in Visual. Otherwise, it's also possible to manually define ZDICT_DISABLE_DEPRECATE_WARNINGS */ #ifdef ZDICT_DISABLE_DEPRECATE_WARNINGS -# define ZDICT_DEPRECATED(message) ZDICTLIB_API /* disable deprecation warnings */ +# define ZDICT_DEPRECATED(message) /* disable deprecation warnings */ #else # define ZDICT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) # if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define ZDICT_DEPRECATED(message) [[deprecated(message)]] ZDICTLIB_API +# define ZDICT_DEPRECATED(message) [[deprecated(message)]] # elif defined(__clang__) || (ZDICT_GCC_VERSION >= 405) -# define ZDICT_DEPRECATED(message) ZDICTLIB_API __attribute__((deprecated(message))) +# define ZDICT_DEPRECATED(message) __attribute__((deprecated(message))) # elif (ZDICT_GCC_VERSION >= 301) -# define ZDICT_DEPRECATED(message) ZDICTLIB_API __attribute__((deprecated)) +# define ZDICT_DEPRECATED(message) __attribute__((deprecated)) # elif defined(_MSC_VER) -# define ZDICT_DEPRECATED(message) ZDICTLIB_API __declspec(deprecated(message)) +# define ZDICT_DEPRECATED(message) __declspec(deprecated(message)) # else # pragma message("WARNING: You need to implement ZDICT_DEPRECATED for this compiler") -# define ZDICT_DEPRECATED(message) ZDICTLIB_API +# define ZDICT_DEPRECATED(message) # endif #endif /* ZDICT_DISABLE_DEPRECATE_WARNINGS */ ZDICT_DEPRECATED("use ZDICT_finalizeDictionary() instead") +ZDICTLIB_STATIC_API size_t ZDICT_addEntropyTablesFromBuffer(void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity, const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples); -#endif /* ZDICT_STATIC_LINKING_ONLY */ +#endif /* ZSTD_ZDICT_H_STATIC */ #if defined (__cplusplus) } #endif - -#endif /* DICTBUILDER_H_001 */ diff --git a/src/dependencies/zstd-1.5.0/lib/zstd.h b/src/dependencies/zstd-1.5.4/lib/zstd.h similarity index 77% rename from src/dependencies/zstd-1.5.0/lib/zstd.h rename to src/dependencies/zstd-1.5.4/lib/zstd.h index 4651e6c..95aac07 100644 --- a/src/dependencies/zstd-1.5.0/lib/zstd.h +++ b/src/dependencies/zstd-1.5.4/lib/zstd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -14,27 +14,61 @@ extern "C" { #ifndef ZSTD_H_235446 #define ZSTD_H_235446 -/* ====== Dependency ======*/ +/* ====== Dependencies ======*/ #include /* INT_MAX */ #include /* size_t */ /* ===== ZSTDLIB_API : control library symbols visibility ===== */ -#ifndef ZSTDLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#ifndef ZSTDLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE ZSTDLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) # else -# define ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE # endif #endif -#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) -# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY -#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) -# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ -#else -# define ZSTDLIB_API ZSTDLIB_VISIBILITY + +#ifndef ZSTDLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDLIB_HIDDEN +# endif #endif +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDLIB_API ZSTDLIB_VISIBLE +#endif + +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + /******************************************************************************* Introduction @@ -72,7 +106,7 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 #define ZSTD_VERSION_MINOR 5 -#define ZSTD_VERSION_RELEASE 0 +#define ZSTD_VERSION_RELEASE 4 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) /*! ZSTD_versionNumber() : @@ -163,7 +197,9 @@ ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t * "empty", "unknown" and "error" results to the same return value (0), * while ZSTD_getFrameContentSize() gives them separate return values. * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ -ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +ZSTDLIB_API +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); /*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ * `src` should point to the start of a ZSTD frame or skippable frame. @@ -175,8 +211,30 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize) /*====== Helper functions ======*/ -#define ZSTD_COMPRESSBOUND(srcSize) ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ -ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_compressBound() : + * maximum compressed size in worst case single-pass scenario. + * When invoking `ZSTD_compress()` or any other one-pass compression function, + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + * as it eliminates one potential failure scenario, + * aka not enough room in dst buffer to write the compressed frame. + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + * In which case, ZSTD_compressBound() will return an error code + * which can be tested using ZSTD_isError(). + * + * ZSTD_COMPRESSBOUND() : + * same as ZSTD_compressBound(), but as a macro. + * It can be used to produce constants, which can be useful for static allocation, + * for example to size a static array on stack. + * Will produce constant value 0 if srcSize too large. + */ +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_isError() : + * Most ZSTD_* functions returning a size_t value can be tested for error, + * using ZSTD_isError(). + * @return 1 if error, 0 otherwise + */ ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */ @@ -247,7 +305,7 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, * * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). * - * This API supercedes all other "advanced" API entry points in the experimental section. + * This API supersedes all other "advanced" API entry points in the experimental section. * In the future, we expect to remove from experimental API entry points which are redundant with this API. */ @@ -417,8 +475,11 @@ typedef enum { * ZSTD_c_stableOutBuffer * ZSTD_c_blockDelimiters * ZSTD_c_validateSequences - * ZSTD_c_splitBlocks + * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables + * ZSTD_c_enableSeqProducerFallback + * ZSTD_c_maxBlockSize * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; * also, the enums values themselves are unstable and can still change. @@ -437,7 +498,11 @@ typedef enum { ZSTD_c_experimentalParam12=1009, ZSTD_c_experimentalParam13=1010, ZSTD_c_experimentalParam14=1011, - ZSTD_c_experimentalParam15=1012 + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013, + ZSTD_c_experimentalParam17=1014, + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 } ZSTD_cParameter; typedef struct { @@ -500,7 +565,7 @@ typedef enum { * They will be used to compress next frame. * Resetting session never fails. * - The parameters : changes all parameters back to "default". - * This removes any reference to any dictionary too. + * This also removes any reference to any dictionary or external sequence producer. * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) * - Both : similar to resetting the session, followed by resetting parameters. @@ -550,13 +615,15 @@ typedef enum { * ZSTD_d_stableOutBuffer * ZSTD_d_forceIgnoreChecksum * ZSTD_d_refMultipleDDicts + * ZSTD_d_disableHuffmanAssembly * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly */ ZSTD_d_experimentalParam1=1000, ZSTD_d_experimentalParam2=1001, ZSTD_d_experimentalParam3=1002, - ZSTD_d_experimentalParam4=1003 + ZSTD_d_experimentalParam4=1003, + ZSTD_d_experimentalParam5=1004 } ZSTD_dParameter; @@ -735,8 +802,6 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output * This following is a legacy streaming API, available since v1.0+ . * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). * It is redundant, but remains fully supported. - * Streaming in combination with advanced parameters and dictionary compression - * can only be used through the new API. ******************************************************************************/ /*! @@ -745,6 +810,9 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * + * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + * to compress with a dictionary. */ ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); /*! @@ -795,13 +863,31 @@ ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer /*===== Streaming decompression functions =====*/ -/* This function is redundant with the advanced API and equivalent to: +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. * + * Note : This function is redundant with the advanced API and equivalent to: * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); * ZSTD_DCtx_refDDict(zds, NULL); */ ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Function will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completely decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ @@ -920,7 +1006,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); * If @return == 0, the dictID could not be decoded. * This could for one of the following reasons : * - The frame does not require a dictionary to be decoded (most common case). - * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. * Note : this use case also happens when using a non-conformant dictionary. * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). * - This is not a Zstandard frame. @@ -932,7 +1018,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); * Advanced dictionary and prefix API (Requires v1.4.0+) * * This API allows dictionaries to be used with ZSTD_compress2(), - * ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). Dictionaries are sticky, and * only reset with the context is reset with ZSTD_reset_parameters or * ZSTD_reset_session_and_parameters. Prefixes are single-use. ******************************************************************************/ @@ -944,8 +1030,9 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, * meaning "return to no-dictionary mode". - * Note 1 : Dictionary is sticky, it will be used for all future compressed frames. - * To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters). + * Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + * until parameters are reset, a new dictionary is loaded, or the dictionary + * is explicitly invalidated by loading a NULL dictionary. * Note 2 : Loading a dictionary involves building tables. * It's also a CPU consuming operation, with non-negligible impact on latency. * Tables are dependent on compression parameters, and for this reason, @@ -958,7 +1045,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); /*! ZSTD_CCtx_refCDict() : Requires v1.4.0+ - * Reference a prepared dictionary, to be used for all next compressed frames. + * Reference a prepared dictionary, to be used for all future compressed frames. * Note that compression parameters are enforced from within CDict, * and supersede any compression parameter previously set within CCtx. * The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. @@ -993,9 +1080,9 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize); /*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+ - * Create an internal DDict from dict buffer, - * to be used to decompress next frames. - * The dictionary remains valid for all future frames, until explicitly invalidated. + * Create an internal DDict from dict buffer, to be used to decompress all future frames. + * The dictionary remains valid for all future frames, until explicitly invalidated, or + * a new dictionary is loaded. * @result : 0, or an error code (which can be tested with ZSTD_isError()). * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, * meaning "return to no-dictionary mode". @@ -1019,9 +1106,10 @@ ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, s * The memory for the table is allocated on the first call to refDDict, and can be * freed with ZSTD_freeDCtx(). * + * If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + * will be managed, and referencing a dictionary effectively "discards" any previous one. + * * @result : 0, or an error code (which can be tested with ZSTD_isError()). - * Note 1 : Currently, only one dictionary can be managed. - * Referencing a new dictionary effectively "discards" any previous one. * Special: referencing a NULL DDict means "return to no-dictionary mode". * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. */ @@ -1073,27 +1161,16 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY -/* Deprecation warnings : - * Should these warnings be a problem, it is generally possible to disable them, - * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. - * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. - */ -#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS -# define ZSTD_DEPRECATED(message) ZSTDLIB_API /* disable deprecation warnings */ -#else -# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define ZSTD_DEPRECATED(message) [[deprecated(message)]] ZSTDLIB_API -# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated(message))) -# elif defined(__GNUC__) && (__GNUC__ >= 3) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated)) -# elif defined(_MSC_VER) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __declspec(deprecated(message)) +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE # else -# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") -# define ZSTD_DEPRECATED(message) ZSTDLIB_API +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE # endif -#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ +#endif /**************************************************************************************** * experimental API (static linking only) @@ -1129,6 +1206,7 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ #define ZSTD_STRATEGY_MIN ZSTD_fast #define ZSTD_STRATEGY_MAX ZSTD_btultra2 +#define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */ #define ZSTD_OVERLAPLOG_MIN 0 @@ -1157,9 +1235,6 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #define ZSTD_SRCSIZEHINT_MIN 0 #define ZSTD_SRCSIZEHINT_MAX INT_MAX -/* internal */ -#define ZSTD_HASHLOG3_MAX 17 - /* --- Advanced types --- */ @@ -1302,10 +1377,14 @@ typedef enum { } ZSTD_literalCompressionMode_e; typedef enum { - ZSTD_urm_auto = 0, /* Automatically determine whether or not we use row matchfinder */ - ZSTD_urm_disableRowMatchFinder = 1, /* Never use row matchfinder */ - ZSTD_urm_enableRowMatchFinder = 2 /* Always use row matchfinder when applicable */ -} ZSTD_useRowMatchFinderMode_e; + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; /*************************************** * Frame size functions @@ -1332,7 +1411,7 @@ typedef enum { * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to * read each contained frame header. This is fast as most of the data is skipped, * however it does mean that all frame data must be present and valid. */ -ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); /*! ZSTD_decompressBound() : * `src` should point to the start of a series of ZSTD encoded and/or skippable frames @@ -1347,41 +1426,97 @@ ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: * upper-bound = # blocks * min(128 KB, Window_Size) */ -ZSTDLIB_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); /*! ZSTD_frameHeaderSize() : * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. * @return : size of the Frame Header, * or an error code (if srcSize is too small) */ -ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); + +/*! ZSTD_decompressionMargin() : + * Zstd supports in-place decompression, where the input and output buffers overlap. + * In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + * and the input buffer must be at the end of the output buffer. + * + * _______________________ Output Buffer ________________________ + * | | + * | ____ Input Buffer ____| + * | | | + * v v v + * |---------------------------------------|-----------|----------| + * ^ ^ ^ + * |___________________ Output_Size ___________________|_ Margin _| + * + * NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + * ZSTD_decompressDCtx(). + * NOTE: This function supports multi-frame input. + * + * @param src The compressed frame(s) + * @param srcSize The size of the compressed frame(s) + * @returns The decompression margin or an error that can be checked with ZSTD_isError(). + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize); + +/*! ZSTD_DECOMPRESS_MARGIN() : + * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + * the compressed frame, compute it from the original size and the blockSizeLog. + * See ZSTD_decompressionMargin() for details. + * + * WARNING: This macro does not support multi-frame input, the input must be a single + * zstd frame. If you need that support use the function, or implement it yourself. + * + * @param originalSize The original uncompressed size of the data. + * @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + * Unless you explicitly set the windowLog smaller than + * ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + */ +#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)( \ + ZSTD_FRAMEHEADERSIZE_MAX /* Frame header */ + \ + 4 /* checksum */ + \ + ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \ + (blockSize) /* One block of margin */ \ + )) typedef enum { ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ } ZSTD_sequenceFormat_e; +/*! ZSTD_sequenceBound() : + * `srcSize` : size of the input buffer + * @return : upper-bound for the number of sequences that can be generated + * from a buffer of srcSize bytes + * + * note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + */ +ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize); + /*! ZSTD_generateSequences() : - * Generate sequences using ZSTD_compress2, given a source buffer. + * Generate sequences using ZSTD_compress2(), given a source buffer. * * Each block will end with a dummy sequence * with offset == 0, matchLength == 0, and litLength == length of last literals. * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) * simply acts as a block delimiter. * - * zc can be used to insert custom compression params. - * This function invokes ZSTD_compress2 + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). * * The output of this function can be fed into ZSTD_compressSequences() with CCtx * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters * @return : number of sequences generated */ -ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, - size_t outSeqsSize, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); /*! ZSTD_mergeBlockDelimiters() : * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals - * by merging them into into the literals of the next sequence. + * by merging them into the literals of the next sequence. * * As such, the final generated result has no explicit representation of block boundaries, * and the final last literals segment is not represented in the sequences. @@ -1390,10 +1525,12 @@ ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters * @return : number of sequences left after merging */ -ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); /*! ZSTD_compressSequences() : - * Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) * The entire source is compressed into a single frame. * @@ -1418,17 +1555,18 @@ ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t se * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, * and cannot emit an RLE block that disagrees with the repcode history - * @return : final compressed size or a ZSTD error. + * @return : final compressed size, or a ZSTD error code. */ -ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize, - const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); /*! ZSTD_writeSkippableFrame() : * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. * - * Skippable frames begin with a a 4-byte magic number. There are 16 possible choices of magic number, + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. @@ -1438,9 +1576,29 @@ ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size * * @return : number of bytes written or a ZSTD error. */ -ZSTDLIB_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned magicVariant); +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); + + /*************************************** * Memory management @@ -1466,13 +1624,16 @@ ZSTDLIB_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. * - * Note 2 : only single-threaded compression is supported. + * Note : only single-threaded compression is supported. * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. */ -ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); /*! ZSTD_estimateCStreamSize() : * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. @@ -1486,21 +1647,26 @@ ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), * an internal ?Dict will be created, which additional size is not estimated here. - * In this case, get total size by adding ZSTD_estimate?DictSize */ -ZSTDLIB_API size_t ZSTD_estimateCStreamSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize(size_t windowSize); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); + * In this case, get total size by adding ZSTD_estimate?DictSize + * Note 2 : only single-threaded compression is supported. + * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); /*! ZSTD_estimate?DictSize() : * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. */ -ZSTDLIB_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); -ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); /*! ZSTD_initStatic*() : * Initialize an object using a pre-allocated fixed-size buffer. @@ -1523,20 +1689,20 @@ ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e * Limitation 2 : static cctx currently not compatible with multi-threading. * Limitation 3 : static dctx is incompatible with legacy support. */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ -ZSTDLIB_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ -ZSTDLIB_API const ZSTD_CDict* ZSTD_initStaticCDict( +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams); -ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict( +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, @@ -1557,44 +1723,44 @@ __attribute__((__unused__)) #endif ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams, ZSTD_customMem customMem); -/* ! Thread pool : - * These prototypes make it possible to share a thread pool among multiple compression contexts. - * This can limit resources for applications with multiple threads where each one uses - * a threaded compression mode (via ZSTD_c_nbWorkers parameter). - * ZSTD_createThreadPool creates a new thread pool with a given number of threads. - * Note that the lifetime of such pool must exist while being used. - * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value - * to use an internal thread pool). - * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. */ typedef struct POOL_ctx_s ZSTD_threadPool; -ZSTDLIB_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); -ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ -ZSTDLIB_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); /* * This API is temporary and is expected to change or disappear in the future! */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2( +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, const ZSTD_CCtx_params* cctxParams, ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced( +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, @@ -1611,22 +1777,22 @@ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced( * As a consequence, `dictBuffer` **must** outlive CDict, * and its content must remain unmodified throughout the lifetime of CDict. * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); /*! ZSTD_getCParams() : * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. * `estimatedSrcSize` value is optional, select 0 if not known */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_getParams() : * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ -ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_checkCParams() : * Ensure param values remain within authorized range. * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ -ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); /*! ZSTD_adjustCParams() : * optimize params for a given `srcSize` and `dictSize`. @@ -1634,24 +1800,33 @@ ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); * `dictSize` must be `0` when there is no dictionary. * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. * This function never fails (wide contract) */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_CCtx_setCParams() : + * Set all parameters provided within @cparams into the working @cctx. + * Note : if modifying parameters during compression (MT mode only), + * note that changes to the .windowLog parameter will be ignored. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams); /*! ZSTD_compress_advanced() : * Note : this function is now DEPRECATED. * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_compress2") +ZSTDLIB_STATIC_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const void* dict,size_t dictSize, - ZSTD_parameters params); + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); /*! ZSTD_compress_usingCDict_advanced() : * Note : this function is now DEPRECATED. * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") +ZSTDLIB_STATIC_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, @@ -1662,18 +1837,18 @@ size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, /*! ZSTD_CCtx_loadDictionary_byReference() : * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); /*! ZSTD_CCtx_loadDictionary_advanced() : * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_CCtx_refPrefix_advanced() : * Same as ZSTD_CCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /* === experimental parameters === */ /* these parameters can be used with ZSTD_setParameter() @@ -1712,9 +1887,15 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * See the comments on that enum for an explanation of the feature. */ #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 -/* Controls how the literals are compressed (default is auto). - * The value must be of type ZSTD_literalCompressionMode_e. - * See ZSTD_literalCompressionMode_e enum definition for details. +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. */ #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 @@ -1777,7 +1958,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * * Note that this means that the CDict tables can no longer be copied into the * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be - * useable. The dictionary can only be attached or reloaded. + * usable. The dictionary can only be attached or reloaded. * * In general, you should expect compression to be faster--sometimes very much * so--and CDict creation to be slightly slower. Eventually, we will probably @@ -1789,13 +1970,16 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * Experimental parameter. * Default is 0 == disabled. Set to 1 to enable. * - * Tells the compressor that the ZSTD_inBuffer will ALWAYS be the same - * between calls, except for the modifications that zstd makes to pos (the - * caller must not modify pos). This is checked by the compressor, and - * compression will fail if it ever changes. This means the only flush - * mode that makes sense is ZSTD_e_end, so zstd will error if ZSTD_e_end - * is not used. The data in the ZSTD_inBuffer in the range [src, src + pos) - * MUST not be modified during compression or you will get data corruption. + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. * * When this flag is enabled zstd won't allocate an input window buffer, * because the user guarantees it can reference the ZSTD_inBuffer until @@ -1803,18 +1987,15 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also * avoid the memcpy() from the input buffer to the input window buffer. * - * NOTE: ZSTD_compressStream2() will error if ZSTD_e_end is not used. - * That means this flag cannot be used with ZSTD_compressStream(). - * * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using * this flag is ALWAYS memory safe, and will never access out-of-bounds - * memory. However, compression WILL fail if you violate the preconditions. + * memory. However, compression WILL fail if conditions are not respected. * - * WARNING: The data in the ZSTD_inBuffer in the range [dst, dst + pos) MUST - * not be modified during compression or you will get data corruption. This - * is because zstd needs to reference data in the ZSTD_inBuffer to find + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST + * not be modified during compression or it will result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find * matches. Normally zstd maintains its own window buffer for this purpose, - * but passing this flag tells zstd to use the user provided buffer. + * but passing this flag tells zstd to rely on user provided buffer instead. */ #define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 @@ -1859,30 +2040,33 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * Without validation, providing a sequence that does not conform to the zstd spec will cause * undefined behavior, and may produce a corrupted block. * - * With validation enabled, a if sequence is invalid (see doc/zstd_compression_format.md for + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for * specifics regarding offset/matchlength requirements) then the function will bail out and * return an error. * */ #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 -/* ZSTD_c_splitBlocks - * Default is 0 == disabled. Set to 1 to enable block splitting. +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. * - * Will attempt to split blocks in order to improve compression ratio at the cost of speed. + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. */ -#define ZSTD_c_splitBlocks ZSTD_c_experimentalParam13 +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 /* ZSTD_c_useRowMatchFinder - * Default is ZSTD_urm_auto. - * Controlled with ZSTD_useRowMatchFinderMode_e enum. + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. * - * By default, in ZSTD_urm_auto, when finalizing the compression parameters, the library - * will decide at runtime whether to use the row-based matchfinder based on support for SIMD - * instructions as well as the windowLog. - * - * Set to ZSTD_urm_disableRowMatchFinder to never use row-based matchfinder. - * Set to ZSTD_urm_enableRowMatchFinder to force usage of row-based matchfinder. + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 */ #define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 @@ -1906,12 +2090,85 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre */ #define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + +/* ZSTD_c_enableSeqProducerFallback + * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. + * + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will + * follow any other cParam settings, such as compression level, the same as in a + * normal (fully-internal) compression operation. + * + * The user is strongly encouraged to read the full Block-Level Sequence Producer API + * documentation (below) before setting this parameter. */ +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 + +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. + * + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() innacurate). Only currently meant to be used for testing. + * + */ +#define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 + +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external block-level + * sequence producer. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external sequence producer, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + /*! ZSTD_CCtx_getParameter() : * Get the requested compression parameter value, selected by enum ZSTD_cParameter, * and store it into int* value. * @return : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_params : @@ -1931,25 +2188,25 @@ ZSTDLIB_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() * for static allocation of CCtx for single-threaded compression. */ -ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); -ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ /*! ZSTD_CCtxParams_reset() : * Reset params to default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); /*! ZSTD_CCtxParams_init() : * Initializes the compression parameters of cctxParams according to * compression level. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); /*! ZSTD_CCtxParams_init_advanced() : * Initializes the compression and frame parameters of cctxParams according to * params. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); /*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ * Similar to ZSTD_CCtx_setParameter. @@ -1959,14 +2216,14 @@ ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, Z * @result : a code representing success or failure (which can be tested with * ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); /*! ZSTD_CCtxParams_getParameter() : * Similar to ZSTD_CCtx_getParameter. * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. * @result : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_setParametersUsingCCtxParams() : * Apply a set of ZSTD_CCtx_params to the compression context. @@ -1975,7 +2232,7 @@ ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, * if nbWorkers>=1, new parameters will be picked up at next job, * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). */ -ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); /*! ZSTD_compressStream2_simpleArgs() : @@ -1984,7 +2241,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( * This variant might be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos, @@ -2000,33 +2257,33 @@ ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. * Note 3 : Skippable Frame Identifiers are considered valid. */ -ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size); +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); /*! ZSTD_createDDict_byReference() : * Create a digested dictionary, ready to start decompression operation without startup delay. * Dictionary content is referenced, and therefore stays in dictBuffer. * It is important that dictBuffer outlives DDict, * it must remain read accessible throughout the lifetime of DDict */ -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_byReference() : * Same as ZSTD_DCtx_loadDictionary(), * but references `dict` content instead of copying it into `dctx`. * This saves memory if `dict` remains around., * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_advanced() : * Same as ZSTD_DCtx_loadDictionary(), * but gives direct control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_refPrefix_advanced() : * Same as ZSTD_DCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_setMaxWindowSize() : * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. @@ -2035,14 +2292,14 @@ ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* pre * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); /*! ZSTD_DCtx_getParameter() : * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, * and store it into int* value. * @return : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); /* ZSTD_d_format * experimental parameter, @@ -2062,7 +2319,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param * in the range [dst, dst + pos) MUST not be modified during decompression * or you will get data corruption. * - * When this flags is enabled zstd won't allocate an output buffer, because + * When this flag is enabled zstd won't allocate an output buffer, because * it can write directly to the ZSTD_outBuffer, but it will still allocate * an input buffer large enough to fit any compressed block. This will also * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. @@ -2115,6 +2372,17 @@ ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param */ #define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4 +/* ZSTD_d_disableHuffmanAssembly + * Set to 1 to disable the Huffman assembly implementation. + * The default value is 0, which allows zstd to use the Huffman assembly + * implementation if available. + * + * This parameter can be used to disable Huffman assembly at runtime. + * If you want to disable it at compile time you can define the macro + * ZSTD_DISABLE_ASM. + */ +#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5 + /*! ZSTD_DCtx_setFormat() : * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). @@ -2123,6 +2391,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param * such ZSTD_f_zstd1_magicless for example. * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); /*! ZSTD_decompressStream_simpleArgs() : @@ -2131,7 +2400,7 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); * This can be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos); @@ -2159,6 +2428,7 @@ ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize); @@ -2176,6 +2446,7 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel); @@ -2196,6 +2467,7 @@ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize, ZSTD_parameters params, @@ -2205,11 +2477,12 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, * This function is DEPRECATED, and equivalent to: * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); * ZSTD_CCtx_refCDict(zcs, cdict); - * + * * note : cdict will just be referenced, and must outlive compression session * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); /*! ZSTD_initCStream_usingCDict_advanced() : @@ -2228,6 +2501,7 @@ size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, ZSTD_frameParameters fParams, @@ -2252,6 +2526,7 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, * This prototype will generate compilation warnings. */ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); @@ -2270,7 +2545,7 @@ typedef struct { * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. * Aggregates progression inside active worker threads. */ -ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); /*! ZSTD_toFlushNow() : * Tell how many bytes are ready to be flushed immediately. @@ -2285,7 +2560,7 @@ ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx * therefore flush speed is limited by production speed of oldest job * irrespective of the speed of concurrent (and newer) jobs. */ -ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); /*===== Advanced Streaming decompression functions =====*/ @@ -2297,9 +2572,9 @@ ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); * * note: no dictionary will be used if dict == NULL or dictSize < 8 - * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /*! * This function is deprecated, and is equivalent to: @@ -2308,9 +2583,9 @@ ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dic * ZSTD_DCtx_refDDict(zds, ddict); * * note : ddict is referenced, it must outlive decompression session - * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); /*! * This function is deprecated, and is equivalent to: @@ -2318,9 +2593,9 @@ ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDi * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); * * re-use decompression parameters from previous init; saves dictionary loading - * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); +ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /********************************************************************* @@ -2340,7 +2615,6 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -2362,18 +2636,23 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); */ /*===== Buffer-less streaming compression functions =====*/ -ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ -ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ -ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API +size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ /** Buffer-less streaming decompression (synchronous mode) @@ -2386,8 +2665,8 @@ size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_ Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. Data fragment must be large enough to ensure successful decoding. `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. - @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. - >0 : `srcSize` is too small, please provide at least @result bytes on next attempt. + result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least result bytes on next attempt. errorCode, which can be tested using ZSTD_isError(). It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, @@ -2406,7 +2685,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_ The most memory efficient way is to use a round buffer of sufficient size. Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), - which can @return an error code if required value is too large for current system (in 32-bits mode). + which can return an error code if required value is too large for current system (in 32-bits mode). In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, up to the moment there is not enough room left in the buffer to guarantee decoding another full block, which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. @@ -2426,7 +2705,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_ ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. - @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. It can also be an error code, which can be tested with ZSTD_isError(). @@ -2458,6 +2737,8 @@ typedef struct { unsigned headerSize; unsigned dictID; unsigned checksumFlag; + unsigned _reserved1; + unsigned _reserved2; } ZSTD_frameHeader; /*! ZSTD_getFrameHeader() : @@ -2465,24 +2746,25 @@ typedef struct { * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, * or an error code, which can be tested using ZSTD_isError() */ -ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ /*! ZSTD_getFrameHeader_advanced() : * same as ZSTD_getFrameHeader(), * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ -ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); -ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); -ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ -ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; -ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); @@ -2502,7 +2784,6 @@ ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); - It is necessary to init context before starting + compression : any ZSTD_compressBegin*() variant, including with dictionary + decompression : any ZSTD_decompressBegin*() variant, including with dictionary - + copyCCtx() and copyDCtx() can be used too - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + If input is larger than a block size, it's necessary to split input data into multiple blocks + For inputs larger than a single block, consider using regular ZSTD_compress() instead. @@ -2519,12 +2800,173 @@ ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); */ /*===== Raw zstd block functions =====*/ -ZSTDLIB_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); -ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* + * + * *** OVERVIEW *** + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. + * + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. + * + * *** USAGE *** + * The user is responsible for implementing a function of type + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following + * arguments to the user-provided function: + * + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. + * + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. + * + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. + * + * - compressionLevel: a signed integer representing the zstd compression level + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. + * + * - windowSize: a size_t representing the maximum allowed offset for external + * sequences. Note that sequence offsets are sometimes allowed to exceed the + * windowSize if a dictionary is present, see doc/zstd_compression_format.md + * for details. + * + * The user-provided function shall return a size_t representing the number of + * sequences written to outSeqs. This return value will be treated as an error + * code if it is greater than outSeqsCapacity. The return value must be non-zero + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided + * for convenience, but any value greater than outSeqsCapacity will be treated as + * an error code. + * + * If the user-provided function does not return an error code, the sequences + * written to outSeqs must be a valid parse of the src buffer. Data corruption may + * occur if the parse is not valid. A parse is defined to be valid if the + * following conditions hold: + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in + * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. + * + * zstd will only validate these conditions (and fail compression if they do not + * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence + * validation has a performance cost. + * + * If the user-provided function returns an error, zstd will either fall back + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. + * + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. + * + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. + * + * *** LIMITATIONS *** + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: + * + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. + * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default + * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). + * + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user + * references a dictionary, but the dictionary won't have any effect. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. + * + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. + * Multi-threading across compressions is fine: simply create one CCtx per thread. + * + * Long-term, we plan to overcome all three limitations. There is no technical blocker to + * overcoming them. It is purely a question of engineering effort. + */ + +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) + +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. + * + * The sequenceProducerState must be initialized by the caller, and the caller is + * responsible for managing its lifetime. This parameter is sticky across + * compressions. It will remain set until the user explicitly resets compression + * parameters. + * + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. + * + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. + * + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ +ZSTDLIB_STATIC_API void +ZSTD_registerSequenceProducer( + ZSTD_CCtx* cctx, + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer +); + #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ #if defined (__cplusplus) diff --git a/src/dependencies/zstd-1.5.0/lib/zstd_errors.h b/src/dependencies/zstd-1.5.4/lib/zstd_errors.h similarity index 74% rename from src/dependencies/zstd-1.5.0/lib/zstd_errors.h rename to src/dependencies/zstd-1.5.4/lib/zstd_errors.h index fa3686b..dc75eee 100644 --- a/src/dependencies/zstd-1.5.0/lib/zstd_errors.h +++ b/src/dependencies/zstd-1.5.4/lib/zstd_errors.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -20,19 +20,31 @@ extern "C" { /* ===== ZSTDERRORLIB_API : control library symbols visibility ===== */ -#ifndef ZSTDERRORLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define ZSTDERRORLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#ifndef ZSTDERRORLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_VISIBLE ZSTDERRORLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_VISIBLE __attribute__ ((visibility ("default"))) # else -# define ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_VISIBLE # endif #endif + +#ifndef ZSTDERRORLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDERRORLIB_HIDDEN +# endif +#endif + #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) -# define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBLE #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) -# define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +# define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ #else -# define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBLE #endif /*-********************************************* @@ -58,14 +70,17 @@ typedef enum { ZSTD_error_frameParameter_windowTooLarge = 16, ZSTD_error_corruption_detected = 20, ZSTD_error_checksum_wrong = 22, + ZSTD_error_literals_headerWrong = 24, ZSTD_error_dictionary_corrupted = 30, ZSTD_error_dictionary_wrong = 32, ZSTD_error_dictionaryCreation_failed = 34, ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_combination_unsupported = 41, ZSTD_error_parameter_outOfBound = 42, ZSTD_error_tableLog_tooLarge = 44, ZSTD_error_maxSymbolValue_tooLarge = 46, ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stabilityCondition_notRespected = 50, ZSTD_error_stage_wrong = 60, ZSTD_error_init_missing = 62, ZSTD_error_memory_allocation = 64, @@ -73,11 +88,15 @@ typedef enum { ZSTD_error_dstSize_tooSmall = 70, ZSTD_error_srcSize_wrong = 72, ZSTD_error_dstBuffer_null = 74, + ZSTD_error_noForwardProgress_destFull = 80, + ZSTD_error_noForwardProgress_inputEmpty = 82, /* following error codes are __NOT STABLE__, they can be removed or changed in future versions */ ZSTD_error_frameIndex_tooLarge = 100, ZSTD_error_seekableIO = 102, ZSTD_error_dstBuffer_wrong = 104, ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_sequenceProducer_failed = 106, + ZSTD_error_externalSequences_invalid = 107, ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */ } ZSTD_ErrorCode; diff --git a/src/dependencies/zstd-1.5.0/programs/.gitignore b/src/dependencies/zstd-1.5.4/programs/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/programs/.gitignore rename to src/dependencies/zstd-1.5.4/programs/.gitignore diff --git a/src/dependencies/zstd-1.5.0/programs/BUCK b/src/dependencies/zstd-1.5.4/programs/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/programs/BUCK rename to src/dependencies/zstd-1.5.4/programs/BUCK diff --git a/src/dependencies/zstd-1.5.0/programs/Makefile b/src/dependencies/zstd-1.5.4/programs/Makefile similarity index 68% rename from src/dependencies/zstd-1.5.0/programs/Makefile rename to src/dependencies/zstd-1.5.4/programs/Makefile index 599fb02..fcff41d 100644 --- a/src/dependencies/zstd-1.5.0/programs/Makefile +++ b/src/dependencies/zstd-1.5.4/programs/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -9,7 +9,7 @@ # ########################################################################## # zstd : Command Line Utility, supporting gzip-like arguments # zstd32 : Same as zstd, but forced to compile in 32-bits mode -# zstd_nolegacy : zstd without support of decompression of legacy versions +# zstd-nolegacy : zstd without support of decompression of legacy versions # zstd-small : minimal zstd without dictionary builder and benchmark # zstd-compress : compressor-only version of zstd # zstd-decompress : decompressor-only version of zstd @@ -18,31 +18,9 @@ .PHONY: default default: zstd-release -# silent mode by default; verbose can be triggered by V=1 or VERBOSE=1 -$(V)$(VERBOSE).SILENT: +LIBZSTD := ../lib - -ZSTDDIR := ../lib - -# Version numbers -LIBVER_SRC := $(ZSTDDIR)/zstd.h -LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` -LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` -LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` -LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) -LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) -LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) -LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) -LIBVER := $(shell echo $(LIBVER_SCRIPT)) - -ZSTD_VERSION = $(LIBVER) - -HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) -GREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) - GREP_OPTIONS += --color=never -endif -GREP = grep $(GREP_OPTIONS) +include $(LIBZSTD)/libzstd.mk ifeq ($(shell $(CC) -v 2>&1 | $(GREP) -c "gcc version "), 1) ALIGN_LOOP = -falign-loops=32 @@ -50,78 +28,25 @@ else ALIGN_LOOP = endif -DEBUGLEVEL ?= 0 -CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) -ifeq ($(OS),Windows_NT) # MinGW assumed - CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting -endif -CFLAGS ?= -O3 -DEBUGFLAGS+=-Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ - -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ - -Wstrict-prototypes -Wundef -Wpointer-arith \ - -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ - -Wredundant-decls -Wmissing-prototypes -Wc++-compat -CFLAGS += $(DEBUGFLAGS) -CPPFLAGS += $(MOREFLAGS) -LDFLAGS += $(MOREFLAGS) -FLAGS = $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) - -ZSTDLIB_COMMON := $(ZSTDDIR)/common -ZSTDLIB_COMPRESS := $(ZSTDDIR)/compress -ZSTDLIB_DECOMPRESS := $(ZSTDDIR)/decompress -ZDICT_DIR := $(ZSTDDIR)/dictBuilder -ZSTDLEGACY_DIR := $(ZSTDDIR)/legacy - -vpath %.c $(ZSTDLIB_COMMON) $(ZSTDLIB_COMPRESS) $(ZSTDLIB_DECOMPRESS) $(ZDICT_DIR) $(ZSTDLEGACY_DIR) - -ZSTDLIB_COMMON_C := $(wildcard $(ZSTDLIB_COMMON)/*.c) -ZSTDLIB_COMPRESS_C := $(wildcard $(ZSTDLIB_COMPRESS)/*.c) -ZSTDLIB_DECOMPRESS_C := $(wildcard $(ZSTDLIB_DECOMPRESS)/*.c) -ZSTDLIB_CORE_SRC := $(ZSTDLIB_DECOMPRESS_C) $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) -ZDICT_SRC := $(wildcard $(ZDICT_DIR)/*.c) - -ZSTD_LEGACY_SUPPORT ?= 5 -ZSTDLEGACY_SRC := -ifneq ($(ZSTD_LEGACY_SUPPORT), 0) -ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) - ZSTDLEGACY_SRC += $(shell ls $(ZSTDLEGACY_DIR)/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') -endif -endif +ZSTDLIB_COMMON_SRC := $(sort $(ZSTD_COMMON_FILES)) +ZSTDLIB_COMPRESS_SRC := $(sort $(ZSTD_COMPRESS_FILES)) +ZSTDLIB_DECOMPRESS_SRC := $(sort $(ZSTD_DECOMPRESS_FILES)) +ZSTDLIB_CORE_SRC := $(sort $(ZSTD_DECOMPRESS_FILES) $(ZSTD_COMMON_FILES) $(ZSTD_COMPRESS_FILES)) +ZDICT_SRC := $(sort $(ZSTD_DICTBUILDER_FILES)) +ZSTDLEGACY_SRC := $(sort $(ZSTD_LEGACY_FILES)) # Sort files in alphabetical order for reproducible builds ZSTDLIB_FULL_SRC = $(sort $(ZSTDLIB_CORE_SRC) $(ZSTDLEGACY_SRC) $(ZDICT_SRC)) ZSTDLIB_LOCAL_SRC = $(notdir $(ZSTDLIB_FULL_SRC)) -ZSTDLIB_LOCAL_OBJ := $(ZSTDLIB_LOCAL_SRC:.c=.o) +ZSTDLIB_LOCAL_OBJ0 := $(ZSTDLIB_LOCAL_SRC:.c=.o) +ZSTDLIB_LOCAL_OBJ := $(ZSTDLIB_LOCAL_OBJ0:.S=.o) -ZSTD_CLI_SRC := $(wildcard *.c) +ZSTD_CLI_SRC := $(sort $(wildcard *.c)) ZSTD_CLI_OBJ := $(ZSTD_CLI_SRC:.c=.o) ZSTD_ALL_SRC = $(ZSTDLIB_LOCAL_SRC) $(ZSTD_CLI_SRC) -ZSTD_ALL_OBJ := $(ZSTD_ALL_SRC:.c=.o) - -UNAME := $(shell uname) - -ifndef BUILD_DIR -ifeq ($(UNAME), Darwin) - ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0) - HASH ?= md5 - endif -else ifeq ($(UNAME), FreeBSD) - HASH ?= gmd5sum -else ifeq ($(UNAME), NetBSD) - HASH ?= md5 -n -else ifeq ($(UNAME), OpenBSD) - HASH ?= md5 -endif -HASH ?= md5sum -HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) - -HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " ") -ifeq ($(HAVE_HASH),0) - $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) - BUILD_DIR := obj/generic_noconf -endif -endif # BUILD_DIR +ZSTD_ALL_OBJ0 := $(ZSTD_ALL_SRC:.c=.o) +ZSTD_ALL_OBJ := $(ZSTD_ALL_OBJ0:.S=.o) # Define *.exe as extension for Windows systems ifneq (,$(filter Windows%,$(OS))) @@ -137,11 +62,6 @@ else EXT = endif -VOID = /dev/null - -# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/) -NUM_SYMBOL := \# - # thread detection NO_THREAD_MSG := ==> no threads, building without multithreading support HAVE_PTHREAD := $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_pthread.c && $(CC) $(FLAGS) -o have_pthread$(EXT) have_pthread.c -pthread 2> $(VOID) && rm have_pthread$(EXT) && echo 1 || echo 0; rm have_pthread.c) @@ -156,7 +76,7 @@ endif # zlib detection NO_ZLIB_MSG := ==> no zlib, building zstd without .gz support -HAVE_ZLIB := $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_zlib.c && $(CC) $(FLAGS) -o have_zlib$(EXT) have_zlib.c -lz 2> $(VOID) && rm have_zlib$(EXT) && echo 1 || echo 0; rm have_zlib.c) +HAVE_ZLIB ?= $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_zlib.c && $(CC) $(FLAGS) -o have_zlib$(EXT) have_zlib.c -lz 2> $(VOID) && rm have_zlib$(EXT) && echo 1 || echo 0; rm have_zlib.c) ifeq ($(HAVE_ZLIB), 1) ZLIB_MSG := ==> building zstd with .gz compression support ZLIBCPP = -DZSTD_GZCOMPRESS -DZSTD_GZDECOMPRESS @@ -167,7 +87,7 @@ endif # lzma detection NO_LZMA_MSG := ==> no liblzma, building zstd without .xz/.lzma support -HAVE_LZMA := $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lzma.c && $(CC) $(FLAGS) -o have_lzma$(EXT) have_lzma.c -llzma 2> $(VOID) && rm have_lzma$(EXT) && echo 1 || echo 0; rm have_lzma.c) +HAVE_LZMA ?= $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lzma.c && $(CC) $(FLAGS) -o have_lzma$(EXT) have_lzma.c -llzma 2> $(VOID) && rm have_lzma$(EXT) && echo 1 || echo 0; rm have_lzma.c) ifeq ($(HAVE_LZMA), 1) LZMA_MSG := ==> building zstd with .xz/.lzma compression support LZMACPP = -DZSTD_LZMACOMPRESS -DZSTD_LZMADECOMPRESS @@ -178,7 +98,7 @@ endif # lz4 detection NO_LZ4_MSG := ==> no liblz4, building zstd without .lz4 support -HAVE_LZ4 := $(shell printf '$(NUM_SYMBOL)include \n$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lz4.c && $(CC) $(FLAGS) -o have_lz4$(EXT) have_lz4.c -llz4 2> $(VOID) && rm have_lz4$(EXT) && echo 1 || echo 0; rm have_lz4.c) +HAVE_LZ4 ?= $(shell printf '$(NUM_SYMBOL)include \n$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lz4.c && $(CC) $(FLAGS) -o have_lz4$(EXT) have_lz4.c -llz4 2> $(VOID) && rm have_lz4$(EXT) && echo 1 || echo 0; rm have_lz4.c) ifeq ($(HAVE_LZ4), 1) LZ4_MSG := ==> building zstd with .lz4 compression support LZ4CPP = -DZSTD_LZ4COMPRESS -DZSTD_LZ4DECOMPRESS @@ -209,10 +129,10 @@ SET_CACHE_DIRECTORY = \ .PHONY: all -all: zstd +all: zstd zstd-compress zstd-decompress zstd-small .PHONY: allVariants -allVariants: zstd zstd-compress zstd-decompress zstd-small zstd-nolegacy zstd-dictBuilder +allVariants: all zstd-frugal zstd-nolegacy zstd-dictBuilder .PHONY: zstd # must always be run zstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) @@ -242,8 +162,8 @@ $(BUILD_DIR)/zstd : $(ZSTD_OBJ) $(CC) $(FLAGS) $^ $(LDLIBS) -o $@$(EXT) ifeq ($(HAVE_HASH),1) -SRCBIN_HASH = $(shell cat $(BUILD_DIR)/zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ") -DSTBIN_HASH = $(shell cat zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ") +SRCBIN_HASH = $(shell cat $(BUILD_DIR)/zstd$(EXT) 2> $(VOID) | $(HASH) | cut -f 1 -d " ") +DSTBIN_HASH = $(shell cat zstd$(EXT) 2> $(VOID) | $(HASH) | cut -f 1 -d " ") BIN_ISDIFFERENT = $(if $(filter $(SRCBIN_HASH),$(DSTBIN_HASH)),0,1) else BIN_ISDIFFERENT = 1 @@ -251,7 +171,7 @@ endif zstd : $(BUILD_DIR)/zstd if [ $(BIN_ISDIFFERENT) -eq 1 ]; then \ - cp -f $< $@; \ + cp -f $<$(EXT) $@$(EXT); \ echo zstd build completed; \ else \ echo zstd already built; \ @@ -260,11 +180,13 @@ zstd : $(BUILD_DIR)/zstd endif # BUILD_DIR +CLEAN += zstd .PHONY: zstd-release zstd-release: DEBUGFLAGS := -DBACKTRACE_ENABLE=0 zstd-release: DEBUGFLAGS_LD := zstd-release: zstd +CLEAN += zstd32 zstd32 : CPPFLAGS += $(THREAD_CPP) zstd32 : LDFLAGS += $(THREAD_LD) zstd32 : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) @@ -274,8 +196,10 @@ endif zstd32 : $(ZSTDLIB_FULL_SRC) $(ZSTD_CLI_SRC) $(CC) -m32 $(FLAGS) $^ -o $@$(EXT) -## zstd-nolegacy: same scope as zstd, with just support of legacy formats removed +## zstd-nolegacy: same scope as zstd, with removed support of legacy formats +CLEAN += zstd-nolegacy zstd-nolegacy : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) +zstd-nolegacy : CPPFLAGS += -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 zstd-nolegacy : $(ZSTDLIB_CORE_SRC) $(ZDICT_SRC) $(ZSTD_CLI_OBJ) $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) @@ -299,7 +223,7 @@ zstd-noxz : zstd ## zstd-dll: zstd executable linked to dynamic library libzstd (must have same version) .PHONY: zstd-dll -zstd-dll : LDFLAGS+= -L$(ZSTDDIR) +zstd-dll : LDFLAGS+= -L$(LIBZSTD) zstd-dll : LDLIBS += -lzstd zstd-dll : ZSTDLIB_LOCAL_SRC = xxhash.c zstd-dll : zstd @@ -307,35 +231,46 @@ zstd-dll : zstd ## zstd-pgo: zstd executable optimized with PGO. .PHONY: zstd-pgo +zstd-pgo : LLVM_PROFDATA?=llvm-profdata +zstd-pgo : PROF_GENERATE_FLAGS=-fprofile-generate $(if $(findstring gcc,$(CC)),-fprofile-dir=.) +zstd-pgo : PROF_USE_FLAGS=-fprofile-use $(if $(findstring gcc,$(CC)),-fprofile-dir=. -Werror=missing-profile -Wno-error=coverage-mismatch) zstd-pgo : - $(MAKE) clean - $(MAKE) zstd MOREFLAGS=-fprofile-generate + $(MAKE) clean HASH_DIR=$(HASH_DIR) + $(MAKE) zstd HASH_DIR=$(HASH_DIR) MOREFLAGS="$(PROF_GENERATE_FLAGS)" ./zstd -b19i1 $(PROFILE_WITH) ./zstd -b16i1 $(PROFILE_WITH) ./zstd -b9i2 $(PROFILE_WITH) ./zstd -b $(PROFILE_WITH) ./zstd -b7i2 $(PROFILE_WITH) ./zstd -b5 $(PROFILE_WITH) - $(RM) zstd *.o - case $(CC) in *clang*) if ! [ -e default.profdata ]; then llvm-profdata merge -output=default.profdata default*.profraw; fi ;; esac - $(MAKE) zstd MOREFLAGS=-fprofile-use +ifndef BUILD_DIR + $(RM) zstd obj/$(HASH_DIR)/zstd obj/$(HASH_DIR)/*.o +else + $(RM) zstd $(BUILD_DIR)/zstd $(BUILD_DIR)/*.o +endif + case $(CC) in *clang*) if ! [ -e default.profdata ]; then $(LLVM_PROFDATA) merge -output=default.profdata default*.profraw; fi ;; esac + $(MAKE) zstd HASH_DIR=$(HASH_DIR) MOREFLAGS="$(PROF_USE_FLAGS)" ## zstd-small: minimal target, supporting only zstd compression and decompression. no bench. no legacy. no other format. -zstd-small: CFLAGS = -Os -s -zstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c - $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOTRACE $^ -o $@$(EXT) +CLEAN += zstd-small zstd-frugal +zstd-small: CFLAGS = -Os -Wl,-s +zstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c + $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) -zstd-decompress: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_DECOMPRESS_C) zstdcli.c util.c timefn.c fileio.c - $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOCOMPRESS -DZSTD_NOTRACE $^ -o $@$(EXT) +CLEAN += zstd-decompress +zstd-decompress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_DECOMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c + $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOCOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) -zstd-compress: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) zstdcli.c util.c timefn.c fileio.c - $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS -DZSTD_NOTRACE $^ -o $@$(EXT) +CLEAN += zstd-compress +zstd-compress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c + $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) ## zstd-dictBuilder: executable supporting dictionary creation and compression (only) -zstd-dictBuilder: CPPFLAGS += -DZSTD_NOBENCH -DZSTD_NODECOMPRESS -DZSTD_NOTRACE -zstd-dictBuilder: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c dibio.c - $(CC) $(FLAGS) $^ -o $@$(EXT) +CLEAN += zstd-dictBuilder +zstd-dictBuilder: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c dibio.c + $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODECOMPRESS -DZSTD_NOTRACE $^ -o $@$(EXT) +CLEAN += zstdmt zstdmt: zstd ln -sf zstd zstdmt @@ -344,7 +279,7 @@ generate_res: $(RES64_FILE) $(RES32_FILE) ifneq (,$(filter Windows%,$(OS))) RC ?= windres -# http://stackoverflow.com/questions/708238/how-do-i-add-an-icon-to-a-mingw-gcc-compiled-executable +# https://stackoverflow.com/questions/708238/how-do-i-add-an-icon-to-a-mingw-gcc-compiled-executable $(RES64_FILE): windres/zstd.rc $(RC) -o $@ -I ../lib -I windres -i $< -O coff -F pe-x86-64 $(RES32_FILE): windres/zstd.rc @@ -353,12 +288,8 @@ endif .PHONY: clean clean: - $(RM) core *.o tmp* result* *.gcda dictionary *.zst \ - zstd$(EXT) zstd32$(EXT) zstd-dll$(EXT) \ - zstd-compress$(EXT) zstd-decompress$(EXT) \ - zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) zstd4$(EXT) \ - zstd-dictBuilder$(EXT) \ - *.gcda default*.profraw default.profdata have_zlib$(EXT) + $(RM) $(CLEAN) core *.o tmp* result* dictionary *.zst \ + *.gcda default*.profraw default.profdata have_zlib $(RM) -r obj/* @echo Cleaning completed @@ -398,6 +329,10 @@ $(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) @echo CC $@ $(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< +$(BUILD_DIR)/%.o : %.S | $(BUILD_DIR) + @echo AS $@ + $(COMPILE.S) $(OUTPUT_OPTION) $< + MKDIR ?= mkdir $(BUILD_DIR): ; $(MKDIR) -p $@ @@ -411,11 +346,11 @@ include $(wildcard $(DEPFILES)) #----------------------------------------------------------------------------- # make install is validated only for Linux, macOS, BSD, Hurd and Solaris targets #----------------------------------------------------------------------------- -ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku)) +ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX)) HAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) EGREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) +ifeq ($(HAVE_COLORNEVER), 1) EGREP_OPTIONS += --color=never endif EGREP = egrep $(EGREP_OPTIONS) diff --git a/src/dependencies/zstd-1.5.0/programs/README.md b/src/dependencies/zstd-1.5.4/programs/README.md similarity index 97% rename from src/dependencies/zstd-1.5.0/programs/README.md rename to src/dependencies/zstd-1.5.4/programs/README.md index 7fd7104..1b9f47c 100644 --- a/src/dependencies/zstd-1.5.0/programs/README.md +++ b/src/dependencies/zstd-1.5.4/programs/README.md @@ -156,7 +156,7 @@ Arguments : Advanced arguments : -V : display Version number and exit - -c : force write to standard output, even if it is the console + -c : write to standard output (even if it is the console) -v : verbose mode; specify multiple times to increase verbosity -q : suppress warnings; specify twice to suppress errors too --no-progress : do not display the progress counter @@ -164,6 +164,7 @@ Advanced arguments : --filelist FILE : read list of files to operate upon from FILE --output-dir-flat DIR : processed files are stored into DIR --output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure +--[no-]asyncio : use asynchronous IO (default: enabled) --[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled). If specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate). -- : All arguments after "--" are treated as files @@ -172,6 +173,7 @@ Advanced compression arguments : --long[=#]: enable long distance matching with given window log (default: 27) --fast[=#]: switch to very fast compression levels (default: 1) --adapt : dynamically adapt compression level to I/O conditions +--patch-from=FILE : specify the file to be used as a reference point for zstd's diff engine -T# : spawns # compression threads (default: 1, 0==# cores) -B# : select size of each job (default: 0==automatic) --single-thread : use a single thread for both I/O and compression (result slightly different than -T1) @@ -207,7 +209,7 @@ Benchmark arguments : -b# : benchmark file(s), using # compression level (default: 3) -e# : test all compression levels successively from -b# to -e# (default: 1) -i# : minimum evaluation time in seconds (default: 3s) - -B# : cut file into independent blocks of size # (default: no block) + -B# : cut file into independent chunks of size # (default: no chunking) -S : output one benchmark result per input file (default: consolidated result) --priority=rt : set process priority to real-time ``` @@ -274,7 +276,7 @@ compression speed (for lower levels) with minimal change in compression ratio. The below table illustrates this on the [Silesia compression corpus]. -[Silesia compression corpus]: http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia +[Silesia compression corpus]: https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia | Method | Compression ratio | Compression speed | Decompression speed | |:-------|------------------:|------------------:|---------------------:| diff --git a/src/dependencies/zstd-1.5.0/programs/benchfn.c b/src/dependencies/zstd-1.5.4/programs/benchfn.c similarity index 97% rename from src/dependencies/zstd-1.5.0/programs/benchfn.c rename to src/dependencies/zstd-1.5.4/programs/benchfn.c index 1aadbdd..8e6726f 100644 --- a/src/dependencies/zstd-1.5.0/programs/benchfn.c +++ b/src/dependencies/zstd-1.5.4/programs/benchfn.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -229,9 +229,9 @@ BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t* cont, cont->timeSpent_ns += (unsigned long long)loopDuration_ns; /* estimate nbLoops for next run to last approximately 1 second */ - if (loopDuration_ns > (runBudget_ns / 50)) { + if (loopDuration_ns > ((double)runBudget_ns / 50)) { double const fastestRun_ns = MIN(bestRunTime.nanoSecPerRun, newRunTime.nanoSecPerRun); - cont->nbLoops = (unsigned)(runBudget_ns / fastestRun_ns) + 1; + cont->nbLoops = (unsigned)((double)runBudget_ns / fastestRun_ns) + 1; } else { /* previous run was too short : blindly increase workload by x multiplier */ const unsigned multiplier = 10; @@ -239,7 +239,7 @@ BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t* cont, cont->nbLoops *= multiplier; } - if(loopDuration_ns < runTimeMin_ns) { + if(loopDuration_ns < (double)runTimeMin_ns) { /* don't report results for which benchmark run time was too small : increased risks of rounding errors */ assert(completed == 0); continue; diff --git a/src/dependencies/zstd-1.5.0/programs/benchfn.h b/src/dependencies/zstd-1.5.4/programs/benchfn.h similarity index 99% rename from src/dependencies/zstd-1.5.0/programs/benchfn.h rename to src/dependencies/zstd-1.5.4/programs/benchfn.h index 590f292..1bd93d1 100644 --- a/src/dependencies/zstd-1.5.0/programs/benchfn.h +++ b/src/dependencies/zstd-1.5.4/programs/benchfn.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -123,7 +123,7 @@ BMK_runTime_t BMK_extract_runTime(BMK_runOutcome_t outcome); /* when benchmark failed, it means one invocation of `benchFn` failed. * The failure was detected by `errorFn`, operating on return values of `benchFn`. * Returns the faulty return value. - * note : this function will abort() program execution if benchmark did not failed. + * note : this function will abort() program execution if benchmark did not fail. * always check if benchmark failed first ! */ size_t BMK_extract_errorResult(BMK_runOutcome_t outcome); diff --git a/src/dependencies/zstd-1.5.0/programs/benchzstd.c b/src/dependencies/zstd-1.5.4/programs/benchzstd.c similarity index 92% rename from src/dependencies/zstd-1.5.0/programs/benchzstd.c rename to src/dependencies/zstd-1.5.4/programs/benchzstd.c index 49c0349..a76db5f 100644 --- a/src/dependencies/zstd-1.5.0/programs/benchzstd.c +++ b/src/dependencies/zstd-1.5.4/programs/benchzstd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -13,7 +13,7 @@ * Tuning parameters ****************************************/ #ifndef BMK_TIMETEST_DEFAULT_S /* default minimum time per test */ -#define BMK_TIMETEST_DEFAULT_S 3 +# define BMK_TIMETEST_DEFAULT_S 3 #endif @@ -31,9 +31,14 @@ #include "timefn.h" /* UTIL_time_t */ #include "benchfn.h" #include "../lib/common/mem.h" +#ifndef ZSTD_STATIC_LINKING_ONLY #define ZSTD_STATIC_LINKING_ONLY +#endif #include "../lib/zstd.h" #include "datagen.h" /* RDG_genBuffer */ +#ifndef XXH_INLINE_ALL +#define XXH_INLINE_ALL +#endif #include "../lib/common/xxhash.h" #include "benchzstd.h" #include "../lib/zstd_errors.h" @@ -70,6 +75,8 @@ static const size_t maxMemory = (sizeof(size_t)==4) ? #define DISPLAY(...) { fprintf(stderr, __VA_ARGS__); fflush(NULL); } #define DISPLAYLEVEL(l, ...) if (displayLevel>=l) { DISPLAY(__VA_ARGS__); } /* 0 : no display; 1: errors; 2 : + result + interaction + warnings; 3 : + progression; 4 : + information */ +#define OUTPUT(...) { fprintf(stdout, __VA_ARGS__); fflush(NULL); } +#define OUTPUTLEVEL(l, ...) if (displayLevel>=l) { OUTPUT(__VA_ARGS__); } /* ************************************* @@ -129,7 +136,7 @@ BMK_advancedParams_t BMK_initAdvancedParams(void) { 0, /* ldmHashLog */ 0, /* ldmBuckSizeLog */ 0, /* ldmHashRateLog */ - ZSTD_lcm_auto, /* literalCompressionMode */ + ZSTD_ps_auto, /* literalCompressionMode */ 0 /* useRowMatchFinder */ }; return res; @@ -181,7 +188,7 @@ BMK_initCCtx(ZSTD_CCtx* ctx, CHECK_Z(ZSTD_CCtx_setParameter(ctx, ZSTD_c_minMatch, (int)comprParams->minMatch)); CHECK_Z(ZSTD_CCtx_setParameter(ctx, ZSTD_c_targetLength, (int)comprParams->targetLength)); CHECK_Z(ZSTD_CCtx_setParameter(ctx, ZSTD_c_literalCompressionMode, (int)adv->literalCompressionMode)); - CHECK_Z(ZSTD_CCtx_setParameter(ctx, ZSTD_c_strategy, comprParams->strategy)); + CHECK_Z(ZSTD_CCtx_setParameter(ctx, ZSTD_c_strategy, (int)comprParams->strategy)); CHECK_Z(ZSTD_CCtx_loadDictionary(ctx, dictBuffer, dictBufferSize)); } @@ -320,26 +327,31 @@ BMK_benchMemAdvancedNoAlloc( /* init */ memset(&benchResult, 0, sizeof(benchResult)); if (strlen(displayName)>17) displayName += strlen(displayName) - 17; /* display last 17 characters */ - if (adv->mode == BMK_decodeOnly) { /* benchmark only decompression : source must be already compressed */ + if (adv->mode == BMK_decodeOnly) { + /* benchmark only decompression : source must be already compressed */ const char* srcPtr = (const char*)srcBuffer; U64 totalDSize64 = 0; U32 fileNb; for (fileNb=0; fileNb decodedSize) { /* size_t overflow */ + RETURN_ERROR(32, BMK_benchOutcome_t, "decompressed size is too large for local system"); + } *resultBufferPtr = malloc(decodedSize); if (!(*resultBufferPtr)) { - RETURN_ERROR(33, BMK_benchOutcome_t, "not enough memory"); - } - if (totalDSize64 > decodedSize) { /* size_t overflow */ - free(*resultBufferPtr); - RETURN_ERROR(32, BMK_benchOutcome_t, "original size is too large"); + RETURN_ERROR(33, BMK_benchOutcome_t, "allocation error: not enough memory"); } cSize = srcSize; srcSize = decodedSize; @@ -371,10 +383,7 @@ BMK_benchMemAdvancedNoAlloc( if (adv->mode == BMK_decodeOnly) { cSizes[nbBlocks] = thisBlockSize; benchResult.cSize = thisBlockSize; - } - } - } - } + } } } } /* warming up `compressedBuffer` */ if (adv->mode == BMK_decodeOnly) { @@ -383,6 +392,10 @@ BMK_benchMemAdvancedNoAlloc( RDG_genBuffer(compressedBuffer, maxCompressedSize, 0.10, 0.50, 1); } + if (!UTIL_support_MT_measurements() && adv->nbWorkers > 1) { + OUTPUTLEVEL(2, "Warning : time measurements may be incorrect in multithreading mode... \n") + } + /* Bench */ { U64 const crcOrig = (adv->mode == BMK_decodeOnly) ? 0 : XXH64(srcBuffer, srcSize, 0); # define NB_MARKS 4 @@ -429,20 +442,21 @@ BMK_benchMemAdvancedNoAlloc( dctxprep.dictBuffer = dictBuffer; dctxprep.dictBufferSize = dictBufferSize; - DISPLAYLEVEL(2, "\r%70s\r", ""); /* blank line */ - DISPLAYLEVEL(2, "%2s-%-17.17s :%10u ->\r", marks[markNb], displayName, (unsigned)srcSize); + OUTPUTLEVEL(2, "\r%70s\r", ""); /* blank line */ + assert(srcSize < UINT_MAX); + OUTPUTLEVEL(2, "%2s-%-17.17s :%10u -> \r", marks[markNb], displayName, (unsigned)srcSize); while (!(compressionCompleted && decompressionCompleted)) { if (!compressionCompleted) { BMK_runOutcome_t const cOutcome = BMK_benchTimedFn( timeStateCompress, cbp); if (!BMK_isSuccessful_runOutcome(cOutcome)) { - return BMK_benchOutcome_error(); + RETURN_ERROR(30, BMK_benchOutcome_t, "compression error"); } { BMK_runTime_t const cResult = BMK_extract_runTime(cOutcome); cSize = cResult.sumOfReturn; - ratio = (double)srcSize / cSize; + ratio = (double)srcSize / (double)cSize; { BMK_benchResult_t newResult; newResult.cSpeed = (U64)((double)srcSize * TIMELOOP_NANOSEC / cResult.nanoSecPerRun); benchResult.cSize = cSize; @@ -451,11 +465,12 @@ BMK_benchMemAdvancedNoAlloc( } } { int const ratioAccuracy = (ratio < 10.) ? 3 : 2; - DISPLAYLEVEL(2, "%2s-%-17.17s :%10u ->%10u (%5.*f),%6.*f MB/s\r", + assert(cSize < UINT_MAX); + OUTPUTLEVEL(2, "%2s-%-17.17s :%10u ->%10u (x%5.*f), %6.*f MB/s \r", marks[markNb], displayName, (unsigned)srcSize, (unsigned)cSize, ratioAccuracy, ratio, - benchResult.cSpeed < (10 MB) ? 2 : 1, (double)benchResult.cSpeed / MB_UNIT); + benchResult.cSpeed < (10 * MB_UNIT) ? 2 : 1, (double)benchResult.cSpeed / MB_UNIT); } compressionCompleted = BMK_isCompleted_TimedFn(timeStateCompress); } @@ -464,7 +479,7 @@ BMK_benchMemAdvancedNoAlloc( BMK_runOutcome_t const dOutcome = BMK_benchTimedFn(timeStateDecompress, dbp); if(!BMK_isSuccessful_runOutcome(dOutcome)) { - return BMK_benchOutcome_error(); + RETURN_ERROR(30, BMK_benchOutcome_t, "decompression error"); } { BMK_runTime_t const dResult = BMK_extract_runTime(dOutcome); @@ -474,11 +489,11 @@ BMK_benchMemAdvancedNoAlloc( } { int const ratioAccuracy = (ratio < 10.) ? 3 : 2; - DISPLAYLEVEL(2, "%2s-%-17.17s :%10u ->%10u (%5.*f),%6.*f MB/s ,%6.1f MB/s \r", + OUTPUTLEVEL(2, "%2s-%-17.17s :%10u ->%10u (x%5.*f), %6.*f MB/s, %6.1f MB/s\r", marks[markNb], displayName, (unsigned)srcSize, (unsigned)cSize, ratioAccuracy, ratio, - benchResult.cSpeed < (10 MB) ? 2 : 1, (double)benchResult.cSpeed / MB_UNIT, + benchResult.cSpeed < (10 * MB_UNIT) ? 2 : 1, (double)benchResult.cSpeed / MB_UNIT, (double)benchResult.dSpeed / MB_UNIT); } decompressionCompleted = BMK_isCompleted_TimedFn(timeStateDecompress); @@ -515,7 +530,7 @@ BMK_benchMemAdvancedNoAlloc( DISPLAY("%02X ", ((const BYTE*)srcBuffer)[u+n]); DISPLAY(" \n"); DISPLAY("decode: "); - for (n=lowest; n>0; n++) + for (n=lowest; n>0; n--) DISPLAY("%02X ", resultBuffer[u-n]); DISPLAY(" :%02X: ", resultBuffer[u]); for (n=1; n<3; n++) @@ -535,13 +550,13 @@ BMK_benchMemAdvancedNoAlloc( double const cSpeed = (double)benchResult.cSpeed / MB_UNIT; double const dSpeed = (double)benchResult.dSpeed / MB_UNIT; if (adv->additionalParam) { - DISPLAY("-%-3i%11i (%5.3f) %6.2f MB/s %6.1f MB/s %s (param=%d)\n", cLevel, (int)cSize, ratio, cSpeed, dSpeed, displayName, adv->additionalParam); + OUTPUT("-%-3i%11i (%5.3f) %6.2f MB/s %6.1f MB/s %s (param=%d)\n", cLevel, (int)cSize, ratio, cSpeed, dSpeed, displayName, adv->additionalParam); } else { - DISPLAY("-%-3i%11i (%5.3f) %6.2f MB/s %6.1f MB/s %s\n", cLevel, (int)cSize, ratio, cSpeed, dSpeed, displayName); + OUTPUT("-%-3i%11i (%5.3f) %6.2f MB/s %6.1f MB/s %s\n", cLevel, (int)cSize, ratio, cSpeed, dSpeed, displayName); } } - DISPLAYLEVEL(2, "%2i#\n", cLevel); + OUTPUTLEVEL(2, "%2i#\n", cLevel); } /* Bench */ benchResult.cMem = (1ULL << (comprParams->windowLog)) + ZSTD_sizeof_CCtx(cctx); @@ -588,7 +603,7 @@ BMK_benchOutcome_t BMK_benchMemAdvanced(const void* srcBuffer, size_t srcSize, void* resultBuffer = srcSize ? malloc(srcSize) : NULL; - int allocationincomplete = !srcPtrs || !srcSizes || !cPtrs || + int const allocationincomplete = !srcPtrs || !srcSizes || !cPtrs || !cSizes || !cCapacities || !resPtrs || !resSizes || !timeStateCompress || !timeStateDecompress || !cctx || !dctx || @@ -670,7 +685,7 @@ static BMK_benchOutcome_t BMK_benchCLevel(const void* srcBuffer, size_t benchedS } if (displayLevel == 1 && !adv->additionalParam) /* --quiet mode */ - DISPLAY("bench %s %s: input %u bytes, %u seconds, %u KB blocks\n", + OUTPUT("bench %s %s: input %u bytes, %u seconds, %u KB blocks\n", ZSTD_VERSION_STRING, ZSTD_GIT_COMMIT_STRING, (unsigned)benchedSize, adv->nbSeconds, (unsigned)(adv->blockSize>>10)); @@ -760,7 +775,7 @@ static int BMK_loadFiles(void* buffer, size_t bufferSize, } { FILE* const f = fopen(fileNamesTable[n], "rb"); if (f==NULL) RETURN_ERROR_INT(10, "impossible to open file %s", fileNamesTable[n]); - DISPLAYLEVEL(2, "Loading %s... \r", fileNamesTable[n]); + OUTPUTLEVEL(2, "Loading %s... \r", fileNamesTable[n]); if (fileSize > bufferSize-pos) fileSize = bufferSize-pos, nbFiles=n; /* buffer too small - stop after this file */ { size_t const readSize = fread(((char*)buffer)+pos, 1, (size_t)fileSize, f); if (readSize != (size_t)fileSize) RETURN_ERROR_INT(11, "could not read %s", fileNamesTable[n]); @@ -797,6 +812,10 @@ BMK_benchOutcome_t BMK_benchFilesAdvanced( RETURN_ERROR(15, BMK_benchOutcome_t, "Invalid Compression Level"); } + if (totalSizeToLoad == UTIL_FILESIZE_UNKNOWN) { + RETURN_ERROR(9, BMK_benchOutcome_t, "Error loading files"); + } + fileSizes = (size_t*)calloc(nbFiles, sizeof(size_t)); if (!fileSizes) RETURN_ERROR(12, BMK_benchOutcome_t, "not enough memory for fileSizes"); diff --git a/src/dependencies/zstd-1.5.0/programs/benchzstd.h b/src/dependencies/zstd-1.5.4/programs/benchzstd.h similarity index 98% rename from src/dependencies/zstd-1.5.0/programs/benchzstd.h rename to src/dependencies/zstd-1.5.4/programs/benchzstd.h index 9b40dcc..aa683df 100644 --- a/src/dependencies/zstd-1.5.0/programs/benchzstd.h +++ b/src/dependencies/zstd-1.5.4/programs/benchzstd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -116,7 +116,7 @@ typedef struct { int ldmHashLog; int ldmBucketSizeLog; int ldmHashRateLog; - ZSTD_literalCompressionMode_e literalCompressionMode; + ZSTD_paramSwitch_e literalCompressionMode; int useRowMatchFinder; /* use row-based matchfinder if possible */ } BMK_advancedParams_t; diff --git a/src/dependencies/zstd-1.5.0/programs/datagen.c b/src/dependencies/zstd-1.5.4/programs/datagen.c similarity index 99% rename from src/dependencies/zstd-1.5.0/programs/datagen.c rename to src/dependencies/zstd-1.5.4/programs/datagen.c index 3b4f9e5..ddc690b 100644 --- a/src/dependencies/zstd-1.5.0/programs/datagen.c +++ b/src/dependencies/zstd-1.5.4/programs/datagen.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/programs/datagen.h b/src/dependencies/zstd-1.5.4/programs/datagen.h similarity index 95% rename from src/dependencies/zstd-1.5.0/programs/datagen.h rename to src/dependencies/zstd-1.5.4/programs/datagen.h index b76ae2a..ca72700 100644 --- a/src/dependencies/zstd-1.5.0/programs/datagen.h +++ b/src/dependencies/zstd-1.5.4/programs/datagen.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/programs/dibio.c b/src/dependencies/zstd-1.5.4/programs/dibio.c similarity index 58% rename from src/dependencies/zstd-1.5.0/programs/dibio.c rename to src/dependencies/zstd-1.5.4/programs/dibio.c index d6c9f6d..26ebe5c 100644 --- a/src/dependencies/zstd-1.5.0/programs/dibio.c +++ b/src/dependencies/zstd-1.5.4/programs/dibio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -27,11 +27,11 @@ #include /* memset */ #include /* fprintf, fopen, ftello64 */ #include /* errno */ -#include #include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */ +#include "../lib/common/debug.h" /* assert */ #include "../lib/common/mem.h" /* read */ -#include "../lib/common/error_private.h" +#include "../lib/zstd_errors.h" #include "dibio.h" @@ -49,6 +49,7 @@ static const size_t g_maxMemory = (sizeof(size_t) == 4) ? (2 GB - 64 MB) : ((size_t)(512 MB) << sizeof(size_t)); #define NOISELENGTH 32 +#define MAX_SAMPLES_SIZE (2 GB) /* training dataset limited to 2GB */ /*-************************************* @@ -88,6 +89,15 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; #undef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) +/** + Returns the size of a file. + If error returns -1. +*/ +static S64 DiB_getFileSize (const char * fileName) +{ + U64 const fileSize = UTIL_getFileSize(fileName); + return (fileSize == UTIL_FILESIZE_UNKNOWN) ? -1 : (S64)fileSize; +} /* ******************************************************** * File related operations @@ -101,47 +111,70 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; * *bufferSizePtr is modified, it provides the amount data loaded within buffer. * sampleSizes is filled with the size of each sample. */ -static unsigned DiB_loadFiles(void* buffer, size_t* bufferSizePtr, - size_t* sampleSizes, unsigned sstSize, - const char** fileNamesTable, unsigned nbFiles, size_t targetChunkSize, - unsigned displayLevel) +static int DiB_loadFiles( + void* buffer, size_t* bufferSizePtr, + size_t* sampleSizes, int sstSize, + const char** fileNamesTable, int nbFiles, + size_t targetChunkSize, int displayLevel ) { char* const buff = (char*)buffer; - size_t pos = 0; - unsigned nbLoadedChunks = 0, fileIndex; + size_t totalDataLoaded = 0; + int nbSamplesLoaded = 0; + int fileIndex = 0; + FILE * f = NULL; - for (fileIndex=0; fileIndex *bufferSizePtr-pos) break; - { size_t const readSize = fread(buff+pos, 1, toLoad, f); - if (readSize != toLoad) EXM_THROW(11, "Pb reading %s", fileName); - pos += readSize; - sampleSizes[nbLoadedChunks++] = toLoad; - remainingToLoad -= targetChunkSize; - if (nbLoadedChunks == sstSize) { /* no more space left in sampleSizes table */ - fileIndex = nbFiles; /* stop there */ + assert(targetChunkSize <= SAMPLESIZE_MAX); + + while ( nbSamplesLoaded < sstSize && fileIndex < nbFiles ) { + size_t fileDataLoaded; + S64 const fileSize = DiB_getFileSize(fileNamesTable[fileIndex]); + if (fileSize <= 0) { + /* skip if zero-size or file error */ + ++fileIndex; + continue; + } + + f = fopen( fileNamesTable[fileIndex], "rb"); + if (f == NULL) + EXM_THROW(10, "zstd: dictBuilder: %s %s ", fileNamesTable[fileIndex], strerror(errno)); + DISPLAYUPDATE(2, "Loading %s... \r", fileNamesTable[fileIndex]); + + /* Load the first chunk of data from the file */ + fileDataLoaded = targetChunkSize > 0 ? + (size_t)MIN(fileSize, (S64)targetChunkSize) : + (size_t)MIN(fileSize, SAMPLESIZE_MAX ); + if (totalDataLoaded + fileDataLoaded > *bufferSizePtr) + break; + if (fread( buff+totalDataLoaded, 1, fileDataLoaded, f ) != fileDataLoaded) + EXM_THROW(11, "Pb reading %s", fileNamesTable[fileIndex]); + sampleSizes[nbSamplesLoaded++] = fileDataLoaded; + totalDataLoaded += fileDataLoaded; + + /* If file-chunking is enabled, load the rest of the file as more samples */ + if (targetChunkSize > 0) { + while( (S64)fileDataLoaded < fileSize && nbSamplesLoaded < sstSize ) { + size_t const chunkSize = MIN((size_t)(fileSize-fileDataLoaded), targetChunkSize); + if (totalDataLoaded + chunkSize > *bufferSizePtr) /* buffer is full */ break; - } - if (toLoad < targetChunkSize) { - fseek(f, (long)(targetChunkSize - toLoad), SEEK_CUR); - } } } - fclose(f); + + if (fread( buff+totalDataLoaded, 1, chunkSize, f ) != chunkSize) + EXM_THROW(11, "Pb reading %s", fileNamesTable[fileIndex]); + sampleSizes[nbSamplesLoaded++] = chunkSize; + totalDataLoaded += chunkSize; + fileDataLoaded += chunkSize; + } + } + fileIndex += 1; + fclose(f); f = NULL; } + if (f != NULL) + fclose(f); + DISPLAYLEVEL(2, "\r%79s\r", ""); - *bufferSizePtr = pos; - DISPLAYLEVEL(4, "loaded : %u KB \n", (unsigned)(pos >> 10)) - return nbLoadedChunks; + DISPLAYLEVEL(4, "Loaded %d KB total training data, %d nb samples \n", + (int)(totalDataLoaded / (1 KB)), nbSamplesLoaded ); + *bufferSizePtr = totalDataLoaded; + return nbSamplesLoaded; } #define DiB_rotl32(x,r) ((x << r) | (x >> (32 - r))) @@ -164,7 +197,8 @@ static U32 DiB_rand(U32* src) static void DiB_shuffle(const char** fileNamesTable, unsigned nbFiles) { U32 seed = 0xFD2FB528; unsigned i; - assert(nbFiles >= 1); + if (nbFiles == 0) + return; for (i = nbFiles - 1; i > 0; --i) { unsigned const j = DiB_rand(&seed) % (i + 1); const char* const tmp = fileNamesTable[j]; @@ -223,11 +257,10 @@ static void DiB_saveDict(const char* dictFileName, if (n!=0) EXM_THROW(5, "%s : flush error", dictFileName) } } - typedef struct { - U64 totalSizeToLoad; - unsigned oneSampleTooLarge; - unsigned nbSamples; + S64 totalSizeToLoad; + int nbSamples; + int oneSampleTooLarge; } fileStats; /*! DiB_fileStats() : @@ -235,48 +268,93 @@ typedef struct { * provides the amount of data to be loaded and the resulting nb of samples. * This is useful primarily for allocation purpose => sample buffer, and sample sizes table. */ -static fileStats DiB_fileStats(const char** fileNamesTable, unsigned nbFiles, size_t chunkSize, unsigned displayLevel) +static fileStats DiB_fileStats(const char** fileNamesTable, int nbFiles, size_t chunkSize, int displayLevel) { fileStats fs; - unsigned n; + int n; memset(&fs, 0, sizeof(fs)); + + /* We assume that if chunking is requested, the chunk size is < SAMPLESIZE_MAX */ + assert( chunkSize <= SAMPLESIZE_MAX ); + for (n=0; n 2*SAMPLESIZE_MAX); - fs.nbSamples += nbSamples; + S64 const fileSize = DiB_getFileSize(fileNamesTable[n]); + /* TODO: is there a minimum sample size? What if the file is 1-byte? */ + if (fileSize == 0) { + DISPLAYLEVEL(3, "Sample file '%s' has zero size, skipping...\n", fileNamesTable[n]); + continue; + } + + /* the case where we are breaking up files in sample chunks */ + if (chunkSize > 0) { + /* TODO: is there a minimum sample size? Can we have a 1-byte sample? */ + fs.nbSamples += (int)((fileSize + chunkSize-1) / chunkSize); + fs.totalSizeToLoad += fileSize; + } + else { + /* the case where one file is one sample */ + if (fileSize > SAMPLESIZE_MAX) { + /* flag excessively large sample files */ + fs.oneSampleTooLarge |= (fileSize > 2*SAMPLESIZE_MAX); + + /* Limit to the first SAMPLESIZE_MAX (128kB) of the file */ + DISPLAYLEVEL(3, "Sample file '%s' is too large, limiting to %d KB", + fileNamesTable[n], SAMPLESIZE_MAX / (1 KB)); + } + fs.nbSamples += 1; + fs.totalSizeToLoad += MIN(fileSize, SAMPLESIZE_MAX); + } } - DISPLAYLEVEL(4, "Preparing to load : %u KB \n", (unsigned)(fs.totalSizeToLoad >> 10)); + DISPLAYLEVEL(4, "Found training data %d files, %d KB, %d samples\n", nbFiles, (int)(fs.totalSizeToLoad / (1 KB)), fs.nbSamples); return fs; } - -int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, - const char** fileNamesTable, unsigned nbFiles, size_t chunkSize, +int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, + const char** fileNamesTable, int nbFiles, size_t chunkSize, ZDICT_legacy_params_t* params, ZDICT_cover_params_t* coverParams, - ZDICT_fastCover_params_t* fastCoverParams, int optimize) + ZDICT_fastCover_params_t* fastCoverParams, int optimize, unsigned memLimit) { - unsigned const displayLevel = params ? params->zParams.notificationLevel : - coverParams ? coverParams->zParams.notificationLevel : - fastCoverParams ? fastCoverParams->zParams.notificationLevel : - 0; /* should never happen */ + fileStats fs; + size_t* sampleSizes; /* vector of sample sizes. Each sample can be up to SAMPLESIZE_MAX */ + int nbSamplesLoaded; /* nb of samples effectively loaded in srcBuffer */ + size_t loadedSize; /* total data loaded in srcBuffer for all samples */ + void* srcBuffer /* contiguous buffer with training data/samples */; void* const dictBuffer = malloc(maxDictSize); - fileStats const fs = DiB_fileStats(fileNamesTable, nbFiles, chunkSize, displayLevel); - size_t* const sampleSizes = (size_t*)malloc(fs.nbSamples * sizeof(size_t)); - size_t const memMult = params ? MEMMULT : - coverParams ? COVER_MEMMULT: - FASTCOVER_MEMMULT; - size_t const maxMem = DiB_findMaxMem(fs.totalSizeToLoad * memMult) / memMult; - size_t loadedSize = (size_t) MIN ((unsigned long long)maxMem, fs.totalSizeToLoad); - void* const srcBuffer = malloc(loadedSize+NOISELENGTH); int result = 0; + int const displayLevel = params ? params->zParams.notificationLevel : + coverParams ? coverParams->zParams.notificationLevel : + fastCoverParams ? fastCoverParams->zParams.notificationLevel : 0; + + /* Shuffle input files before we start assessing how much sample datA to load. + The purpose of the shuffle is to pick random samples when the sample + set is larger than what we can load in memory. */ + DISPLAYLEVEL(3, "Shuffling input files\n"); + DiB_shuffle(fileNamesTable, nbFiles); + + /* Figure out how much sample data to load with how many samples */ + fs = DiB_fileStats(fileNamesTable, nbFiles, chunkSize, displayLevel); + + { + int const memMult = params ? MEMMULT : + coverParams ? COVER_MEMMULT: + FASTCOVER_MEMMULT; + size_t const maxMem = DiB_findMaxMem(fs.totalSizeToLoad * memMult) / memMult; + /* Limit the size of the training data to the free memory */ + /* Limit the size of the training data to 2GB */ + /* TODO: there is opportunity to stop DiB_fileStats() early when the data limit is reached */ + loadedSize = (size_t)MIN( MIN((S64)maxMem, fs.totalSizeToLoad), MAX_SAMPLES_SIZE ); + if (memLimit != 0) { + DISPLAYLEVEL(2, "! Warning : setting manual memory limit for dictionary training data at %u MB \n", + (unsigned)(memLimit / (1 MB))); + loadedSize = (size_t)MIN(loadedSize, memLimit); + } + srcBuffer = malloc(loadedSize+NOISELENGTH); + sampleSizes = (size_t*)malloc(fs.nbSamples * sizeof(size_t)); + } + /* Checks */ - if ((!sampleSizes) || (!srcBuffer) || (!dictBuffer)) + if ((fs.nbSamples && !sampleSizes) || (!srcBuffer) || (!dictBuffer)) EXM_THROW(12, "not enough memory for DiB_trainFiles"); /* should not happen */ if (fs.oneSampleTooLarge) { DISPLAYLEVEL(2, "! Warning : some sample(s) are very large \n"); @@ -289,31 +367,32 @@ int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, DISPLAYLEVEL(2, "! Alternatively, split files into fixed-size blocks representative of samples, with -B# \n"); EXM_THROW(14, "nb of samples too low"); /* we now clearly forbid this case */ } - if (fs.totalSizeToLoad < (unsigned long long)maxDictSize * 8) { + if (fs.totalSizeToLoad < (S64)maxDictSize * 8) { DISPLAYLEVEL(2, "! Warning : data size of samples too small for target dictionary size \n"); DISPLAYLEVEL(2, "! Samples should be about 100x larger than target dictionary size \n"); } /* init */ - if (loadedSize < fs.totalSizeToLoad) - DISPLAYLEVEL(1, "Not enough memory; training on %u MB only...\n", (unsigned)(loadedSize >> 20)); + if ((S64)loadedSize < fs.totalSizeToLoad) + DISPLAYLEVEL(1, "Training samples set too large (%u MB); training on %u MB only...\n", + (unsigned)(fs.totalSizeToLoad / (1 MB)), + (unsigned)(loadedSize / (1 MB))); /* Load input buffer */ - DISPLAYLEVEL(3, "Shuffling input files\n"); - DiB_shuffle(fileNamesTable, nbFiles); + nbSamplesLoaded = DiB_loadFiles( + srcBuffer, &loadedSize, sampleSizes, fs.nbSamples, fileNamesTable, + nbFiles, chunkSize, displayLevel); - DiB_loadFiles(srcBuffer, &loadedSize, sampleSizes, fs.nbSamples, fileNamesTable, nbFiles, chunkSize, displayLevel); - - { size_t dictSize; + { size_t dictSize = ZSTD_error_GENERIC; if (params) { DiB_fillNoise((char*)srcBuffer + loadedSize, NOISELENGTH); /* guard band, for end of buffer condition */ dictSize = ZDICT_trainFromBuffer_legacy(dictBuffer, maxDictSize, - srcBuffer, sampleSizes, fs.nbSamples, + srcBuffer, sampleSizes, nbSamplesLoaded, *params); } else if (coverParams) { if (optimize) { dictSize = ZDICT_optimizeTrainFromBuffer_cover(dictBuffer, maxDictSize, - srcBuffer, sampleSizes, fs.nbSamples, + srcBuffer, sampleSizes, nbSamplesLoaded, coverParams); if (!ZDICT_isError(dictSize)) { unsigned splitPercentage = (unsigned)(coverParams->splitPoint * 100); @@ -322,13 +401,12 @@ int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, } } else { dictSize = ZDICT_trainFromBuffer_cover(dictBuffer, maxDictSize, srcBuffer, - sampleSizes, fs.nbSamples, *coverParams); + sampleSizes, nbSamplesLoaded, *coverParams); } - } else { - assert(fastCoverParams != NULL); + } else if (fastCoverParams != NULL) { if (optimize) { dictSize = ZDICT_optimizeTrainFromBuffer_fastCover(dictBuffer, maxDictSize, - srcBuffer, sampleSizes, fs.nbSamples, + srcBuffer, sampleSizes, nbSamplesLoaded, fastCoverParams); if (!ZDICT_isError(dictSize)) { unsigned splitPercentage = (unsigned)(fastCoverParams->splitPoint * 100); @@ -338,8 +416,10 @@ int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, } } else { dictSize = ZDICT_trainFromBuffer_fastCover(dictBuffer, maxDictSize, srcBuffer, - sampleSizes, fs.nbSamples, *fastCoverParams); + sampleSizes, nbSamplesLoaded, *fastCoverParams); } + } else { + assert(0 /* Impossible */); } if (ZDICT_isError(dictSize)) { DISPLAYLEVEL(1, "dictionary training failed : %s \n", ZDICT_getErrorName(dictSize)); /* should not happen */ diff --git a/src/dependencies/zstd-1.5.0/programs/dibio.h b/src/dependencies/zstd-1.5.4/programs/dibio.h similarity index 83% rename from src/dependencies/zstd-1.5.0/programs/dibio.h rename to src/dependencies/zstd-1.5.4/programs/dibio.h index f65ed9b..a96104c 100644 --- a/src/dependencies/zstd-1.5.0/programs/dibio.h +++ b/src/dependencies/zstd-1.5.4/programs/dibio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -31,9 +31,9 @@ `parameters` is optional and can be provided with values set to 0, meaning "default". @return : 0 == ok. Any other : error. */ -int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, - const char** fileNamesTable, unsigned nbFiles, size_t chunkSize, +int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, + const char** fileNamesTable, int nbFiles, size_t chunkSize, ZDICT_legacy_params_t* params, ZDICT_cover_params_t* coverParams, - ZDICT_fastCover_params_t* fastCoverParams, int optimize); + ZDICT_fastCover_params_t* fastCoverParams, int optimize, unsigned memLimit); #endif diff --git a/src/dependencies/zstd-1.5.0/programs/fileio.c b/src/dependencies/zstd-1.5.4/programs/fileio.c similarity index 65% rename from src/dependencies/zstd-1.5.0/programs/fileio.c rename to src/dependencies/zstd-1.5.4/programs/fileio.c index 5693ac3..9a8300c 100644 --- a/src/dependencies/zstd-1.5.0/programs/fileio.c +++ b/src/dependencies/zstd-1.5.4/programs/fileio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,6 +28,7 @@ #include /* fprintf, open, fdopen, fread, _fileno, stdin, stdout */ #include /* malloc, free */ #include /* strcmp, strlen */ +#include /* clock_t, to measure process time */ #include /* O_WRONLY */ #include #include /* errno */ @@ -40,8 +41,12 @@ # include #endif -#include "../lib/common/mem.h" /* U32, U64 */ #include "fileio.h" +#include "fileio_asyncio.h" +#include "fileio_common.h" + +FIO_display_prefs_t g_display_prefs = {2, FIO_ps_auto}; +UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_magicNumber, ZSTD_frameHeaderSize_max */ #include "../lib/zstd.h" @@ -65,6 +70,40 @@ # include #endif +char const* FIO_zlibVersion(void) +{ +#if defined(ZSTD_GZCOMPRESS) || defined(ZSTD_GZDECOMPRESS) + return zlibVersion(); +#else + return "Unsupported"; +#endif +} + +char const* FIO_lz4Version(void) +{ +#if defined(ZSTD_LZ4COMPRESS) || defined(ZSTD_LZ4DECOMPRESS) + /* LZ4_versionString() added in v1.7.3 */ +# if LZ4_VERSION_NUMBER >= 10703 + return LZ4_versionString(); +# else +# define ZSTD_LZ4_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +# define ZSTD_LZ4_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LZ4_VERSION) + return ZSTD_LZ4_VERSION_STRING; +# endif +#else + return "Unsupported"; +#endif +} + +char const* FIO_lzmaVersion(void) +{ +#if defined(ZSTD_LZMACOMPRESS) || defined(ZSTD_LZMADECOMPRESS) + return lzma_version_string(); +#else + return "Unsupported"; +#endif +} + /*-************************************* * Constants @@ -75,69 +114,17 @@ #define FNSPACE 30 /* Default file permissions 0666 (modulated by umask) */ +/* Temporary restricted file permissions are used when we're going to + * chmod/chown at the end of the operation. */ #if !defined(_WIN32) /* These macros aren't defined on windows. */ #define DEFAULT_FILE_PERMISSIONS (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) +#define TEMPORARY_FILE_PERMISSIONS (S_IRUSR|S_IWUSR) #else #define DEFAULT_FILE_PERMISSIONS (0666) +#define TEMPORARY_FILE_PERMISSIONS (0600) #endif -/*-************************************* -* Macros -***************************************/ -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) -#undef MAX -#define MAX(a,b) ((a)>(b) ? (a) : (b)) - -struct FIO_display_prefs_s { - int displayLevel; /* 0 : no display; 1: errors; 2: + result + interaction + warnings; 3: + progression; 4: + information */ - FIO_progressSetting_e progressSetting; -}; - -static FIO_display_prefs_t g_display_prefs = {2, FIO_ps_auto}; - -#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) -#define DISPLAYOUT(...) fprintf(stdout, __VA_ARGS__) -#define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } - -static const U64 g_refreshRate = SEC_TO_MICRO / 6; -static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; - -#define READY_FOR_UPDATE() ((g_display_prefs.progressSetting != FIO_ps_never) && UTIL_clockSpanMicro(g_displayClock) > g_refreshRate) -#define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } -#define DISPLAYUPDATE(l, ...) { \ - if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ - if (READY_FOR_UPDATE() || (g_display_prefs.displayLevel>=4)) { \ - DELAY_NEXT_UPDATE(); \ - DISPLAY(__VA_ARGS__); \ - if (g_display_prefs.displayLevel>=4) fflush(stderr); \ - } } } - -#undef MIN /* in case it would be already defined */ -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - - -#define EXM_THROW(error, ...) \ -{ \ - DISPLAYLEVEL(1, "zstd: "); \ - DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ - DISPLAYLEVEL(1, "error %i : ", error); \ - DISPLAYLEVEL(1, __VA_ARGS__); \ - DISPLAYLEVEL(1, " \n"); \ - exit(error); \ -} - -#define CHECK_V(v, f) \ - v = f; \ - if (ZSTD_isError(v)) { \ - DISPLAYLEVEL(5, "%s \n", #f); \ - EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ - } -#define CHECK(f) { size_t err; CHECK_V(err, f); } - - /*-************************************ * Signal (Ctrl-C trapping) **************************************/ @@ -237,7 +224,7 @@ static void ABRThandler(int sig) { } #endif -void FIO_addAbortHandler() +void FIO_addAbortHandler(void) { #if BACKTRACE_ENABLE signal(SIGABRT, ABRThandler); @@ -248,94 +235,6 @@ void FIO_addAbortHandler() #endif } - -/*-************************************************************ -* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW -***************************************************************/ -#if defined(_MSC_VER) && _MSC_VER >= 1400 -# define LONG_SEEK _fseeki64 -# define LONG_TELL _ftelli64 -#elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ -# define LONG_SEEK fseeko -# define LONG_TELL ftello -#elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) -# define LONG_SEEK fseeko64 -# define LONG_TELL ftello64 -#elif defined(_WIN32) && !defined(__DJGPP__) -# include - static int LONG_SEEK(FILE* file, __int64 offset, int origin) { - LARGE_INTEGER off; - DWORD method; - off.QuadPart = offset; - if (origin == SEEK_END) - method = FILE_END; - else if (origin == SEEK_CUR) - method = FILE_CURRENT; - else - method = FILE_BEGIN; - - if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) - return 0; - else - return -1; - } - static __int64 LONG_TELL(FILE* file) { - LARGE_INTEGER off, newOff; - off.QuadPart = 0; - newOff.QuadPart = 0; - SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); - return newOff.QuadPart; - } -#else -# define LONG_SEEK fseek -# define LONG_TELL ftell -#endif - - -/*-************************************* -* Parameters: FIO_prefs_t -***************************************/ - -/* typedef'd to FIO_prefs_t within fileio.h */ -struct FIO_prefs_s { - - /* Algorithm preferences */ - FIO_compressionType_t compressionType; - U32 sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ - int dictIDFlag; - int checksumFlag; - int blockSize; - int overlapLog; - U32 adaptiveMode; - U32 useRowMatchFinder; - int rsyncable; - int minAdaptLevel; - int maxAdaptLevel; - int ldmFlag; - int ldmHashLog; - int ldmMinMatch; - int ldmBucketSizeLog; - int ldmHashRateLog; - size_t streamSrcSize; - size_t targetCBlockSize; - int srcSizeHint; - int testMode; - ZSTD_literalCompressionMode_e literalCompressionMode; - - /* IO preferences */ - U32 removeSrcFile; - U32 overwrite; - - /* Computation resources preferences */ - unsigned memLimit; - int nbWorkers; - - int excludeCompressedFiles; - int patchFromMode; - int contentSize; - int allowBlockDevices; -}; - /*-************************************* * Parameters: FIO_ctx_t ***************************************/ @@ -355,6 +254,18 @@ struct FIO_ctx_s { size_t totalBytesOutput; }; +static int FIO_shouldDisplayFileSummary(FIO_ctx_t const* fCtx) +{ + return fCtx->nbFilesTotal <= 1 || g_display_prefs.displayLevel >= 3; +} + +static int FIO_shouldDisplayMultipleFileSummary(FIO_ctx_t const* fCtx) +{ + int const shouldDisplay = (fCtx->nbFilesProcessed >= 1 && fCtx->nbFilesTotal > 1); + assert(shouldDisplay || FIO_shouldDisplayFileSummary(fCtx) || fCtx->nbFilesProcessed == 0); + return shouldDisplay; +} + /*-************************************* * Parameters: Initialization @@ -392,9 +303,11 @@ FIO_prefs_t* FIO_createPreferences(void) ret->targetCBlockSize = 0; ret->srcSizeHint = 0; ret->testMode = 0; - ret->literalCompressionMode = ZSTD_lcm_auto; + ret->literalCompressionMode = ZSTD_ps_auto; ret->excludeCompressedFiles = 0; ret->allowBlockDevices = 0; + ret->asyncIO = AIO_supported(); + ret->passThrough = -1; return ret; } @@ -443,13 +356,13 @@ void FIO_setCompressionType(FIO_prefs_t* const prefs, FIO_compressionType_t comp void FIO_overwriteMode(FIO_prefs_t* const prefs) { prefs->overwrite = 1; } -void FIO_setSparseWrite(FIO_prefs_t* const prefs, unsigned sparse) { prefs->sparseFileSupport = sparse; } +void FIO_setSparseWrite(FIO_prefs_t* const prefs, int sparse) { prefs->sparseFileSupport = sparse; } void FIO_setDictIDFlag(FIO_prefs_t* const prefs, int dictIDFlag) { prefs->dictIDFlag = dictIDFlag; } void FIO_setChecksumFlag(FIO_prefs_t* const prefs, int checksumFlag) { prefs->checksumFlag = checksumFlag; } -void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, unsigned flag) { prefs->removeSrcFile = (flag>0); } +void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, int flag) { prefs->removeSrcFile = (flag!=0); } void FIO_setMemLimit(FIO_prefs_t* const prefs, unsigned memLimit) { prefs->memLimit = memLimit; } @@ -476,7 +389,7 @@ void FIO_setOverlapLog(FIO_prefs_t* const prefs, int overlapLog){ prefs->overlapLog = overlapLog; } -void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, unsigned adapt) { +void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, int adapt) { if ((adapt>0) && (prefs->nbWorkers==0)) EXM_THROW(1, "Adaptive mode is not compatible with single thread mode \n"); prefs->adaptiveMode = adapt; @@ -510,7 +423,7 @@ void FIO_setTestMode(FIO_prefs_t* const prefs, int testMode) { void FIO_setLiteralCompressionMode( FIO_prefs_t* const prefs, - ZSTD_literalCompressionMode_e mode) { + ZSTD_paramSwitch_e mode) { prefs->literalCompressionMode = mode; } @@ -558,6 +471,20 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value) prefs->contentSize = value != 0; } +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value) { +#ifdef ZSTD_MULTITHREAD + prefs->asyncIO = value; +#else + (void) prefs; + (void) value; + DISPLAYLEVEL(2, "Note : asyncio is disabled (lack of multithreading support) \n"); +#endif +} + +void FIO_setPassThroughFlag(FIO_prefs_t* const prefs, int value) { + prefs->passThrough = (value != 0); +} + /* FIO_ctx_t functions */ void FIO_setHasStdoutOutput(FIO_ctx_t* const fCtx, int value) { @@ -608,26 +535,26 @@ static int FIO_removeFile(const char* path) /** FIO_openSrcFile() : * condition : `srcFileName` must be non-NULL. `prefs` may be NULL. * @result : FILE* to `srcFileName`, or NULL if it fails */ -static FILE* FIO_openSrcFile(const FIO_prefs_t* const prefs, const char* srcFileName) +static FILE* FIO_openSrcFile(const FIO_prefs_t* const prefs, const char* srcFileName, stat_t* statbuf) { - stat_t statbuf; int allowBlockDevices = prefs != NULL ? prefs->allowBlockDevices : 0; assert(srcFileName != NULL); + assert(statbuf != NULL); if (!strcmp (srcFileName, stdinmark)) { DISPLAYLEVEL(4,"Using stdin for input \n"); SET_BINARY_MODE(stdin); return stdin; } - if (!UTIL_stat(srcFileName, &statbuf)) { + if (!UTIL_stat(srcFileName, statbuf)) { DISPLAYLEVEL(1, "zstd: can't stat %s : %s -- ignored \n", srcFileName, strerror(errno)); return NULL; } - if (!UTIL_isRegularFileStat(&statbuf) - && !UTIL_isFIFOStat(&statbuf) - && !(allowBlockDevices && UTIL_isBlockDevStat(&statbuf)) + if (!UTIL_isRegularFileStat(statbuf) + && !UTIL_isFIFOStat(statbuf) + && !(allowBlockDevices && UTIL_isBlockDevStat(statbuf)) ) { DISPLAYLEVEL(1, "zstd: %s is not a regular file -- ignored \n", srcFileName); @@ -685,7 +612,7 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, if (!prefs->overwrite) { if (g_display_prefs.displayLevel <= 1) { /* No interaction possible */ - DISPLAY("zstd: %s already exists; not overwritten \n", + DISPLAYLEVEL(1, "zstd: %s already exists; not overwritten \n", dstFileName); return NULL; } @@ -718,6 +645,17 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, if (f == NULL) { DISPLAYLEVEL(1, "zstd: %s: %s\n", dstFileName, strerror(errno)); } + /* An increased buffer size can provide a significant performance boost on some platforms. + * Note that providing a NULL buf with a size that's not 0 is not defined in ANSI C, but is defined + * in an extension. There are three possibilities here - + * 1. Libc supports the extended version and everything is good. + * 2. Libc ignores the size when buf is NULL, in which case everything will continue as if we didn't + * call `setvbuf`. + * 3. We fail the call and execution continues but a warning message might be shown. + * In all cases due execution continues. For now, I believe that this is a more cost-effective + * solution than managing the buffers allocations ourselves (will require an API change). */ + if(setvbuf(f, NULL, _IOFBF, 1 MB)) + DISPLAYLEVEL(2, "Warning: setvbuf failed for %s\n", dstFileName); return f; } } @@ -728,33 +666,47 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, * @return : loaded size * if fileName==NULL, returns 0 and a NULL pointer */ -static size_t FIO_createDictBuffer(void** bufferPtr, const char* fileName, FIO_prefs_t* const prefs) +static size_t FIO_createDictBuffer(void** bufferPtr, const char* fileName, FIO_prefs_t* const prefs, stat_t* dictFileStat) { FILE* fileHandle; U64 fileSize; assert(bufferPtr != NULL); + assert(dictFileStat != NULL); *bufferPtr = NULL; if (fileName == NULL) return 0; DISPLAYLEVEL(4,"Loading %s as dictionary \n", fileName); - fileHandle = fopen(fileName, "rb"); - if (fileHandle==NULL) EXM_THROW(31, "%s: %s", fileName, strerror(errno)); - fileSize = UTIL_getFileSize(fileName); + if (!UTIL_stat(fileName, dictFileStat)) { + EXM_THROW(31, "Stat failed on dictionary file %s: %s", fileName, strerror(errno)); + } + + if (!UTIL_isRegularFileStat(dictFileStat)) { + EXM_THROW(32, "Dictionary %s must be a regular file.", fileName); + } + + fileHandle = fopen(fileName, "rb"); + + if (fileHandle == NULL) { + EXM_THROW(33, "Couldn't open dictionary %s: %s", fileName, strerror(errno)); + } + + fileSize = UTIL_getFileSizeStat(dictFileStat); { size_t const dictSizeMax = prefs->patchFromMode ? prefs->memLimit : DICTSIZE_MAX; if (fileSize > dictSizeMax) { - EXM_THROW(32, "Dictionary file %s is too large (> %u bytes)", + EXM_THROW(34, "Dictionary file %s is too large (> %u bytes)", fileName, (unsigned)dictSizeMax); /* avoid extreme cases */ } } *bufferPtr = malloc((size_t)fileSize); if (*bufferPtr==NULL) EXM_THROW(34, "%s", strerror(errno)); { size_t const readSize = fread(*bufferPtr, 1, (size_t)fileSize, fileHandle); - if (readSize != fileSize) + if (readSize != fileSize) { EXM_THROW(35, "Error reading dictionary file %s : %s", fileName, strerror(errno)); + } } fclose(fileHandle); return (size_t)fileSize; @@ -771,7 +723,7 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles) { filenameTableSorted = (const char**) malloc(sizeof(char*) * nbFiles); if (!filenameTableSorted) { - DISPLAY("Unable to malloc new str array, not checking for name collisions\n"); + DISPLAYLEVEL(1, "Allocation error during filename collision checking \n"); return 1; } @@ -788,7 +740,7 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles) { prevElem = filenameTableSorted[0]; for (u = 1; u < nbFiles; ++u) { if (strcmp(prevElem, filenameTableSorted[u]) == 0) { - DISPLAY("WARNING: Two files have same filename: %s\n", prevElem); + DISPLAYLEVEL(2, "WARNING: Two files have same filename: %s\n", prevElem); } prevElem = filenameTableSorted[u]; } @@ -871,46 +823,89 @@ static void FIO_adjustMemLimitForPatchFromMode(FIO_prefs_t* const prefs, FIO_setMemLimit(prefs, (unsigned)maxSize); } -/* FIO_removeMultiFilesWarning() : +/* FIO_multiFilesConcatWarning() : + * This function handles logic when processing multiple files with -o or -c, displaying the appropriate warnings/prompts. * Returns 1 if the console should abort, 0 if console should proceed. - * This function handles logic when processing multiple files with -o, displaying the appropriate warnings/prompts. * - * If -f is specified, or there is just 1 file, zstd will always proceed as usual. - * If --rm is specified, there will be a prompt asking for user confirmation. - * If -f is specified with --rm, zstd will proceed as usual - * If -q is specified with --rm, zstd will abort pre-emptively - * If neither flag is specified, zstd will prompt the user for confirmation to proceed. - * If --rm is not specified, then zstd will print a warning to the user (which can be silenced with -q). - * However, if the output is stdout, we will always abort rather than displaying the warning prompt. + * If output is stdout or test mode is active, check that `--rm` disabled. + * + * If there is just 1 file to process, zstd will proceed as usual. + * If each file get processed into its own separate destination file, proceed as usual. + * + * When multiple files are processed into a single output, + * display a warning message, then disable --rm if it's set. + * + * If -f is specified or if output is stdout, just proceed. + * If output is set with -o, prompt for confirmation. */ -static int FIO_removeMultiFilesWarning(FIO_ctx_t* const fCtx, const FIO_prefs_t* const prefs, const char* outFileName, int displayLevelCutoff) +static int FIO_multiFilesConcatWarning(const FIO_ctx_t* fCtx, FIO_prefs_t* prefs, const char* outFileName, int displayLevelCutoff) { - int error = 0; - if (fCtx->nbFilesTotal > 1 && !prefs->overwrite) { - if (g_display_prefs.displayLevel <= displayLevelCutoff) { - if (prefs->removeSrcFile) { - DISPLAYLEVEL(1, "zstd: Aborting... not deleting files and processing into dst: %s", outFileName); - error = 1; - } - } else { - if (!strcmp(outFileName, stdoutmark)) { - DISPLAYLEVEL(2, "zstd: WARNING: all input files will be processed and concatenated into stdout. "); - } else { - DISPLAYLEVEL(2, "zstd: WARNING: all input files will be processed and concatenated into a single output file: %s ", outFileName); - } - DISPLAYLEVEL(2, "\nThe concatenated output CANNOT regenerate the original directory tree. ") - if (prefs->removeSrcFile) { - if (fCtx->hasStdoutOutput) { - DISPLAYLEVEL(1, "\nAborting. Use -f if you really want to delete the files and output to stdout"); - error = 1; - } else { - error = g_display_prefs.displayLevel > displayLevelCutoff && UTIL_requireUserConfirmation("This is a destructive operation. Proceed? (y/n): ", "Aborting...", "yY", fCtx->hasStdinInput); - } - } - } - DISPLAY("\n"); + if (fCtx->hasStdoutOutput) { + if (prefs->removeSrcFile) + /* this should not happen ; hard fail, to protect user's data + * note: this should rather be an assert(), but we want to be certain that user's data will not be wiped out in case it nonetheless happen */ + EXM_THROW(43, "It's not allowed to remove input files when processed output is piped to stdout. " + "This scenario is not supposed to be possible. " + "This is a programming error. File an issue for it to be fixed."); } - return error; + if (prefs->testMode) { + if (prefs->removeSrcFile) + /* this should not happen ; hard fail, to protect user's data + * note: this should rather be an assert(), but we want to be certain that user's data will not be wiped out in case it nonetheless happen */ + EXM_THROW(43, "Test mode shall not remove input files! " + "This scenario is not supposed to be possible. " + "This is a programming error. File an issue for it to be fixed."); + return 0; + } + + if (fCtx->nbFilesTotal == 1) return 0; + assert(fCtx->nbFilesTotal > 1); + + if (!outFileName) return 0; + + if (fCtx->hasStdoutOutput) { + DISPLAYLEVEL(2, "zstd: WARNING: all input files will be processed and concatenated into stdout. \n"); + } else { + DISPLAYLEVEL(2, "zstd: WARNING: all input files will be processed and concatenated into a single output file: %s \n", outFileName); + } + DISPLAYLEVEL(2, "The concatenated output CANNOT regenerate original file names nor directory structure. \n") + + /* multi-input into single output : --rm is not allowed */ + if (prefs->removeSrcFile) { + DISPLAYLEVEL(2, "Since it's a destructive operation, input files will not be removed. \n"); + prefs->removeSrcFile = 0; + } + + if (fCtx->hasStdoutOutput) return 0; + if (prefs->overwrite) return 0; + + /* multiple files concatenated into single destination file using -o without -f */ + if (g_display_prefs.displayLevel <= displayLevelCutoff) { + /* quiet mode => no prompt => fail automatically */ + DISPLAYLEVEL(1, "Concatenating multiple processed inputs into a single output loses file metadata. \n"); + DISPLAYLEVEL(1, "Aborting. \n"); + return 1; + } + /* normal mode => prompt */ + return UTIL_requireUserConfirmation("Proceed? (y/n): ", "Aborting...", "yY", fCtx->hasStdinInput); +} + +static ZSTD_inBuffer setInBuffer(const void* buf, size_t s, size_t pos) +{ + ZSTD_inBuffer i; + i.src = buf; + i.size = s; + i.pos = pos; + return i; +} + +static ZSTD_outBuffer setOutBuffer(void* buf, size_t s, size_t pos) +{ + ZSTD_outBuffer o; + o.dst = buf; + o.size = s; + o.pos = pos; + return o; } #ifndef ZSTD_NOCOMPRESS @@ -919,16 +914,13 @@ static int FIO_removeMultiFilesWarning(FIO_ctx_t* const fCtx, const FIO_prefs_t* * Compression ************************************************************************/ typedef struct { - FILE* srcFile; - FILE* dstFile; - void* srcBuffer; - size_t srcBufferSize; - void* dstBuffer; - size_t dstBufferSize; void* dictBuffer; size_t dictBufferSize; const char* dictFileName; + stat_t dictFileStat; ZSTD_CStream* cctx; + WritePoolCtx_t *writeCtx; + ReadPoolCtx_t *readCtx; } cRess_t; /** ZSTD_cycleLog() : @@ -960,9 +952,9 @@ static void FIO_adjustParamsForPatchFromMode(FIO_prefs_t* const prefs, if (cParams.strategy >= ZSTD_btopt) { DISPLAYLEVEL(1, "[Optimal parser notes] Consider the following to improve patch size at the cost of speed:\n"); DISPLAYLEVEL(1, "- Use --single-thread mode in the zstd cli\n"); - DISPLAYLEVEL(1, "- Set a larger targetLength (eg. --zstd=targetLength=4096)\n"); - DISPLAYLEVEL(1, "- Set a larger chainLog (eg. --zstd=chainLog=%u)\n", ZSTD_CHAINLOG_MAX); - DISPLAYLEVEL(1, "Also consdier playing around with searchLog and hashLog\n"); + DISPLAYLEVEL(1, "- Set a larger targetLength (e.g. --zstd=targetLength=4096)\n"); + DISPLAYLEVEL(1, "- Set a larger chainLog (e.g. --zstd=chainLog=%u)\n", ZSTD_CHAINLOG_MAX); + DISPLAYLEVEL(1, "Also consider playing around with searchLog and hashLog\n"); } } @@ -977,9 +969,6 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, if (ress.cctx == NULL) EXM_THROW(30, "allocation error (%s): can't create ZSTD_CCtx", strerror(errno)); - ress.srcBufferSize = ZSTD_CStreamInSize(); - ress.srcBuffer = malloc(ress.srcBufferSize); - ress.dstBufferSize = ZSTD_CStreamOutSize(); /* need to update memLimit before calling createDictBuffer * because of memLimit check inside it */ @@ -987,10 +976,10 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, unsigned long long const ssSize = (unsigned long long)prefs->streamSrcSize; FIO_adjustParamsForPatchFromMode(prefs, &comprParams, UTIL_getFileSize(dictFileName), ssSize > 0 ? ssSize : maxSrcFileSize, cLevel); } - ress.dstBuffer = malloc(ress.dstBufferSize); - ress.dictBufferSize = FIO_createDictBuffer(&ress.dictBuffer, dictFileName, prefs); /* works with dictFileName==NULL */ - if (!ress.srcBuffer || !ress.dstBuffer) - EXM_THROW(31, "allocation error : not enough memory"); + ress.dictBufferSize = FIO_createDictBuffer(&ress.dictBuffer, dictFileName, prefs, &ress.dictFileStat); /* works with dictFileName==NULL */ + + ress.writeCtx = AIO_WritePool_create(prefs, ZSTD_CStreamOutSize()); + ress.readCtx = AIO_ReadPool_create(prefs, ZSTD_CStreamInSize()); /* Advanced parameters, including dictionary */ if (dictFileName && (ress.dictBuffer==NULL)) @@ -1053,9 +1042,9 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, static void FIO_freeCResources(const cRess_t* const ress) { - free(ress->srcBuffer); - free(ress->dstBuffer); free(ress->dictBuffer); + AIO_WritePool_free(ress->writeCtx); + AIO_ReadPool_free(ress->readCtx); ZSTD_freeCStream(ress->cctx); /* never fails */ } @@ -1068,6 +1057,7 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no { unsigned long long inFileSize = 0, outFileSize = 0; z_stream strm; + IOJob_t *writeJob = NULL; if (compressionLevel > Z_BEST_COMPRESSION) compressionLevel = Z_BEST_COMPRESSION; @@ -1078,56 +1068,65 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no { int const ret = deflateInit2(&strm, compressionLevel, Z_DEFLATED, 15 /* maxWindowLogSize */ + 16 /* gzip only */, - 8, Z_DEFAULT_STRATEGY); /* see http://www.zlib.net/manual.html */ + 8, Z_DEFAULT_STRATEGY); /* see https://www.zlib.net/manual.html */ if (ret != Z_OK) { EXM_THROW(71, "zstd: %s: deflateInit2 error %d \n", srcFileName, ret); } } + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_in = 0; strm.avail_in = 0; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; while (1) { int ret; if (strm.avail_in == 0) { - size_t const inSize = fread(ress->srcBuffer, 1, ress->srcBufferSize, ress->srcFile); - if (inSize == 0) break; - inFileSize += inSize; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; - strm.avail_in = (uInt)inSize; + AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_CStreamInSize()); + if (ress->readCtx->srcBufferLoaded == 0) break; + inFileSize += ress->readCtx->srcBufferLoaded; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; } - ret = deflate(&strm, Z_NO_FLUSH); + + { + size_t const availBefore = strm.avail_in; + ret = deflate(&strm, Z_NO_FLUSH); + AIO_ReadPool_consumeBytes(ress->readCtx, availBefore - strm.avail_in); + } + if (ret != Z_OK) EXM_THROW(72, "zstd: %s: deflate error %d \n", srcFileName, ret); - { size_t const cSize = ress->dstBufferSize - strm.avail_out; + { size_t const cSize = writeJob->bufferSize - strm.avail_out; if (cSize) { - if (fwrite(ress->dstBuffer, 1, cSize, ress->dstFile) != cSize) - EXM_THROW(73, "Write error : cannot write to output file : %s ", strerror(errno)); + writeJob->usedBufferSize = cSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += cSize; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; - } } + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + } } if (srcFileSize == UTIL_FILESIZE_UNKNOWN) { - DISPLAYUPDATE(2, "\rRead : %u MB ==> %.2f%% ", - (unsigned)(inFileSize>>20), - (double)outFileSize/inFileSize*100) + DISPLAYUPDATE_PROGRESS( + "\rRead : %u MB ==> %.2f%% ", + (unsigned)(inFileSize>>20), + (double)outFileSize/(double)inFileSize*100) } else { - DISPLAYUPDATE(2, "\rRead : %u / %u MB ==> %.2f%% ", - (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), - (double)outFileSize/inFileSize*100); + DISPLAYUPDATE_PROGRESS( + "\rRead : %u / %u MB ==> %.2f%% ", + (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), + (double)outFileSize/(double)inFileSize*100); } } while (1) { int const ret = deflate(&strm, Z_FINISH); - { size_t const cSize = ress->dstBufferSize - strm.avail_out; + { size_t const cSize = writeJob->bufferSize - strm.avail_out; if (cSize) { - if (fwrite(ress->dstBuffer, 1, cSize, ress->dstFile) != cSize) - EXM_THROW(75, "Write error : %s ", strerror(errno)); + writeJob->usedBufferSize = cSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += cSize; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; - } } + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + } } if (ret == Z_STREAM_END) break; if (ret != Z_BUF_ERROR) EXM_THROW(77, "zstd: %s: deflate error %d \n", srcFileName, ret); @@ -1138,6 +1137,8 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no EXM_THROW(79, "zstd: %s: deflateEnd error %d \n", srcFileName, ret); } } *readsize = inFileSize; + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return outFileSize; } #endif @@ -1153,6 +1154,7 @@ FIO_compressLzmaFrame(cRess_t* ress, lzma_stream strm = LZMA_STREAM_INIT; lzma_action action = LZMA_RUN; lzma_ret ret; + IOJob_t *writeJob = NULL; if (compressionLevel < 0) compressionLevel = 0; if (compressionLevel > 9) compressionLevel = 9; @@ -1170,46 +1172,55 @@ FIO_compressLzmaFrame(cRess_t* ress, EXM_THROW(83, "zstd: %s: lzma_easy_encoder error %d", srcFileName, ret); } + writeJob =AIO_WritePool_acquireJob(ress->writeCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; strm.next_in = 0; strm.avail_in = 0; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; while (1) { if (strm.avail_in == 0) { - size_t const inSize = fread(ress->srcBuffer, 1, ress->srcBufferSize, ress->srcFile); - if (inSize == 0) action = LZMA_FINISH; + size_t const inSize = AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_CStreamInSize()); + if (ress->readCtx->srcBufferLoaded == 0) action = LZMA_FINISH; inFileSize += inSize; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = inSize; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; + } + + { + size_t const availBefore = strm.avail_in; + ret = lzma_code(&strm, action); + AIO_ReadPool_consumeBytes(ress->readCtx, availBefore - strm.avail_in); } - ret = lzma_code(&strm, action); if (ret != LZMA_OK && ret != LZMA_STREAM_END) EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, ret); - { size_t const compBytes = ress->dstBufferSize - strm.avail_out; + { size_t const compBytes = writeJob->bufferSize - strm.avail_out; if (compBytes) { - if (fwrite(ress->dstBuffer, 1, compBytes, ress->dstFile) != compBytes) - EXM_THROW(85, "Write error : %s", strerror(errno)); + writeJob->usedBufferSize = compBytes; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += compBytes; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = writeJob->bufferSize; } } if (srcFileSize == UTIL_FILESIZE_UNKNOWN) - DISPLAYUPDATE(2, "\rRead : %u MB ==> %.2f%%", + DISPLAYUPDATE_PROGRESS("\rRead : %u MB ==> %.2f%%", (unsigned)(inFileSize>>20), - (double)outFileSize/inFileSize*100) + (double)outFileSize/(double)inFileSize*100) else - DISPLAYUPDATE(2, "\rRead : %u / %u MB ==> %.2f%%", + DISPLAYUPDATE_PROGRESS("\rRead : %u / %u MB ==> %.2f%%", (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), - (double)outFileSize/inFileSize*100); + (double)outFileSize/(double)inFileSize*100); if (ret == LZMA_STREAM_END) break; } lzma_end(&strm); *readsize = inFileSize; + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); + return outFileSize; } #endif @@ -1235,15 +1246,18 @@ FIO_compressLz4Frame(cRess_t* ress, LZ4F_preferences_t prefs; LZ4F_compressionContext_t ctx; + IOJob_t* writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + LZ4F_errorCode_t const errorCode = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION); if (LZ4F_isError(errorCode)) EXM_THROW(31, "zstd: failed to create lz4 compression context"); memset(&prefs, 0, sizeof(prefs)); - assert(blockSize <= ress->srcBufferSize); + assert(blockSize <= ress->readCtx->base.jobBufferSize); - prefs.autoFlush = 1; + /* autoflush off to mitigate a bug in lz4<=1.9.3 for compression level 12 */ + prefs.autoFlush = 0; prefs.compressionLevel = compressionLevel; prefs.frameInfo.blockMode = LZ4F_blockLinked; prefs.frameInfo.blockSizeID = LZ4F_max64KB; @@ -1251,75 +1265,68 @@ FIO_compressLz4Frame(cRess_t* ress, #if LZ4_VERSION_NUMBER >= 10600 prefs.frameInfo.contentSize = (srcFileSize==UTIL_FILESIZE_UNKNOWN) ? 0 : srcFileSize; #endif - assert(LZ4F_compressBound(blockSize, &prefs) <= ress->dstBufferSize); + assert(LZ4F_compressBound(blockSize, &prefs) <= writeJob->bufferSize); { - size_t readSize; - size_t headerSize = LZ4F_compressBegin(ctx, ress->dstBuffer, ress->dstBufferSize, &prefs); + size_t headerSize = LZ4F_compressBegin(ctx, writeJob->buffer, writeJob->bufferSize, &prefs); if (LZ4F_isError(headerSize)) EXM_THROW(33, "File header generation failed : %s", LZ4F_getErrorName(headerSize)); - if (fwrite(ress->dstBuffer, 1, headerSize, ress->dstFile) != headerSize) - EXM_THROW(34, "Write error : %s (cannot write header)", strerror(errno)); + writeJob->usedBufferSize = headerSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += headerSize; /* Read first block */ - readSize = fread(ress->srcBuffer, (size_t)1, (size_t)blockSize, ress->srcFile); - inFileSize += readSize; + inFileSize += AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); /* Main Loop */ - while (readSize>0) { - size_t const outSize = LZ4F_compressUpdate(ctx, - ress->dstBuffer, ress->dstBufferSize, - ress->srcBuffer, readSize, NULL); + while (ress->readCtx->srcBufferLoaded) { + size_t inSize = MIN(blockSize, ress->readCtx->srcBufferLoaded); + size_t const outSize = LZ4F_compressUpdate(ctx, writeJob->buffer, writeJob->bufferSize, + ress->readCtx->srcBuffer, inSize, NULL); if (LZ4F_isError(outSize)) EXM_THROW(35, "zstd: %s: lz4 compression failed : %s", srcFileName, LZ4F_getErrorName(outSize)); outFileSize += outSize; if (srcFileSize == UTIL_FILESIZE_UNKNOWN) { - DISPLAYUPDATE(2, "\rRead : %u MB ==> %.2f%%", + DISPLAYUPDATE_PROGRESS("\rRead : %u MB ==> %.2f%%", (unsigned)(inFileSize>>20), - (double)outFileSize/inFileSize*100) + (double)outFileSize/(double)inFileSize*100) } else { - DISPLAYUPDATE(2, "\rRead : %u / %u MB ==> %.2f%%", + DISPLAYUPDATE_PROGRESS("\rRead : %u / %u MB ==> %.2f%%", (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), - (double)outFileSize/inFileSize*100); + (double)outFileSize/(double)inFileSize*100); } /* Write Block */ - { size_t const sizeCheck = fwrite(ress->dstBuffer, 1, outSize, ress->dstFile); - if (sizeCheck != outSize) - EXM_THROW(36, "Write error : %s", strerror(errno)); - } + writeJob->usedBufferSize = outSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); /* Read next block */ - readSize = fread(ress->srcBuffer, (size_t)1, (size_t)blockSize, ress->srcFile); - inFileSize += readSize; + AIO_ReadPool_consumeBytes(ress->readCtx, inSize); + inFileSize += AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); } - if (ferror(ress->srcFile)) EXM_THROW(37, "Error reading %s ", srcFileName); /* End of Stream mark */ - headerSize = LZ4F_compressEnd(ctx, ress->dstBuffer, ress->dstBufferSize, NULL); + headerSize = LZ4F_compressEnd(ctx, writeJob->buffer, writeJob->bufferSize, NULL); if (LZ4F_isError(headerSize)) EXM_THROW(38, "zstd: %s: lz4 end of file generation failed : %s", srcFileName, LZ4F_getErrorName(headerSize)); - { size_t const sizeCheck = fwrite(ress->dstBuffer, 1, headerSize, ress->dstFile); - if (sizeCheck != headerSize) - EXM_THROW(39, "Write error : %s (cannot write end of stream)", - strerror(errno)); - } + writeJob->usedBufferSize = headerSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += headerSize; } *readsize = inFileSize; LZ4F_freeCompressionContext(ctx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return outFileSize; } #endif - static unsigned long long FIO_compressZstdFrame(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, @@ -1328,10 +1335,11 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, int compressionLevel, U64* readsize) { cRess_t const ress = *ressPtr; - FILE* const srcFile = ress.srcFile; - FILE* const dstFile = ress.dstFile; + IOJob_t *writeJob = AIO_WritePool_acquireJob(ressPtr->writeCtx); + U64 compressedfilesize = 0; ZSTD_EndDirective directive = ZSTD_e_continue; + U64 pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* stats */ ZSTD_frameProgression previous_zfp_update = { 0, 0, 0, 0, 0, 0 }; @@ -1342,28 +1350,51 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, unsigned inputPresented = 0; unsigned inputBlocked = 0; unsigned lastJobID = 0; + UTIL_time_t lastAdaptTime = UTIL_getTime(); + U64 const adaptEveryMicro = REFRESH_RATE; + + UTIL_HumanReadableSize_t const file_hrs = UTIL_makeHumanReadableSize(fileSize); DISPLAYLEVEL(6, "compression using zstd format \n"); /* init */ if (fileSize != UTIL_FILESIZE_UNKNOWN) { + pledgedSrcSize = fileSize; CHECK(ZSTD_CCtx_setPledgedSrcSize(ress.cctx, fileSize)); } else if (prefs->streamSrcSize > 0) { /* unknown source size; use the declared stream size */ + pledgedSrcSize = prefs->streamSrcSize; CHECK( ZSTD_CCtx_setPledgedSrcSize(ress.cctx, prefs->streamSrcSize) ); } + + { + int windowLog; + UTIL_HumanReadableSize_t windowSize; + CHECK(ZSTD_CCtx_getParameter(ress.cctx, ZSTD_c_windowLog, &windowLog)); + if (windowLog == 0) { + if (prefs->ldmFlag) { + /* If long mode is set without a window size libzstd will set this size internally */ + windowLog = ZSTD_WINDOWLOG_LIMIT_DEFAULT; + } else { + const ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, fileSize, 0); + windowLog = (int)cParams.windowLog; + } + } + windowSize = UTIL_makeHumanReadableSize(MAX(1ULL, MIN(1ULL << windowLog, pledgedSrcSize))); + DISPLAYLEVEL(4, "Decompression will require %.*f%s of memory\n", windowSize.precision, windowSize.value, windowSize.suffix); + } (void)srcFileName; /* Main compression loop */ do { size_t stillToFlush; /* Fill input Buffer */ - size_t const inSize = fread(ress.srcBuffer, (size_t)1, ress.srcBufferSize, srcFile); - ZSTD_inBuffer inBuff = { ress.srcBuffer, inSize, 0 }; + size_t const inSize = AIO_ReadPool_fillBuffer(ress.readCtx, ZSTD_CStreamInSize()); + ZSTD_inBuffer inBuff = setInBuffer( ress.readCtx->srcBuffer, ress.readCtx->srcBufferLoaded, 0 ); DISPLAYLEVEL(6, "fread %u bytes from source \n", (unsigned)inSize); *readsize += inSize; - if ((inSize == 0) || (*readsize == fileSize)) + if ((ress.readCtx->srcBufferLoaded == 0) || (*readsize == fileSize)) directive = ZSTD_e_end; stillToFlush = 1; @@ -1371,9 +1402,10 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, || (directive == ZSTD_e_end && stillToFlush != 0) ) { size_t const oldIPos = inBuff.pos; - ZSTD_outBuffer outBuff = { ress.dstBuffer, ress.dstBufferSize, 0 }; + ZSTD_outBuffer outBuff = setOutBuffer( writeJob->buffer, writeJob->bufferSize, 0 ); size_t const toFlushNow = ZSTD_toFlushNow(ress.cctx); CHECK_V(stillToFlush, ZSTD_compressStream2(ress.cctx, &outBuff, &inBuff, directive)); + AIO_ReadPool_consumeBytes(ress.readCtx, inBuff.pos - oldIPos); /* count stats */ inputPresented++; @@ -1382,148 +1414,155 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, /* Write compressed stream */ DISPLAYLEVEL(6, "ZSTD_compress_generic(end:%u) => input pos(%u)<=(%u)size ; output generated %u bytes \n", - (unsigned)directive, (unsigned)inBuff.pos, (unsigned)inBuff.size, (unsigned)outBuff.pos); + (unsigned)directive, (unsigned)inBuff.pos, (unsigned)inBuff.size, (unsigned)outBuff.pos); if (outBuff.pos) { - size_t const sizeCheck = fwrite(ress.dstBuffer, 1, outBuff.pos, dstFile); - if (sizeCheck != outBuff.pos) - EXM_THROW(25, "Write error : %s (cannot write compressed block)", - strerror(errno)); + writeJob->usedBufferSize = outBuff.pos; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); compressedfilesize += outBuff.pos; } - /* display notification; and adapt compression level */ - if (READY_FOR_UPDATE()) { + /* adaptive mode : statistics measurement and speed correction */ + if (prefs->adaptiveMode && UTIL_clockSpanMicro(lastAdaptTime) > adaptEveryMicro) { + ZSTD_frameProgression const zfp = ZSTD_getFrameProgression(ress.cctx); + + lastAdaptTime = UTIL_getTime(); + + /* check output speed */ + if (zfp.currentJobID > 1) { /* only possible if nbWorkers >= 1 */ + + unsigned long long newlyProduced = zfp.produced - previous_zfp_update.produced; + unsigned long long newlyFlushed = zfp.flushed - previous_zfp_update.flushed; + assert(zfp.produced >= previous_zfp_update.produced); + assert(prefs->nbWorkers >= 1); + + /* test if compression is blocked + * either because output is slow and all buffers are full + * or because input is slow and no job can start while waiting for at least one buffer to be filled. + * note : exclude starting part, since currentJobID > 1 */ + if ( (zfp.consumed == previous_zfp_update.consumed) /* no data compressed : no data available, or no more buffer to compress to, OR compression is really slow (compression of a single block is slower than update rate)*/ + && (zfp.nbActiveWorkers == 0) /* confirmed : no compression ongoing */ + ) { + DISPLAYLEVEL(6, "all buffers full : compression stopped => slow down \n") + speedChange = slower; + } + + previous_zfp_update = zfp; + + if ( (newlyProduced > (newlyFlushed * 9 / 8)) /* compression produces more data than output can flush (though production can be spiky, due to work unit : (N==4)*block sizes) */ + && (flushWaiting == 0) /* flush speed was never slowed by lack of production, so it's operating at max capacity */ + ) { + DISPLAYLEVEL(6, "compression faster than flush (%llu > %llu), and flushed was never slowed down by lack of production => slow down \n", newlyProduced, newlyFlushed); + speedChange = slower; + } + flushWaiting = 0; + } + + /* course correct only if there is at least one new job completed */ + if (zfp.currentJobID > lastJobID) { + DISPLAYLEVEL(6, "compression level adaptation check \n") + + /* check input speed */ + if (zfp.currentJobID > (unsigned)(prefs->nbWorkers+1)) { /* warm up period, to fill all workers */ + if (inputBlocked <= 0) { + DISPLAYLEVEL(6, "input is never blocked => input is slower than ingestion \n"); + speedChange = slower; + } else if (speedChange == noChange) { + unsigned long long newlyIngested = zfp.ingested - previous_zfp_correction.ingested; + unsigned long long newlyConsumed = zfp.consumed - previous_zfp_correction.consumed; + unsigned long long newlyProduced = zfp.produced - previous_zfp_correction.produced; + unsigned long long newlyFlushed = zfp.flushed - previous_zfp_correction.flushed; + previous_zfp_correction = zfp; + assert(inputPresented > 0); + DISPLAYLEVEL(6, "input blocked %u/%u(%.2f) - ingested:%u vs %u:consumed - flushed:%u vs %u:produced \n", + inputBlocked, inputPresented, (double)inputBlocked/inputPresented*100, + (unsigned)newlyIngested, (unsigned)newlyConsumed, + (unsigned)newlyFlushed, (unsigned)newlyProduced); + if ( (inputBlocked > inputPresented / 8) /* input is waiting often, because input buffers is full : compression or output too slow */ + && (newlyFlushed * 33 / 32 > newlyProduced) /* flush everything that is produced */ + && (newlyIngested * 33 / 32 > newlyConsumed) /* input speed as fast or faster than compression speed */ + ) { + DISPLAYLEVEL(6, "recommend faster as in(%llu) >= (%llu)comp(%llu) <= out(%llu) \n", + newlyIngested, newlyConsumed, newlyProduced, newlyFlushed); + speedChange = faster; + } + } + inputBlocked = 0; + inputPresented = 0; + } + + if (speedChange == slower) { + DISPLAYLEVEL(6, "slower speed , higher compression \n") + compressionLevel ++; + if (compressionLevel > ZSTD_maxCLevel()) compressionLevel = ZSTD_maxCLevel(); + if (compressionLevel > prefs->maxAdaptLevel) compressionLevel = prefs->maxAdaptLevel; + compressionLevel += (compressionLevel == 0); /* skip 0 */ + ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_compressionLevel, compressionLevel); + } + if (speedChange == faster) { + DISPLAYLEVEL(6, "faster speed , lighter compression \n") + compressionLevel --; + if (compressionLevel < prefs->minAdaptLevel) compressionLevel = prefs->minAdaptLevel; + compressionLevel -= (compressionLevel == 0); /* skip 0 */ + ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_compressionLevel, compressionLevel); + } + speedChange = noChange; + + lastJobID = zfp.currentJobID; + } /* if (zfp.currentJobID > lastJobID) */ + } /* if (prefs->adaptiveMode && UTIL_clockSpanMicro(lastAdaptTime) > adaptEveryMicro) */ + + /* display notification */ + if (SHOULD_DISPLAY_PROGRESS() && READY_FOR_UPDATE()) { ZSTD_frameProgression const zfp = ZSTD_getFrameProgression(ress.cctx); double const cShare = (double)zfp.produced / (double)(zfp.consumed + !zfp.consumed/*avoid div0*/) * 100; + UTIL_HumanReadableSize_t const buffered_hrs = UTIL_makeHumanReadableSize(zfp.ingested - zfp.consumed); + UTIL_HumanReadableSize_t const consumed_hrs = UTIL_makeHumanReadableSize(zfp.consumed); + UTIL_HumanReadableSize_t const produced_hrs = UTIL_makeHumanReadableSize(zfp.produced); + + DELAY_NEXT_UPDATE(); /* display progress notifications */ + DISPLAY_PROGRESS("\r%79s\r", ""); /* Clear out the current displayed line */ if (g_display_prefs.displayLevel >= 3) { - DISPLAYUPDATE(3, "\r(L%i) Buffered :%4u MB - Consumed :%4u MB - Compressed :%4u MB => %.2f%% ", - compressionLevel, - (unsigned)((zfp.ingested - zfp.consumed) >> 20), - (unsigned)(zfp.consumed >> 20), - (unsigned)(zfp.produced >> 20), - cShare ); - } else if (g_display_prefs.displayLevel >= 2 || g_display_prefs.progressSetting == FIO_ps_always) { + /* Verbose progress update */ + DISPLAY_PROGRESS( + "(L%i) Buffered:%5.*f%s - Consumed:%5.*f%s - Compressed:%5.*f%s => %.2f%% ", + compressionLevel, + buffered_hrs.precision, buffered_hrs.value, buffered_hrs.suffix, + consumed_hrs.precision, consumed_hrs.value, consumed_hrs.suffix, + produced_hrs.precision, produced_hrs.value, produced_hrs.suffix, + cShare ); + } else { /* Require level 2 or forcibly displayed progress counter for summarized updates */ - DISPLAYLEVEL(1, "\r%79s\r", ""); /* Clear out the current displayed line */ if (fCtx->nbFilesTotal > 1) { size_t srcFileNameSize = strlen(srcFileName); /* Ensure that the string we print is roughly the same size each time */ if (srcFileNameSize > 18) { const char* truncatedSrcFileName = srcFileName + srcFileNameSize - 15; - DISPLAYLEVEL(1, "Compress: %u/%u files. Current: ...%s ", + DISPLAY_PROGRESS("Compress: %u/%u files. Current: ...%s ", fCtx->currFileIdx+1, fCtx->nbFilesTotal, truncatedSrcFileName); } else { - DISPLAYLEVEL(1, "Compress: %u/%u files. Current: %*s ", + DISPLAY_PROGRESS("Compress: %u/%u files. Current: %*s ", fCtx->currFileIdx+1, fCtx->nbFilesTotal, (int)(18-srcFileNameSize), srcFileName); } } - DISPLAYLEVEL(1, "Read : %2u ", (unsigned)(zfp.consumed >> 20)); + DISPLAY_PROGRESS("Read:%6.*f%4s ", consumed_hrs.precision, consumed_hrs.value, consumed_hrs.suffix); if (fileSize != UTIL_FILESIZE_UNKNOWN) - DISPLAYLEVEL(2, "/ %2u ", (unsigned)(fileSize >> 20)); - DISPLAYLEVEL(1, "MB ==> %2.f%%", cShare); - DELAY_NEXT_UPDATE(); + DISPLAY_PROGRESS("/%6.*f%4s", file_hrs.precision, file_hrs.value, file_hrs.suffix); + DISPLAY_PROGRESS(" ==> %2.f%%", cShare); } - - /* adaptive mode : statistics measurement and speed correction */ - if (prefs->adaptiveMode) { - - /* check output speed */ - if (zfp.currentJobID > 1) { /* only possible if nbWorkers >= 1 */ - - unsigned long long newlyProduced = zfp.produced - previous_zfp_update.produced; - unsigned long long newlyFlushed = zfp.flushed - previous_zfp_update.flushed; - assert(zfp.produced >= previous_zfp_update.produced); - assert(prefs->nbWorkers >= 1); - - /* test if compression is blocked - * either because output is slow and all buffers are full - * or because input is slow and no job can start while waiting for at least one buffer to be filled. - * note : exclude starting part, since currentJobID > 1 */ - if ( (zfp.consumed == previous_zfp_update.consumed) /* no data compressed : no data available, or no more buffer to compress to, OR compression is really slow (compression of a single block is slower than update rate)*/ - && (zfp.nbActiveWorkers == 0) /* confirmed : no compression ongoing */ - ) { - DISPLAYLEVEL(6, "all buffers full : compression stopped => slow down \n") - speedChange = slower; - } - - previous_zfp_update = zfp; - - if ( (newlyProduced > (newlyFlushed * 9 / 8)) /* compression produces more data than output can flush (though production can be spiky, due to work unit : (N==4)*block sizes) */ - && (flushWaiting == 0) /* flush speed was never slowed by lack of production, so it's operating at max capacity */ - ) { - DISPLAYLEVEL(6, "compression faster than flush (%llu > %llu), and flushed was never slowed down by lack of production => slow down \n", newlyProduced, newlyFlushed); - speedChange = slower; - } - flushWaiting = 0; - } - - /* course correct only if there is at least one new job completed */ - if (zfp.currentJobID > lastJobID) { - DISPLAYLEVEL(6, "compression level adaptation check \n") - - /* check input speed */ - if (zfp.currentJobID > (unsigned)(prefs->nbWorkers+1)) { /* warm up period, to fill all workers */ - if (inputBlocked <= 0) { - DISPLAYLEVEL(6, "input is never blocked => input is slower than ingestion \n"); - speedChange = slower; - } else if (speedChange == noChange) { - unsigned long long newlyIngested = zfp.ingested - previous_zfp_correction.ingested; - unsigned long long newlyConsumed = zfp.consumed - previous_zfp_correction.consumed; - unsigned long long newlyProduced = zfp.produced - previous_zfp_correction.produced; - unsigned long long newlyFlushed = zfp.flushed - previous_zfp_correction.flushed; - previous_zfp_correction = zfp; - assert(inputPresented > 0); - DISPLAYLEVEL(6, "input blocked %u/%u(%.2f) - ingested:%u vs %u:consumed - flushed:%u vs %u:produced \n", - inputBlocked, inputPresented, (double)inputBlocked/inputPresented*100, - (unsigned)newlyIngested, (unsigned)newlyConsumed, - (unsigned)newlyFlushed, (unsigned)newlyProduced); - if ( (inputBlocked > inputPresented / 8) /* input is waiting often, because input buffers is full : compression or output too slow */ - && (newlyFlushed * 33 / 32 > newlyProduced) /* flush everything that is produced */ - && (newlyIngested * 33 / 32 > newlyConsumed) /* input speed as fast or faster than compression speed */ - ) { - DISPLAYLEVEL(6, "recommend faster as in(%llu) >= (%llu)comp(%llu) <= out(%llu) \n", - newlyIngested, newlyConsumed, newlyProduced, newlyFlushed); - speedChange = faster; - } - } - inputBlocked = 0; - inputPresented = 0; - } - - if (speedChange == slower) { - DISPLAYLEVEL(6, "slower speed , higher compression \n") - compressionLevel ++; - if (compressionLevel > ZSTD_maxCLevel()) compressionLevel = ZSTD_maxCLevel(); - if (compressionLevel > prefs->maxAdaptLevel) compressionLevel = prefs->maxAdaptLevel; - compressionLevel += (compressionLevel == 0); /* skip 0 */ - ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_compressionLevel, compressionLevel); - } - if (speedChange == faster) { - DISPLAYLEVEL(6, "faster speed , lighter compression \n") - compressionLevel --; - if (compressionLevel < prefs->minAdaptLevel) compressionLevel = prefs->minAdaptLevel; - compressionLevel -= (compressionLevel == 0); /* skip 0 */ - ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_compressionLevel, compressionLevel); - } - speedChange = noChange; - - lastJobID = zfp.currentJobID; - } /* if (zfp.currentJobID > lastJobID) */ - } /* if (g_adaptiveMode) */ - } /* if (READY_FOR_UPDATE()) */ + } /* if (SHOULD_DISPLAY_PROGRESS() && READY_FOR_UPDATE()) */ } /* while ((inBuff.pos != inBuff.size) */ } while (directive != ZSTD_e_end); - if (ferror(srcFile)) { - EXM_THROW(26, "Read error : I/O error"); - } if (fileSize != UTIL_FILESIZE_UNKNOWN && *readsize != fileSize) { EXM_THROW(27, "Read error : Incomplete read : %llu / %llu B", (unsigned long long)*readsize, (unsigned long long)fileSize); } + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ressPtr->writeCtx); + return compressedfilesize; } @@ -1588,20 +1627,22 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, /* Status */ fCtx->totalBytesInput += (size_t)readsize; fCtx->totalBytesOutput += (size_t)compressedfilesize; - DISPLAYLEVEL(2, "\r%79s\r", ""); - if (g_display_prefs.displayLevel >= 2 && - !fCtx->hasStdoutOutput && - (g_display_prefs.displayLevel >= 3 || fCtx->nbFilesTotal <= 1)) { + DISPLAY_PROGRESS("\r%79s\r", ""); + if (FIO_shouldDisplayFileSummary(fCtx)) { + UTIL_HumanReadableSize_t hr_isize = UTIL_makeHumanReadableSize((U64) readsize); + UTIL_HumanReadableSize_t hr_osize = UTIL_makeHumanReadableSize((U64) compressedfilesize); if (readsize == 0) { - DISPLAYLEVEL(2,"%-20s : (%6llu => %6llu bytes, %s) \n", + DISPLAY_SUMMARY("%-20s : (%6.*f%s => %6.*f%s, %s) \n", srcFileName, - (unsigned long long)readsize, (unsigned long long) compressedfilesize, + hr_isize.precision, hr_isize.value, hr_isize.suffix, + hr_osize.precision, hr_osize.value, hr_osize.suffix, dstFileName); } else { - DISPLAYLEVEL(2,"%-20s :%6.2f%% (%6llu => %6llu bytes, %s) \n", + DISPLAY_SUMMARY("%-20s :%6.2f%% (%6.*f%s => %6.*f%s, %s) \n", srcFileName, (double)compressedfilesize / (double)readsize * 100, - (unsigned long long)readsize, (unsigned long long) compressedfilesize, + hr_isize.precision, hr_isize.value, hr_isize.suffix, + hr_osize.precision, hr_osize.value, hr_osize.suffix, dstFileName); } } @@ -1620,7 +1661,7 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, /*! FIO_compressFilename_dstFile() : - * open dstFileName, or pass-through if ress.dstFile != NULL, + * open dstFileName, or pass-through if ress.file != NULL, * then start compression with FIO_compressFilename_internal(). * Manages source removal (--rm) and file permissions transfer. * note : ress.srcFile must be != NULL, @@ -1633,24 +1674,29 @@ static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, cRess_t ress, const char* dstFileName, const char* srcFileName, + const stat_t* srcFileStat, int compressionLevel) { int closeDstFile = 0; int result; - stat_t statbuf; - assert(ress.srcFile != NULL); - if (ress.dstFile == NULL) { - int dstFilePermissions = DEFAULT_FILE_PERMISSIONS; + int transferStat = 0; + FILE *dstFile; + + assert(AIO_ReadPool_getFile(ress.readCtx) != NULL); + if (AIO_WritePool_getFile(ress.writeCtx) == NULL) { + int dstFileInitialPermissions = DEFAULT_FILE_PERMISSIONS; if ( strcmp (srcFileName, stdinmark) - && UTIL_stat(srcFileName, &statbuf) - && UTIL_isRegularFileStat(&statbuf) ) { - dstFilePermissions = statbuf.st_mode; + && strcmp (dstFileName, stdoutmark) + && UTIL_isRegularFileStat(srcFileStat) ) { + transferStat = 1; + dstFileInitialPermissions = TEMPORARY_FILE_PERMISSIONS; } closeDstFile = 1; DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: opening dst: %s \n", dstFileName); - ress.dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); - if (ress.dstFile==NULL) return 1; /* could not open dstFileName */ + dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFileInitialPermissions); + if (dstFile==NULL) return 1; /* could not open dstFileName */ + AIO_WritePool_setFile(ress.writeCtx, dstFile); /* Must only be added after FIO_openDstFile() succeeds. * Otherwise we may delete the destination file if it already exists, * and the user presses Ctrl-C when asked if they wish to overwrite. @@ -1661,16 +1707,16 @@ static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, result = FIO_compressFilename_internal(fCtx, prefs, ress, dstFileName, srcFileName, compressionLevel); if (closeDstFile) { - FILE* const dstFile = ress.dstFile; - ress.dstFile = NULL; - clearHandler(); DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: closing dst: %s \n", dstFileName); - if (fclose(dstFile)) { /* error closing dstFile */ + if (AIO_WritePool_closeFile(ress.writeCtx)) { /* error closing file */ DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result=1; } + if (transferStat) { + UTIL_setFileStat(dstFileName, srcFileStat); + } if ( (result != 0) /* operation failure */ && strcmp(dstFileName, stdoutmark) /* special case : don't remove() stdout */ ) { @@ -1710,18 +1756,27 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, int compressionLevel) { int result; + FILE* srcFile; + stat_t srcFileStat; + U64 fileSize = UTIL_FILESIZE_UNKNOWN; DISPLAYLEVEL(6, "FIO_compressFilename_srcFile: %s \n", srcFileName); - /* ensure src is not a directory */ - if (UTIL_isDirectory(srcFileName)) { - DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName); - return 1; - } + if (strcmp(srcFileName, stdinmark)) { + if (UTIL_stat(srcFileName, &srcFileStat)) { + /* failure to stat at all is handled during opening */ - /* ensure src is not the same as dict (if present) */ - if (ress.dictFileName != NULL && UTIL_isSameFile(srcFileName, ress.dictFileName)) { - DISPLAYLEVEL(1, "zstd: cannot use %s as an input file and dictionary \n", srcFileName); - return 1; + /* ensure src is not a directory */ + if (UTIL_isDirectoryStat(&srcFileStat)) { + DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName); + return 1; + } + + /* ensure src is not the same as dict (if present) */ + if (ress.dictFileName != NULL && UTIL_isSameFileStat(srcFileName, ress.dictFileName, &srcFileStat, &ress.dictFileStat)) { + DISPLAYLEVEL(1, "zstd: cannot use %s as an input file and dictionary \n", srcFileName); + return 1; + } + } } /* Check if "srcFile" is compressed. Only done if --exclude-compressed flag is used @@ -1733,16 +1788,30 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, return 0; } - ress.srcFile = FIO_openSrcFile(prefs, srcFileName); - if (ress.srcFile == NULL) return 1; /* srcFile could not be opened */ + srcFile = FIO_openSrcFile(prefs, srcFileName, &srcFileStat); + if (srcFile == NULL) return 1; /* srcFile could not be opened */ - result = FIO_compressFilename_dstFile(fCtx, prefs, ress, dstFileName, srcFileName, compressionLevel); + /* Don't use AsyncIO for small files */ + if (strcmp(srcFileName, stdinmark)) /* Stdin doesn't have stats */ + fileSize = UTIL_getFileSizeStat(&srcFileStat); + if(fileSize != UTIL_FILESIZE_UNKNOWN && fileSize < ZSTD_BLOCKSIZE_MAX * 3) { + AIO_ReadPool_setAsync(ress.readCtx, 0); + AIO_WritePool_setAsync(ress.writeCtx, 0); + } else { + AIO_ReadPool_setAsync(ress.readCtx, 1); + AIO_WritePool_setAsync(ress.writeCtx, 1); + } - fclose(ress.srcFile); - ress.srcFile = NULL; - if ( prefs->removeSrcFile /* --rm */ - && result == 0 /* success */ - && strcmp(srcFileName, stdinmark) /* exception : don't erase stdin */ + AIO_ReadPool_setFile(ress.readCtx, srcFile); + result = FIO_compressFilename_dstFile( + fCtx, prefs, ress, + dstFileName, srcFileName, + &srcFileStat, compressionLevel); + AIO_ReadPool_closeFile(ress.readCtx); + + if ( prefs->removeSrcFile /* --rm */ + && result == 0 /* success */ + && strcmp(srcFileName, stdinmark) /* exception : don't erase stdin */ ) { /* We must clear the handler, since after this point calling it would * delete both the source and destination files. @@ -1754,6 +1823,52 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, return result; } +static const char* +checked_index(const char* options[], size_t length, size_t index) { + assert(index < length); + /* Necessary to avoid warnings since -O3 will omit the above `assert` */ + (void) length; + return options[index]; +} + +#define INDEX(options, index) checked_index((options), sizeof(options) / sizeof(char*), (size_t)(index)) + +void FIO_displayCompressionParameters(const FIO_prefs_t* prefs) +{ + static const char* formatOptions[5] = {ZSTD_EXTENSION, GZ_EXTENSION, XZ_EXTENSION, + LZMA_EXTENSION, LZ4_EXTENSION}; + static const char* sparseOptions[3] = {" --no-sparse", "", " --sparse"}; + static const char* checkSumOptions[3] = {" --no-check", "", " --check"}; + static const char* rowMatchFinderOptions[3] = {"", " --no-row-match-finder", " --row-match-finder"}; + static const char* compressLiteralsOptions[3] = {"", " --compress-literals", " --no-compress-literals"}; + + assert(g_display_prefs.displayLevel >= 4); + + DISPLAY("--format=%s", formatOptions[prefs->compressionType]); + DISPLAY("%s", INDEX(sparseOptions, prefs->sparseFileSupport)); + DISPLAY("%s", prefs->dictIDFlag ? "" : " --no-dictID"); + DISPLAY("%s", INDEX(checkSumOptions, prefs->checksumFlag)); + DISPLAY(" --block-size=%d", prefs->blockSize); + if (prefs->adaptiveMode) + DISPLAY(" --adapt=min=%d,max=%d", prefs->minAdaptLevel, prefs->maxAdaptLevel); + DISPLAY("%s", INDEX(rowMatchFinderOptions, prefs->useRowMatchFinder)); + DISPLAY("%s", prefs->rsyncable ? " --rsyncable" : ""); + if (prefs->streamSrcSize) + DISPLAY(" --stream-size=%u", (unsigned) prefs->streamSrcSize); + if (prefs->srcSizeHint) + DISPLAY(" --size-hint=%d", prefs->srcSizeHint); + if (prefs->targetCBlockSize) + DISPLAY(" --target-compressed-block-size=%u", (unsigned) prefs->targetCBlockSize); + DISPLAY("%s", INDEX(compressLiteralsOptions, prefs->literalCompressionMode)); + DISPLAY(" --memory=%u", prefs->memLimit ? prefs->memLimit : 128 MB); + DISPLAY(" --threads=%d", prefs->nbWorkers); + DISPLAY("%s", prefs->excludeCompressedFiles ? " --exclude-compressed" : ""); + DISPLAY(" --%scontent-size", prefs->contentSize ? "" : "no-"); + DISPLAY("\n"); +} + +#undef INDEX + int FIO_compressFilename(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, const char* dstFileName, const char* srcFileName, const char* dictFileName, int compressionLevel, ZSTD_compressionParameters comprParams) @@ -1780,6 +1895,11 @@ FIO_determineCompressedName(const char* srcFileName, const char* outDirName, con char* outDirFilename = NULL; size_t sfnSize = strlen(srcFileName); size_t const srcSuffixLen = strlen(suffix); + + if(!strcmp(srcFileName, stdinmark)) { + return stdoutmark; + } + if (outDirName) { outDirFilename = FIO_createFilename_fromOutDir(srcFileName, outDirName, srcSuffixLen); sfnSize = strlen(outDirFilename); @@ -1842,23 +1962,24 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, /* init */ assert(outFileName != NULL || suffix != NULL); if (outFileName != NULL) { /* output into a single destination (stdout typically) */ - if (FIO_removeMultiFilesWarning(fCtx, prefs, outFileName, 1 /* displayLevelCutoff */)) { + FILE *dstFile; + if (FIO_multiFilesConcatWarning(fCtx, prefs, outFileName, 1 /* displayLevelCutoff */)) { FIO_freeCResources(&ress); return 1; } - ress.dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); - if (ress.dstFile == NULL) { /* could not open outFileName */ + dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); + if (dstFile == NULL) { /* could not open outFileName */ error = 1; } else { + AIO_WritePool_setFile(ress.writeCtx, dstFile); for (; fCtx->currFileIdx < fCtx->nbFilesTotal; ++fCtx->currFileIdx) { status = FIO_compressFilename_srcFile(fCtx, prefs, ress, outFileName, inFileNamesTable[fCtx->currFileIdx], compressionLevel); if (!status) fCtx->nbFilesProcessed++; error |= status; } - if (fclose(ress.dstFile)) + if (AIO_WritePool_closeFile(ress.writeCtx)) EXM_THROW(29, "Write error (%s) : cannot properly close %s", strerror(errno), outFileName); - ress.dstFile = NULL; } } else { if (outMirroredRootDirName) @@ -1889,11 +2010,23 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, FIO_checkFilenameCollisions(inFileNamesTable , (unsigned)fCtx->nbFilesTotal); } - if (fCtx->nbFilesProcessed >= 1 && fCtx->nbFilesTotal > 1 && fCtx->totalBytesInput != 0) { - DISPLAYLEVEL(2, "\r%79s\r", ""); - DISPLAYLEVEL(2, "%d files compressed : %.2f%% (%6zu => %6zu bytes)\n", fCtx->nbFilesProcessed, - (double)fCtx->totalBytesOutput/((double)fCtx->totalBytesInput)*100, - fCtx->totalBytesInput, fCtx->totalBytesOutput); + if (FIO_shouldDisplayMultipleFileSummary(fCtx)) { + UTIL_HumanReadableSize_t hr_isize = UTIL_makeHumanReadableSize((U64) fCtx->totalBytesInput); + UTIL_HumanReadableSize_t hr_osize = UTIL_makeHumanReadableSize((U64) fCtx->totalBytesOutput); + + DISPLAY_PROGRESS("\r%79s\r", ""); + if (fCtx->totalBytesInput == 0) { + DISPLAY_SUMMARY("%3d files compressed : (%6.*f%4s => %6.*f%4s)\n", + fCtx->nbFilesProcessed, + hr_isize.precision, hr_isize.value, hr_isize.suffix, + hr_osize.precision, hr_osize.value, hr_osize.suffix); + } else { + DISPLAY_SUMMARY("%3d files compressed : %.2f%% (%6.*f%4s => %6.*f%4s)\n", + fCtx->nbFilesProcessed, + (double)fCtx->totalBytesOutput/((double)fCtx->totalBytesInput)*100, + hr_isize.precision, hr_isize.value, hr_isize.suffix, + hr_osize.precision, hr_osize.value, hr_osize.suffix); + } } FIO_freeCResources(&ress); @@ -1910,13 +2043,9 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, * Decompression ***************************************************************************/ typedef struct { - void* srcBuffer; - size_t srcBufferSize; - size_t srcBufferLoaded; - void* dstBuffer; - size_t dstBufferSize; ZSTD_DStream* dctx; - FILE* dstFile; + WritePoolCtx_t *writeCtx; + ReadPoolCtx_t *readCtx; } dRess_t; static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFileName) @@ -1934,159 +2063,49 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi CHECK( ZSTD_DCtx_setMaxWindowSize(ress.dctx, prefs->memLimit) ); CHECK( ZSTD_DCtx_setParameter(ress.dctx, ZSTD_d_forceIgnoreChecksum, !prefs->checksumFlag)); - ress.srcBufferSize = ZSTD_DStreamInSize(); - ress.srcBuffer = malloc(ress.srcBufferSize); - ress.dstBufferSize = ZSTD_DStreamOutSize(); - ress.dstBuffer = malloc(ress.dstBufferSize); - if (!ress.srcBuffer || !ress.dstBuffer) - EXM_THROW(61, "Allocation error : not enough memory"); - /* dictionary */ { void* dictBuffer; - size_t const dictBufferSize = FIO_createDictBuffer(&dictBuffer, dictFileName, prefs); - CHECK( ZSTD_initDStream_usingDict(ress.dctx, dictBuffer, dictBufferSize) ); + stat_t statbuf; + size_t const dictBufferSize = FIO_createDictBuffer(&dictBuffer, dictFileName, prefs, &statbuf); + CHECK( ZSTD_DCtx_reset(ress.dctx, ZSTD_reset_session_only) ); + CHECK( ZSTD_DCtx_loadDictionary(ress.dctx, dictBuffer, dictBufferSize) ); free(dictBuffer); } + ress.writeCtx = AIO_WritePool_create(prefs, ZSTD_DStreamOutSize()); + ress.readCtx = AIO_ReadPool_create(prefs, ZSTD_DStreamInSize()); + return ress; } static void FIO_freeDResources(dRess_t ress) { CHECK( ZSTD_freeDStream(ress.dctx) ); - free(ress.srcBuffer); - free(ress.dstBuffer); + AIO_WritePool_free(ress.writeCtx); + AIO_ReadPool_free(ress.readCtx); } - -/** FIO_fwriteSparse() : -* @return : storedSkips, -* argument for next call to FIO_fwriteSparse() or FIO_fwriteSparseEnd() */ -static unsigned -FIO_fwriteSparse(FILE* file, - const void* buffer, size_t bufferSize, - const FIO_prefs_t* const prefs, - unsigned storedSkips) -{ - const size_t* const bufferT = (const size_t*)buffer; /* Buffer is supposed malloc'ed, hence aligned on size_t */ - size_t bufferSizeT = bufferSize / sizeof(size_t); - const size_t* const bufferTEnd = bufferT + bufferSizeT; - const size_t* ptrT = bufferT; - static const size_t segmentSizeT = (32 KB) / sizeof(size_t); /* check every 32 KB */ - - if (prefs->testMode) return 0; /* do not output anything in test mode */ - - if (!prefs->sparseFileSupport) { /* normal write */ - size_t const sizeCheck = fwrite(buffer, 1, bufferSize, file); - if (sizeCheck != bufferSize) - EXM_THROW(70, "Write error : cannot write decoded block : %s", - strerror(errno)); - return 0; - } - - /* avoid int overflow */ - if (storedSkips > 1 GB) { - if (LONG_SEEK(file, 1 GB, SEEK_CUR) != 0) - EXM_THROW(91, "1 GB skip error (sparse file support)"); - storedSkips -= 1 GB; - } - - while (ptrT < bufferTEnd) { - size_t nb0T; - - /* adjust last segment if < 32 KB */ - size_t seg0SizeT = segmentSizeT; - if (seg0SizeT > bufferSizeT) seg0SizeT = bufferSizeT; - bufferSizeT -= seg0SizeT; - - /* count leading zeroes */ - for (nb0T=0; (nb0T < seg0SizeT) && (ptrT[nb0T] == 0); nb0T++) ; - storedSkips += (unsigned)(nb0T * sizeof(size_t)); - - if (nb0T != seg0SizeT) { /* not all 0s */ - size_t const nbNon0ST = seg0SizeT - nb0T; - /* skip leading zeros */ - if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) - EXM_THROW(92, "Sparse skip error ; try --no-sparse"); - storedSkips = 0; - /* write the rest */ - if (fwrite(ptrT + nb0T, sizeof(size_t), nbNon0ST, file) != nbNon0ST) - EXM_THROW(93, "Write error : cannot write decoded block : %s", - strerror(errno)); - } - ptrT += seg0SizeT; - } - - { static size_t const maskT = sizeof(size_t)-1; - if (bufferSize & maskT) { - /* size not multiple of sizeof(size_t) : implies end of block */ - const char* const restStart = (const char*)bufferTEnd; - const char* restPtr = restStart; - const char* const restEnd = (const char*)buffer + bufferSize; - assert(restEnd > restStart && restEnd < restStart + sizeof(size_t)); - for ( ; (restPtr < restEnd) && (*restPtr == 0); restPtr++) ; - storedSkips += (unsigned) (restPtr - restStart); - if (restPtr != restEnd) { - /* not all remaining bytes are 0 */ - size_t const restSize = (size_t)(restEnd - restPtr); - if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) - EXM_THROW(92, "Sparse skip error ; try --no-sparse"); - if (fwrite(restPtr, 1, restSize, file) != restSize) - EXM_THROW(95, "Write error : cannot write end of decoded block : %s", - strerror(errno)); - storedSkips = 0; - } } } - - return storedSkips; -} - -static void -FIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) -{ - if (prefs->testMode) assert(storedSkips == 0); - if (storedSkips>0) { - assert(prefs->sparseFileSupport > 0); /* storedSkips>0 implies sparse support is enabled */ - (void)prefs; /* assert can be disabled, in which case prefs becomes unused */ - if (LONG_SEEK(file, storedSkips-1, SEEK_CUR) != 0) - EXM_THROW(69, "Final skip error (sparse file support)"); - /* last zero must be explicitly written, - * so that skipped ones get implicitly translated as zero by FS */ - { const char lastZeroByte[1] = { 0 }; - if (fwrite(lastZeroByte, 1, 1, file) != 1) - EXM_THROW(69, "Write error : cannot write last zero : %s", strerror(errno)); - } } -} - - /** FIO_passThrough() : just copy input into output, for compatibility with gzip -df mode @return : 0 (no error) */ -static int FIO_passThrough(const FIO_prefs_t* const prefs, - FILE* foutput, FILE* finput, - void* buffer, size_t bufferSize, - size_t alreadyLoaded) +static int FIO_passThrough(dRess_t *ress) { - size_t const blockSize = MIN(64 KB, bufferSize); - size_t readFromInput; - unsigned storedSkips = 0; + size_t const blockSize = MIN(MIN(64 KB, ZSTD_DStreamInSize()), ZSTD_DStreamOutSize()); + IOJob_t *writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); - /* assumption : ress->srcBufferLoaded bytes already loaded and stored within buffer */ - { size_t const sizeCheck = fwrite(buffer, 1, alreadyLoaded, foutput); - if (sizeCheck != alreadyLoaded) { - DISPLAYLEVEL(1, "Pass-through write error : %s\n", strerror(errno)); - return 1; - } } - - do { - readFromInput = fread(buffer, 1, blockSize, finput); - storedSkips = FIO_fwriteSparse(foutput, buffer, readFromInput, prefs, storedSkips); - } while (readFromInput == blockSize); - if (ferror(finput)) { - DISPLAYLEVEL(1, "Pass-through read error : %s\n", strerror(errno)); - return 1; + while(ress->readCtx->srcBufferLoaded) { + size_t writeSize; + writeSize = MIN(blockSize, ress->readCtx->srcBufferLoaded); + assert(writeSize <= writeJob->bufferSize); + memcpy(writeJob->buffer, ress->readCtx->srcBuffer, writeSize); + writeJob->usedBufferSize = writeSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); + AIO_ReadPool_consumeBytes(ress->readCtx, writeSize); + AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); } - assert(feof(finput)); - - FIO_fwriteSparseEnd(prefs, foutput, storedSkips); + assert(ress->readCtx->reachedEof); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return 0; } @@ -2104,7 +2123,7 @@ FIO_zstdErrorHelp(const FIO_prefs_t* const prefs, return; /* Try to decode the frame header */ - err = ZSTD_getFrameHeader(&header, ress->srcBuffer, ress->srcBufferLoaded); + err = ZSTD_getFrameHeader(&header, ress->readCtx->srcBuffer, ress->readCtx->srcBufferLoaded); if (err == 0) { unsigned long long const windowSize = header.windowSize; unsigned const windowLog = FIO_highbit64(windowSize) + ((windowSize & (windowSize - 1)) != 0); @@ -2127,13 +2146,13 @@ FIO_zstdErrorHelp(const FIO_prefs_t* const prefs, */ #define FIO_ERROR_FRAME_DECODING ((unsigned long long)(-2)) static unsigned long long -FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, +FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, const FIO_prefs_t* const prefs, const char* srcFileName, U64 alreadyDecoded) /* for multi-frames streams */ { U64 frameSize = 0; - U32 storedSkips = 0; + IOJob_t *writeJob = AIO_WritePool_acquireJob(ress->writeCtx); /* display last 20 characters only */ { size_t const srcFileLength = strlen(srcFileName); @@ -2143,67 +2162,60 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, ZSTD_DCtx_reset(ress->dctx, ZSTD_reset_session_only); /* Header loading : ensures ZSTD_getFrameHeader() will succeed */ - { size_t const toDecode = ZSTD_FRAMEHEADERSIZE_MAX; - if (ress->srcBufferLoaded < toDecode) { - size_t const toRead = toDecode - ress->srcBufferLoaded; - void* const startPosition = (char*)ress->srcBuffer + ress->srcBufferLoaded; - ress->srcBufferLoaded += fread(startPosition, 1, toRead, finput); - } } + AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_FRAMEHEADERSIZE_MAX); /* Main decompression Loop */ while (1) { - ZSTD_inBuffer inBuff = { ress->srcBuffer, ress->srcBufferLoaded, 0 }; - ZSTD_outBuffer outBuff= { ress->dstBuffer, ress->dstBufferSize, 0 }; + ZSTD_inBuffer inBuff = setInBuffer( ress->readCtx->srcBuffer, ress->readCtx->srcBufferLoaded, 0 ); + ZSTD_outBuffer outBuff= setOutBuffer( writeJob->buffer, writeJob->bufferSize, 0 ); size_t const readSizeHint = ZSTD_decompressStream(ress->dctx, &outBuff, &inBuff); + UTIL_HumanReadableSize_t const hrs = UTIL_makeHumanReadableSize(alreadyDecoded+frameSize); if (ZSTD_isError(readSizeHint)) { DISPLAYLEVEL(1, "%s : Decoding error (36) : %s \n", srcFileName, ZSTD_getErrorName(readSizeHint)); FIO_zstdErrorHelp(prefs, ress, readSizeHint, srcFileName); + AIO_WritePool_releaseIoJob(writeJob); return FIO_ERROR_FRAME_DECODING; } /* Write block */ - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, outBuff.pos, prefs, storedSkips); + writeJob->usedBufferSize = outBuff.pos; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); frameSize += outBuff.pos; - if (!fCtx->hasStdoutOutput || g_display_prefs.progressSetting == FIO_ps_always) { - if (fCtx->nbFilesTotal > 1) { - size_t srcFileNameSize = strlen(srcFileName); - if (srcFileNameSize > 18) { - const char* truncatedSrcFileName = srcFileName + srcFileNameSize - 15; - DISPLAYUPDATE(2, "\rDecompress: %2u/%2u files. Current: ...%s : %u MB... ", - fCtx->currFileIdx+1, fCtx->nbFilesTotal, truncatedSrcFileName, (unsigned)((alreadyDecoded+frameSize)>>20) ); - } else { - DISPLAYUPDATE(2, "\rDecompress: %2u/%2u files. Current: %s : %u MB... ", - fCtx->currFileIdx+1, fCtx->nbFilesTotal, srcFileName, (unsigned)((alreadyDecoded+frameSize)>>20) ); - } + if (fCtx->nbFilesTotal > 1) { + size_t srcFileNameSize = strlen(srcFileName); + if (srcFileNameSize > 18) { + const char* truncatedSrcFileName = srcFileName + srcFileNameSize - 15; + DISPLAYUPDATE_PROGRESS( + "\rDecompress: %2u/%2u files. Current: ...%s : %.*f%s... ", + fCtx->currFileIdx+1, fCtx->nbFilesTotal, truncatedSrcFileName, hrs.precision, hrs.value, hrs.suffix); } else { - DISPLAYUPDATE(2, "\r%-20.20s : %u MB... ", - srcFileName, (unsigned)((alreadyDecoded+frameSize)>>20) ); + DISPLAYUPDATE_PROGRESS("\rDecompress: %2u/%2u files. Current: %s : %.*f%s... ", + fCtx->currFileIdx+1, fCtx->nbFilesTotal, srcFileName, hrs.precision, hrs.value, hrs.suffix); } + } else { + DISPLAYUPDATE_PROGRESS("\r%-20.20s : %.*f%s... ", + srcFileName, hrs.precision, hrs.value, hrs.suffix); } - if (inBuff.pos > 0) { - memmove(ress->srcBuffer, (char*)ress->srcBuffer + inBuff.pos, inBuff.size - inBuff.pos); - ress->srcBufferLoaded -= inBuff.pos; - } + AIO_ReadPool_consumeBytes(ress->readCtx, inBuff.pos); if (readSizeHint == 0) break; /* end of frame */ /* Fill input buffer */ - { size_t const toDecode = MIN(readSizeHint, ress->srcBufferSize); /* support large skippable frames */ - if (ress->srcBufferLoaded < toDecode) { - size_t const toRead = toDecode - ress->srcBufferLoaded; /* > 0 */ - void* const startPosition = (char*)ress->srcBuffer + ress->srcBufferLoaded; - size_t const readSize = fread(startPosition, 1, toRead, finput); + { size_t const toDecode = MIN(readSizeHint, ZSTD_DStreamInSize()); /* support large skippable frames */ + if (ress->readCtx->srcBufferLoaded < toDecode) { + size_t const readSize = AIO_ReadPool_fillBuffer(ress->readCtx, toDecode); if (readSize==0) { DISPLAYLEVEL(1, "%s : Read error (39) : premature end \n", - srcFileName); + srcFileName); + AIO_WritePool_releaseIoJob(writeJob); return FIO_ERROR_FRAME_DECODING; } - ress->srcBufferLoaded += readSize; - } } } + } } } - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return frameSize; } @@ -2211,37 +2223,36 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, #ifdef ZSTD_GZDECOMPRESS static unsigned long long -FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, - const char* srcFileName) +FIO_decompressGzFrame(dRess_t* ress, const char* srcFileName) { unsigned long long outFileSize = 0; z_stream strm; int flush = Z_NO_FLUSH; int decodingError = 0; - unsigned storedSkips = 0; + IOJob_t *writeJob = NULL; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.next_in = 0; strm.avail_in = 0; - /* see http://www.zlib.net/manual.html */ + /* see https://www.zlib.net/manual.html */ if (inflateInit2(&strm, 15 /* maxWindowLogSize */ + 16 /* gzip only */) != Z_OK) return FIO_ERROR_FRAME_DECODING; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; - strm.avail_in = (uInt)ress->srcBufferLoaded; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; for ( ; ; ) { int ret; if (strm.avail_in == 0) { - ress->srcBufferLoaded = fread(ress->srcBuffer, 1, ress->srcBufferSize, srcFile); - if (ress->srcBufferLoaded == 0) flush = Z_FINISH; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; - strm.avail_in = (uInt)ress->srcBufferLoaded; + AIO_ReadPool_consumeAndRefill(ress->readCtx); + if (ress->readCtx->srcBufferLoaded == 0) flush = Z_FINISH; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; } ret = inflate(&strm, flush); if (ret == Z_BUF_ERROR) { @@ -2252,35 +2263,34 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, DISPLAYLEVEL(1, "zstd: %s: inflate error %d \n", srcFileName, ret); decodingError = 1; break; } - { size_t const decompBytes = ress->dstBufferSize - strm.avail_out; + { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decompBytes, prefs, storedSkips); + writeJob->usedBufferSize = decompBytes; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; } } if (ret == Z_STREAM_END) break; } - if (strm.avail_in > 0) - memmove(ress->srcBuffer, strm.next_in, strm.avail_in); - ress->srcBufferLoaded = strm.avail_in; + AIO_ReadPool_consumeBytes(ress->readCtx, ress->readCtx->srcBufferLoaded - strm.avail_in); + if ( (inflateEnd(&strm) != Z_OK) /* release resources ; error detected */ && (decodingError==0) ) { DISPLAYLEVEL(1, "zstd: %s: inflateEnd error \n", srcFileName); decodingError = 1; } - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif - #ifdef ZSTD_LZMADECOMPRESS static unsigned long long -FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, +FIO_decompressLzmaFrame(dRess_t* ress, const char* srcFileName, int plain_lzma) { unsigned long long outFileSize = 0; @@ -2288,7 +2298,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, lzma_action action = LZMA_RUN; lzma_ret initRet; int decodingError = 0; - unsigned storedSkips = 0; + IOJob_t *writeJob = NULL; strm.next_in = 0; strm.avail_in = 0; @@ -2305,18 +2315,19 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, return FIO_ERROR_FRAME_DECODING; } - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = ress->srcBufferLoaded; + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; for ( ; ; ) { lzma_ret ret; if (strm.avail_in == 0) { - ress->srcBufferLoaded = fread(ress->srcBuffer, 1, ress->srcBufferSize, srcFile); - if (ress->srcBufferLoaded == 0) action = LZMA_FINISH; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = ress->srcBufferLoaded; + AIO_ReadPool_consumeAndRefill(ress->readCtx); + if (ress->readCtx->srcBufferLoaded == 0) action = LZMA_FINISH; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; } ret = lzma_code(&strm, action); @@ -2329,102 +2340,90 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, srcFileName, ret); decodingError = 1; break; } - { size_t const decompBytes = ress->dstBufferSize - strm.avail_out; + { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decompBytes, prefs, storedSkips); + writeJob->usedBufferSize = decompBytes; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = writeJob->bufferSize; } } if (ret == LZMA_STREAM_END) break; } - if (strm.avail_in > 0) - memmove(ress->srcBuffer, strm.next_in, strm.avail_in); - ress->srcBufferLoaded = strm.avail_in; + AIO_ReadPool_consumeBytes(ress->readCtx, ress->readCtx->srcBufferLoaded - strm.avail_in); lzma_end(&strm); - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif #ifdef ZSTD_LZ4DECOMPRESS static unsigned long long -FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, - const char* srcFileName) +FIO_decompressLz4Frame(dRess_t* ress, const char* srcFileName) { unsigned long long filesize = 0; - LZ4F_errorCode_t nextToLoad; + LZ4F_errorCode_t nextToLoad = 4; LZ4F_decompressionContext_t dCtx; LZ4F_errorCode_t const errorCode = LZ4F_createDecompressionContext(&dCtx, LZ4F_VERSION); int decodingError = 0; - unsigned storedSkips = 0; + IOJob_t *writeJob = NULL; if (LZ4F_isError(errorCode)) { DISPLAYLEVEL(1, "zstd: failed to create lz4 decompression context \n"); return FIO_ERROR_FRAME_DECODING; } - /* Init feed with magic number (already consumed from FILE* sFile) */ - { size_t inSize = 4; - size_t outSize= 0; - MEM_writeLE32(ress->srcBuffer, LZ4_MAGICNUMBER); - nextToLoad = LZ4F_decompress(dCtx, ress->dstBuffer, &outSize, ress->srcBuffer, &inSize, NULL); - if (LZ4F_isError(nextToLoad)) { - DISPLAYLEVEL(1, "zstd: %s: lz4 header error : %s \n", - srcFileName, LZ4F_getErrorName(nextToLoad)); - LZ4F_freeDecompressionContext(dCtx); - return FIO_ERROR_FRAME_DECODING; - } } + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); /* Main Loop */ for (;nextToLoad;) { - size_t readSize; size_t pos = 0; - size_t decodedBytes = ress->dstBufferSize; + size_t decodedBytes = writeJob->bufferSize; + int fullBufferDecoded = 0; /* Read input */ - if (nextToLoad > ress->srcBufferSize) nextToLoad = ress->srcBufferSize; - readSize = fread(ress->srcBuffer, 1, nextToLoad, srcFile); - if (!readSize) break; /* reached end of file or stream */ + AIO_ReadPool_fillBuffer(ress->readCtx, nextToLoad); + if(!ress->readCtx->srcBufferLoaded) break; /* reached end of file */ - while ((pos < readSize) || (decodedBytes == ress->dstBufferSize)) { /* still to read, or still to flush */ + while ((pos < ress->readCtx->srcBufferLoaded) || fullBufferDecoded) { /* still to read, or still to flush */ /* Decode Input (at least partially) */ - size_t remaining = readSize - pos; - decodedBytes = ress->dstBufferSize; - nextToLoad = LZ4F_decompress(dCtx, ress->dstBuffer, &decodedBytes, (char*)(ress->srcBuffer)+pos, &remaining, NULL); + size_t remaining = ress->readCtx->srcBufferLoaded - pos; + decodedBytes = writeJob->bufferSize; + nextToLoad = LZ4F_decompress(dCtx, writeJob->buffer, &decodedBytes, (char*)(ress->readCtx->srcBuffer)+pos, + &remaining, NULL); if (LZ4F_isError(nextToLoad)) { DISPLAYLEVEL(1, "zstd: %s: lz4 decompression error : %s \n", srcFileName, LZ4F_getErrorName(nextToLoad)); decodingError = 1; nextToLoad = 0; break; } pos += remaining; + assert(pos <= ress->readCtx->srcBufferLoaded); + fullBufferDecoded = decodedBytes == writeJob->bufferSize; /* Write Block */ if (decodedBytes) { - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decodedBytes, prefs, storedSkips); + UTIL_HumanReadableSize_t hrs; + writeJob->usedBufferSize = decodedBytes; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); filesize += decodedBytes; - DISPLAYUPDATE(2, "\rDecompressed : %u MB ", (unsigned)(filesize>>20)); + hrs = UTIL_makeHumanReadableSize(filesize); + DISPLAYUPDATE_PROGRESS("\rDecompressed : %.*f%s ", hrs.precision, hrs.value, hrs.suffix); } if (!nextToLoad) break; } + AIO_ReadPool_consumeBytes(ress->readCtx, pos); } - /* can be out because readSize == 0, which could be an fread() error */ - if (ferror(srcFile)) { - DISPLAYLEVEL(1, "zstd: %s: read error \n", srcFileName); - decodingError=1; - } - if (nextToLoad!=0) { DISPLAYLEVEL(1, "zstd: %s: unfinished lz4 stream \n", srcFileName); decodingError=1; } LZ4F_freeDecompressionContext(dCtx); - ress->srcBufferLoaded = 0; /* LZ4F will reach exact frame boundary */ - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : filesize; } @@ -2439,23 +2438,30 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, * 1 : error */ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, - dRess_t ress, FILE* srcFile, - const FIO_prefs_t* const prefs, - const char* dstFileName, const char* srcFileName) + dRess_t ress, const FIO_prefs_t* const prefs, + const char* dstFileName, const char* srcFileName) { unsigned readSomething = 0; unsigned long long filesize = 0; - assert(srcFile != NULL); + int passThrough = prefs->passThrough; + + if (passThrough == -1) { + /* If pass-through mode is not explicitly enabled or disabled, + * default to the legacy behavior of enabling it if we are writing + * to stdout with the overwrite flag enabled. + */ + passThrough = prefs->overwrite && !strcmp(dstFileName, stdoutmark); + } + assert(passThrough == 0 || passThrough == 1); /* for each frame */ for ( ; ; ) { /* check magic number -> version */ size_t const toRead = 4; - const BYTE* const buf = (const BYTE*)ress.srcBuffer; - if (ress.srcBufferLoaded < toRead) /* load up to 4 bytes for header */ - ress.srcBufferLoaded += fread((char*)ress.srcBuffer + ress.srcBufferLoaded, - (size_t)1, toRead - ress.srcBufferLoaded, srcFile); - if (ress.srcBufferLoaded==0) { + const BYTE* buf; + AIO_ReadPool_fillBuffer(ress.readCtx, toRead); + buf = (const BYTE*)ress.readCtx->srcBuffer; + if (ress.readCtx->srcBufferLoaded==0) { if (readSomething==0) { /* srcFile is empty (which is invalid) */ DISPLAYLEVEL(1, "zstd: %s: unexpected end of file \n", srcFileName); return 1; @@ -2463,17 +2469,20 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, break; /* no more input */ } readSomething = 1; /* there is at least 1 byte in srcFile */ - if (ress.srcBufferLoaded < toRead) { + if (ress.readCtx->srcBufferLoaded < toRead) { /* not enough input to check magic number */ + if (passThrough) { + return FIO_passThrough(&ress); + } DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName); return 1; } - if (ZSTD_isFrame(buf, ress.srcBufferLoaded)) { - unsigned long long const frameSize = FIO_decompressZstdFrame(fCtx, &ress, srcFile, prefs, srcFileName, filesize); + if (ZSTD_isFrame(buf, ress.readCtx->srcBufferLoaded)) { + unsigned long long const frameSize = FIO_decompressZstdFrame(fCtx, &ress, prefs, srcFileName, filesize); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; } else if (buf[0] == 31 && buf[1] == 139) { /* gz magic number */ #ifdef ZSTD_GZDECOMPRESS - unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFile, prefs, srcFileName); + unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2483,7 +2492,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, } else if ((buf[0] == 0xFD && buf[1] == 0x37) /* xz magic number */ || (buf[0] == 0x5D && buf[1] == 0x00)) { /* lzma header (no magic number) */ #ifdef ZSTD_LZMADECOMPRESS - unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFile, prefs, srcFileName, buf[0] != 0xFD); + unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFileName, buf[0] != 0xFD); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2492,18 +2501,15 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, #endif } else if (MEM_readLE32(buf) == LZ4_MAGICNUMBER) { #ifdef ZSTD_LZ4DECOMPRESS - unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFile, prefs, srcFileName); + unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else DISPLAYLEVEL(1, "zstd: %s: lz4 file cannot be uncompressed (zstd compiled without HAVE_LZ4) -- ignored \n", srcFileName); return 1; #endif - } else if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ - return FIO_passThrough(prefs, - ress.dstFile, srcFile, - ress.srcBuffer, ress.srcBufferSize, - ress.srcBufferLoaded); + } else if (passThrough) { + return FIO_passThrough(&ress); } else { DISPLAYLEVEL(1, "zstd: %s: unsupported format \n", srcFileName); return 1; @@ -2511,45 +2517,45 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, /* Final Status */ fCtx->totalBytesOutput += (size_t)filesize; - DISPLAYLEVEL(2, "\r%79s\r", ""); - /* No status message in pipe mode (stdin - stdout) or multi-files mode */ - if (g_display_prefs.displayLevel >= 2) { - if (fCtx->nbFilesTotal <= 1 || g_display_prefs.displayLevel >= 3) { - DISPLAYLEVEL(2, "%-20s: %llu bytes \n", srcFileName, filesize); - } - } + DISPLAY_PROGRESS("\r%79s\r", ""); + if (FIO_shouldDisplayFileSummary(fCtx)) + DISPLAY_SUMMARY("%-20s: %llu bytes \n", srcFileName, filesize); return 0; } /** FIO_decompressDstFile() : - open `dstFileName`, - or path-through if ress.dstFile is already != 0, + open `dstFileName`, or pass-through if writeCtx's file is already != 0, then start decompression process (FIO_decompressFrames()). @return : 0 : OK 1 : operation aborted */ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, - dRess_t ress, FILE* srcFile, - const char* dstFileName, const char* srcFileName) + dRess_t ress, + const char* dstFileName, + const char* srcFileName, + const stat_t* srcFileStat) { int result; - stat_t statbuf; int releaseDstFile = 0; + int transferStat = 0; - if ((ress.dstFile == NULL) && (prefs->testMode==0)) { + if ((AIO_WritePool_getFile(ress.writeCtx) == NULL) && (prefs->testMode == 0)) { + FILE *dstFile; int dstFilePermissions = DEFAULT_FILE_PERMISSIONS; if ( strcmp(srcFileName, stdinmark) /* special case : don't transfer permissions from stdin */ - && UTIL_stat(srcFileName, &statbuf) - && UTIL_isRegularFileStat(&statbuf) ) { - dstFilePermissions = statbuf.st_mode; + && strcmp(dstFileName, stdoutmark) + && UTIL_isRegularFileStat(srcFileStat) ) { + transferStat = 1; + dstFilePermissions = TEMPORARY_FILE_PERMISSIONS; } releaseDstFile = 1; - ress.dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); - if (ress.dstFile==NULL) return 1; + dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); + if (dstFile==NULL) return 1; + AIO_WritePool_setFile(ress.writeCtx, dstFile); /* Must only be added after FIO_openDstFile() succeeds. * Otherwise we may delete the destination file if it already exists, @@ -2558,17 +2564,19 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, addHandler(dstFileName); } - result = FIO_decompressFrames(fCtx, ress, srcFile, prefs, dstFileName, srcFileName); + result = FIO_decompressFrames(fCtx, ress, prefs, dstFileName, srcFileName); if (releaseDstFile) { - FILE* const dstFile = ress.dstFile; clearHandler(); - ress.dstFile = NULL; - if (fclose(dstFile)) { + if (AIO_WritePool_closeFile(ress.writeCtx)) { DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result = 1; } + if (transferStat) { + UTIL_setFileStat(dstFileName, srcFileStat); + } + if ( (result != 0) /* operation failure */ && strcmp(dstFileName, stdoutmark) /* special case : don't remove() stdout */ ) { @@ -2588,18 +2596,34 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, static int FIO_decompressSrcFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, dRess_t ress, const char* dstFileName, const char* srcFileName) { FILE* srcFile; + stat_t srcFileStat; int result; + U64 fileSize = UTIL_FILESIZE_UNKNOWN; if (UTIL_isDirectory(srcFileName)) { DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName); return 1; } - srcFile = FIO_openSrcFile(prefs, srcFileName); + srcFile = FIO_openSrcFile(prefs, srcFileName, &srcFileStat); if (srcFile==NULL) return 1; - ress.srcBufferLoaded = 0; - result = FIO_decompressDstFile(fCtx, prefs, ress, srcFile, dstFileName, srcFileName); + /* Don't use AsyncIO for small files */ + if (strcmp(srcFileName, stdinmark)) /* Stdin doesn't have stats */ + fileSize = UTIL_getFileSizeStat(&srcFileStat); + if(fileSize != UTIL_FILESIZE_UNKNOWN && fileSize < ZSTD_BLOCKSIZE_MAX * 3) { + AIO_ReadPool_setAsync(ress.readCtx, 0); + AIO_WritePool_setAsync(ress.writeCtx, 0); + } else { + AIO_ReadPool_setAsync(ress.readCtx, 1); + AIO_WritePool_setAsync(ress.writeCtx, 1); + } + + AIO_ReadPool_setFile(ress.readCtx, srcFile); + + result = FIO_decompressDstFile(fCtx, prefs, ress, dstFileName, srcFileName, &srcFileStat); + + AIO_ReadPool_setFile(ress.readCtx, NULL); /* Close file */ if (fclose(srcFile)) { @@ -2688,6 +2712,11 @@ FIO_determineDstName(const char* srcFileName, const char* outDirName) size_t srcSuffixLen; const char* const srcSuffix = strrchr(srcFileName, '.'); + + if(!strcmp(srcFileName, stdinmark)) { + return stdoutmark; + } + if (srcSuffix == NULL) { DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%s expected). " @@ -2769,20 +2798,21 @@ FIO_decompressMultipleFilenames(FIO_ctx_t* const fCtx, dRess_t ress = FIO_createDResources(prefs, dictFileName); if (outFileName) { - if (FIO_removeMultiFilesWarning(fCtx, prefs, outFileName, 1 /* displayLevelCutoff */)) { + if (FIO_multiFilesConcatWarning(fCtx, prefs, outFileName, 1 /* displayLevelCutoff */)) { FIO_freeDResources(ress); return 1; } if (!prefs->testMode) { - ress.dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); - if (ress.dstFile == 0) EXM_THROW(19, "cannot open %s", outFileName); + FILE* dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); + if (dstFile == 0) EXM_THROW(19, "cannot open %s", outFileName); + AIO_WritePool_setFile(ress.writeCtx, dstFile); } for (; fCtx->currFileIdx < fCtx->nbFilesTotal; fCtx->currFileIdx++) { status = FIO_decompressSrcFile(fCtx, prefs, ress, outFileName, srcNamesTable[fCtx->currFileIdx]); if (!status) fCtx->nbFilesProcessed++; error |= status; } - if ((!prefs->testMode) && (fclose(ress.dstFile))) + if ((!prefs->testMode) && (AIO_WritePool_closeFile(ress.writeCtx))) EXM_THROW(72, "Write error : %s : cannot properly close output file", strerror(errno)); } else { @@ -2812,8 +2842,11 @@ FIO_decompressMultipleFilenames(FIO_ctx_t* const fCtx, FIO_checkFilenameCollisions(srcNamesTable , (unsigned)fCtx->nbFilesTotal); } - if (fCtx->nbFilesProcessed >= 1 && fCtx->nbFilesTotal > 1 && fCtx->totalBytesOutput != 0) - DISPLAYLEVEL(2, "%d files decompressed : %6zu bytes total \n", fCtx->nbFilesProcessed, fCtx->totalBytesOutput); + if (FIO_shouldDisplayMultipleFileSummary(fCtx)) { + DISPLAY_PROGRESS("\r%79s\r", ""); + DISPLAY_SUMMARY("%d files decompressed : %6llu bytes total \n", + fCtx->nbFilesProcessed, (unsigned long long)fCtx->totalBytesOutput); + } FIO_freeDResources(ress); return error; @@ -2831,7 +2864,9 @@ typedef struct { int numSkippableFrames; int decompUnavailable; int usesCheck; + BYTE checksum[4]; U32 nbFiles; + unsigned dictID; } fileInfo_t; typedef enum { @@ -2839,7 +2874,7 @@ typedef enum { info_frame_error=1, info_not_zstd=2, info_file_error=3, - info_truncated_input=4, + info_truncated_input=4 } InfoError; #define ERROR_IF(c,n,...) { \ @@ -2886,6 +2921,12 @@ FIO_analyzeFrames(fileInfo_t* info, FILE* const srcFile) } ERROR_IF(ZSTD_getFrameHeader(&header, headerBuffer, numBytesRead) != 0, info_frame_error, "Error: could not decode frame header"); + if (info->dictID != 0 && info->dictID != header.dictID) { + DISPLAY("WARNING: File contains multiple frames with different dictionary IDs. Showing dictID 0 instead"); + info->dictID = 0; + } else { + info->dictID = header.dictID; + } info->windowSize = header.windowSize; /* move to the end of the frame header */ { size_t const headerSize = ZSTD_frameHeaderSize(headerBuffer, numBytesRead); @@ -2918,8 +2959,8 @@ FIO_analyzeFrames(fileInfo_t* info, FILE* const srcFile) int const contentChecksumFlag = (frameHeaderDescriptor & (1 << 2)) >> 2; if (contentChecksumFlag) { info->usesCheck = 1; - ERROR_IF(fseek(srcFile, 4, SEEK_CUR) != 0, - info_frame_error, "Error: could not skip past checksum"); + ERROR_IF(fread(info->checksum, 1, 4, srcFile) != 4, + info_frame_error, "Error: could not read checksum"); } } info->numActualFrames++; } @@ -2945,10 +2986,11 @@ static InfoError getFileInfo_fileConfirmed(fileInfo_t* info, const char* inFileName) { InfoError status; - FILE* const srcFile = FIO_openSrcFile(NULL, inFileName); + stat_t srcFileStat; + FILE* const srcFile = FIO_openSrcFile(NULL, inFileName, &srcFileStat); ERROR_IF(srcFile == NULL, info_file_error, "Error: could not open source file %s", inFileName); - info->compressedSize = UTIL_getFileSize(inFileName); + info->compressedSize = UTIL_getFileSizeStat(&srcFileStat); status = FIO_analyzeFrames(info, srcFile); fclose(srcFile); @@ -2973,25 +3015,24 @@ getFileInfo(fileInfo_t* info, const char* srcFileName) static void displayInfo(const char* inFileName, const fileInfo_t* info, int displayLevel) { - unsigned const unit = info->compressedSize < (1 MB) ? (1 KB) : (1 MB); - const char* const unitStr = info->compressedSize < (1 MB) ? "KB" : "MB"; - double const windowSizeUnit = (double)info->windowSize / unit; - double const compressedSizeUnit = (double)info->compressedSize / unit; - double const decompressedSizeUnit = (double)info->decompressedSize / unit; + UTIL_HumanReadableSize_t const window_hrs = UTIL_makeHumanReadableSize(info->windowSize); + UTIL_HumanReadableSize_t const compressed_hrs = UTIL_makeHumanReadableSize(info->compressedSize); + UTIL_HumanReadableSize_t const decompressed_hrs = UTIL_makeHumanReadableSize(info->decompressedSize); double const ratio = (info->compressedSize == 0) ? 0 : ((double)info->decompressedSize)/(double)info->compressedSize; const char* const checkString = (info->usesCheck ? "XXH64" : "None"); if (displayLevel <= 2) { if (!info->decompUnavailable) { - DISPLAYOUT("%6d %5d %7.2f %2s %9.2f %2s %5.3f %5s %s\n", + DISPLAYOUT("%6d %5d %6.*f%4s %8.*f%4s %5.3f %5s %s\n", info->numSkippableFrames + info->numActualFrames, info->numSkippableFrames, - compressedSizeUnit, unitStr, decompressedSizeUnit, unitStr, + compressed_hrs.precision, compressed_hrs.value, compressed_hrs.suffix, + decompressed_hrs.precision, decompressed_hrs.value, decompressed_hrs.suffix, ratio, checkString, inFileName); } else { - DISPLAYOUT("%6d %5d %7.2f %2s %5s %s\n", + DISPLAYOUT("%6d %5d %6.*f%4s %5s %s\n", info->numSkippableFrames + info->numActualFrames, info->numSkippableFrames, - compressedSizeUnit, unitStr, + compressed_hrs.precision, compressed_hrs.value, compressed_hrs.suffix, checkString, inFileName); } } else { @@ -2999,19 +3040,29 @@ displayInfo(const char* inFileName, const fileInfo_t* info, int displayLevel) DISPLAYOUT("# Zstandard Frames: %d\n", info->numActualFrames); if (info->numSkippableFrames) DISPLAYOUT("# Skippable Frames: %d\n", info->numSkippableFrames); - DISPLAYOUT("Window Size: %.2f %2s (%llu B)\n", - windowSizeUnit, unitStr, + DISPLAYOUT("DictID: %u\n", info->dictID); + DISPLAYOUT("Window Size: %.*f%s (%llu B)\n", + window_hrs.precision, window_hrs.value, window_hrs.suffix, (unsigned long long)info->windowSize); - DISPLAYOUT("Compressed Size: %.2f %2s (%llu B)\n", - compressedSizeUnit, unitStr, + DISPLAYOUT("Compressed Size: %.*f%s (%llu B)\n", + compressed_hrs.precision, compressed_hrs.value, compressed_hrs.suffix, (unsigned long long)info->compressedSize); if (!info->decompUnavailable) { - DISPLAYOUT("Decompressed Size: %.2f %2s (%llu B)\n", - decompressedSizeUnit, unitStr, + DISPLAYOUT("Decompressed Size: %.*f%s (%llu B)\n", + decompressed_hrs.precision, decompressed_hrs.value, decompressed_hrs.suffix, (unsigned long long)info->decompressedSize); DISPLAYOUT("Ratio: %.4f\n", ratio); } - DISPLAYOUT("Check: %s\n", checkString); + + if (info->usesCheck && info->numActualFrames == 1) { + DISPLAYOUT("Check: %s %02x%02x%02x%02x\n", checkString, + info->checksum[3], info->checksum[2], + info->checksum[1], info->checksum[0] + ); + } else { + DISPLAYOUT("Check: %s\n", checkString); + } + DISPLAYOUT("\n"); } } @@ -3075,7 +3126,7 @@ int FIO_listMultipleFiles(unsigned numFiles, const char** filenameTable, int dis } } if (numFiles == 0) { - if (!IS_CONSOLE(stdin)) { + if (!UTIL_isConsole(stdin)) { DISPLAYLEVEL(1, "zstd: --list does not support reading from standard input \n"); } DISPLAYLEVEL(1, "No files given \n"); @@ -3095,24 +3146,23 @@ int FIO_listMultipleFiles(unsigned numFiles, const char** filenameTable, int dis error |= FIO_listFile(&total, filenameTable[u], displayLevel); } } if (numFiles > 1 && displayLevel <= 2) { /* display total */ - unsigned const unit = total.compressedSize < (1 MB) ? (1 KB) : (1 MB); - const char* const unitStr = total.compressedSize < (1 MB) ? "KB" : "MB"; - double const compressedSizeUnit = (double)total.compressedSize / unit; - double const decompressedSizeUnit = (double)total.decompressedSize / unit; + UTIL_HumanReadableSize_t const compressed_hrs = UTIL_makeHumanReadableSize(total.compressedSize); + UTIL_HumanReadableSize_t const decompressed_hrs = UTIL_makeHumanReadableSize(total.decompressedSize); double const ratio = (total.compressedSize == 0) ? 0 : ((double)total.decompressedSize)/(double)total.compressedSize; const char* const checkString = (total.usesCheck ? "XXH64" : ""); DISPLAYOUT("----------------------------------------------------------------- \n"); if (total.decompUnavailable) { - DISPLAYOUT("%6d %5d %7.2f %2s %5s %u files\n", + DISPLAYOUT("%6d %5d %6.*f%4s %5s %u files\n", total.numSkippableFrames + total.numActualFrames, total.numSkippableFrames, - compressedSizeUnit, unitStr, + compressed_hrs.precision, compressed_hrs.value, compressed_hrs.suffix, checkString, (unsigned)total.nbFiles); } else { - DISPLAYOUT("%6d %5d %7.2f %2s %9.2f %2s %5.3f %5s %u files\n", + DISPLAYOUT("%6d %5d %6.*f%4s %8.*f%4s %5.3f %5s %u files\n", total.numSkippableFrames + total.numActualFrames, total.numSkippableFrames, - compressedSizeUnit, unitStr, decompressedSizeUnit, unitStr, + compressed_hrs.precision, compressed_hrs.value, compressed_hrs.suffix, + decompressed_hrs.precision, decompressed_hrs.value, decompressed_hrs.suffix, ratio, checkString, (unsigned)total.nbFiles); } } return error; diff --git a/src/dependencies/zstd-1.5.0/programs/fileio.h b/src/dependencies/zstd-1.5.4/programs/fileio.h similarity index 90% rename from src/dependencies/zstd-1.5.0/programs/fileio.h rename to src/dependencies/zstd-1.5.4/programs/fileio.h index 9d97ec8..291d4d4 100644 --- a/src/dependencies/zstd-1.5.0/programs/fileio.h +++ b/src/dependencies/zstd-1.5.4/programs/fileio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -12,6 +12,8 @@ #ifndef FILEIO_H_23981798732 #define FILEIO_H_23981798732 +#include "fileio_types.h" +#include "util.h" /* FileNamesTable */ #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ #include "../lib/zstd.h" /* ZSTD_* */ @@ -53,10 +55,6 @@ extern "C" { /*-************************************* * Types ***************************************/ -typedef enum { FIO_zstdCompression, FIO_gzipCompression, FIO_xzCompression, FIO_lzmaCompression, FIO_lz4Compression } FIO_compressionType_t; - -typedef struct FIO_prefs_s FIO_prefs_t; - FIO_prefs_t* FIO_createPreferences(void); void FIO_freePreferences(FIO_prefs_t* const prefs); @@ -66,9 +64,6 @@ typedef struct FIO_ctx_s FIO_ctx_t; FIO_ctx_t* FIO_createContext(void); void FIO_freeContext(FIO_ctx_t* const fCtx); -typedef struct FIO_display_prefs_s FIO_display_prefs_t; - -typedef enum { FIO_ps_auto, FIO_ps_never, FIO_ps_always } FIO_progressSetting_e; /*-************************************* * Parameters @@ -76,7 +71,7 @@ typedef enum { FIO_ps_auto, FIO_ps_never, FIO_ps_always } FIO_progressSetting_e; /* FIO_prefs_t functions */ void FIO_setCompressionType(FIO_prefs_t* const prefs, FIO_compressionType_t compressionType); void FIO_overwriteMode(FIO_prefs_t* const prefs); -void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, unsigned adapt); +void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, int adapt); void FIO_setAdaptMin(FIO_prefs_t* const prefs, int minCLevel); void FIO_setAdaptMax(FIO_prefs_t* const prefs, int maxCLevel); void FIO_setUseRowMatchFinder(FIO_prefs_t* const prefs, int useRowMatchFinder); @@ -91,8 +86,8 @@ void FIO_setLdmMinMatch(FIO_prefs_t* const prefs, int ldmMinMatch); void FIO_setMemLimit(FIO_prefs_t* const prefs, unsigned memLimit); void FIO_setNbWorkers(FIO_prefs_t* const prefs, int nbWorkers); void FIO_setOverlapLog(FIO_prefs_t* const prefs, int overlapLog); -void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, unsigned flag); -void FIO_setSparseWrite(FIO_prefs_t* const prefs, unsigned sparse); /**< 0: no sparse; 1: disable on stdout; 2: always enabled */ +void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, int flag); +void FIO_setSparseWrite(FIO_prefs_t* const prefs, int sparse); /**< 0: no sparse; 1: disable on stdout; 2: always enabled */ void FIO_setRsyncable(FIO_prefs_t* const prefs, int rsyncable); void FIO_setStreamSrcSize(FIO_prefs_t* const prefs, size_t streamSrcSize); void FIO_setTargetCBlockSize(FIO_prefs_t* const prefs, size_t targetCBlockSize); @@ -100,7 +95,7 @@ void FIO_setSrcSizeHint(FIO_prefs_t* const prefs, size_t srcSizeHint); void FIO_setTestMode(FIO_prefs_t* const prefs, int testMode); void FIO_setLiteralCompressionMode( FIO_prefs_t* const prefs, - ZSTD_literalCompressionMode_e mode); + ZSTD_paramSwitch_e mode); void FIO_setProgressSetting(FIO_progressSetting_e progressSetting); void FIO_setNotificationLevel(int level); @@ -108,6 +103,9 @@ void FIO_setExcludeCompressedFile(FIO_prefs_t* const prefs, int excludeCompresse void FIO_setAllowBlockDevices(FIO_prefs_t* const prefs, int allowBlockDevices); void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); void FIO_setContentSize(FIO_prefs_t* const prefs, int value); +void FIO_displayCompressionParameters(const FIO_prefs_t* prefs); +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value); +void FIO_setPassThroughFlag(FIO_prefs_t* const prefs, int value); /* FIO_ctx_t functions */ void FIO_setNbFilesTotal(FIO_ctx_t* const fCtx, int value); @@ -170,6 +168,9 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles); /* custom crash signal handler */ void FIO_addAbortHandler(void); +char const* FIO_zlibVersion(void); +char const* FIO_lz4Version(void); +char const* FIO_lzmaVersion(void); #if defined (__cplusplus) diff --git a/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.c b/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.c new file mode 100644 index 0000000..fe9cca9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.c @@ -0,0 +1,663 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "platform.h" +#include /* fprintf, open, fdopen, fread, _fileno, stdin, stdout */ +#include /* malloc, free */ +#include +#include /* errno */ + +#if defined (_MSC_VER) +# include +# include +#endif + +#include "fileio_asyncio.h" +#include "fileio_common.h" + +/* ********************************************************************** + * Sparse write + ************************************************************************/ + +/** AIO_fwriteSparse() : +* @return : storedSkips, +* argument for next call to AIO_fwriteSparse() or AIO_fwriteSparseEnd() */ +static unsigned +AIO_fwriteSparse(FILE* file, + const void* buffer, size_t bufferSize, + const FIO_prefs_t* const prefs, + unsigned storedSkips) +{ + const size_t* const bufferT = (const size_t*)buffer; /* Buffer is supposed malloc'ed, hence aligned on size_t */ + size_t bufferSizeT = bufferSize / sizeof(size_t); + const size_t* const bufferTEnd = bufferT + bufferSizeT; + const size_t* ptrT = bufferT; + static const size_t segmentSizeT = (32 KB) / sizeof(size_t); /* check every 32 KB */ + + if (prefs->testMode) return 0; /* do not output anything in test mode */ + + if (!prefs->sparseFileSupport) { /* normal write */ + size_t const sizeCheck = fwrite(buffer, 1, bufferSize, file); + if (sizeCheck != bufferSize) + EXM_THROW(70, "Write error : cannot write block : %s", + strerror(errno)); + return 0; + } + + /* avoid int overflow */ + if (storedSkips > 1 GB) { + if (LONG_SEEK(file, 1 GB, SEEK_CUR) != 0) + EXM_THROW(91, "1 GB skip error (sparse file support)"); + storedSkips -= 1 GB; + } + + while (ptrT < bufferTEnd) { + size_t nb0T; + + /* adjust last segment if < 32 KB */ + size_t seg0SizeT = segmentSizeT; + if (seg0SizeT > bufferSizeT) seg0SizeT = bufferSizeT; + bufferSizeT -= seg0SizeT; + + /* count leading zeroes */ + for (nb0T=0; (nb0T < seg0SizeT) && (ptrT[nb0T] == 0); nb0T++) ; + storedSkips += (unsigned)(nb0T * sizeof(size_t)); + + if (nb0T != seg0SizeT) { /* not all 0s */ + size_t const nbNon0ST = seg0SizeT - nb0T; + /* skip leading zeros */ + if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) + EXM_THROW(92, "Sparse skip error ; try --no-sparse"); + storedSkips = 0; + /* write the rest */ + if (fwrite(ptrT + nb0T, sizeof(size_t), nbNon0ST, file) != nbNon0ST) + EXM_THROW(93, "Write error : cannot write block : %s", + strerror(errno)); + } + ptrT += seg0SizeT; + } + + { static size_t const maskT = sizeof(size_t)-1; + if (bufferSize & maskT) { + /* size not multiple of sizeof(size_t) : implies end of block */ + const char* const restStart = (const char*)bufferTEnd; + const char* restPtr = restStart; + const char* const restEnd = (const char*)buffer + bufferSize; + assert(restEnd > restStart && restEnd < restStart + sizeof(size_t)); + for ( ; (restPtr < restEnd) && (*restPtr == 0); restPtr++) ; + storedSkips += (unsigned) (restPtr - restStart); + if (restPtr != restEnd) { + /* not all remaining bytes are 0 */ + size_t const restSize = (size_t)(restEnd - restPtr); + if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) + EXM_THROW(92, "Sparse skip error ; try --no-sparse"); + if (fwrite(restPtr, 1, restSize, file) != restSize) + EXM_THROW(95, "Write error : cannot write end of decoded block : %s", + strerror(errno)); + storedSkips = 0; + } } } + + return storedSkips; +} + +static void +AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) +{ + if (prefs->testMode) assert(storedSkips == 0); + if (storedSkips>0) { + assert(prefs->sparseFileSupport > 0); /* storedSkips>0 implies sparse support is enabled */ + (void)prefs; /* assert can be disabled, in which case prefs becomes unused */ + if (LONG_SEEK(file, storedSkips-1, SEEK_CUR) != 0) + EXM_THROW(69, "Final skip error (sparse file support)"); + /* last zero must be explicitly written, + * so that skipped ones get implicitly translated as zero by FS */ + { const char lastZeroByte[1] = { 0 }; + if (fwrite(lastZeroByte, 1, 1, file) != 1) + EXM_THROW(69, "Write error : cannot write last zero : %s", strerror(errno)); + } } +} + + +/* ********************************************************************** + * AsyncIO functionality + ************************************************************************/ + +/* AIO_supported: + * Returns 1 if AsyncIO is supported on the system, 0 otherwise. */ +int AIO_supported(void) { +#ifdef ZSTD_MULTITHREAD + return 1; +#else + return 0; +#endif +} + +/* *********************************** + * Generic IoPool implementation + *************************************/ + +static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { + IOJob_t* const job = (IOJob_t*) malloc(sizeof(IOJob_t)); + void* const buffer = malloc(bufferSize); + if(!job || !buffer) + EXM_THROW(101, "Allocation error : not enough memory"); + job->buffer = buffer; + job->bufferSize = bufferSize; + job->usedBufferSize = 0; + job->file = NULL; + job->ctx = ctx; + job->offset = 0; + return job; +} + + +/* AIO_IOPool_createThreadPool: + * Creates a thread pool and a mutex for threaded IO pool. + * Displays warning if asyncio is requested but MT isn't available. */ +static void AIO_IOPool_createThreadPool(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs) { + ctx->threadPool = NULL; + ctx->threadPoolActive = 0; + if(prefs->asyncIO) { + if (ZSTD_pthread_mutex_init(&ctx->ioJobsMutex, NULL)) + EXM_THROW(102,"Failed creating ioJobsMutex mutex"); + /* We want MAX_IO_JOBS-2 queue items because we need to always have 1 free buffer to + * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ + assert(MAX_IO_JOBS >= 2); + ctx->threadPool = POOL_create(1, MAX_IO_JOBS - 2); + ctx->threadPoolActive = 1; + if (!ctx->threadPool) + EXM_THROW(104, "Failed creating I/O thread pool"); + } +} + +/* AIO_IOPool_init: + * Allocates and sets and a new I/O thread pool including its included availableJobs. */ +static void AIO_IOPool_init(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs, POOL_function poolFunction, size_t bufferSize) { + int i; + AIO_IOPool_createThreadPool(ctx, prefs); + ctx->prefs = prefs; + ctx->poolFunction = poolFunction; + ctx->totalIoJobs = ctx->threadPool ? MAX_IO_JOBS : 2; + ctx->availableJobsCount = ctx->totalIoJobs; + for(i=0; i < ctx->availableJobsCount; i++) { + ctx->availableJobs[i] = AIO_IOPool_createIoJob(ctx, bufferSize); + } + ctx->jobBufferSize = bufferSize; + ctx->file = NULL; +} + + +/* AIO_IOPool_threadPoolActive: + * Check if current operation uses thread pool. + * Note that in some cases we have a thread pool initialized but choose not to use it. */ +static int AIO_IOPool_threadPoolActive(IOPoolCtx_t* ctx) { + return ctx->threadPool && ctx->threadPoolActive; +} + + +/* AIO_IOPool_lockJobsMutex: + * Locks the IO jobs mutex if threading is active */ +static void AIO_IOPool_lockJobsMutex(IOPoolCtx_t* ctx) { + if(AIO_IOPool_threadPoolActive(ctx)) + ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); +} + +/* AIO_IOPool_unlockJobsMutex: + * Unlocks the IO jobs mutex if threading is active */ +static void AIO_IOPool_unlockJobsMutex(IOPoolCtx_t* ctx) { + if(AIO_IOPool_threadPoolActive(ctx)) + ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); +} + +/* AIO_IOPool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +static void AIO_IOPool_releaseIoJob(IOJob_t* job) { + IOPoolCtx_t* const ctx = (IOPoolCtx_t *) job->ctx; + AIO_IOPool_lockJobsMutex(ctx); + assert(ctx->availableJobsCount < ctx->totalIoJobs); + ctx->availableJobs[ctx->availableJobsCount++] = job; + AIO_IOPool_unlockJobsMutex(ctx); +} + +/* AIO_IOPool_join: + * Waits for all tasks in the pool to finish executing. */ +static void AIO_IOPool_join(IOPoolCtx_t* ctx) { + if(AIO_IOPool_threadPoolActive(ctx)) + POOL_joinJobs(ctx->threadPool); +} + +/* AIO_IOPool_setThreaded: + * Allows (de)activating threaded mode, to be used when the expected overhead + * of threading costs more than the expected gains. */ +static void AIO_IOPool_setThreaded(IOPoolCtx_t* ctx, int threaded) { + assert(threaded == 0 || threaded == 1); + assert(ctx != NULL); + if(ctx->threadPoolActive != threaded) { + AIO_IOPool_join(ctx); + ctx->threadPoolActive = threaded; + } +} + +/* AIO_IOPool_free: + * Release a previously allocated IO thread pool. Makes sure all tasks are done and released. */ +static void AIO_IOPool_destroy(IOPoolCtx_t* ctx) { + int i; + if(ctx->threadPool) { + /* Make sure we finish all tasks and then free the resources */ + AIO_IOPool_join(ctx); + /* Make sure we are not leaking availableJobs */ + assert(ctx->availableJobsCount == ctx->totalIoJobs); + POOL_free(ctx->threadPool); + ZSTD_pthread_mutex_destroy(&ctx->ioJobsMutex); + } + assert(ctx->file == NULL); + for(i=0; iavailableJobsCount; i++) { + IOJob_t* job = (IOJob_t*) ctx->availableJobs[i]; + free(job->buffer); + free(job); + } +} + +/* AIO_IOPool_acquireJob: + * Returns an available io job to be used for a future io. */ +static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t* ctx) { + IOJob_t *job; + assert(ctx->file != NULL || ctx->prefs->testMode); + AIO_IOPool_lockJobsMutex(ctx); + assert(ctx->availableJobsCount > 0); + job = (IOJob_t*) ctx->availableJobs[--ctx->availableJobsCount]; + AIO_IOPool_unlockJobsMutex(ctx); + job->usedBufferSize = 0; + job->file = ctx->file; + job->offset = 0; + return job; +} + + +/* AIO_IOPool_setFile: + * Sets the destination file for future files in the pool. + * Requires completion of all queued jobs and release of all otherwise acquired jobs. */ +static void AIO_IOPool_setFile(IOPoolCtx_t* ctx, FILE* file) { + assert(ctx!=NULL); + AIO_IOPool_join(ctx); + assert(ctx->availableJobsCount == ctx->totalIoJobs); + ctx->file = file; +} + +static FILE* AIO_IOPool_getFile(const IOPoolCtx_t* ctx) { + return ctx->file; +} + +/* AIO_IOPool_enqueueJob: + * Enqueues an io job for execution. + * The queued job shouldn't be used directly after queueing it. */ +static void AIO_IOPool_enqueueJob(IOJob_t* job) { + IOPoolCtx_t* const ctx = (IOPoolCtx_t *)job->ctx; + if(AIO_IOPool_threadPoolActive(ctx)) + POOL_add(ctx->threadPool, ctx->poolFunction, job); + else + ctx->poolFunction(job); +} + +/* *********************************** + * WritePool implementation + *************************************/ + +/* AIO_WritePool_acquireJob: + * Returns an available write job to be used for a future write. */ +IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t* ctx) { + return AIO_IOPool_acquireJob(&ctx->base); +} + +/* AIO_WritePool_enqueueAndReacquireWriteJob: + * Queues a write job for execution and acquires a new one. + * After execution `job`'s pointed value would change to the newly acquired job. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job) { + AIO_IOPool_enqueueJob(*job); + *job = AIO_IOPool_acquireJob((IOPoolCtx_t *)(*job)->ctx); +} + +/* AIO_WritePool_sparseWriteEnd: + * Ends sparse writes to the current file. + * Blocks on completion of all current write jobs before executing. */ +void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t* ctx) { + assert(ctx != NULL); + AIO_IOPool_join(&ctx->base); + AIO_fwriteSparseEnd(ctx->base.prefs, ctx->base.file, ctx->storedSkips); + ctx->storedSkips = 0; +} + +/* AIO_WritePool_setFile: + * Sets the destination file for future writes in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +void AIO_WritePool_setFile(WritePoolCtx_t* ctx, FILE* file) { + AIO_IOPool_setFile(&ctx->base, file); + assert(ctx->storedSkips == 0); +} + +/* AIO_WritePool_getFile: + * Returns the file the writePool is currently set to write to. */ +FILE* AIO_WritePool_getFile(const WritePoolCtx_t* ctx) { + return AIO_IOPool_getFile(&ctx->base); +} + +/* AIO_WritePool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +void AIO_WritePool_releaseIoJob(IOJob_t* job) { + AIO_IOPool_releaseIoJob(job); +} + +/* AIO_WritePool_closeFile: + * Ends sparse write and closes the writePool's current file and sets the file to NULL. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ +int AIO_WritePool_closeFile(WritePoolCtx_t* ctx) { + FILE* const dstFile = ctx->base.file; + assert(dstFile!=NULL || ctx->base.prefs->testMode!=0); + AIO_WritePool_sparseWriteEnd(ctx); + AIO_IOPool_setFile(&ctx->base, NULL); + return fclose(dstFile); +} + +/* AIO_WritePool_executeWriteJob: + * Executes a write job synchronously. Can be used as a function for a thread pool. */ +static void AIO_WritePool_executeWriteJob(void* opaque){ + IOJob_t* const job = (IOJob_t*) opaque; + WritePoolCtx_t* const ctx = (WritePoolCtx_t*) job->ctx; + ctx->storedSkips = AIO_fwriteSparse(job->file, job->buffer, job->usedBufferSize, ctx->base.prefs, ctx->storedSkips); + AIO_IOPool_releaseIoJob(job); +} + +/* AIO_WritePool_create: + * Allocates and sets and a new write pool including its included jobs. */ +WritePoolCtx_t* AIO_WritePool_create(const FIO_prefs_t* prefs, size_t bufferSize) { + WritePoolCtx_t* const ctx = (WritePoolCtx_t*) malloc(sizeof(WritePoolCtx_t)); + if(!ctx) EXM_THROW(100, "Allocation error : not enough memory"); + AIO_IOPool_init(&ctx->base, prefs, AIO_WritePool_executeWriteJob, bufferSize); + ctx->storedSkips = 0; + return ctx; +} + +/* AIO_WritePool_free: + * Frees and releases a writePool and its resources. Closes destination file if needs to. */ +void AIO_WritePool_free(WritePoolCtx_t* ctx) { + /* Make sure we finish all tasks and then free the resources */ + if(AIO_WritePool_getFile(ctx)) + AIO_WritePool_closeFile(ctx); + AIO_IOPool_destroy(&ctx->base); + assert(ctx->storedSkips==0); + free(ctx); +} + +/* AIO_WritePool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_WritePool_setAsync(WritePoolCtx_t* ctx, int async) { + AIO_IOPool_setThreaded(&ctx->base, async); +} + + +/* *********************************** + * ReadPool implementation + *************************************/ +static void AIO_ReadPool_releaseAllCompletedJobs(ReadPoolCtx_t* ctx) { + int i; + for(i=0; icompletedJobsCount; i++) { + IOJob_t* job = (IOJob_t*) ctx->completedJobs[i]; + AIO_IOPool_releaseIoJob(job); + } + ctx->completedJobsCount = 0; +} + +static void AIO_ReadPool_addJobToCompleted(IOJob_t* job) { + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t *)job->ctx; + AIO_IOPool_lockJobsMutex(&ctx->base); + assert(ctx->completedJobsCount < MAX_IO_JOBS); + ctx->completedJobs[ctx->completedJobsCount++] = job; + if(AIO_IOPool_threadPoolActive(&ctx->base)) { + ZSTD_pthread_cond_signal(&ctx->jobCompletedCond); + } + AIO_IOPool_unlockJobsMutex(&ctx->base); +} + +/* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked: + * Looks through the completed jobs for a job matching the waitingOnOffset and returns it, + * if job wasn't found returns NULL. + * IMPORTANT: assumes ioJobsMutex is locked. */ +static IOJob_t* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ReadPoolCtx_t* ctx) { + IOJob_t *job = NULL; + int i; + /* This implementation goes through all completed jobs and looks for the one matching the next offset. + * While not strictly needed for a single threaded reader implementation (as in such a case we could expect + * reads to be completed in order) this implementation was chosen as it better fits other asyncio + * interfaces (such as io_uring) that do not provide promises regarding order of completion. */ + for (i=0; icompletedJobsCount; i++) { + job = (IOJob_t *) ctx->completedJobs[i]; + if (job->offset == ctx->waitingOnOffset) { + ctx->completedJobs[i] = ctx->completedJobs[--ctx->completedJobsCount]; + return job; + } + } + return NULL; +} + +/* AIO_ReadPool_numReadsInFlight: + * Returns the number of IO read jobs currently in flight. */ +static size_t AIO_ReadPool_numReadsInFlight(ReadPoolCtx_t* ctx) { + const size_t jobsHeld = (ctx->currentJobHeld==NULL ? 0 : 1); + return ctx->base.totalIoJobs - (ctx->base.availableJobsCount + ctx->completedJobsCount + jobsHeld); +} + +/* AIO_ReadPool_getNextCompletedJob: + * Returns a completed IOJob_t for the next read in line based on waitingOnOffset and advances waitingOnOffset. + * Would block. */ +static IOJob_t* AIO_ReadPool_getNextCompletedJob(ReadPoolCtx_t* ctx) { + IOJob_t *job = NULL; + AIO_IOPool_lockJobsMutex(&ctx->base); + + job = AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ctx); + + /* As long as we didn't find the job matching the next read, and we have some reads in flight continue waiting */ + while (!job && (AIO_ReadPool_numReadsInFlight(ctx) > 0)) { + assert(ctx->base.threadPool != NULL); /* we shouldn't be here if we work in sync mode */ + ZSTD_pthread_cond_wait(&ctx->jobCompletedCond, &ctx->base.ioJobsMutex); + job = AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ctx); + } + + if(job) { + assert(job->offset == ctx->waitingOnOffset); + ctx->waitingOnOffset += job->usedBufferSize; + } + + AIO_IOPool_unlockJobsMutex(&ctx->base); + return job; +} + + +/* AIO_ReadPool_executeReadJob: + * Executes a read job synchronously. Can be used as a function for a thread pool. */ +static void AIO_ReadPool_executeReadJob(void* opaque){ + IOJob_t* const job = (IOJob_t*) opaque; + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t *)job->ctx; + if(ctx->reachedEof) { + job->usedBufferSize = 0; + AIO_ReadPool_addJobToCompleted(job); + return; + } + job->usedBufferSize = fread(job->buffer, 1, job->bufferSize, job->file); + if(job->usedBufferSize < job->bufferSize) { + if(ferror(job->file)) { + EXM_THROW(37, "Read error"); + } else if(feof(job->file)) { + ctx->reachedEof = 1; + } else { + EXM_THROW(37, "Unexpected short read"); + } + } + AIO_ReadPool_addJobToCompleted(job); +} + +static void AIO_ReadPool_enqueueRead(ReadPoolCtx_t* ctx) { + IOJob_t* const job = AIO_IOPool_acquireJob(&ctx->base); + job->offset = ctx->nextReadOffset; + ctx->nextReadOffset += job->bufferSize; + AIO_IOPool_enqueueJob(job); +} + +static void AIO_ReadPool_startReading(ReadPoolCtx_t* ctx) { + int i; + for (i = 0; i < ctx->base.availableJobsCount; i++) { + AIO_ReadPool_enqueueRead(ctx); + } +} + +/* AIO_ReadPool_setFile: + * Sets the source file for future read in the pool. Initiates reading immediately if file is not NULL. + * Waits for all current enqueued tasks to complete if a previous file was set. */ +void AIO_ReadPool_setFile(ReadPoolCtx_t* ctx, FILE* file) { + assert(ctx!=NULL); + AIO_IOPool_join(&ctx->base); + AIO_ReadPool_releaseAllCompletedJobs(ctx); + if (ctx->currentJobHeld) { + AIO_IOPool_releaseIoJob((IOJob_t *)ctx->currentJobHeld); + ctx->currentJobHeld = NULL; + } + AIO_IOPool_setFile(&ctx->base, file); + ctx->nextReadOffset = 0; + ctx->waitingOnOffset = 0; + ctx->srcBuffer = ctx->coalesceBuffer; + ctx->srcBufferLoaded = 0; + ctx->reachedEof = 0; + if(file != NULL) + AIO_ReadPool_startReading(ctx); +} + +/* AIO_ReadPool_create: + * Allocates and sets and a new readPool including its included jobs. + * bufferSize should be set to the maximal buffer we want to read at a time, will also be used + * as our basic read size. */ +ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize) { + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t*) malloc(sizeof(ReadPoolCtx_t)); + if(!ctx) EXM_THROW(100, "Allocation error : not enough memory"); + AIO_IOPool_init(&ctx->base, prefs, AIO_ReadPool_executeReadJob, bufferSize); + + ctx->coalesceBuffer = (U8*) malloc(bufferSize * 2); + ctx->srcBuffer = ctx->coalesceBuffer; + ctx->srcBufferLoaded = 0; + ctx->completedJobsCount = 0; + ctx->currentJobHeld = NULL; + + if(ctx->base.threadPool) + if (ZSTD_pthread_cond_init(&ctx->jobCompletedCond, NULL)) + EXM_THROW(103,"Failed creating jobCompletedCond cond"); + + return ctx; +} + +/* AIO_ReadPool_free: + * Frees and releases a readPool and its resources. Closes source file. */ +void AIO_ReadPool_free(ReadPoolCtx_t* ctx) { + if(AIO_ReadPool_getFile(ctx)) + AIO_ReadPool_closeFile(ctx); + if(ctx->base.threadPool) + ZSTD_pthread_cond_destroy(&ctx->jobCompletedCond); + AIO_IOPool_destroy(&ctx->base); + free(ctx->coalesceBuffer); + free(ctx); +} + +/* AIO_ReadPool_consumeBytes: + * Consumes byes from srcBuffer's beginning and updates srcBufferLoaded accordingly. */ +void AIO_ReadPool_consumeBytes(ReadPoolCtx_t* ctx, size_t n) { + assert(n <= ctx->srcBufferLoaded); + ctx->srcBufferLoaded -= n; + ctx->srcBuffer += n; +} + +/* AIO_ReadPool_releaseCurrentlyHeldAndGetNext: + * Release the current held job and get the next one, returns NULL if no next job available. */ +static IOJob_t* AIO_ReadPool_releaseCurrentHeldAndGetNext(ReadPoolCtx_t* ctx) { + if (ctx->currentJobHeld) { + AIO_IOPool_releaseIoJob((IOJob_t *)ctx->currentJobHeld); + ctx->currentJobHeld = NULL; + AIO_ReadPool_enqueueRead(ctx); + } + ctx->currentJobHeld = AIO_ReadPool_getNextCompletedJob(ctx); + return (IOJob_t*) ctx->currentJobHeld; +} + +/* AIO_ReadPool_fillBuffer: + * Tries to fill the buffer with at least n or jobBufferSize bytes (whichever is smaller). + * Returns if srcBuffer has at least the expected number of bytes loaded or if we've reached the end of the file. + * Return value is the number of bytes added to the buffer. + * Note that srcBuffer might have up to 2 times jobBufferSize bytes. */ +size_t AIO_ReadPool_fillBuffer(ReadPoolCtx_t* ctx, size_t n) { + IOJob_t *job; + int useCoalesce = 0; + if(n > ctx->base.jobBufferSize) + n = ctx->base.jobBufferSize; + + /* We are good, don't read anything */ + if (ctx->srcBufferLoaded >= n) + return 0; + + /* We still have bytes loaded, but not enough to satisfy caller. We need to get the next job + * and coalesce the remaining bytes with the next job's buffer */ + if (ctx->srcBufferLoaded > 0) { + useCoalesce = 1; + memcpy(ctx->coalesceBuffer, ctx->srcBuffer, ctx->srcBufferLoaded); + ctx->srcBuffer = ctx->coalesceBuffer; + } + + /* Read the next chunk */ + job = AIO_ReadPool_releaseCurrentHeldAndGetNext(ctx); + if(!job) + return 0; + if(useCoalesce) { + assert(ctx->srcBufferLoaded + job->usedBufferSize <= 2*ctx->base.jobBufferSize); + memcpy(ctx->coalesceBuffer + ctx->srcBufferLoaded, job->buffer, job->usedBufferSize); + ctx->srcBufferLoaded += job->usedBufferSize; + } + else { + ctx->srcBuffer = (U8 *) job->buffer; + ctx->srcBufferLoaded = job->usedBufferSize; + } + return job->usedBufferSize; +} + +/* AIO_ReadPool_consumeAndRefill: + * Consumes the current buffer and refills it with bufferSize bytes. */ +size_t AIO_ReadPool_consumeAndRefill(ReadPoolCtx_t* ctx) { + AIO_ReadPool_consumeBytes(ctx, ctx->srcBufferLoaded); + return AIO_ReadPool_fillBuffer(ctx, ctx->base.jobBufferSize); +} + +/* AIO_ReadPool_getFile: + * Returns the current file set for the read pool. */ +FILE* AIO_ReadPool_getFile(const ReadPoolCtx_t* ctx) { + return AIO_IOPool_getFile(&ctx->base); +} + +/* AIO_ReadPool_closeFile: + * Closes the current set file. Waits for all current enqueued tasks to complete and resets state. */ +int AIO_ReadPool_closeFile(ReadPoolCtx_t* ctx) { + FILE* const file = AIO_ReadPool_getFile(ctx); + AIO_ReadPool_setFile(ctx, NULL); + return fclose(file); +} + +/* AIO_ReadPool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_ReadPool_setAsync(ReadPoolCtx_t* ctx, int async) { + AIO_IOPool_setThreaded(&ctx->base, async); +} diff --git a/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.h b/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.h new file mode 100644 index 0000000..feb25a3 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/fileio_asyncio.h @@ -0,0 +1,203 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + /* + * FileIO AsyncIO exposes read/write IO pools that allow doing IO asynchronously. + * Current implementation relies on having one thread that reads and one that + * writes. + * Each IO pool supports up to `MAX_IO_JOBS` that can be enqueued for work, but + * are performed serially by the appropriate worker thread. + * Most systems exposes better primitives to perform asynchronous IO, such as + * io_uring on newer linux systems. The API is built in such a way that in the + * future we could replace the threads with better solutions when available. + */ + +#ifndef ZSTD_FILEIO_ASYNCIO_H +#define ZSTD_FILEIO_ASYNCIO_H + +#if defined (__cplusplus) +extern "C" { +#endif + +#include "../lib/common/mem.h" /* U32, U64 */ +#include "fileio_types.h" +#include "platform.h" +#include "util.h" +#include "../lib/common/pool.h" +#include "../lib/common/threading.h" + +#define MAX_IO_JOBS (10) + +typedef struct { + /* These struct fields should be set only on creation and not changed afterwards */ + POOL_ctx* threadPool; + int threadPoolActive; + int totalIoJobs; + const FIO_prefs_t* prefs; + POOL_function poolFunction; + + /* Controls the file we currently write to, make changes only by using provided utility functions */ + FILE* file; + + /* The jobs and availableJobsCount fields are accessed by both the main and worker threads and should + * only be mutated after locking the mutex */ + ZSTD_pthread_mutex_t ioJobsMutex; + void* availableJobs[MAX_IO_JOBS]; + int availableJobsCount; + size_t jobBufferSize; +} IOPoolCtx_t; + +typedef struct { + IOPoolCtx_t base; + + /* State regarding the currently read file */ + int reachedEof; + U64 nextReadOffset; + U64 waitingOnOffset; + + /* We may hold an IOJob object as needed if we actively expose its buffer. */ + void *currentJobHeld; + + /* Coalesce buffer is used to join two buffers in case where we need to read more bytes than left in + * the first of them. Shouldn't be accessed from outside ot utility functions. */ + U8 *coalesceBuffer; + + /* Read buffer can be used by consumer code, take care when copying this pointer aside as it might + * change when consuming / refilling buffer. */ + U8 *srcBuffer; + size_t srcBufferLoaded; + + /* We need to know what tasks completed so we can use their buffers when their time comes. + * Should only be accessed after locking base.ioJobsMutex . */ + void* completedJobs[MAX_IO_JOBS]; + int completedJobsCount; + ZSTD_pthread_cond_t jobCompletedCond; +} ReadPoolCtx_t; + +typedef struct { + IOPoolCtx_t base; + unsigned storedSkips; +} WritePoolCtx_t; + +typedef struct { + /* These fields are automatically set and shouldn't be changed by non WritePool code. */ + void *ctx; + FILE* file; + void *buffer; + size_t bufferSize; + + /* This field should be changed before a job is queued for execution and should contain the number + * of bytes to write from the buffer. */ + size_t usedBufferSize; + U64 offset; +} IOJob_t; + +/* AIO_supported: + * Returns 1 if AsyncIO is supported on the system, 0 otherwise. */ +int AIO_supported(void); + + +/* AIO_WritePool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +void AIO_WritePool_releaseIoJob(IOJob_t *job); + +/* AIO_WritePool_acquireJob: + * Returns an available write job to be used for a future write. */ +IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t *ctx); + +/* AIO_WritePool_enqueueAndReacquireWriteJob: + * Enqueues a write job for execution and acquires a new one. + * After execution `job`'s pointed value would change to the newly acquired job. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job); + +/* AIO_WritePool_sparseWriteEnd: + * Ends sparse writes to the current file. + * Blocks on completion of all current write jobs before executing. */ +void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t *ctx); + +/* AIO_WritePool_setFile: + * Sets the destination file for future writes in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +void AIO_WritePool_setFile(WritePoolCtx_t *ctx, FILE* file); + +/* AIO_WritePool_getFile: + * Returns the file the writePool is currently set to write to. */ +FILE* AIO_WritePool_getFile(const WritePoolCtx_t* ctx); + +/* AIO_WritePool_closeFile: + * Ends sparse write and closes the writePool's current file and sets the file to NULL. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ +int AIO_WritePool_closeFile(WritePoolCtx_t *ctx); + +/* AIO_WritePool_create: + * Allocates and sets and a new write pool including its included jobs. + * bufferSize should be set to the maximal buffer we want to write to at a time. */ +WritePoolCtx_t* AIO_WritePool_create(const FIO_prefs_t* prefs, size_t bufferSize); + +/* AIO_WritePool_free: + * Frees and releases a writePool and its resources. Closes destination file. */ +void AIO_WritePool_free(WritePoolCtx_t* ctx); + +/* AIO_WritePool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_WritePool_setAsync(WritePoolCtx_t* ctx, int async); + +/* AIO_ReadPool_create: + * Allocates and sets and a new readPool including its included jobs. + * bufferSize should be set to the maximal buffer we want to read at a time, will also be used + * as our basic read size. */ +ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize); + +/* AIO_ReadPool_free: + * Frees and releases a readPool and its resources. Closes source file. */ +void AIO_ReadPool_free(ReadPoolCtx_t* ctx); + +/* AIO_ReadPool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_ReadPool_setAsync(ReadPoolCtx_t* ctx, int async); + +/* AIO_ReadPool_consumeBytes: + * Consumes byes from srcBuffer's beginning and updates srcBufferLoaded accordingly. */ +void AIO_ReadPool_consumeBytes(ReadPoolCtx_t *ctx, size_t n); + +/* AIO_ReadPool_fillBuffer: + * Makes sure buffer has at least n bytes loaded (as long as n is not bigger than the initialized bufferSize). + * Returns if srcBuffer has at least n bytes loaded or if we've reached the end of the file. + * Return value is the number of bytes added to the buffer. + * Note that srcBuffer might have up to 2 times bufferSize bytes. */ +size_t AIO_ReadPool_fillBuffer(ReadPoolCtx_t *ctx, size_t n); + +/* AIO_ReadPool_consumeAndRefill: + * Consumes the current buffer and refills it with bufferSize bytes. */ +size_t AIO_ReadPool_consumeAndRefill(ReadPoolCtx_t *ctx); + +/* AIO_ReadPool_setFile: + * Sets the source file for future read in the pool. Initiates reading immediately if file is not NULL. + * Waits for all current enqueued tasks to complete if a previous file was set. */ +void AIO_ReadPool_setFile(ReadPoolCtx_t *ctx, FILE* file); + +/* AIO_ReadPool_getFile: + * Returns the current file set for the read pool. */ +FILE* AIO_ReadPool_getFile(const ReadPoolCtx_t *ctx); + +/* AIO_ReadPool_closeFile: + * Closes the current set file. Waits for all current enqueued tasks to complete and resets state. */ +int AIO_ReadPool_closeFile(ReadPoolCtx_t *ctx); + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_FILEIO_ASYNCIO_H */ diff --git a/src/dependencies/zstd-1.5.4/programs/fileio_common.h b/src/dependencies/zstd-1.5.4/programs/fileio_common.h new file mode 100644 index 0000000..55491b8 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/fileio_common.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_FILEIO_COMMON_H +#define ZSTD_FILEIO_COMMON_H + +#if defined (__cplusplus) +extern "C" { +#endif + +#include "../lib/common/mem.h" /* U32, U64 */ +#include "fileio_types.h" +#include "platform.h" +#include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ + +/*-************************************* +* Macros +***************************************/ +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) +#undef MAX +#define MAX(a,b) ((a)>(b) ? (a) : (b)) + +extern FIO_display_prefs_t g_display_prefs; + +#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) +#define DISPLAYOUT(...) fprintf(stdout, __VA_ARGS__) +#define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } + +extern UTIL_time_t g_displayClock; + +#define REFRESH_RATE ((U64)(SEC_TO_MICRO / 6)) +#define READY_FOR_UPDATE() (UTIL_clockSpanMicro(g_displayClock) > REFRESH_RATE || g_display_prefs.displayLevel >= 4) +#define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } +#define DISPLAYUPDATE(l, ...) { \ + if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ + if (READY_FOR_UPDATE()) { \ + DELAY_NEXT_UPDATE(); \ + DISPLAY(__VA_ARGS__); \ + if (g_display_prefs.displayLevel>=4) fflush(stderr); \ + } } } + +#define SHOULD_DISPLAY_SUMMARY() \ + (g_display_prefs.displayLevel >= 2 || g_display_prefs.progressSetting == FIO_ps_always) +#define SHOULD_DISPLAY_PROGRESS() \ + (g_display_prefs.progressSetting != FIO_ps_never && SHOULD_DISPLAY_SUMMARY()) +#define DISPLAY_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYLEVEL(1, __VA_ARGS__); }} +#define DISPLAYUPDATE_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYUPDATE(1, __VA_ARGS__); }} +#define DISPLAY_SUMMARY(...) { if (SHOULD_DISPLAY_SUMMARY()) { DISPLAYLEVEL(1, __VA_ARGS__); } } + +#undef MIN /* in case it would be already defined */ +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +#define EXM_THROW(error, ...) \ +{ \ + DISPLAYLEVEL(1, "zstd: "); \ + DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ + DISPLAYLEVEL(1, "error %i : ", error); \ + DISPLAYLEVEL(1, __VA_ARGS__); \ + DISPLAYLEVEL(1, " \n"); \ + exit(error); \ +} + +#define CHECK_V(v, f) \ + v = f; \ + if (ZSTD_isError(v)) { \ + DISPLAYLEVEL(5, "%s \n", #f); \ + EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ + } +#define CHECK(f) { size_t err; CHECK_V(err, f); } + + +/* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */ +#if defined(_MSC_VER) && _MSC_VER >= 1400 +# define LONG_SEEK _fseeki64 +# define LONG_TELL _ftelli64 +#elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ +# define LONG_SEEK fseeko +# define LONG_TELL ftello +#elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) +# define LONG_SEEK fseeko64 +# define LONG_TELL ftello64 +#elif defined(_WIN32) && !defined(__DJGPP__) +# include + static int LONG_SEEK(FILE* file, __int64 offset, int origin) { + LARGE_INTEGER off; + DWORD method; + off.QuadPart = offset; + if (origin == SEEK_END) + method = FILE_END; + else if (origin == SEEK_CUR) + method = FILE_CURRENT; + else + method = FILE_BEGIN; + + if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) + return 0; + else + return -1; + } + static __int64 LONG_TELL(FILE* file) { + LARGE_INTEGER off, newOff; + off.QuadPart = 0; + newOff.QuadPart = 0; + SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); + return newOff.QuadPart; + } +#else +# define LONG_SEEK fseek +# define LONG_TELL ftell +#endif + +#if defined (__cplusplus) +} +#endif +#endif /* ZSTD_FILEIO_COMMON_H */ diff --git a/src/dependencies/zstd-1.5.4/programs/fileio_types.h b/src/dependencies/zstd-1.5.4/programs/fileio_types.h new file mode 100644 index 0000000..c1f42f1 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/fileio_types.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef FILEIO_TYPES_HEADER +#define FILEIO_TYPES_HEADER + +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +#include "../lib/zstd.h" /* ZSTD_* */ + +/*-************************************* +* Parameters: FIO_prefs_t +***************************************/ + +typedef struct FIO_display_prefs_s FIO_display_prefs_t; + +typedef enum { FIO_ps_auto, FIO_ps_never, FIO_ps_always } FIO_progressSetting_e; + +struct FIO_display_prefs_s { + int displayLevel; /* 0 : no display; 1: errors; 2: + result + interaction + warnings; 3: + progression; 4: + information */ + FIO_progressSetting_e progressSetting; +}; + + +typedef enum { FIO_zstdCompression, FIO_gzipCompression, FIO_xzCompression, FIO_lzmaCompression, FIO_lz4Compression } FIO_compressionType_t; + +typedef struct FIO_prefs_s { + + /* Algorithm preferences */ + FIO_compressionType_t compressionType; + int sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ + int dictIDFlag; + int checksumFlag; + int blockSize; + int overlapLog; + int adaptiveMode; + int useRowMatchFinder; + int rsyncable; + int minAdaptLevel; + int maxAdaptLevel; + int ldmFlag; + int ldmHashLog; + int ldmMinMatch; + int ldmBucketSizeLog; + int ldmHashRateLog; + size_t streamSrcSize; + size_t targetCBlockSize; + int srcSizeHint; + int testMode; + ZSTD_paramSwitch_e literalCompressionMode; + + /* IO preferences */ + int removeSrcFile; + int overwrite; + int asyncIO; + + /* Computation resources preferences */ + unsigned memLimit; + int nbWorkers; + + int excludeCompressedFiles; + int patchFromMode; + int contentSize; + int allowBlockDevices; + int passThrough; +} FIO_prefs_t; + +#endif /* FILEIO_TYPES_HEADER */ diff --git a/src/dependencies/zstd-1.5.0/programs/platform.h b/src/dependencies/zstd-1.5.4/programs/platform.h similarity index 93% rename from src/dependencies/zstd-1.5.0/programs/platform.h rename to src/dependencies/zstd-1.5.4/programs/platform.h index b858e3b..18a3587 100644 --- a/src/dependencies/zstd-1.5.0/programs/platform.h +++ b/src/dependencies/zstd-1.5.4/programs/platform.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -33,7 +33,7 @@ extern "C" { /* ************************************** * Detect 64-bit OS -* http://nadeausoftware.com/articles/2012/02/c_c_tip_how_detect_processor_type_using_compiler_predefined_macros +* https://nadeausoftware.com/articles/2012/02/c_c_tip_how_detect_processor_type_using_compiler_predefined_macros ****************************************/ #if defined __ia64 || defined _M_IA64 /* Intel Itanium */ \ || defined __powerpc64__ || defined __ppc64__ || defined __PPC64__ /* POWER 64-bit */ \ @@ -80,7 +80,7 @@ extern "C" { * note: it's better to use unistd.h's _POSIX_VERSION whenever possible */ # define PLATFORM_POSIX_VERSION 200112L -/* try to determine posix version through official unistd.h's _POSIX_VERSION (http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html). +/* try to determine posix version through official unistd.h's _POSIX_VERSION (https://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html). * note : there is no simple way to know in advance if is present or not on target system, * Posix specification mandates its presence and its content, but target system must respect this spec. * It's necessary to _not_ #include whenever target OS is not unix-like @@ -127,6 +127,10 @@ extern "C" { /*-********************************************* * Detect if isatty() and fileno() are available +* +* Note: Use UTIL_isConsole() for the zstd CLI +* instead, as it allows faking is console for +* testing. ************************************************/ #if (defined(__linux__) && (PLATFORM_POSIX_VERSION > 1)) \ || (PLATFORM_POSIX_VERSION >= 200112L) \ @@ -192,13 +196,13 @@ static __inline int IS_CONSOLE(FILE* stdStream) { #ifndef ZSTD_SETPRIORITY_SUPPORT - /* mandates presence of and support for setpriority() : http://man7.org/linux/man-pages/man2/setpriority.2.html */ + /* mandates presence of and support for setpriority() : https://man7.org/linux/man-pages/man2/setpriority.2.html */ # define ZSTD_SETPRIORITY_SUPPORT (PLATFORM_POSIX_VERSION >= 200112L) #endif #ifndef ZSTD_NANOSLEEP_SUPPORT - /* mandates support of nanosleep() within : http://man7.org/linux/man-pages/man2/nanosleep.2.html */ + /* mandates support of nanosleep() within : https://man7.org/linux/man-pages/man2/nanosleep.2.html */ # if (defined(__linux__) && (PLATFORM_POSIX_VERSION >= 199309L)) \ || (PLATFORM_POSIX_VERSION >= 200112L) # define ZSTD_NANOSLEEP_SUPPORT 1 diff --git a/src/dependencies/zstd-1.5.4/programs/timefn.c b/src/dependencies/zstd-1.5.4/programs/timefn.c new file mode 100644 index 0000000..f941e57 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/timefn.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* === Dependencies === */ + +#include "timefn.h" +#include "platform.h" /* set _POSIX_C_SOURCE */ +#include /* CLOCK_MONOTONIC, TIME_UTC */ + +/*-**************************************** +* Time functions +******************************************/ + +#if defined(_WIN32) /* Windows */ + +#include /* LARGE_INTEGER */ +#include /* abort */ +#include /* perror */ + +UTIL_time_t UTIL_getTime(void) +{ + static LARGE_INTEGER ticksPerSecond; + static int init = 0; + if (!init) { + if (!QueryPerformanceFrequency(&ticksPerSecond)) { + perror("timefn::QueryPerformanceFrequency"); + abort(); + } + init = 1; + } + { UTIL_time_t r; + LARGE_INTEGER x; + QueryPerformanceCounter(&x); + r.t = (PTime)(x.QuadPart * 1000000000ULL / ticksPerSecond.QuadPart); + return r; + } +} + + +#elif defined(__APPLE__) && defined(__MACH__) + +#include /* mach_timebase_info_data_t, mach_timebase_info, mach_absolute_time */ + +UTIL_time_t UTIL_getTime(void) +{ + static mach_timebase_info_data_t rate; + static int init = 0; + if (!init) { + mach_timebase_info(&rate); + init = 1; + } + { UTIL_time_t r; + r.t = mach_absolute_time() * (PTime)rate.numer / (PTime)rate.denom; + return r; + } +} + +/* POSIX.1-2001 (optional) */ +#elif defined(CLOCK_MONOTONIC) + +#include /* abort */ +#include /* perror */ + +UTIL_time_t UTIL_getTime(void) +{ + /* time must be initialized, othersize it may fail msan test. + * No good reason, likely a limitation of timespec_get() for some target */ + struct timespec time = { 0, 0 }; + if (clock_gettime(CLOCK_MONOTONIC, &time) != 0) { + perror("timefn::clock_gettime(CLOCK_MONOTONIC)"); + abort(); + } + { UTIL_time_t r; + r.t = (PTime)time.tv_sec * 1000000000ULL + (PTime)time.tv_nsec; + return r; + } +} + + +/* C11 requires support of timespec_get(). + * However, FreeBSD 11 claims C11 compliance while lacking timespec_get(). + * Double confirm timespec_get() support by checking the definition of TIME_UTC. + * However, some versions of Android manage to simultanously define TIME_UTC + * and lack timespec_get() support... */ +#elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \ + && defined(TIME_UTC) && !defined(__ANDROID__) + +#include /* abort */ +#include /* perror */ + +UTIL_time_t UTIL_getTime(void) +{ + /* time must be initialized, othersize it may fail msan test. + * No good reason, likely a limitation of timespec_get() for some target */ + struct timespec time = { 0, 0 }; + if (timespec_get(&time, TIME_UTC) != TIME_UTC) { + perror("timefn::timespec_get(TIME_UTC)"); + abort(); + } + { UTIL_time_t r; + r.t = (PTime)time.tv_sec * 1000000000ULL + (PTime)time.tv_nsec; + return r; + } +} + + +#else /* relies on standard C90 (note : clock_t produces wrong measurements for multi-threaded workloads) */ + +UTIL_time_t UTIL_getTime(void) +{ + UTIL_time_t r; + r.t = (PTime)clock() * 1000000000ULL / CLOCKS_PER_SEC; + return r; +} + +#define TIME_MT_MEASUREMENTS_NOT_SUPPORTED + +#endif + +/* ==== Common functions, valid for all time API ==== */ + +PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd) +{ + return clockEnd.t - clockStart.t; +} + +PTime UTIL_getSpanTimeMicro(UTIL_time_t begin, UTIL_time_t end) +{ + return UTIL_getSpanTimeNano(begin, end) / 1000ULL; +} + +PTime UTIL_clockSpanMicro(UTIL_time_t clockStart ) +{ + UTIL_time_t const clockEnd = UTIL_getTime(); + return UTIL_getSpanTimeMicro(clockStart, clockEnd); +} + +PTime UTIL_clockSpanNano(UTIL_time_t clockStart ) +{ + UTIL_time_t const clockEnd = UTIL_getTime(); + return UTIL_getSpanTimeNano(clockStart, clockEnd); +} + +void UTIL_waitForNextTick(void) +{ + UTIL_time_t const clockStart = UTIL_getTime(); + UTIL_time_t clockEnd; + do { + clockEnd = UTIL_getTime(); + } while (UTIL_getSpanTimeNano(clockStart, clockEnd) == 0); +} + +int UTIL_support_MT_measurements(void) +{ +# if defined(TIME_MT_MEASUREMENTS_NOT_SUPPORTED) + return 0; +# else + return 1; +# endif +} diff --git a/src/dependencies/zstd-1.5.0/programs/timefn.h b/src/dependencies/zstd-1.5.4/programs/timefn.h similarity index 54% rename from src/dependencies/zstd-1.5.0/programs/timefn.h rename to src/dependencies/zstd-1.5.4/programs/timefn.h index 3fcd78a..b814ff8 100644 --- a/src/dependencies/zstd-1.5.0/programs/timefn.h +++ b/src/dependencies/zstd-1.5.4/programs/timefn.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -16,70 +16,51 @@ extern "C" { #endif -/*-**************************************** -* Dependencies -******************************************/ -#include /* clock_t, clock, CLOCKS_PER_SEC */ - - /*-**************************************** -* Local Types +* Types ******************************************/ #if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # if defined(_AIX) # include # else -# include /* intptr_t */ +# include /* uint64_t */ # endif typedef uint64_t PTime; /* Precise Time */ #else typedef unsigned long long PTime; /* does not support compilers without long long support */ #endif +/* UTIL_time_t contains a nanosecond time counter. + * The absolute value is not meaningful. + * It's only valid to compute the difference between 2 measurements. */ +typedef struct { PTime t; } UTIL_time_t; +#define UTIL_TIME_INITIALIZER { 0 } /*-**************************************** * Time functions ******************************************/ -#if defined(_WIN32) /* Windows */ - - #include /* LARGE_INTEGER */ - typedef LARGE_INTEGER UTIL_time_t; - #define UTIL_TIME_INITIALIZER { { 0, 0 } } - -#elif defined(__APPLE__) && defined(__MACH__) - - #include - typedef PTime UTIL_time_t; - #define UTIL_TIME_INITIALIZER 0 - -/* C11 requires timespec_get, but FreeBSD 11 lacks it, while still claiming C11 compliance. - Android also lacks it but does define TIME_UTC. */ -#elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \ - && defined(TIME_UTC) && !defined(__ANDROID__) - - typedef struct timespec UTIL_time_t; - #define UTIL_TIME_INITIALIZER { 0, 0 } - -#else /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */ - - typedef clock_t UTIL_time_t; - #define UTIL_TIME_INITIALIZER 0 - -#endif - UTIL_time_t UTIL_getTime(void); -PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd); -PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd); -#define SEC_TO_MICRO ((PTime)1000000) -PTime UTIL_clockSpanMicro(UTIL_time_t clockStart); +/* Timer resolution can be low on some platforms. + * To improve accuracy, it's recommended to wait for a new tick + * before starting benchmark measurements */ +void UTIL_waitForNextTick(void); +/* tells if timefn will return correct time measurements + * in presence of multi-threaded workload. + * note : this is not the case if only C90 clock_t measurements are available */ +int UTIL_support_MT_measurements(void); + +PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd); PTime UTIL_clockSpanNano(UTIL_time_t clockStart); -void UTIL_waitForNextTick(void); +PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd); +PTime UTIL_clockSpanMicro(UTIL_time_t clockStart); + +#define SEC_TO_MICRO ((PTime)1000000) /* nb of microseconds in a second */ #if defined (__cplusplus) diff --git a/src/dependencies/zstd-1.5.0/programs/util.c b/src/dependencies/zstd-1.5.4/programs/util.c similarity index 73% rename from src/dependencies/zstd-1.5.0/programs/util.c rename to src/dependencies/zstd-1.5.4/programs/util.c index 8d190c6..e017772 100644 --- a/src/dependencies/zstd-1.5.0/programs/util.c +++ b/src/dependencies/zstd-1.5.4/programs/util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -66,6 +66,27 @@ extern "C" { #define UTIL_DISPLAY(...) fprintf(stderr, __VA_ARGS__) #define UTIL_DISPLAYLEVEL(l, ...) { if (g_utilDisplayLevel>=l) { UTIL_DISPLAY(__VA_ARGS__); } } +static int g_traceDepth = 0; +int g_traceFileStat = 0; + +#define UTIL_TRACE_CALL(...) \ + { \ + if (g_traceFileStat) { \ + UTIL_DISPLAY("Trace:FileStat: %*s> ", g_traceDepth, ""); \ + UTIL_DISPLAY(__VA_ARGS__); \ + UTIL_DISPLAY("\n"); \ + ++g_traceDepth; \ + } \ + } + +#define UTIL_TRACE_RET(ret) \ + { \ + if (g_traceFileStat) { \ + --g_traceDepth; \ + UTIL_DISPLAY("Trace:FileStat: %*s< %d\n", g_traceDepth, "", (ret)); \ + } \ + } + /* A modified version of realloc(). * If UTIL_realloc() fails the original block is freed. */ @@ -100,7 +121,7 @@ int UTIL_requireUserConfirmation(const char* prompt, const char* abortMsg, ch = getchar(); result = 0; if (strchr(acceptableLetters, ch) == NULL) { - UTIL_DISPLAY("%s", abortMsg); + UTIL_DISPLAY("%s \n", abortMsg); result = 1; } /* flush the rest */ @@ -121,21 +142,34 @@ int UTIL_requireUserConfirmation(const char* prompt, const char* abortMsg, * Functions ***************************************/ +void UTIL_traceFileStat(void) +{ + g_traceFileStat = 1; +} + int UTIL_stat(const char* filename, stat_t* statbuf) { + int ret; + UTIL_TRACE_CALL("UTIL_stat(%s)", filename); #if defined(_MSC_VER) - return !_stat64(filename, statbuf); + ret = !_stat64(filename, statbuf); #elif defined(__MINGW32__) && defined (__MSVCRT__) - return !_stati64(filename, statbuf); + ret = !_stati64(filename, statbuf); #else - return !stat(filename, statbuf); + ret = !stat(filename, statbuf); #endif + UTIL_TRACE_RET(ret); + return ret; } int UTIL_isRegularFile(const char* infilename) { stat_t statbuf; - return UTIL_stat(infilename, &statbuf) && UTIL_isRegularFileStat(&statbuf); + int ret; + UTIL_TRACE_CALL("UTIL_isRegularFile(%s)", infilename); + ret = UTIL_stat(infilename, &statbuf) && UTIL_isRegularFileStat(&statbuf); + UTIL_TRACE_RET(ret); + return ret; } int UTIL_isRegularFileStat(const stat_t* statbuf) @@ -151,23 +185,32 @@ int UTIL_isRegularFileStat(const stat_t* statbuf) int UTIL_chmod(char const* filename, const stat_t* statbuf, mode_t permissions) { stat_t localStatBuf; + UTIL_TRACE_CALL("UTIL_chmod(%s, %#4o)", filename, (unsigned)permissions); if (statbuf == NULL) { - if (!UTIL_stat(filename, &localStatBuf)) return 0; + if (!UTIL_stat(filename, &localStatBuf)) { + UTIL_TRACE_RET(0); + return 0; + } statbuf = &localStatBuf; } - if (!UTIL_isRegularFileStat(statbuf)) return 0; /* pretend success, but don't change anything */ - return chmod(filename, permissions); + if (!UTIL_isRegularFileStat(statbuf)) { + UTIL_TRACE_RET(0); + return 0; /* pretend success, but don't change anything */ + } + UTIL_TRACE_CALL("chmod"); + { + int const ret = chmod(filename, permissions); + UTIL_TRACE_RET(ret); + UTIL_TRACE_RET(ret); + return ret; + } } -int UTIL_setFileStat(const char *filename, const stat_t *statbuf) +/* set access and modification times */ +int UTIL_utime(const char* filename, const stat_t *statbuf) { - int res = 0; - - stat_t curStatBuf; - if (!UTIL_stat(filename, &curStatBuf) || !UTIL_isRegularFileStat(&curStatBuf)) - return -1; - - /* set access and modification times */ + int ret; + UTIL_TRACE_CALL("UTIL_utime(%s)", filename); /* We check that st_mtime is a macro here in order to give us confidence * that struct stat has a struct timespec st_mtim member. We need this * check because there are some platforms that claim to be POSIX 2008 @@ -177,40 +220,79 @@ int UTIL_setFileStat(const char *filename, const stat_t *statbuf) /* (atime, mtime) */ struct timespec timebuf[2] = { {0, UTIME_NOW} }; timebuf[1] = statbuf->st_mtim; - res += utimensat(AT_FDCWD, filename, timebuf, 0); + ret = utimensat(AT_FDCWD, filename, timebuf, 0); } #else { struct utimbuf timebuf; timebuf.actime = time(NULL); timebuf.modtime = statbuf->st_mtime; - res += utime(filename, &timebuf); + ret = utime(filename, &timebuf); } #endif + errno = 0; + UTIL_TRACE_RET(ret); + return ret; +} + +int UTIL_setFileStat(const char *filename, const stat_t *statbuf) +{ + int res = 0; + stat_t curStatBuf; + UTIL_TRACE_CALL("UTIL_setFileStat(%s)", filename); + + if (!UTIL_stat(filename, &curStatBuf) || !UTIL_isRegularFileStat(&curStatBuf)) { + UTIL_TRACE_RET(-1); + return -1; + } + + /* set access and modification times */ + res += UTIL_utime(filename, statbuf); + + /* Mimic gzip's behavior: + * + * "Change the group first, then the permissions, then the owner. + * That way, the permissions will be correct on systems that allow + * users to give away files, without introducing a security hole. + * Security depends on permissions not containing the setuid or + * setgid bits." */ #if !defined(_WIN32) - res += chown(filename, statbuf->st_uid, statbuf->st_gid); /* Copy ownership */ + res += chown(filename, -1, statbuf->st_gid); /* Apply group ownership */ #endif - res += UTIL_chmod(filename, &curStatBuf, statbuf->st_mode & 07777); /* Copy file permissions */ + res += UTIL_chmod(filename, &curStatBuf, statbuf->st_mode & 0777); /* Copy file permissions */ + +#if !defined(_WIN32) + res += chown(filename, statbuf->st_uid, -1); /* Apply user ownership */ +#endif errno = 0; + UTIL_TRACE_RET(-res); return -res; /* number of errors is returned */ } int UTIL_isDirectory(const char* infilename) { stat_t statbuf; - return UTIL_stat(infilename, &statbuf) && UTIL_isDirectoryStat(&statbuf); + int ret; + UTIL_TRACE_CALL("UTIL_isDirectory(%s)", infilename); + ret = UTIL_stat(infilename, &statbuf) && UTIL_isDirectoryStat(&statbuf); + UTIL_TRACE_RET(ret); + return ret; } int UTIL_isDirectoryStat(const stat_t* statbuf) { + int ret; + UTIL_TRACE_CALL("UTIL_isDirectoryStat()"); #if defined(_MSC_VER) - return (statbuf->st_mode & _S_IFDIR) != 0; + ret = (statbuf->st_mode & _S_IFDIR) != 0; #else - return S_ISDIR(statbuf->st_mode) != 0; + ret = S_ISDIR(statbuf->st_mode) != 0; #endif + UTIL_TRACE_RET(ret); + return ret; } int UTIL_compareStr(const void *p1, const void *p2) { @@ -219,33 +301,68 @@ int UTIL_compareStr(const void *p1, const void *p2) { int UTIL_isSameFile(const char* fName1, const char* fName2) { + int ret; assert(fName1 != NULL); assert(fName2 != NULL); + UTIL_TRACE_CALL("UTIL_isSameFile(%s, %s)", fName1, fName2); #if defined(_MSC_VER) || defined(_WIN32) /* note : Visual does not support file identification by inode. * inode does not work on Windows, even with a posix layer, like msys2. * The following work-around is limited to detecting exact name repetition only, * aka `filename` is considered different from `subdir/../filename` */ - return !strcmp(fName1, fName2); + ret = !strcmp(fName1, fName2); #else { stat_t file1Stat; stat_t file2Stat; - return UTIL_stat(fName1, &file1Stat) + ret = UTIL_stat(fName1, &file1Stat) && UTIL_stat(fName2, &file2Stat) - && (file1Stat.st_dev == file2Stat.st_dev) - && (file1Stat.st_ino == file2Stat.st_ino); + && UTIL_isSameFileStat(fName1, fName2, &file1Stat, &file2Stat); } #endif + UTIL_TRACE_RET(ret); + return ret; +} + +int UTIL_isSameFileStat( + const char* fName1, const char* fName2, + const stat_t* file1Stat, const stat_t* file2Stat) +{ + int ret; + assert(fName1 != NULL); assert(fName2 != NULL); + UTIL_TRACE_CALL("UTIL_isSameFileStat(%s, %s)", fName1, fName2); +#if defined(_MSC_VER) || defined(_WIN32) + /* note : Visual does not support file identification by inode. + * inode does not work on Windows, even with a posix layer, like msys2. + * The following work-around is limited to detecting exact name repetition only, + * aka `filename` is considered different from `subdir/../filename` */ + (void)file1Stat; + (void)file2Stat; + ret = !strcmp(fName1, fName2); +#else + { + ret = (file1Stat->st_dev == file2Stat->st_dev) + && (file1Stat->st_ino == file2Stat->st_ino); + } +#endif + UTIL_TRACE_RET(ret); + return ret; } /* UTIL_isFIFO : distinguish named pipes */ int UTIL_isFIFO(const char* infilename) { + UTIL_TRACE_CALL("UTIL_isFIFO(%s)", infilename); /* macro guards, as defined in : https://linux.die.net/man/2/lstat */ #if PLATFORM_POSIX_VERSION >= 200112L - stat_t statbuf; - if (UTIL_stat(infilename, &statbuf) && UTIL_isFIFOStat(&statbuf)) return 1; + { + stat_t statbuf; + if (UTIL_stat(infilename, &statbuf) && UTIL_isFIFOStat(&statbuf)) { + UTIL_TRACE_RET(1); + return 1; + } + } #endif (void)infilename; + UTIL_TRACE_RET(0); return 0; } @@ -273,21 +390,69 @@ int UTIL_isBlockDevStat(const stat_t* statbuf) int UTIL_isLink(const char* infilename) { + UTIL_TRACE_CALL("UTIL_isLink(%s)", infilename); /* macro guards, as defined in : https://linux.die.net/man/2/lstat */ #if PLATFORM_POSIX_VERSION >= 200112L - stat_t statbuf; - int const r = lstat(infilename, &statbuf); - if (!r && S_ISLNK(statbuf.st_mode)) return 1; + { + stat_t statbuf; + int const r = lstat(infilename, &statbuf); + if (!r && S_ISLNK(statbuf.st_mode)) { + UTIL_TRACE_RET(1); + return 1; + } + } #endif (void)infilename; + UTIL_TRACE_RET(0); return 0; } +static int g_fakeStdinIsConsole = 0; +static int g_fakeStderrIsConsole = 0; +static int g_fakeStdoutIsConsole = 0; + +int UTIL_isConsole(FILE* file) +{ + int ret; + UTIL_TRACE_CALL("UTIL_isConsole(%d)", fileno(file)); + if (file == stdin && g_fakeStdinIsConsole) + ret = 1; + else if (file == stderr && g_fakeStderrIsConsole) + ret = 1; + else if (file == stdout && g_fakeStdoutIsConsole) + ret = 1; + else + ret = IS_CONSOLE(file); + UTIL_TRACE_RET(ret); + return ret; +} + +void UTIL_fakeStdinIsConsole(void) +{ + g_fakeStdinIsConsole = 1; +} +void UTIL_fakeStdoutIsConsole(void) +{ + g_fakeStdoutIsConsole = 1; +} +void UTIL_fakeStderrIsConsole(void) +{ + g_fakeStderrIsConsole = 1; +} + U64 UTIL_getFileSize(const char* infilename) { stat_t statbuf; - if (!UTIL_stat(infilename, &statbuf)) return UTIL_FILESIZE_UNKNOWN; - return UTIL_getFileSizeStat(&statbuf); + UTIL_TRACE_CALL("UTIL_getFileSize(%s)", infilename); + if (!UTIL_stat(infilename, &statbuf)) { + UTIL_TRACE_RET(-1); + return UTIL_FILESIZE_UNKNOWN; + } + { + U64 const size = UTIL_getFileSizeStat(&statbuf); + UTIL_TRACE_RET((int)size); + return size; + } } U64 UTIL_getFileSizeStat(const stat_t* statbuf) @@ -303,16 +468,77 @@ U64 UTIL_getFileSizeStat(const stat_t* statbuf) return (U64)statbuf->st_size; } +UTIL_HumanReadableSize_t UTIL_makeHumanReadableSize(U64 size) +{ + UTIL_HumanReadableSize_t hrs; + + if (g_utilDisplayLevel > 3) { + /* In verbose mode, do not scale sizes down, except in the case of + * values that exceed the integral precision of a double. */ + if (size >= (1ull << 53)) { + hrs.value = (double)size / (1ull << 20); + hrs.suffix = " MiB"; + /* At worst, a double representation of a maximal size will be + * accurate to better than tens of kilobytes. */ + hrs.precision = 2; + } else { + hrs.value = (double)size; + hrs.suffix = " B"; + hrs.precision = 0; + } + } else { + /* In regular mode, scale sizes down and use suffixes. */ + if (size >= (1ull << 60)) { + hrs.value = (double)size / (1ull << 60); + hrs.suffix = " EiB"; + } else if (size >= (1ull << 50)) { + hrs.value = (double)size / (1ull << 50); + hrs.suffix = " PiB"; + } else if (size >= (1ull << 40)) { + hrs.value = (double)size / (1ull << 40); + hrs.suffix = " TiB"; + } else if (size >= (1ull << 30)) { + hrs.value = (double)size / (1ull << 30); + hrs.suffix = " GiB"; + } else if (size >= (1ull << 20)) { + hrs.value = (double)size / (1ull << 20); + hrs.suffix = " MiB"; + } else if (size >= (1ull << 10)) { + hrs.value = (double)size / (1ull << 10); + hrs.suffix = " KiB"; + } else { + hrs.value = (double)size; + hrs.suffix = " B"; + } + + if (hrs.value >= 100 || (U64)hrs.value == size) { + hrs.precision = 0; + } else if (hrs.value >= 10) { + hrs.precision = 1; + } else if (hrs.value > 1) { + hrs.precision = 2; + } else { + hrs.precision = 3; + } + } + + return hrs; +} U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles) { U64 total = 0; unsigned n; + UTIL_TRACE_CALL("UTIL_getTotalFileSize(%u)", nbFiles); for (n=0; ntableSize; i++) { + if(!strcmp(table->fileNames[i], name)) { + return (int)i; + } + } + return -1; +} + void UTIL_refFilename(FileNamesTable* fnt, const char* filename) { assert(fnt->tableSize < fnt->tableCapacity); @@ -498,7 +734,7 @@ UTIL_mergeFileNamesTable(FileNamesTable* table1, FileNamesTable* table2) for( idx2=0 ; (idx2 < table2->tableSize) && table2->fileNames[idx2] && (pos < newTotalTableSize) ; ++idx2, ++newTableIdx) { size_t const curLen = strlen(table2->fileNames[idx2]); memcpy(buf+pos, table2->fileNames[idx2], curLen); - assert(newTableIdx <= newTable->tableSize); + assert(newTableIdx < newTable->tableSize); newTable->fileNames[newTableIdx] = buf+pos; pos += curLen+1; } } @@ -622,8 +858,11 @@ static int UTIL_prepareFileList(const char *dirName, ptrdiff_t newListSize = (*bufEnd - *bufStart) + LIST_SIZE_INCREASE; assert(newListSize >= 0); *bufStart = (char*)UTIL_realloc(*bufStart, (size_t)newListSize); - *bufEnd = *bufStart + newListSize; - if (*bufStart == NULL) { free(path); closedir(dir); return 0; } + if (*bufStart != NULL) { + *bufEnd = *bufStart + newListSize; + } else { + free(path); closedir(dir); return 0; + } } if (*bufStart + *pos + pathLength < *bufEnd) { memcpy(*bufStart + *pos, path, pathLength + 1); /* with final \0 */ @@ -809,30 +1048,30 @@ static const char * trimPath(const char *pathname) static char* mallocAndJoin2Dir(const char *dir1, const char *dir2) { - const size_t dir1Size = strlen(dir1); - const size_t dir2Size = strlen(dir2); - char *outDirBuffer, *buffer, trailingChar; - assert(dir1 != NULL && dir2 != NULL); - outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2); - CONTROL(outDirBuffer != NULL); + { const size_t dir1Size = strlen(dir1); + const size_t dir2Size = strlen(dir2); + char *outDirBuffer, *buffer; - memcpy(outDirBuffer, dir1, dir1Size); - outDirBuffer[dir1Size] = '\0'; + outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2); + CONTROL(outDirBuffer != NULL); + + memcpy(outDirBuffer, dir1, dir1Size); + outDirBuffer[dir1Size] = '\0'; + + if (dir2[0] == '.') + return outDirBuffer; + + buffer = outDirBuffer + dir1Size; + if (dir1Size > 0 && *(buffer - 1) != PATH_SEP) { + *buffer = PATH_SEP; + buffer++; + } + memcpy(buffer, dir2, dir2Size); + buffer[dir2Size] = '\0'; - if (dir2[0] == '.') return outDirBuffer; - - buffer = outDirBuffer + dir1Size; - trailingChar = *(buffer - 1); - if (trailingChar != PATH_SEP) { - *buffer = PATH_SEP; - buffer++; } - memcpy(buffer, dir2, dir2Size); - buffer[dir2Size] = '\0'; - - return outDirBuffer; } /* this function will return NULL if input srcFileName is not valid name for mirrored output path */ @@ -931,15 +1170,15 @@ makeUniqueMirroredDestDirs(char** srcDirNames, unsigned nbFile, const char* outD char* prevDirName = srcDirNames[i - 1]; char* currDirName = srcDirNames[i]; - /* note: we alwasy compare trimmed path, i.e.: + /* note: we always compare trimmed path, i.e.: * src dir of "./foo" and "/foo" will be both saved into: * "outDirName/foo/" */ if (!firstIsParentOrSameDirOfSecond(trimPath(prevDirName), trimPath(currDirName))) uniqueDirNr++; - /* we need maintain original src dir name instead of trimmed - * dir, so we can retrive the original src dir's mode_t */ + /* we need to maintain original src dir name instead of trimmed + * dir, so we can retrieve the original src dir's mode_t */ uniqueDirNames[uniqueDirNr - 1] = currDirName; } @@ -1048,7 +1287,7 @@ FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFile /*-**************************************** -* count the number of physical cores +* count the number of cores ******************************************/ #if defined(_WIN32) || defined(WIN32) @@ -1057,10 +1296,26 @@ FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFile typedef BOOL(WINAPI* LPFN_GLPI)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD); -int UTIL_countPhysicalCores(void) +DWORD CountSetBits(ULONG_PTR bitMask) { - static int numPhysicalCores = 0; - if (numPhysicalCores != 0) return numPhysicalCores; + DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1; + DWORD bitSetCount = 0; + ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT; + DWORD i; + + for (i = 0; i <= LSHIFT; ++i) + { + bitSetCount += ((bitMask & bitTest)?1:0); + bitTest/=2; + } + + return bitSetCount; +} + +int UTIL_countCores(int logical) +{ + static int numCores = 0; + if (numCores != 0) return numCores; { LPFN_GLPI glpi; BOOL done = FALSE; @@ -1106,7 +1361,10 @@ int UTIL_countPhysicalCores(void) while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) { if (ptr->Relationship == RelationProcessorCore) { - numPhysicalCores++; + if (logical) + numCores += CountSetBits(ptr->ProcessorMask); + else + numCores++; } ptr++; @@ -1115,17 +1373,17 @@ int UTIL_countPhysicalCores(void) free(buffer); - return numPhysicalCores; + return numCores; } failed: /* try to fall back on GetSystemInfo */ { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); - numPhysicalCores = sysinfo.dwNumberOfProcessors; - if (numPhysicalCores == 0) numPhysicalCores = 1; /* just in case */ + numCores = sysinfo.dwNumberOfProcessors; + if (numCores == 0) numCores = 1; /* just in case */ } - return numPhysicalCores; + return numCores; } #elif defined(__APPLE__) @@ -1134,24 +1392,24 @@ failed: /* Use apple-provided syscall * see: man 3 sysctl */ -int UTIL_countPhysicalCores(void) +int UTIL_countCores(int logical) { - static S32 numPhysicalCores = 0; /* apple specifies int32_t */ - if (numPhysicalCores != 0) return numPhysicalCores; + static S32 numCores = 0; /* apple specifies int32_t */ + if (numCores != 0) return numCores; { size_t size = sizeof(S32); - int const ret = sysctlbyname("hw.physicalcpu", &numPhysicalCores, &size, NULL, 0); + int const ret = sysctlbyname(logical ? "hw.logicalcpu" : "hw.physicalcpu", &numCores, &size, NULL, 0); if (ret != 0) { if (errno == ENOENT) { /* entry not present, fall back on 1 */ - numPhysicalCores = 1; + numCores = 1; } else { - perror("zstd: can't get number of physical cpus"); + perror("zstd: can't get number of cpus"); exit(1); } } - return numPhysicalCores; + return numCores; } } @@ -1160,16 +1418,16 @@ int UTIL_countPhysicalCores(void) /* parse /proc/cpuinfo * siblings / cpu cores should give hyperthreading ratio * otherwise fall back on sysconf */ -int UTIL_countPhysicalCores(void) +int UTIL_countCores(int logical) { - static int numPhysicalCores = 0; + static int numCores = 0; - if (numPhysicalCores != 0) return numPhysicalCores; + if (numCores != 0) return numCores; - numPhysicalCores = (int)sysconf(_SC_NPROCESSORS_ONLN); - if (numPhysicalCores == -1) { + numCores = (int)sysconf(_SC_NPROCESSORS_ONLN); + if (numCores == -1) { /* value not queryable, fall back on 1 */ - return numPhysicalCores = 1; + return numCores = 1; } /* try to determine if there's hyperthreading */ @@ -1183,7 +1441,7 @@ int UTIL_countPhysicalCores(void) if (cpuinfo == NULL) { /* fall back on the sysconf value */ - return numPhysicalCores; + return numCores; } /* assume the cpu cores/siblings values will be constant across all @@ -1216,13 +1474,13 @@ int UTIL_countPhysicalCores(void) ratio = siblings / cpu_cores; } - if (ratio && numPhysicalCores > ratio) { - numPhysicalCores = numPhysicalCores / ratio; + if (ratio && numCores > ratio && !logical) { + numCores = numCores / ratio; } failed: fclose(cpuinfo); - return numPhysicalCores; + return numCores; } } @@ -1233,59 +1491,90 @@ failed: /* Use physical core sysctl when available * see: man 4 smp, man 3 sysctl */ -int UTIL_countPhysicalCores(void) +int UTIL_countCores(int logical) { - static int numPhysicalCores = 0; /* freebsd sysctl is native int sized */ - if (numPhysicalCores != 0) return numPhysicalCores; + static int numCores = 0; /* freebsd sysctl is native int sized */ +#if __FreeBSD_version >= 1300008 + static int perCore = 1; +#endif + if (numCores != 0) return numCores; #if __FreeBSD_version >= 1300008 - { size_t size = sizeof(numPhysicalCores); - int ret = sysctlbyname("kern.smp.cores", &numPhysicalCores, &size, NULL, 0); - if (ret == 0) return numPhysicalCores; + { size_t size = sizeof(numCores); + int ret = sysctlbyname("kern.smp.cores", &numCores, &size, NULL, 0); + if (ret == 0) { + if (logical) { + ret = sysctlbyname("kern.smp.threads_per_core", &perCore, &size, NULL, 0); + /* default to physical cores if logical cannot be read */ + if (ret == 0) + numCores *= perCore; + } + + return numCores; + } if (errno != ENOENT) { - perror("zstd: can't get number of physical cpus"); + perror("zstd: can't get number of cpus"); exit(1); } /* sysctl not present, fall through to older sysconf method */ } +#else + /* suppress unused parameter warning */ + (void) logical; #endif - numPhysicalCores = (int)sysconf(_SC_NPROCESSORS_ONLN); - if (numPhysicalCores == -1) { + numCores = (int)sysconf(_SC_NPROCESSORS_ONLN); + if (numCores == -1) { /* value not queryable, fall back on 1 */ - numPhysicalCores = 1; + numCores = 1; } - return numPhysicalCores; + return numCores; } #elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__CYGWIN__) /* Use POSIX sysconf * see: man 3 sysconf */ -int UTIL_countPhysicalCores(void) +int UTIL_countCores(int logical) { - static int numPhysicalCores = 0; + static int numCores = 0; - if (numPhysicalCores != 0) return numPhysicalCores; + /* suppress unused parameter warning */ + (void)logical; - numPhysicalCores = (int)sysconf(_SC_NPROCESSORS_ONLN); - if (numPhysicalCores == -1) { + if (numCores != 0) return numCores; + + numCores = (int)sysconf(_SC_NPROCESSORS_ONLN); + if (numCores == -1) { /* value not queryable, fall back on 1 */ - return numPhysicalCores = 1; + return numCores = 1; } - return numPhysicalCores; + return numCores; } #else -int UTIL_countPhysicalCores(void) +int UTIL_countCores(int logical) { + /* suppress unused parameter warning */ + (void)logical; + /* assume 1 */ return 1; } #endif +int UTIL_countPhysicalCores(void) +{ + return UTIL_countCores(0); +} + +int UTIL_countLogicalCores(void) +{ + return UTIL_countCores(1); +} + #if defined (__cplusplus) } #endif diff --git a/src/dependencies/zstd-1.5.0/programs/util.h b/src/dependencies/zstd-1.5.4/programs/util.h similarity index 85% rename from src/dependencies/zstd-1.5.0/programs/util.h rename to src/dependencies/zstd-1.5.4/programs/util.h index 24cce44..4ec5413 100644 --- a/src/dependencies/zstd-1.5.0/programs/util.h +++ b/src/dependencies/zstd-1.5.4/programs/util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -64,7 +64,7 @@ extern "C" { # define SET_REALTIME_PRIORITY /* disabled */ # endif -#else /* unknown non-unix operating systen */ +#else /* unknown non-unix operating system */ # define UTIL_sleep(s) /* disabled */ # define UTIL_sleepMilli(milli) /* disabled */ # define SET_REALTIME_PRIORITY /* disabled */ @@ -122,6 +122,7 @@ int UTIL_requireUserConfirmation(const char* prompt, const char* abortMsg, const #define STRDUP(s) strdup(s) #endif + /** * Calls platform's equivalent of stat() on filename and writes info to statbuf. * Returns success (1) or failure (0). @@ -135,6 +136,14 @@ int UTIL_stat(const char* filename, stat_t* statbuf); */ int UTIL_setFileStat(const char* filename, const stat_t* statbuf); +/** + * Set atime to now and mtime to the st_mtim in statbuf. + * + * Directly wraps utime() or utimensat(). Returns -1 on error. + * Does not validate filename is valid. + */ +int UTIL_utime(const char* filename, const stat_t *statbuf); + /* * These helpers operate on a pre-populated stat_t, i.e., the result of * calling one of the above functions. @@ -162,14 +171,51 @@ int UTIL_chmod(char const* filename, const stat_t* statbuf, mode_t permissions); int UTIL_isRegularFile(const char* infilename); int UTIL_isDirectory(const char* infilename); int UTIL_isSameFile(const char* file1, const char* file2); +int UTIL_isSameFileStat(const char* file1, const char* file2, const stat_t* file1Stat, const stat_t* file2Stat); int UTIL_isCompressedFile(const char* infilename, const char *extensionList[]); int UTIL_isLink(const char* infilename); int UTIL_isFIFO(const char* infilename); +/** + * Returns with the given file descriptor is a console. + * Allows faking whether stdin/stdout/stderr is a console + * using UTIL_fake*IsConsole(). + */ +int UTIL_isConsole(FILE* file); + +/** + * Pretends that stdin/stdout/stderr is a console for testing. + */ +void UTIL_fakeStdinIsConsole(void); +void UTIL_fakeStdoutIsConsole(void); +void UTIL_fakeStderrIsConsole(void); + +/** + * Emit traces for functions that read, or modify file metadata. + */ +void UTIL_traceFileStat(void); + #define UTIL_FILESIZE_UNKNOWN ((U64)(-1)) U64 UTIL_getFileSize(const char* infilename); U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles); +/** + * Take @size in bytes, + * prepare the components to pretty-print it in a scaled way. + * The components in the returned struct should be passed in + * precision, value, suffix order to a "%.*f%s" format string. + * Output policy is sensible to @g_utilDisplayLevel, + * for verbose mode (@g_utilDisplayLevel >= 4), + * does not scale down. + */ +typedef struct { + double value; + int precision; + const char* suffix; +} UTIL_HumanReadableSize_t; + +UTIL_HumanReadableSize_t UTIL_makeHumanReadableSize(U64 size); + int UTIL_compareStr(const void *p1, const void *p2); const char* UTIL_getFileExtension(const char* infilename); void UTIL_mirrorSourceFilesDirectories(const char** fileNamesTable, unsigned int nbFiles, const char *outDirName); @@ -222,7 +268,6 @@ UTIL_mergeFileNamesTable(FileNamesTable* table1, FileNamesTable* table2); /*! UTIL_expandFNT() : * read names from @fnt, and expand those corresponding to directories * update @fnt, now containing only file names, - * @return : 0 in case of success, 1 if error * note : in case of error, @fnt[0] is NULL */ void UTIL_expandFNT(FileNamesTable** fnt, int followLinks); @@ -243,6 +288,11 @@ UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames); */ FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize); +/*! UTIL_searchFileNamesTable() : + * Searched through entries in FileNamesTable for a specific name. + * @return : index of entry if found or -1 if not found + */ +int UTIL_searchFileNamesTable(FileNamesTable* table, char const* name); /*! UTIL_refFilename() : * Add a reference to read-only name into @fnt table. @@ -275,13 +325,19 @@ void UTIL_refFilename(FileNamesTable* fnt, const char* filename); FileNamesTable* UTIL_createExpandedFNT(const char* const* filenames, size_t nbFilenames, int followLinks); +#if defined(_WIN32) || defined(WIN32) +DWORD CountSetBits(ULONG_PTR bitMask); +#endif /*-**************************************** * System ******************************************/ +int UTIL_countCores(int logical); + int UTIL_countPhysicalCores(void); +int UTIL_countLogicalCores(void); #if defined (__cplusplus) } diff --git a/src/dependencies/zstd-1.5.0/programs/windres/verrsrc.h b/src/dependencies/zstd-1.5.4/programs/windres/verrsrc.h similarity index 91% rename from src/dependencies/zstd-1.5.0/programs/windres/verrsrc.h rename to src/dependencies/zstd-1.5.4/programs/windres/verrsrc.h index c1b60e9..61b1f3d 100644 --- a/src/dependencies/zstd-1.5.0/programs/windres/verrsrc.h +++ b/src/dependencies/zstd-1.5.4/programs/windres/verrsrc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/programs/windres/zstd.rc b/src/dependencies/zstd-1.5.4/programs/windres/zstd.rc similarity index 88% rename from src/dependencies/zstd-1.5.0/programs/windres/zstd.rc rename to src/dependencies/zstd-1.5.4/programs/windres/zstd.rc index f5e4047..a2118c2 100644 --- a/src/dependencies/zstd-1.5.0/programs/windres/zstd.rc +++ b/src/dependencies/zstd-1.5.4/programs/windres/zstd.rc @@ -32,11 +32,11 @@ BEGIN BEGIN BLOCK "040904B0" BEGIN - VALUE "CompanyName", "Yann Collet, Facebook, Inc." + VALUE "CompanyName", "Meta Platforms, Inc." VALUE "FileDescription", "Zstandard - Fast and efficient compression algorithm" VALUE "FileVersion", ZSTD_VERSION_STRING VALUE "InternalName", "zstd.exe" - VALUE "LegalCopyright", "Copyright (c) 2013-present, Yann Collet, Facebook, Inc." + VALUE "LegalCopyright", "Copyright (c) Meta Platforms, Inc. and affiliates." VALUE "OriginalFilename", "zstd.exe" VALUE "ProductName", "Zstandard" VALUE "ProductVersion", ZSTD_VERSION_STRING diff --git a/src/dependencies/zstd-1.5.0/programs/windres/zstd32.res b/src/dependencies/zstd-1.5.4/programs/windres/zstd32.res similarity index 100% rename from src/dependencies/zstd-1.5.0/programs/windres/zstd32.res rename to src/dependencies/zstd-1.5.4/programs/windres/zstd32.res diff --git a/src/dependencies/zstd-1.5.0/programs/windres/zstd64.res b/src/dependencies/zstd-1.5.4/programs/windres/zstd64.res similarity index 100% rename from src/dependencies/zstd-1.5.0/programs/windres/zstd64.res rename to src/dependencies/zstd-1.5.4/programs/windres/zstd64.res diff --git a/src/dependencies/zstd-1.5.0/programs/zstd.1 b/src/dependencies/zstd-1.5.4/programs/zstd.1 similarity index 51% rename from src/dependencies/zstd-1.5.0/programs/zstd.1 rename to src/dependencies/zstd-1.5.4/programs/zstd.1 index 861f938..edc128f 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstd.1 +++ b/src/dependencies/zstd-1.5.4/programs/zstd.1 @@ -1,491 +1,381 @@ -. -.TH "ZSTD" "1" "May 2021" "zstd 1.5.0" "User Commands" -. +.TH "ZSTD" "1" "February 2023" "zstd 1.5.4" "User Commands" .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files -. .SH "SYNOPSIS" -\fBzstd\fR [\fIOPTIONS\fR] [\-|\fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] -. +.TS +allbox; +\fBzstd\fR [\fIOPTIONS\fR] [\- \fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] +.TE .P \fBzstdmt\fR is equivalent to \fBzstd \-T0\fR -. .P \fBunzstd\fR is equivalent to \fBzstd \-d\fR -. .P \fBzstdcat\fR is equivalent to \fBzstd \-dcf\fR -. .SH "DESCRIPTION" -\fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip (1)\fR and \fBxz (1)\fR\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, with fast modes at > 200 MB/s per core, and strong modes nearing lzma compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. -. +\fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip\fR(1) and \fBxz\fR(1)\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, from fast modes at > 200 MB/s per core, to strong modes with excellent compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. .P -\fBzstd\fR command line syntax is generally similar to gzip, but features the following differences : -. -.IP "\(bu" 4 +\fBzstd\fR command line syntax is generally similar to gzip, but features the following differences: +.IP "\[ci]" 4 Source files are preserved by default\. It\'s possible to remove them automatically by using the \fB\-\-rm\fR command\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing a single file, \fBzstd\fR displays progress notifications and result summary by default\. Use \fB\-q\fR to turn them off\. -. -.IP "\(bu" 4 -\fBzstd\fR does not accept input from console, but it properly accepts \fBstdin\fR when it\'s not the console\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fBzstd\fR displays a short help page when command line is an error\. Use \fB\-q\fR to turn it off\. -. +.IP "\[ci]" 4 +\fBzstd\fR does not accept input from console, though it does accept \fBstdin\fR when it\'s not the console\. +.IP "\[ci]" 4 +\fBzstd\fR does not store the input\'s filename or attributes, only its contents\. .IP "" 0 -. .P -\fBzstd\fR compresses or decompresses each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal : it will display an error message and skip the \fIfile\fR\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. -. +\fBzstd\fR processes each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal: it will display an error message and skip the file\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. .P Unless \fB\-\-stdout\fR or \fB\-o\fR is specified, \fIfiles\fR are written to a new file whose name is derived from the source \fIfile\fR name: -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing, the suffix \fB\.zst\fR is appended to the source filename to get the target filename\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When decompressing, the \fB\.zst\fR suffix is removed from the source filename to get the target filename -. .IP "" 0 -. -.SS "Concatenation with \.zst files" -It is possible to concatenate \fB\.zst\fR files as is\. \fBzstd\fR will decompress such files as if they were a single \fB\.zst\fR file\. -. +.SS "Concatenation with \.zst Files" +It is possible to concatenate multiple \fB\.zst\fR files\. \fBzstd\fR will decompress such agglomerated file as if it was a single \fB\.zst\fR file\. .SH "OPTIONS" -. -.SS "Integer suffixes and special values" +.SS "Integer Suffixes and Special Values" In most places where an integer argument is expected, an optional suffix is supported to easily indicate large integers\. There must be no space between the integer and the suffix\. -. .TP \fBKiB\fR -Multiply the integer by 1,024 (2^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. -. +Multiply the integer by 1,024 (2\e^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. .TP \fBMiB\fR -Multiply the integer by 1,048,576 (2^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. -. -.SS "Operation mode" +Multiply the integer by 1,048,576 (2\e^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. +.SS "Operation Mode" If multiple operation mode options are given, the last one takes effect\. -. .TP \fB\-z\fR, \fB\-\-compress\fR Compress\. This is the default operation mode when no operation mode option is specified and no other operation mode is implied from the command name (for example, \fBunzstd\fR implies \fB\-\-decompress\fR)\. -. .TP \fB\-d\fR, \fB\-\-decompress\fR, \fB\-\-uncompress\fR Decompress\. -. .TP \fB\-t\fR, \fB\-\-test\fR -Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout\fR except that the decompressed data is discarded instead of being written to standard output\. No files are created or removed\. -. +Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout > /dev/null\fR, decompressed data is discarded and checksummed for errors\. No files are created or removed\. .TP \fB\-b#\fR -Benchmark file(s) using compression level # -. +Benchmark file(s) using compression level \fI#\fR\. See \fIBENCHMARK\fR below for a description of this operation\. .TP -\fB\-\-train FILEs\fR -Use FILEs as a training set to create a dictionary\. The training set should contain a lot of small files (> 100)\. -. +\fB\-\-train FILES\fR +Use \fIFILES\fR as a training set to create a dictionary\. The training set should contain a lot of small files (> 100)\. See \fIDICTIONARY BUILDER\fR below for a description of this operation\. .TP \fB\-l\fR, \fB\-\-list\fR -Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command can be augmented with the \fB\-v\fR modifier\. -. -.SS "Operation modifiers" -. -.IP "\(bu" 4 -\fB\-#\fR: \fB#\fR compression level [1\-19] (default: 3) -. -.IP "\(bu" 4 +Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command\'s output can be augmented with the \fB\-v\fR modifier\. +.SS "Operation Modifiers" +.IP "\[ci]" 4 +\fB\-#\fR: selects \fB#\fR compression level [1\-19] (default: 3) +.IP "\[ci]" 4 \fB\-\-ultra\fR: unlocks high compression levels 20+ (maximum 22), using a lot more memory\. Note that decompression will also require more memory when using these levels\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-fast[=#]\fR: switch to ultra\-fast compression levels\. If \fB=#\fR is not present, it defaults to \fB1\fR\. The higher the value, the faster the compression speed, at the cost of some compression ratio\. This setting overwrites compression level if one was set previously\. Similarly, if a compression level is set after \fB\-\-fast\fR, it overrides it\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-T#\fR, \fB\-\-threads=#\fR: Compress using \fB#\fR working threads (default: 1)\. If \fB#\fR is 0, attempt to detect and use the number of physical CPU cores\. In all cases, the nb of threads is capped to \fBZSTDMT_NBWORKERS_MAX\fR, which is either 64 in 32\-bit mode, or 256 for 64\-bit environments\. This modifier does nothing if \fBzstd\fR is compiled without multithread support\. -. -.IP "\(bu" 4 -\fB\-\-single\-thread\fR: Does not spawn a thread for compression, use a single thread for both I/O and compression\. In this mode, compression is serialized with I/O, which is slightly slower\. (This is different from \fB\-T1\fR, which spawns 1 compression thread in parallel of I/O)\. This mode is the only one available when multithread support is disabled\. Single\-thread mode features lower memory usage\. Final compressed result is slightly different from \fB\-T1\fR\. -. -.IP "\(bu" 4 -\fB\-\-adapt[=min=#,max=#]\fR : \fBzstd\fR will dynamically adapt compression level to perceived I/O conditions\. Compression level adaptation can be observed live by using command \fB\-v\fR\. Adaptation can be constrained between supplied \fBmin\fR and \fBmax\fR levels\. The feature works when combined with multi\-threading and \fB\-\-long\fR mode\. It does not work with \fB\-\-single\-thread\fR\. It sets window size to 8 MB by default (can be changed manually, see \fBwlog\fR)\. Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible\. \fInote\fR : at the time of this writing, \fB\-\-adapt\fR can remain stuck at low speed when combined with multiple worker threads (>=2)\. -. -.IP "\(bu" 4 -\fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if not \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. -. +.IP "\[ci]" 4 +\fB\-\-single\-thread\fR: Use a single thread for both I/O and compression\. As compression is serialized with I/O, this can be slightly slower\. Single\-thread mode features significantly lower memory usage, which can be useful for systems with limited amount of memory, such as 32\-bit systems\. +.IP +Note 1: this mode is the only available one when multithread support is disabled\. +.IP +Note 2: this mode is different from \fB\-T1\fR, which spawns 1 compression thread in parallel with I/O\. Final compressed result is also slightly different from \fB\-T1\fR\. +.IP "\[ci]" 4 +\fB\-\-auto\-threads={physical,logical} (default: physical)\fR: When using a default amount of threads via \fB\-T0\fR, choose the default based on the number of detected physical or logical cores\. +.IP "\[ci]" 4 +\fB\-\-adapt[=min=#,max=#]\fR: \fBzstd\fR will dynamically adapt compression level to perceived I/O conditions\. Compression level adaptation can be observed live by using command \fB\-v\fR\. Adaptation can be constrained between supplied \fBmin\fR and \fBmax\fR levels\. The feature works when combined with multi\-threading and \fB\-\-long\fR mode\. It does not work with \fB\-\-single\-thread\fR\. It sets window size to 8 MiB by default (can be changed manually, see \fBwlog\fR)\. Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible\. +.IP +\fINote\fR: at the time of this writing, \fB\-\-adapt\fR can remain stuck at low speed when combined with multiple worker threads (>=2)\. +.IP "\[ci]" 4 +\fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-D DICT\fR: use \fBDICT\fR as Dictionary to compress or decompress FILE(s) -. -.IP "\(bu" 4 -\fB\-\-patch\-from FILE\fR: Specify the file to be used as a reference point for zstd\'s diff engine\. This is effectively dictionary compression with some convenient parameter selection, namely that windowSize > srcSize\. -. +.IP "\[ci]" 4 +\fB\-\-patch\-from FILE\fR: Specify the file to be used as a reference point for zstd\'s diff engine\. This is effectively dictionary compression with some convenient parameter selection, namely that \fIwindowSize\fR > \fIsrcSize\fR\. .IP -Note: cannot use both this and \-D together Note: \fB\-\-long\fR mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file)\. You can also manually force it\. Node: for all levels, you can use \-\-patch\-from in \-\-single\-thread mode to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e 4096), and by setting a large \fB\-\-zstd=chainLog=\fR -. -.IP "\(bu" 4 -\fB\-\-rsyncable\fR : \fBzstd\fR will periodically synchronize the compression state to make the compressed file more rsync\-friendly\. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit\. This feature does not work with \fB\-\-single\-thread\fR\. You probably don\'t want to use it with long range mode, since it will decrease the effectiveness of the synchronization points, but your milage may vary\. -. -.IP "\(bu" 4 +Note: cannot use both this and \fB\-D\fR together\. +.IP +Note: \fB\-\-long\fR mode will be automatically activated if \fIchainLog\fR < \fIfileLog\fR (\fIfileLog\fR being the \fIwindowLog\fR required to cover the whole file)\. You can also manually force it\. +.IP +Note: for all levels, you can use \fB\-\-patch\-from\fR in \fB\-\-single\-thread\fR mode to improve compression ratio at the cost of speed\. +.IP +Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e\. 4096), and by setting a large \fB\-\-zstd=chainLog=\fR\. +.IP "\[ci]" 4 +\fB\-\-rsyncable\fR: \fBzstd\fR will periodically synchronize the compression state to make the compressed file more rsync\-friendly\. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit\. This feature does not work with \fB\-\-single\-thread\fR\. You probably don\'t want to use it with long range mode, since it will decrease the effectiveness of the synchronization points, but your mileage may vary\. +.IP "\[ci]" 4 \fB\-C\fR, \fB\-\-[no\-]check\fR: add integrity check computed from uncompressed data (default: enabled) -. -.IP "\(bu" 4 -\fB\-\-[no\-]content\-size\fR: enable / disable whether or not the original size of the file is placed in the header of the compressed file\. The default option is \-\-content\-size (meaning that the original size will be placed in the header)\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-\-[no\-]content\-size\fR: enable / disable whether or not the original size of the file is placed in the header of the compressed file\. The default option is \fB\-\-content\-size\fR (meaning that the original size will be placed in the header)\. +.IP "\[ci]" 4 \fB\-\-no\-dictID\fR: do not store dictionary ID within frame header (dictionary compression)\. The decoder will have to rely on implicit knowledge about which dictionary to use, it won\'t be able to check if it\'s correct\. -. -.IP "\(bu" 4 -\fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, Zstandard uses 128 MB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (ie\. you can increase or decrease it)\. -. +.IP "\[ci]" 4 +\fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, \fBzstd\fR uses 128 MiB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (i\.e\. you can increase or decrease it)\. .IP -This is also used during compression when using with \-\-patch\-from=\. In this case, this parameter overrides that maximum size allowed for a dictionary\. (128 MB)\. -. -.IP "\(bu" 4 -\fB\-\-stream\-size=#\fR : Sets the pledged source size of input coming from a stream\. This value must be exact, as it will be included in the produced frame header\. Incorrect stream sizes will cause an error\. This information will be used to better optimize compression parameters, resulting in better and potentially faster compression, especially for smaller source sizes\. -. -.IP "\(bu" 4 +This is also used during compression when using with \fB\-\-patch\-from=\fR\. In this case, this parameter overrides that maximum size allowed for a dictionary\. (128 MiB)\. +.IP +Additionally, this can be used to limit memory for dictionary training\. This parameter overrides the default limit of 2 GiB\. zstd will load training samples up to the memory limit and ignore the rest\. +.IP "\[ci]" 4 +\fB\-\-stream\-size=#\fR: Sets the pledged source size of input coming from a stream\. This value must be exact, as it will be included in the produced frame header\. Incorrect stream sizes will cause an error\. This information will be used to better optimize compression parameters, resulting in better and potentially faster compression, especially for smaller source sizes\. +.IP "\[ci]" 4 \fB\-\-size\-hint=#\fR: When handling input from a stream, \fBzstd\fR must guess how large the source size will be when optimizing compression parameters\. If the stream size is relatively small, this guess may be a poor one, resulting in a higher compression ratio than expected\. This feature allows for controlling the guess when needed\. Exact guesses result in better compression ratios\. Overestimates result in slightly degraded compression ratios, while underestimates may result in significant degradation\. -. -.IP "\(bu" 4 -\fB\-o FILE\fR: save result into \fBFILE\fR -. -.IP "\(bu" 4 -\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. -. -.IP "\(bu" 4 -\fB\-c\fR, \fB\-\-stdout\fR: force write to standard output, even if it is the console -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-o FILE\fR: save result into \fBFILE\fR\. +.IP "\[ci]" 4 +\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. During decompression and when the output destination is stdout, pass\-through unrecognized formats as\-is\. +.IP "\[ci]" 4 +\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. +.IP "\[ci]" 4 \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. -. -.IP "\(bu" 4 -\fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. If used in combination with \-o, will trigger a confirmation prompt (which can be silenced with \-f), as this is a destructive operation\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-\-[no\-]pass\-through\fR enable / disable passing through uncompressed files as\-is\. During decompression when pass\-through is enabled, unrecognized formats will be copied as\-is from the input to the output\. By default, pass\-through will occur when the output destination is stdout and the force (\fB\-f\fR) option is set\. +.IP "\[ci]" 4 +\fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. This command is silently ignored if output is \fBstdout\fR\. If used in combination with \fB\-o\fR, triggers a confirmation prompt (which can be silenced with \fB\-f\fR), as this is a destructive operation\. +.IP "\[ci]" 4 \fB\-k\fR, \fB\-\-keep\fR: keep source file(s) after successful compression or decompression\. This is the default behavior\. -. -.IP "\(bu" 4 -\fB\-r\fR: operate recursively on directories -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-r\fR: operate recursively on directories\. It selects all files in the named directory and all its subdirectories\. This can be useful both to reduce command line typing, and to circumvent shell expansion limitations, when there are a lot of files and naming breaks the maximum size of a command line\. +.IP "\[ci]" 4 \fB\-\-filelist FILE\fR read a list of files to process as content from \fBFILE\fR\. Format is compatible with \fBls\fR output, with one file per line\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-flat DIR\fR: resulting files are stored into target \fBDIR\fR directory, instead of same directory as origin file\. Be aware that this command can introduce name collision issues, if multiple files, from different directories, end up having the same name\. Collision resolution ensures first file with a given name will be present in \fBDIR\fR, while in combination with \fB\-f\fR, the last file will be present instead\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-mirror DIR\fR: similar to \fB\-\-output\-dir\-flat\fR, the output files are stored underneath target \fBDIR\fR directory, but this option will replicate input directory hierarchy into output \fBDIR\fR\. -. .IP If input directory contains "\.\.", the files in this directory will be ignored\. If input directory is an absolute directory (i\.e\. "/var/tmp/abc"), it will be stored into the "output\-dir/var/tmp/abc"\. If there are multiple input files or directories, name collision resolution will follow the same rules as \fB\-\-output\-dir\-flat\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-format=FORMAT\fR: compress and decompress in other formats\. If compiled with support, zstd can compress to or decompress from other compression algorithm formats\. Possibly available options are \fBzstd\fR, \fBgzip\fR, \fBxz\fR, \fBlzma\fR, and \fBlz4\fR\. If no such format is provided, \fBzstd\fR is the default\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-h\fR/\fB\-H\fR, \fB\-\-help\fR: display help/long help and exit -. -.IP "\(bu" 4 -\fB\-V\fR, \fB\-\-version\fR: display version number and exit\. Advanced : \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. \fB\-q\fR will only display the version number, suitable for machine reading\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-V\fR, \fB\-\-version\fR: display version number and exit\. Advanced: \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. \fB\-q\fR will only display the version number, suitable for machine reading\. +.IP "\[ci]" 4 \fB\-v\fR, \fB\-\-verbose\fR: verbose mode, display more information -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-q\fR, \fB\-\-quiet\fR: suppress warnings, interactivity, and notifications\. specify twice to suppress errors too\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-no\-progress\fR: do not display the progress bar, but keep all other messages\. -. -.IP "\(bu" 4 -\fB\-\-show\-default\-cparams\fR: Shows the default compression parameters that will be used for a particular src file\. If the provided src file is not a regular file (eg\. named pipe), the cli will just output the default parameters\. That is, the parameters that are used when the src size is unknown\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-\-show\-default\-cparams\fR: shows the default compression parameters that will be used for a particular input file, based on the provided compression level and the input size\. If the provided file is not a regular file (e\.g\. a pipe), this flag will output the parameters used for inputs of unknown size\. +.IP "\[ci]" 4 \fB\-\-\fR: All arguments after \fB\-\-\fR are treated as files -. .IP "" 0 -. -.SS "Restricted usage of Environment Variables" -Using environment variables to set parameters has security implications\. Therefore, this avenue is intentionally restricted\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. -. +.SS "gzip Operation Modifiers" +When invoked via a \fBgzip\fR symlink, \fBzstd\fR will support further options that intend to mimic the \fBgzip\fR behavior: +.TP +\fB\-n\fR, \fB\-\-no\-name\fR +do not store the original filename and timestamps when compressing a file\. This is the default behavior and hence a no\-op\. +.TP +\fB\-\-best\fR +alias to the option \fB\-9\fR\. +.SS "Environment Variables" +Employing environment variables to set parameters has security implications\. Therefore, this avenue is intentionally limited\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. .P \fBZSTD_CLEVEL\fR can be used to set the level between 1 and 19 (the "normal" range)\. If the value of \fBZSTD_CLEVEL\fR is not a valid integer, it will be ignored with a warning message\. \fBZSTD_CLEVEL\fR just replaces the default compression level (\fB3\fR)\. -. .P \fBZSTD_NBTHREADS\fR can be used to set the number of threads \fBzstd\fR will attempt to use during compression\. If the value of \fBZSTD_NBTHREADS\fR is not a valid unsigned integer, it will be ignored with a warning message\. \fBZSTD_NBTHREADS\fR has a default value of (\fB1\fR), and is capped at ZSTDMT_NBWORKERS_MAX==200\. \fBzstd\fR must be compiled with multithread support for this to have any effect\. -. .P They can both be overridden by corresponding command line arguments: \fB\-#\fR for compression level and \fB\-T#\fR for number of compression threads\. -. .SH "DICTIONARY BUILDER" -\fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. -. +\fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then, during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. .TP \fB\-\-train FILEs\fR -Use FILEs as training set to create a dictionary\. The training set should contain a lot of small files (> 100), and weight typically 100x the target dictionary size (for example, 10 MB for a 100 KB dictionary)\. -. +Use FILEs as training set to create a dictionary\. The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size (for example, ~10 MB for a 100 KB dictionary)\. \fB\-\-train\fR can be combined with \fB\-r\fR to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits\. .IP -Supports multithreading if \fBzstd\fR is compiled with threading support\. Additional parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. -. +Since dictionary compression is mostly effective for small files, the expectation is that the training set will only contain small files\. In the case where some samples happen to be large, only the first 128 KiB of these samples will be used for training\. +.IP +\fB\-\-train\fR supports multithreading if \fBzstd\fR is compiled with threading support (default)\. Additional advanced parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The slower cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Default \fB\-\-train\fR is equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. .TP -\fB\-o file\fR -Dictionary saved into \fBfile\fR (default name: dictionary)\. -. +\fB\-o FILE\fR +Dictionary saved into \fBFILE\fR (default name: dictionary)\. .TP \fB\-\-maxdict=#\fR -Limit dictionary to specified size (default: 112640)\. -. +Limit dictionary to specified size (default: 112640 bytes)\. As usual, quantities are expressed in bytes by default, and it\'s possible to employ suffixes (like \fBKB\fR or \fBMB\fR) to specify larger values\. .TP \fB\-#\fR Use \fB#\fR compression level during training (optional)\. Will generate statistics more tuned for selected compression level, resulting in a \fIsmall\fR compression ratio improvement for this level\. -. .TP \fB\-B#\fR -Split input files in blocks of size # (default: no split) -. +Split input files into blocks of size # (default: no split) +.TP +\fB\-M#\fR, \fB\-\-memory=#\fR +Limit the amount of sample data loaded for training (default: 2 GB)\. Note that the default (2 GB) is also the maximum\. This parameter can be useful in situations where the training set size is not well controlled and could be potentially very large\. Since speed of the training process is directly correlated to the size of the training sample set, a smaller sample set leads to faster training\. +.IP +In situations where the training set is larger than maximum memory, the CLI will randomly select samples among the available ones, up to the maximum allowed memory budget\. This is meant to improve dictionary relevance by mitigating the potential impact of clustering, such as selecting only files from the beginning of a list sorted by modification date, or sorted by alphabetical order\. The randomization process is deterministic, so training of the same list of files with the same parameters will lead to the creation of the same dictionary\. .TP \fB\-\-dictID=#\fR -A dictionary ID is a locally unique ID that a decoder can use to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to give a precise number instead\. Short numbers have an advantage : an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. However, it\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. -. +A dictionary ID is a locally unique ID\. The decoder will use this value to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to provide an explicit number ID instead\. It\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. Note that short numbers have an advantage: an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. +.IP +Note that RFC8878 reserves IDs less than 32768 and greater than or equal to 2\e^31, so they should not be used in public\. .TP \fB\-\-train\-cover[=k#,d=#,steps=#,split=#,shrink[=#]]\fR Select parameters for the default dictionary builder algorithm named cover\. If \fId\fR is not specified, then it tries \fId\fR = 6 and \fId\fR = 8\. If \fIk\fR is not specified, then it tries \fIsteps\fR values in the range [50, 2000]\. If \fIsteps\fR is not specified, then the default value of 40 is used\. If \fIsplit\fR is not specified or split <= 0, then the default value of 100 is used\. Requires that \fId\fR <= \fIk\fR\. If \fIshrink\fR flag is not used, then the default value for \fIshrinkDict\fR of 0 is used\. If \fIshrink\fR is not specified, then the default value for \fIshrinkDictMaxRegression\fR of 1 is used\. -. .IP Selects segments of size \fIk\fR with highest score to put in the dictionary\. The score of a segment is computed by the sum of the frequencies of all the subsegments of size \fId\fR\. Generally \fId\fR should be in the range [6, 8], occasionally up to 16, but the algorithm will run faster with d <= \fI8\fR\. Good values for \fIk\fR vary widely based on the input data, but a safe range is [2 * \fId\fR, 2000]\. If \fIsplit\fR is 100, all input samples are used for both training and testing to find optimal \fId\fR and \fIk\fR to build dictionary\. Supports multithreading if \fBzstd\fR is compiled with threading support\. Having \fIshrink\fR enabled takes a truncated dictionary of minimum size and doubles in size until compression ratio of the truncated dictionary is at most \fIshrinkDictMaxRegression%\fR worse than the compression ratio of the largest dictionary\. -. .IP Examples: -. .IP \fBzstd \-\-train\-cover FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,d=8 FILEs\fR -. .IP \fBzstd \-\-train\-cover=d=8,steps=500 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,split=60 FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink=2 FILEs\fR -. .TP \fB\-\-train\-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]\fR Same as cover but with extra parameters \fIf\fR and \fIaccel\fR and different default value of split If \fIsplit\fR is not specified, then it tries \fIsplit\fR = 75\. If \fIf\fR is not specified, then it tries \fIf\fR = 20\. Requires that 0 < \fIf\fR < 32\. If \fIaccel\fR is not specified, then it tries \fIaccel\fR = 1\. Requires that 0 < \fIaccel\fR <= 10\. Requires that \fId\fR = 6 or \fId\fR = 8\. -. .IP \fIf\fR is log of size of array that keeps track of frequency of subsegments of size \fId\fR\. The subsegment is hashed to an index in the range [0,2^\fIf\fR \- 1]\. It is possible that 2 different subsegments are hashed to the same index, and they are considered as the same subsegment when computing frequency\. Using a higher \fIf\fR reduces collision but takes longer\. -. .IP Examples: -. .IP \fBzstd \-\-train\-fastcover FILEs\fR -. .IP \fBzstd \-\-train\-fastcover=d=8,f=15,accel=2 FILEs\fR -. .TP \fB\-\-train\-legacy[=selectivity=#]\fR -Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its possible maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. -. +Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its achievable maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. .IP Examples: -. .IP \fBzstd \-\-train\-legacy FILEs\fR -. .IP \fBzstd \-\-train\-legacy=selectivity=8 FILEs\fR -. .SH "BENCHMARK" -. .TP \fB\-b#\fR benchmark file(s) using compression level # -. .TP \fB\-e#\fR benchmark file(s) using multiple compression levels, from \fB\-b#\fR to \fB\-e#\fR (inclusive) -. .TP \fB\-i#\fR minimum evaluation time, in seconds (default: 3s), benchmark mode only -. .TP \fB\-B#\fR, \fB\-\-block\-size=#\fR -cut file(s) into independent blocks of size # (default: no block) -. +cut file(s) into independent chunks of size # (default: no chunking) .TP \fB\-\-priority=rt\fR set process priority to real\-time -. .P -\fBOutput Format:\fR CompressionLevel#Filename : IntputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed -. +\fBOutput Format:\fR CompressionLevel#Filename: InputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed .P \fBMethodology:\fR For both compression and decompression speed, the entire input is compressed/decompressed in\-memory to measure speed\. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy\. -. .SH "ADVANCED COMPRESSION OPTIONS" -. -.SS "\-B#:" -Select the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to (slightly) different compressed frames\. -. +### \-B#: Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. .SS "\-\-zstd[=options]:" -\fBzstd\fR provides 22 predefined compression levels\. The selected or default predefined compression level can be changed with advanced compression options\. The \fIoptions\fR are provided as a comma\-separated list\. You may specify only the options you want to change and the rest will be taken from the selected or default compression level\. The list of available \fIoptions\fR: -. +\fBzstd\fR provides 22 predefined regular compression levels plus the fast levels\. This compression level is translated internally into a number of specific parameters that actually control the behavior of the compressor\. (You can see the result of this translation with \fB\-\-show\-default\-cparams\fR\.) These specific parameters can be overridden with advanced compression options\. The \fIoptions\fR are provided as a comma\-separated list\. You may specify only the options you want to change and the rest will be taken from the selected or default compression level\. The list of available \fIoptions\fR: .TP \fBstrategy\fR=\fIstrat\fR, \fBstrat\fR=\fIstrat\fR Specify a strategy used by a match finder\. -. .IP -There are 9 strategies numbered from 1 to 9, from faster to stronger: 1=ZSTD_fast, 2=ZSTD_dfast, 3=ZSTD_greedy, 4=ZSTD_lazy, 5=ZSTD_lazy2, 6=ZSTD_btlazy2, 7=ZSTD_btopt, 8=ZSTD_btultra, 9=ZSTD_btultra2\. -. +There are 9 strategies numbered from 1 to 9, from fastest to strongest: 1=\fBZSTD_fast\fR, 2=\fBZSTD_dfast\fR, 3=\fBZSTD_greedy\fR, 4=\fBZSTD_lazy\fR, 5=\fBZSTD_lazy2\fR, 6=\fBZSTD_btlazy2\fR, 7=\fBZSTD_btopt\fR, 8=\fBZSTD_btultra\fR, 9=\fBZSTD_btultra2\fR\. .TP \fBwindowLog\fR=\fIwlog\fR, \fBwlog\fR=\fIwlog\fR Specify the maximum number of bits for a match distance\. -. .IP The higher number of increases the chance to find a match which usually improves compression ratio\. It also increases memory requirements for the compressor and decompressor\. The minimum \fIwlog\fR is 10 (1 KiB) and the maximum is 30 (1 GiB) on 32\-bit platforms and 31 (2 GiB) on 64\-bit platforms\. -. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. .TP \fBhashLog\fR=\fIhlog\fR, \fBhlog\fR=\fIhlog\fR Specify the maximum number of bits for a hash table\. -. .IP -Bigger hash tables cause less collisions which usually makes compression faster, but requires more memory during compression\. -. +Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression\. .IP -The minimum \fIhlog\fR is 6 (64 B) and the maximum is 30 (1 GiB)\. -. +The minimum \fIhlog\fR is 6 (64 entries / 256 B) and the maximum is 30 (1B entries / 4 GiB)\. .TP \fBchainLog\fR=\fIclog\fR, \fBclog\fR=\fIclog\fR -Specify the maximum number of bits for a hash chain or a binary tree\. -. +Specify the maximum number of bits for the secondary search structure, whose form depends on the selected \fBstrategy\fR\. .IP -Higher numbers of bits increases the chance to find a match which usually improves compression ratio\. It also slows down compression speed and increases memory requirements for compression\. This option is ignored for the ZSTD_fast strategy\. -. +Higher numbers of bits increases the chance to find a match which usually improves compression ratio\. It also slows down compression speed and increases memory requirements for compression\. This option is ignored for the \fBZSTD_fast\fR \fBstrategy\fR, which only has the primary hash table\. .IP -The minimum \fIclog\fR is 6 (64 B) and the maximum is 29 (524 Mib) on 32\-bit platforms and 30 (1 Gib) on 64\-bit platforms\. -. +The minimum \fIclog\fR is 6 (64 entries / 256 B) and the maximum is 29 (512M entries / 2 GiB) on 32\-bit platforms and 30 (1B entries / 4 GiB) on 64\-bit platforms\. .TP \fBsearchLog\fR=\fIslog\fR, \fBslog\fR=\fIslog\fR Specify the maximum number of searches in a hash chain or a binary tree using logarithmic scale\. -. .IP More searches increases the chance to find a match which usually increases compression ratio but decreases compression speed\. -. .IP The minimum \fIslog\fR is 1 and the maximum is \'windowLog\' \- 1\. -. .TP \fBminMatch\fR=\fImml\fR, \fBmml\fR=\fImml\fR Specify the minimum searched length of a match in a hash table\. -. .IP Larger search lengths usually decrease compression ratio but improve decompression speed\. -. .IP The minimum \fImml\fR is 3 and the maximum is 7\. -. .TP \fBtargetLength\fR=\fItlen\fR, \fBtlen\fR=\fItlen\fR The impact of this field vary depending on selected strategy\. -. .IP -For ZSTD_btopt, ZSTD_btultra and ZSTD_btultra2, it specifies the minimum match length that causes match finder to stop searching\. A larger \fBtargetLength\fR usually improves compression ratio but decreases compression speed\. t For ZSTD_fast, it triggers ultra\-fast mode when > 0\. The value represents the amount of data skipped between match sampling\. Impact is reversed : a larger \fBtargetLength\fR increases compression speed but decreases compression ratio\. -. +For \fBZSTD_btopt\fR, \fBZSTD_btultra\fR and \fBZSTD_btultra2\fR, it specifies the minimum match length that causes match finder to stop searching\. A larger \fBtargetLength\fR usually improves compression ratio but decreases compression speed\. +.IP +For \fBZSTD_fast\fR, it triggers ultra\-fast mode when > 0\. The value represents the amount of data skipped between match sampling\. Impact is reversed: a larger \fBtargetLength\fR increases compression speed but decreases compression ratio\. .IP For all other strategies, this field has no impact\. -. .IP -The minimum \fItlen\fR is 0 and the maximum is 128 Kib\. -. +The minimum \fItlen\fR is 0 and the maximum is 128 KiB\. .TP \fBoverlapLog\fR=\fIovlog\fR, \fBovlog\fR=\fIovlog\fR Determine \fBoverlapSize\fR, amount of data reloaded from previous job\. This parameter is only available when multithreading is enabled\. Reloading more data improves compression ratio, but decreases speed\. -. .IP -The minimum \fIovlog\fR is 0, and the maximum is 9\. 1 means "no overlap", hence completely independent jobs\. 9 means "full overlap", meaning up to \fBwindowSize\fR is reloaded from previous job\. Reducing \fIovlog\fR by 1 reduces the reloaded amount by a factor 2\. For example, 8 means "windowSize/2", and 6 means "windowSize/8"\. Value 0 is special and means "default" : \fIovlog\fR is automatically determined by \fBzstd\fR\. In which case, \fIovlog\fR will range from 6 to 9, depending on selected \fIstrat\fR\. -. +The minimum \fIovlog\fR is 0, and the maximum is 9\. 1 means "no overlap", hence completely independent jobs\. 9 means "full overlap", meaning up to \fBwindowSize\fR is reloaded from previous job\. Reducing \fIovlog\fR by 1 reduces the reloaded amount by a factor 2\. For example, 8 means "windowSize/2", and 6 means "windowSize/8"\. Value 0 is special and means "default": \fIovlog\fR is automatically determined by \fBzstd\fR\. In which case, \fIovlog\fR will range from 6 to 9, depending on selected \fIstrat\fR\. .TP \fBldmHashLog\fR=\fIlhlog\fR, \fBlhlog\fR=\fIlhlog\fR Specify the maximum size for a hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Bigger hash tables usually improve compression ratio at the expense of more memory during compression and a decrease in compression speed\. -. .IP The minimum \fIlhlog\fR is 6 and the maximum is 30 (default: 20)\. -. .TP \fBldmMinMatch\fR=\fIlmml\fR, \fBlmml\fR=\fIlmml\fR Specify the minimum searched length of a match for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger/very small values usually decrease compression ratio\. -. .IP The minimum \fIlmml\fR is 4 and the maximum is 4096 (default: 64)\. -. .TP \fBldmBucketSizeLog\fR=\fIlblog\fR, \fBlblog\fR=\fIlblog\fR Specify the size of each bucket for the hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger bucket sizes improve collision resolution but decrease compression speed\. -. .IP The minimum \fIlblog\fR is 1 and the maximum is 8 (default: 3)\. -. .TP \fBldmHashRateLog\fR=\fIlhrlog\fR, \fBlhrlog\fR=\fIlhrlog\fR Specify the frequency of inserting entries into the long distance matching hash table\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger values will improve compression speed\. Deviating far from the default value will likely result in a decrease in compression ratio\. -. .IP The default value is \fBwlog \- lhlog\fR\. -. .SS "Example" The following parameters sets advanced compression options to something similar to predefined level 19 for files bigger than 256 KB: -. .P \fB\-\-zstd\fR=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6 -. +.SH "SEE ALSO" +\fBzstdgrep\fR(1), \fBzstdless\fR(1), \fBgzip\fR(1), \fBxz\fR(1) +.P +The \fIzstandard\fR format is specified in Y\. Collet, "Zstandard Compression and the \'application/zstd\' Media Type", https://www\.ietf\.org/rfc/rfc8878\.txt, Internet RFC 8878 (February 2021)\. .SH "BUGS" Report bugs at: https://github\.com/facebook/zstd/issues -. .SH "AUTHOR" Yann Collet diff --git a/src/dependencies/zstd-1.5.0/programs/zstd.1.md b/src/dependencies/zstd-1.5.4/programs/zstd.1.md similarity index 66% rename from src/dependencies/zstd-1.5.0/programs/zstd.1.md rename to src/dependencies/zstd-1.5.4/programs/zstd.1.md index ae50928..3b7f24f 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstd.1.md +++ b/src/dependencies/zstd-1.5.4/programs/zstd.1.md @@ -4,7 +4,7 @@ zstd(1) -- zstd, zstdmt, unzstd, zstdcat - Compress or decompress .zst files SYNOPSIS -------- -`zstd` [*OPTIONS*] [-|_INPUT-FILE_] [-o _OUTPUT-FILE_] +`zstd` [] [-|] [-o ] `zstdmt` is equivalent to `zstd -T0` @@ -16,32 +16,32 @@ SYNOPSIS DESCRIPTION ----------- `zstd` is a fast lossless compression algorithm and data compression tool, -with command line syntax similar to `gzip (1)` and `xz (1)`. +with command line syntax similar to `gzip`(1) and `xz`(1). It is based on the **LZ77** family, with further FSE & huff0 entropy stages. `zstd` offers highly configurable compression speed, -with fast modes at > 200 MB/s per core, -and strong modes nearing lzma compression ratios. +from fast modes at > 200 MB/s per core, +to strong modes with excellent compression ratios. It also features a very fast decoder, with speeds > 500 MB/s per core. `zstd` command line syntax is generally similar to gzip, -but features the following differences : +but features the following differences: - Source files are preserved by default. It's possible to remove them automatically by using the `--rm` command. - When compressing a single file, `zstd` displays progress notifications and result summary by default. Use `-q` to turn them off. - - `zstd` does not accept input from console, - but it properly accepts `stdin` when it's not the console. - `zstd` displays a short help page when command line is an error. Use `-q` to turn it off. + - `zstd` does not accept input from console, + though it does accept `stdin` when it's not the console. + - `zstd` does not store the input's filename or attributes, only its contents. -`zstd` compresses or decompresses each _file_ according to the selected -operation mode. +`zstd` processes each _file_ according to the selected operation mode. If no _files_ are given or _file_ is `-`, `zstd` reads from standard input and writes the processed data to standard output. `zstd` will refuse to write compressed data to standard output -if it is a terminal : it will display an error message and skip the _file_. +if it is a terminal: it will display an error message and skip the file. Similarly, `zstd` will refuse to read compressed data from standard input if it is a terminal. @@ -53,14 +53,15 @@ whose name is derived from the source _file_ name: * When decompressing, the `.zst` suffix is removed from the source filename to get the target filename -### Concatenation with .zst files -It is possible to concatenate `.zst` files as is. -`zstd` will decompress such files as if they were a single `.zst` file. +### Concatenation with .zst Files +It is possible to concatenate multiple `.zst` files. `zstd` will decompress +such agglomerated file as if it was a single `.zst` file. OPTIONS ------- -### Integer suffixes and special values +### Integer Suffixes and Special Values + In most places where an integer argument is expected, an optional suffix is supported to easily indicate large integers. There must be no space between the integer and the suffix. @@ -72,7 +73,8 @@ There must be no space between the integer and the suffix. Multiply the integer by 1,048,576 (2\^20). `Mi`, `M`, and `MB` are accepted as synonyms for `MiB`. -### Operation mode +### Operation Mode + If multiple operation mode options are given, the last one takes effect. @@ -85,23 +87,25 @@ the last one takes effect. Decompress. * `-t`, `--test`: Test the integrity of compressed _files_. - This option is equivalent to `--decompress --stdout` except that the - decompressed data is discarded instead of being written to standard output. + This option is equivalent to `--decompress --stdout > /dev/null`, + decompressed data is discarded and checksummed for errors. No files are created or removed. * `-b#`: - Benchmark file(s) using compression level # -* `--train FILEs`: - Use FILEs as a training set to create a dictionary. + Benchmark file(s) using compression level _#_. + See _BENCHMARK_ below for a description of this operation. +* `--train FILES`: + Use _FILES_ as a training set to create a dictionary. The training set should contain a lot of small files (> 100). + See _DICTIONARY BUILDER_ below for a description of this operation. * `-l`, `--list`: Display information related to a zstd compressed file, such as size, ratio, and checksum. Some of these fields may not be available. - This command can be augmented with the `-v` modifier. + This command's output can be augmented with the `-v` modifier. -### Operation modifiers +### Operation Modifiers * `-#`: - `#` compression level \[1-19] (default: 3) + selects `#` compression level \[1-19\] (default: 3) * `--ultra`: unlocks high compression levels 20+ (maximum 22), using a lot more memory. Note that decompression will also require more memory when using these levels. @@ -119,24 +123,31 @@ the last one takes effect. which is either 64 in 32-bit mode, or 256 for 64-bit environments. This modifier does nothing if `zstd` is compiled without multithread support. * `--single-thread`: - Does not spawn a thread for compression, use a single thread for both I/O and compression. - In this mode, compression is serialized with I/O, which is slightly slower. - (This is different from `-T1`, which spawns 1 compression thread in parallel of I/O). - This mode is the only one available when multithread support is disabled. - Single-thread mode features lower memory usage. - Final compressed result is slightly different from `-T1`. -* `--adapt[=min=#,max=#]` : + Use a single thread for both I/O and compression. + As compression is serialized with I/O, this can be slightly slower. + Single-thread mode features significantly lower memory usage, + which can be useful for systems with limited amount of memory, such as 32-bit systems. + + Note 1: this mode is the only available one when multithread support is disabled. + + Note 2: this mode is different from `-T1`, which spawns 1 compression thread in parallel with I/O. + Final compressed result is also slightly different from `-T1`. +* `--auto-threads={physical,logical} (default: physical)`: + When using a default amount of threads via `-T0`, choose the default based on the number + of detected physical or logical cores. +* `--adapt[=min=#,max=#]`: `zstd` will dynamically adapt compression level to perceived I/O conditions. Compression level adaptation can be observed live by using command `-v`. Adaptation can be constrained between supplied `min` and `max` levels. The feature works when combined with multi-threading and `--long` mode. It does not work with `--single-thread`. - It sets window size to 8 MB by default (can be changed manually, see `wlog`). + It sets window size to 8 MiB by default (can be changed manually, see `wlog`). Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible. - _note_ : at the time of this writing, `--adapt` can remain stuck at low speed + + _Note_: at the time of this writing, `--adapt` can remain stuck at low speed when combined with multiple worker threads (>=2). * `--long[=#]`: - enables long distance matching with `#` `windowLog`, if not `#` is not + enables long distance matching with `#` `windowLog`, if `#` is not present it defaults to `27`. This increases the window size (`windowLog`) and memory usage for both the compressor and decompressor. @@ -150,44 +161,51 @@ the last one takes effect. * `--patch-from FILE`: Specify the file to be used as a reference point for zstd's diff engine. This is effectively dictionary compression with some convenient parameter - selection, namely that windowSize > srcSize. + selection, namely that _windowSize_ > _srcSize_. - Note: cannot use both this and -D together - Note: `--long` mode will be automatically activated if chainLog < fileLog - (fileLog being the windowLog required to cover the whole file). You + Note: cannot use both this and `-D` together. + + Note: `--long` mode will be automatically activated if _chainLog_ < _fileLog_ + (_fileLog_ being the _windowLog_ required to cover the whole file). You can also manually force it. - Node: for all levels, you can use --patch-from in --single-thread mode - to improve compression ratio at the cost of speed + + Note: for all levels, you can use `--patch-from` in `--single-thread` mode + to improve compression ratio at the cost of speed. + Note: for level 19, you can get increased compression ratio at the cost of speed by specifying `--zstd=targetLength=` to be something large - (i.e 4096), and by setting a large `--zstd=chainLog=` -* `--rsyncable` : + (i.e. 4096), and by setting a large `--zstd=chainLog=`. +* `--rsyncable`: `zstd` will periodically synchronize the compression state to make the compressed file more rsync-friendly. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit. This feature does not work with `--single-thread`. You probably don't want to use it with long range mode, since it will decrease the effectiveness of - the synchronization points, but your milage may vary. + the synchronization points, but your mileage may vary. * `-C`, `--[no-]check`: add integrity check computed from uncompressed data (default: enabled) * `--[no-]content-size`: enable / disable whether or not the original size of the file is placed in the header of the compressed file. The default option is - --content-size (meaning that the original size will be placed in the header). + `--content-size` (meaning that the original size will be placed in the header). * `--no-dictID`: do not store dictionary ID within frame header (dictionary compression). The decoder will have to rely on implicit knowledge about which dictionary to use, it won't be able to check if it's correct. * `-M#`, `--memory=#`: - Set a memory usage limit. By default, Zstandard uses 128 MB for decompression + Set a memory usage limit. By default, `zstd` uses 128 MiB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can - override this manually if need be in either direction (ie. you can increase or + override this manually if need be in either direction (i.e. you can increase or decrease it). - This is also used during compression when using with --patch-from=. In this case, - this parameter overrides that maximum size allowed for a dictionary. (128 MB). -* `--stream-size=#` : + This is also used during compression when using with `--patch-from=`. In this case, + this parameter overrides that maximum size allowed for a dictionary. (128 MiB). + + Additionally, this can be used to limit memory for dictionary training. This parameter + overrides the default limit of 2 GiB. zstd will load training samples up to the memory limit + and ignore the rest. +* `--stream-size=#`: Sets the pledged source size of input coming from a stream. This value must be exact, as it will be included in the produced frame header. Incorrect stream sizes will cause an error. This information will be used to better optimize compression parameters, resulting in @@ -200,12 +218,14 @@ the last one takes effect. Exact guesses result in better compression ratios. Overestimates result in slightly degraded compression ratios, while underestimates may result in significant degradation. * `-o FILE`: - save result into `FILE` + save result into `FILE`. * `-f`, `--force`: disable input and output checks. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc. + During decompression and when the output destination is stdout, pass-through + unrecognized formats as-is. * `-c`, `--stdout`: - force write to standard output, even if it is the console + write to standard output (even if it is the console); keep original files unchanged. * `--[no-]sparse`: enable / disable sparse FS support, to make files with many zeroes smaller on disk. @@ -214,14 +234,26 @@ the last one takes effect. default: enabled when output is into a file, and disabled when output is stdout. This setting overrides default and can force sparse mode over stdout. +* `--[no-]pass-through` + enable / disable passing through uncompressed files as-is. During + decompression when pass-through is enabled, unrecognized formats will be + copied as-is from the input to the output. By default, pass-through will + occur when the output destination is stdout and the force (`-f`) option is + set. * `--rm`: - remove source file(s) after successful compression or decompression. If used in combination with - -o, will trigger a confirmation prompt (which can be silenced with -f), as this is a destructive operation. + remove source file(s) after successful compression or decompression. + This command is silently ignored if output is `stdout`. + If used in combination with `-o`, + triggers a confirmation prompt (which can be silenced with `-f`), as this is a destructive operation. * `-k`, `--keep`: keep source file(s) after successful compression or decompression. This is the default behavior. * `-r`: - operate recursively on directories + operate recursively on directories. + It selects all files in the named directory and all its subdirectories. + This can be useful both to reduce command line typing, + and to circumvent shell expansion limitations, + when there are a lot of files and naming breaks the maximum size of a command line. * `--filelist FILE` read a list of files to process as content from `FILE`. Format is compatible with `ls` output, with one file per line. @@ -251,7 +283,7 @@ the last one takes effect. display help/long help and exit * `-V`, `--version`: display version number and exit. - Advanced : `-vV` also displays supported formats. + Advanced: `-vV` also displays supported formats. `-vvV` also displays POSIX support. `-q` will only display the version number, suitable for machine reading. * `-v`, `--verbose`: @@ -262,17 +294,27 @@ the last one takes effect. * `--no-progress`: do not display the progress bar, but keep all other messages. * `--show-default-cparams`: - Shows the default compression parameters that will be used for a - particular src file. If the provided src file is not a regular file - (eg. named pipe), the cli will just output the default parameters. - That is, the parameters that are used when the src size is unknown. + shows the default compression parameters that will be used for a particular input file, based on the provided compression level and the input size. + If the provided file is not a regular file (e.g. a pipe), this flag will output the parameters used for inputs of unknown size. * `--`: All arguments after `--` are treated as files -### Restricted usage of Environment Variables -Using environment variables to set parameters has security implications. -Therefore, this avenue is intentionally restricted. +### gzip Operation Modifiers +When invoked via a `gzip` symlink, `zstd` will support further +options that intend to mimic the `gzip` behavior: + +* `-n`, `--no-name`: + do not store the original filename and timestamps when compressing + a file. This is the default behavior and hence a no-op. +* `--best`: + alias to the option `-9`. + + +### Environment Variables + +Employing environment variables to set parameters has security implications. +Therefore, this avenue is intentionally limited. Only `ZSTD_CLEVEL` and `ZSTD_NBTHREADS` are currently supported. They set the compression level and number of threads to use during compression, respectively. @@ -282,8 +324,8 @@ If the value of `ZSTD_CLEVEL` is not a valid integer, it will be ignored with a `ZSTD_NBTHREADS` can be used to set the number of threads `zstd` will attempt to use during compression. If the value of `ZSTD_NBTHREADS` is not a valid unsigned integer, it will be ignored with a warning message. -`ZSTD_NBTHREADS` has a default value of (`1`), and is capped at ZSTDMT_NBWORKERS_MAX==200. `zstd` must be -compiled with multithread support for this to have any effect. +`ZSTD_NBTHREADS` has a default value of (`1`), and is capped at ZSTDMT_NBWORKERS_MAX==200. +`zstd` must be compiled with multithread support for this to have any effect. They can both be overridden by corresponding command line arguments: `-#` for compression level and `-T#` for number of compression threads. @@ -295,41 +337,76 @@ DICTIONARY BUILDER which greatly improves efficiency on small files and messages. It's possible to train `zstd` with a set of samples, the result of which is saved into a file called a `dictionary`. -Then during compression and decompression, reference the same dictionary, +Then, during compression and decompression, reference the same dictionary, using command `-D dictionaryFileName`. Compression of small files similar to the sample set will be greatly improved. * `--train FILEs`: Use FILEs as training set to create a dictionary. - The training set should contain a lot of small files (> 100), + The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size - (for example, 10 MB for a 100 KB dictionary). + (for example, ~10 MB for a 100 KB dictionary). + `--train` can be combined with `-r` to indicate a directory rather than listing all the files, + which can be useful to circumvent shell expansion limits. - Supports multithreading if `zstd` is compiled with threading support. - Additional parameters can be specified with `--train-fastcover`. + Since dictionary compression is mostly effective for small files, + the expectation is that the training set will only contain small files. + In the case where some samples happen to be large, + only the first 128 KiB of these samples will be used for training. + + `--train` supports multithreading if `zstd` is compiled with threading support (default). + Additional advanced parameters can be specified with `--train-fastcover`. The legacy dictionary builder can be accessed with `--train-legacy`. - The cover dictionary builder can be accessed with `--train-cover`. - Equivalent to `--train-fastcover=d=8,steps=4`. -* `-o file`: - Dictionary saved into `file` (default name: dictionary). + The slower cover dictionary builder can be accessed with `--train-cover`. + Default `--train` is equivalent to `--train-fastcover=d=8,steps=4`. + +* `-o FILE`: + Dictionary saved into `FILE` (default name: dictionary). * `--maxdict=#`: - Limit dictionary to specified size (default: 112640). + Limit dictionary to specified size (default: 112640 bytes). + As usual, quantities are expressed in bytes by default, + and it's possible to employ suffixes (like `KB` or `MB`) + to specify larger values. * `-#`: Use `#` compression level during training (optional). Will generate statistics more tuned for selected compression level, resulting in a _small_ compression ratio improvement for this level. * `-B#`: - Split input files in blocks of size # (default: no split) + Split input files into blocks of size # (default: no split) +* `-M#`, `--memory=#`: + Limit the amount of sample data loaded for training (default: 2 GB). + Note that the default (2 GB) is also the maximum. + This parameter can be useful in situations where the training set size + is not well controlled and could be potentially very large. + Since speed of the training process is directly correlated to + the size of the training sample set, + a smaller sample set leads to faster training. + + In situations where the training set is larger than maximum memory, + the CLI will randomly select samples among the available ones, + up to the maximum allowed memory budget. + This is meant to improve dictionary relevance + by mitigating the potential impact of clustering, + such as selecting only files from the beginning of a list + sorted by modification date, or sorted by alphabetical order. + The randomization process is deterministic, so + training of the same list of files with the same parameters + will lead to the creation of the same dictionary. + * `--dictID=#`: - A dictionary ID is a locally unique ID that a decoder can use to verify it is - using the right dictionary. + A dictionary ID is a locally unique ID. + The decoder will use this value to verify it is using the right dictionary. By default, zstd will create a 4-bytes random number ID. - It's possible to give a precise number instead. - Short numbers have an advantage : an ID < 256 will only need 1 byte in the - compressed frame header, and an ID < 65536 will only need 2 bytes. - This compares favorably to 4 bytes default. - However, it's up to the dictionary manager to not assign twice the same ID to + It's possible to provide an explicit number ID instead. + It's up to the dictionary manager to not assign twice the same ID to 2 different dictionaries. + Note that short numbers have an advantage: + an ID < 256 will only need 1 byte in the compressed frame header, + and an ID < 65536 will only need 2 bytes. + This compares favorably to 4 bytes default. + + Note that RFC8878 reserves IDs less than 32768 and greater than or equal to 2\^31, so they should not be used in public. + * `--train-cover[=k#,d=#,steps=#,split=#,shrink[=#]]`: Select parameters for the default dictionary builder algorithm named cover. If _d_ is not specified, then it tries _d_ = 6 and _d_ = 8. @@ -394,7 +471,7 @@ Compression of small files similar to the sample set will be greatly improved. Use legacy dictionary builder algorithm with the given dictionary _selectivity_ (default: 9). The smaller the _selectivity_ value, the denser the dictionary, - improving its efficiency but reducing its possible maximum size. + improving its efficiency but reducing its achievable maximum size. `--train-legacy=s=#` is also accepted. Examples: @@ -414,30 +491,31 @@ BENCHMARK * `-i#`: minimum evaluation time, in seconds (default: 3s), benchmark mode only * `-B#`, `--block-size=#`: - cut file(s) into independent blocks of size # (default: no block) + cut file(s) into independent chunks of size # (default: no chunking) * `--priority=rt`: set process priority to real-time -**Output Format:** CompressionLevel#Filename : IntputSize -> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed +**Output Format:** CompressionLevel#Filename: InputSize -> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed **Methodology:** For both compression and decompression speed, the entire input is compressed/decompressed in-memory to measure speed. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy. ADVANCED COMPRESSION OPTIONS ---------------------------- ### -B#: -Select the size of each compression job. +Specify the size of each compression job. This parameter is only available when multi-threading is enabled. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads. Default job size varies depending on compression level (generally `4 * windowSize`). `-B#` makes it possible to manually select a custom size. Note that job size must respect a minimum value which is enforced transparently. This minimum is either 512 KB, or `overlapSize`, whichever is largest. -Different job sizes will lead to (slightly) different compressed frames. +Different job sizes will lead to non-identical compressed frames. ### --zstd[=options]: -`zstd` provides 22 predefined compression levels. -The selected or default predefined compression level can be changed with -advanced compression options. +`zstd` provides 22 predefined regular compression levels plus the fast levels. +This compression level is translated internally into a number of specific parameters that actually control the behavior of the compressor. +(You can see the result of this translation with `--show-default-cparams`.) +These specific parameters can be overridden with advanced compression options. The _options_ are provided as a comma-separated list. You may specify only the options you want to change and the rest will be taken from the selected or default compression level. @@ -446,10 +524,10 @@ The list of available _options_: - `strategy`=_strat_, `strat`=_strat_: Specify a strategy used by a match finder. - There are 9 strategies numbered from 1 to 9, from faster to stronger: - 1=ZSTD\_fast, 2=ZSTD\_dfast, 3=ZSTD\_greedy, - 4=ZSTD\_lazy, 5=ZSTD\_lazy2, 6=ZSTD\_btlazy2, - 7=ZSTD\_btopt, 8=ZSTD\_btultra, 9=ZSTD\_btultra2. + There are 9 strategies numbered from 1 to 9, from fastest to strongest: + 1=`ZSTD_fast`, 2=`ZSTD_dfast`, 3=`ZSTD_greedy`, + 4=`ZSTD_lazy`, 5=`ZSTD_lazy2`, 6=`ZSTD_btlazy2`, + 7=`ZSTD_btopt`, 8=`ZSTD_btultra`, 9=`ZSTD_btultra2`. - `windowLog`=_wlog_, `wlog`=_wlog_: Specify the maximum number of bits for a match distance. @@ -466,22 +544,23 @@ The list of available _options_: - `hashLog`=_hlog_, `hlog`=_hlog_: Specify the maximum number of bits for a hash table. - Bigger hash tables cause less collisions which usually makes compression + Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression. - The minimum _hlog_ is 6 (64 B) and the maximum is 30 (1 GiB). + The minimum _hlog_ is 6 (64 entries / 256 B) and the maximum is 30 (1B entries / 4 GiB). - `chainLog`=_clog_, `clog`=_clog_: - Specify the maximum number of bits for a hash chain or a binary tree. + Specify the maximum number of bits for the secondary search structure, + whose form depends on the selected `strategy`. Higher numbers of bits increases the chance to find a match which usually improves compression ratio. It also slows down compression speed and increases memory requirements for compression. - This option is ignored for the ZSTD_fast strategy. + This option is ignored for the `ZSTD_fast` `strategy`, which only has the primary hash table. - The minimum _clog_ is 6 (64 B) and the maximum is 29 (524 Mib) on 32-bit platforms - and 30 (1 Gib) on 64-bit platforms. + The minimum _clog_ is 6 (64 entries / 256 B) and the maximum is 29 (512M entries / 2 GiB) on 32-bit platforms + and 30 (1B entries / 4 GiB) on 64-bit platforms. - `searchLog`=_slog_, `slog`=_slog_: Specify the maximum number of searches in a hash chain or a binary tree @@ -503,19 +582,19 @@ The list of available _options_: - `targetLength`=_tlen_, `tlen`=_tlen_: The impact of this field vary depending on selected strategy. - For ZSTD\_btopt, ZSTD\_btultra and ZSTD\_btultra2, it specifies + For `ZSTD_btopt`, `ZSTD_btultra` and `ZSTD_btultra2`, it specifies the minimum match length that causes match finder to stop searching. A larger `targetLength` usually improves compression ratio but decreases compression speed. -t - For ZSTD\_fast, it triggers ultra-fast mode when > 0. + + For `ZSTD_fast`, it triggers ultra-fast mode when > 0. The value represents the amount of data skipped between match sampling. - Impact is reversed : a larger `targetLength` increases compression speed + Impact is reversed: a larger `targetLength` increases compression speed but decreases compression ratio. For all other strategies, this field has no impact. - The minimum _tlen_ is 0 and the maximum is 128 Kib. + The minimum _tlen_ is 0 and the maximum is 128 KiB. - `overlapLog`=_ovlog_, `ovlog`=_ovlog_: Determine `overlapSize`, amount of data reloaded from previous job. @@ -527,7 +606,7 @@ t 9 means "full overlap", meaning up to `windowSize` is reloaded from previous job. Reducing _ovlog_ by 1 reduces the reloaded amount by a factor 2. For example, 8 means "windowSize/2", and 6 means "windowSize/8". - Value 0 is special and means "default" : _ovlog_ is automatically determined by `zstd`. + Value 0 is special and means "default": _ovlog_ is automatically determined by `zstd`. In which case, _ovlog_ will range from 6 to 9, depending on selected _strat_. - `ldmHashLog`=_lhlog_, `lhlog`=_lhlog_: @@ -577,6 +656,11 @@ similar to predefined level 19 for files bigger than 256 KB: `--zstd`=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6 +SEE ALSO +-------- +`zstdgrep`(1), `zstdless`(1), `gzip`(1), `xz`(1) + +The format is specified in Y. Collet, "Zstandard Compression and the 'application/zstd' Media Type", https://www.ietf.org/rfc/rfc8878.txt, Internet RFC 8878 (February 2021). BUGS ---- diff --git a/src/dependencies/zstd-1.5.0/programs/zstdcli.c b/src/dependencies/zstd-1.5.4/programs/zstdcli.c similarity index 67% rename from src/dependencies/zstd-1.5.0/programs/zstdcli.c rename to src/dependencies/zstd-1.5.4/programs/zstdcli.c index 239aaf4..93f75e2 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstdcli.c +++ b/src/dependencies/zstd-1.5.4/programs/zstdcli.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -27,8 +27,8 @@ /*-************************************ * Dependencies **************************************/ -#include "platform.h" /* IS_CONSOLE, PLATFORM_POSIX_VERSION */ -#include "util.h" /* UTIL_HAS_CREATEFILELIST, UTIL_createFileList */ +#include "platform.h" /* PLATFORM_POSIX_VERSION */ +#include "util.h" /* UTIL_HAS_CREATEFILELIST, UTIL_createFileList, UTIL_isConsole */ #include /* getenv */ #include /* strcmp, strlen */ #include /* fprintf(), stdin, stdout, stderr */ @@ -46,17 +46,18 @@ # include "zstdcli_trace.h" #endif #include "../lib/zstd.h" /* ZSTD_VERSION_STRING, ZSTD_minCLevel, ZSTD_maxCLevel */ +#include "fileio_asyncio.h" /*-************************************ * Constants **************************************/ -#define COMPRESSOR_NAME "zstd command line interface" +#define COMPRESSOR_NAME "Zstandard CLI" #ifndef ZSTD_VERSION # define ZSTD_VERSION "v" ZSTD_VERSION_STRING #endif #define AUTHOR "Yann Collet" -#define WELCOME_MESSAGE "*** %s %i-bits %s, by %s ***\n", COMPRESSOR_NAME, (int)(sizeof(size_t)*8), ZSTD_VERSION, AUTHOR +#define WELCOME_MESSAGE "*** %s (%i-bit) %s, by %s ***\n", COMPRESSOR_NAME, (int)(sizeof(size_t)*8), ZSTD_VERSION, AUTHOR #define ZSTD_ZSTDMT "zstdmt" #define ZSTD_UNZSTD "unzstd" @@ -124,6 +125,15 @@ static void checkLibVersion(void) } +/*! exeNameMatch() : + @return : a non-zero value if exeName matches test, excluding the extension + */ +static int exeNameMatch(const char* exeName, const char* test) +{ + return !strncmp(exeName, test, strlen(test)) && + (exeName[strlen(test)] == '\0' || exeName[strlen(test)] == '.'); +} + /*-************************************ * Command Line **************************************/ @@ -133,141 +143,174 @@ static void checkLibVersion(void) */ static void usage(FILE* f, const char* programName) { - DISPLAY_F(f, "Usage : \n"); - DISPLAY_F(f, " %s [args] [FILE(s)] [-o file] \n", programName); + DISPLAY_F(f, "Compress or decompress the INPUT file(s); reads from STDIN if INPUT is `-` or not provided.\n\n"); + DISPLAY_F(f, "Usage: %s [OPTIONS...] [INPUT... | -] [-o OUTPUT]\n\n", programName); + DISPLAY_F(f, "Options:\n"); + DISPLAY_F(f, " -o OUTPUT Write output to a single file, OUTPUT.\n"); + DISPLAY_F(f, " -k, --keep Preserve INPUT file(s). [Default] \n"); + DISPLAY_F(f, " --rm Remove INPUT file(s) after successful (de)compression.\n"); +#ifdef ZSTD_GZCOMPRESS + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + DISPLAY_F(f, " -n, --no-name Do not store original filename when compressing.\n\n"); + } +#endif DISPLAY_F(f, "\n"); - DISPLAY_F(f, "FILE : a filename \n"); - DISPLAY_F(f, " with no FILE, or when FILE is - , read standard input\n"); - DISPLAY_F(f, "Arguments : \n"); #ifndef ZSTD_NOCOMPRESS - DISPLAY_F(f, " -# : # compression level (1-%d, default: %d) \n", ZSTDCLI_CLEVEL_MAX, ZSTDCLI_CLEVEL_DEFAULT); + DISPLAY_F(f, " -# Desired compression level, where `#` is a number between 1 and %d;\n", ZSTDCLI_CLEVEL_MAX); + DISPLAY_F(f, " lower numbers provide faster compression, higher numbers yield\n"); + DISPLAY_F(f, " better compression ratios. [Default: %d]\n\n", ZSTDCLI_CLEVEL_DEFAULT); #endif #ifndef ZSTD_NODECOMPRESS - DISPLAY_F(f, " -d : decompression \n"); + DISPLAY_F(f, " -d, --decompress Perform decompression.\n"); #endif - DISPLAY_F(f, " -D DICT: use DICT as Dictionary for compression or decompression \n"); - DISPLAY_F(f, " -o file: result stored into `file` (only 1 output file) \n"); - DISPLAY_F(f, " -f : disable input and output checks. Allows overwriting existing files,\n"); - DISPLAY_F(f, " input from console, output to stdout, operating on links,\n"); - DISPLAY_F(f, " block devices, etc.\n"); - DISPLAY_F(f, "--rm : remove source file(s) after successful de/compression \n"); - DISPLAY_F(f, " -k : preserve source file(s) (default) \n"); - DISPLAY_F(f, " -h/-H : display help/long help and exit \n"); + DISPLAY_F(f, " -D DICT Use DICT as the dictionary for compression or decompression.\n\n"); + DISPLAY_F(f, " -f, --force Disable input and output checks. Allows overwriting existing files,\n"); + DISPLAY_F(f, " receiving input from the console, printing ouput to STDOUT, and\n"); + DISPLAY_F(f, " operating on links, block devices, etc. Unrecognized formats will be\n"); + DISPLAY_F(f, " passed-through through as-is.\n\n"); + + DISPLAY_F(f, " -h Display short usage and exit.\n"); + DISPLAY_F(f, " -H, --help Display full help and exit.\n"); + DISPLAY_F(f, " -V, --version Display the program version and exit.\n"); + DISPLAY_F(f, "\n"); } static void usage_advanced(const char* programName) { DISPLAYOUT(WELCOME_MESSAGE); + DISPLAYOUT("\n"); usage(stdout, programName); - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced arguments : \n"); - DISPLAYOUT( " -V : display Version number and exit \n"); + DISPLAYOUT("Advanced options:\n"); + DISPLAYOUT(" -c, --stdout Write to STDOUT (even if it is a console) and keep the INPUT file(s).\n\n"); - DISPLAYOUT( " -c : force write to standard output, even if it is the console \n"); - - DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n"); - DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n"); - DISPLAYOUT( "--[no-]progress : forcibly display, or never display the progress counter.\n"); - DISPLAYOUT( " note: any (de)compressed output to terminal will mix with progress counter text. \n"); + DISPLAYOUT(" -v, --verbose Enable verbose output; pass multiple times to increase verbosity.\n"); + DISPLAYOUT(" -q, --quiet Suppress warnings; pass twice to suppress errors.\n"); +#ifndef ZSTD_NOTRACE + DISPLAYOUT(" --trace LOG Log tracing information to LOG.\n"); +#endif + DISPLAYOUT("\n"); + DISPLAYOUT(" --[no-]progress Forcibly show/hide the progress counter. NOTE: Any (de)compressed\n"); + DISPLAYOUT(" output to terminal will mix with progress counter text.\n\n"); #ifdef UTIL_HAS_CREATEFILELIST - DISPLAYOUT( " -r : operate recursively on directories \n"); - DISPLAYOUT( "--filelist FILE : read list of files to operate upon from FILE \n"); - DISPLAYOUT( "--output-dir-flat DIR : processed files are stored into DIR \n"); + DISPLAYOUT(" -r Operate recursively on directories.\n"); + DISPLAYOUT(" --filelist LIST Read a list of files to operate on from LIST.\n"); + DISPLAYOUT(" --output-dir-flat DIR Store processed files in DIR.\n"); #endif #ifdef UTIL_HAS_MIRRORFILELIST - DISPLAYOUT( "--output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure \n"); + DISPLAYOUT(" --output-dir-mirror DIR Store processed files in DIR, respecting original directory structure.\n"); #endif + if (AIO_supported()) + DISPLAYOUT(" --[no-]asyncio Use asynchronous IO. [Default: Enabled]\n"); - + DISPLAYOUT("\n"); #ifndef ZSTD_NOCOMPRESS - DISPLAYOUT( "--[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled)"); + DISPLAYOUT(" --[no-]check Add XXH64 integrity checksums during compression. [Default: Add, Validate]\n"); #ifndef ZSTD_NODECOMPRESS - DISPLAYOUT( ". If specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate)."); + DISPLAYOUT(" If `-d` is present, ignore/validate checksums during decompression.\n"); #endif #else #ifdef ZSTD_NOCOMPRESS - DISPLAYOUT( "--[no-]check : during decompression, ignore/validate checksums in compressed frame (default: validate)."); + DISPLAYOUT(" --[no-]check Ignore/validate checksums during decompression. [Default: Validate]"); #endif #endif /* ZSTD_NOCOMPRESS */ -#ifndef ZSTD_NOTRACE - DISPLAYOUT( "\n"); - DISPLAYOUT( "--trace FILE : log tracing information to FILE."); -#endif - DISPLAYOUT( "\n"); - - DISPLAYOUT( "-- : All arguments after \"--\" are treated as files \n"); + DISPLAYOUT("\n"); + DISPLAYOUT(" -- Treat remaining arguments after `--` as files.\n"); #ifndef ZSTD_NOCOMPRESS - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced compression arguments : \n"); - DISPLAYOUT( "--ultra : enable levels beyond %i, up to %i (requires more memory) \n", ZSTDCLI_CLEVEL_MAX, ZSTD_maxCLevel()); - DISPLAYOUT( "--long[=#]: enable long distance matching with given window log (default: %u) \n", g_defaultMaxWindowLog); - DISPLAYOUT( "--fast[=#]: switch to very fast compression levels (default: %u) \n", 1); - DISPLAYOUT( "--adapt : dynamically adapt compression level to I/O conditions \n"); - DISPLAYOUT( "--[no-]row-match-finder : force enable/disable usage of fast row-based matchfinder for greedy, lazy, and lazy2 strategies \n"); -# ifdef ZSTD_MULTITHREAD - DISPLAYOUT( " -T# : spawns # compression threads (default: 1, 0==# cores) \n"); - DISPLAYOUT( " -B# : select size of each job (default: 0==automatic) \n"); - DISPLAYOUT( "--single-thread : use a single thread for both I/O and compression (result slightly different than -T1) \n"); - DISPLAYOUT( "--rsyncable : compress using a rsync-friendly method (-B sets block size) \n"); -# endif - DISPLAYOUT( "--exclude-compressed: only compress files that are not already compressed \n"); - DISPLAYOUT( "--stream-size=# : specify size of streaming input from `stdin` \n"); - DISPLAYOUT( "--size-hint=# optimize compression parameters for streaming input of approximately this size \n"); - DISPLAYOUT( "--target-compressed-block-size=# : generate compressed block of approximately targeted size \n"); - DISPLAYOUT( "--no-dictID : don't write dictID into header (dictionary compression only) \n"); - DISPLAYOUT( "--[no-]compress-literals : force (un)compressed literals \n"); - - DISPLAYOUT( "--format=zstd : compress files to the .zst format (default) \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Advanced compression options:\n"); + DISPLAYOUT(" --ultra Enable levels beyond %i, up to %i; requires more memory.\n", ZSTDCLI_CLEVEL_MAX, ZSTD_maxCLevel()); + DISPLAYOUT(" --fast[=#] Use to very fast compression levels. [Default: %u]\n", 1); #ifdef ZSTD_GZCOMPRESS - DISPLAYOUT( "--format=gzip : compress files to the .gz format \n"); + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + DISPLAYOUT(" --best Compatibility alias for `-9`.\n"); + } +#endif + DISPLAYOUT(" --adapt Dynamically adapt compression level to I/O conditions.\n"); + DISPLAYOUT(" --long[=#] Enable long distance matching with window log #. [Default: %u]\n", g_defaultMaxWindowLog); + DISPLAYOUT(" --patch-from=REF Use REF as the reference point for Zstandard's diff engine. \n\n"); +# ifdef ZSTD_MULTITHREAD + DISPLAYOUT(" -T# Spawn # compression threads. [Default: 1; pass 0 for core count.]\n"); + DISPLAYOUT(" --single-thread Share a single thread for I/O and compression (slightly different than `-T1`).\n"); + DISPLAYOUT(" --auto-threads={physical|logical}\n"); + DISPLAYOUT(" Use physical/logical cores when using `-T0`. [Default: Physical]\n\n"); + DISPLAYOUT(" -B# Set job size to #. [Default: 0 (automatic)]\n"); + DISPLAYOUT(" --rsyncable Compress using a rsync-friendly method (`-B` sets block size). \n"); + DISPLAYOUT("\n"); +# endif + DISPLAYOUT(" --exclude-compressed Only compress files that are not already compressed.\n\n"); + + DISPLAYOUT(" --stream-size=# Specify size of streaming input from STDIN.\n"); + DISPLAYOUT(" --size-hint=# Optimize compression parameters for streaming input of approximately size #.\n"); + DISPLAYOUT(" --target-compressed-block-size=#\n"); + DISPLAYOUT(" Generate compressed blocks of approximately # size.\n\n"); + DISPLAYOUT(" --no-dictID Don't write `dictID` into the header (dictionary compression only).\n"); + DISPLAYOUT(" --[no-]compress-literals Force (un)compressed literals.\n"); + DISPLAYOUT(" --[no-]row-match-finder Explicitly enable/disable the fast, row-based matchfinder for\n"); + DISPLAYOUT(" the 'greedy', 'lazy', and 'lazy2' strategies.\n"); + + DISPLAYOUT("\n"); + DISPLAYOUT(" --format=zstd Compress files to the `.zst` format. [Default]\n"); +#ifdef ZSTD_GZCOMPRESS + DISPLAYOUT(" --format=gzip Compress files to the `.gz` format.\n"); #endif #ifdef ZSTD_LZMACOMPRESS - DISPLAYOUT( "--format=xz : compress files to the .xz format \n"); - DISPLAYOUT( "--format=lzma : compress files to the .lzma format \n"); + DISPLAYOUT(" --format=xz Compress files to the `.xz` format.\n"); + DISPLAYOUT(" --format=lzma Compress files to the `.lzma` format.\n"); #endif #ifdef ZSTD_LZ4COMPRESS - DISPLAYOUT( "--format=lz4 : compress files to the .lz4 format \n"); + DISPLAYOUT( " --format=lz4 Compress files to the `.lz4` format.\n"); #endif #endif /* !ZSTD_NOCOMPRESS */ #ifndef ZSTD_NODECOMPRESS - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced decompression arguments : \n"); - DISPLAYOUT( " -l : print information about zstd compressed files \n"); - DISPLAYOUT( "--test : test compressed file integrity \n"); - DISPLAYOUT( " -M# : Set a memory usage limit for decompression \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Advanced decompression options:\n"); + DISPLAYOUT(" -l Print information about Zstandard-compressed files.\n"); + DISPLAYOUT(" --test Test compressed file integrity.\n"); + DISPLAYOUT(" -M# Set the memory usage limit to # megabytes.\n"); # if ZSTD_SPARSE_DEFAULT - DISPLAYOUT( "--[no-]sparse : sparse mode (default: enabled on file, disabled on stdout) \n"); + DISPLAYOUT(" --[no-]sparse Enable sparse mode. [Default: Enabled for files, disabled for STDOUT.]\n"); # else - DISPLAYOUT( "--[no-]sparse : sparse mode (default: disabled) \n"); + DISPLAYOUT(" --[no-]sparse Enable sparse mode. [Default: Disabled]\n"); # endif + { + char const* passThroughDefault = "Disabled"; + if (exeNameMatch(programName, ZSTD_CAT) || + exeNameMatch(programName, ZSTD_ZCAT) || + exeNameMatch(programName, ZSTD_GZCAT)) { + passThroughDefault = "Enabled"; + } + DISPLAYOUT(" --[no-]pass-through Pass through uncompressed files as-is. [Default: %s]\n", passThroughDefault); + } #endif /* ZSTD_NODECOMPRESS */ #ifndef ZSTD_NODICT - DISPLAYOUT( "\n"); - DISPLAYOUT( "Dictionary builder : \n"); - DISPLAYOUT( "--train ## : create a dictionary from a training set of files \n"); - DISPLAYOUT( "--train-cover[=k=#,d=#,steps=#,split=#,shrink[=#]] : use the cover algorithm with optional args \n"); - DISPLAYOUT( "--train-fastcover[=k=#,d=#,f=#,steps=#,split=#,accel=#,shrink[=#]] : use the fast cover algorithm with optional args \n"); - DISPLAYOUT( "--train-legacy[=s=#] : use the legacy algorithm with selectivity (default: %u) \n", g_defaultSelectivityLevel); - DISPLAYOUT( " -o DICT : DICT is dictionary name (default: %s) \n", g_defaultDictName); - DISPLAYOUT( "--maxdict=# : limit dictionary to specified size (default: %u) \n", g_defaultMaxDictSize); - DISPLAYOUT( "--dictID=# : force dictionary ID to specified value (default: random) \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Dictionary builder:\n"); + DISPLAYOUT(" --train Create a dictionary from a training set of files.\n\n"); + DISPLAYOUT(" --train-cover[=k=#,d=#,steps=#,split=#,shrink[=#]]\n"); + DISPLAYOUT(" Use the cover algorithm (with optional arguments).\n"); + DISPLAYOUT(" --train-fastcover[=k=#,d=#,f=#,steps=#,split=#,accel=#,shrink[=#]]\n"); + DISPLAYOUT(" Use the fast cover algorithm (with optional arguments).\n\n"); + DISPLAYOUT(" --train-legacy[=s=#] Use the legacy algorithm with selectivity #. [Default: %u]\n", g_defaultSelectivityLevel); + DISPLAYOUT(" -o NAME Use NAME as dictionary name. [Default: %s]\n", g_defaultDictName); + DISPLAYOUT(" --maxdict=# Limit dictionary to specified size #. [Default: %u]\n", g_defaultMaxDictSize); + DISPLAYOUT(" --dictID=# Force dictionary ID to #. [Default: Random]\n"); #endif #ifndef ZSTD_NOBENCH - DISPLAYOUT( "\n"); - DISPLAYOUT( "Benchmark arguments : \n"); - DISPLAYOUT( " -b# : benchmark file(s), using # compression level (default: %d) \n", ZSTDCLI_CLEVEL_DEFAULT); - DISPLAYOUT( " -e# : test all compression levels successively from -b# to -e# (default: 1) \n"); - DISPLAYOUT( " -i# : minimum evaluation time in seconds (default: 3s) \n"); - DISPLAYOUT( " -B# : cut file into independent blocks of size # (default: no block) \n"); - DISPLAYOUT( " -S : output one benchmark result per input file (default: consolidated result) \n"); - DISPLAYOUT( "--priority=rt : set process priority to real-time \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Benchmark options:\n"); + DISPLAYOUT(" -b# Perform benchmarking with compression level #. [Default: %d]\n", ZSTDCLI_CLEVEL_DEFAULT); + DISPLAYOUT(" -e# Test all compression levels up to #; starting level is `-b#`. [Default: 1]\n"); + DISPLAYOUT(" -i# Set the minimum evaluation to time # seconds. [Default: 3]\n"); + DISPLAYOUT(" -B# Cut file into independent chunks of size #. [Default: No chunking]\n"); + DISPLAYOUT(" -S Output one benchmark result per input file. [Default: Consolidated result]\n"); + DISPLAYOUT(" --priority=rt Set process priority to real-time.\n"); #endif } @@ -294,18 +337,9 @@ static const char* lastNameFromPath(const char* path) return name; } -/*! exeNameMatch() : - @return : a non-zero value if exeName matches test, excluding the extension - */ -static int exeNameMatch(const char* exeName, const char* test) -{ - return !strncmp(exeName, test, strlen(test)) && - (exeName[strlen(test)] == '\0' || exeName[strlen(test)] == '.'); -} - static void errorOut(const char* msg) { - DISPLAY("%s \n", msg); exit(1); + DISPLAYLEVEL(1, "%s \n", msg); exit(1); } /*! readU32FromCharChecked() : @@ -353,6 +387,23 @@ static unsigned readU32FromChar(const char** stringPtr) { return result; } +/*! readIntFromChar() : + * @return : signed integer value read from input in `char` format. + * allows and interprets K, KB, KiB, M, MB and MiB suffix. + * Will also modify `*stringPtr`, advancing it to position where it stopped reading. + * Note : function will exit() program if digit sequence overflows */ +static int readIntFromChar(const char** stringPtr) { + static const char errorMsg[] = "error: numeric value overflows 32-bit int"; + int sign = 1; + unsigned result; + if (**stringPtr=='-') { + (*stringPtr)++; + sign = -1; + } + if (readU32FromCharChecked(stringPtr, &result)) { errorOut(errorMsg); } + return (int) result * sign; +} + /*! readSizeTFromCharChecked() : * @return 0 if success, and store the result in *value. * allows and interprets K, KB, KiB, M, MB and MiB suffix. @@ -546,8 +597,8 @@ static ZDICT_fastCover_params_t defaultFastCoverParams(void) static unsigned parseAdaptParameters(const char* stringPtr, int* adaptMinPtr, int* adaptMaxPtr) { for ( ; ;) { - if (longCommandWArg(&stringPtr, "min=")) { *adaptMinPtr = (int)readU32FromChar(&stringPtr); if (stringPtr[0]==',') { stringPtr++; continue; } else break; } - if (longCommandWArg(&stringPtr, "max=")) { *adaptMaxPtr = (int)readU32FromChar(&stringPtr); if (stringPtr[0]==',') { stringPtr++; continue; } else break; } + if (longCommandWArg(&stringPtr, "min=")) { *adaptMinPtr = readIntFromChar(&stringPtr); if (stringPtr[0]==',') { stringPtr++; continue; } else break; } + if (longCommandWArg(&stringPtr, "max=")) { *adaptMaxPtr = readIntFromChar(&stringPtr); if (stringPtr[0]==',') { stringPtr++; continue; } else break; } DISPLAYLEVEL(4, "invalid compression parameter \n"); return 0; } @@ -615,6 +666,11 @@ static void printVersion(void) #endif DISPLAYOUT("\n"); if (g_displayLevel >= 4) { + /* library versions */ + DISPLAYOUT("zlib version %s\n", FIO_zlibVersion()); + DISPLAYOUT("lz4 version %s\n", FIO_lz4Version()); + DISPLAYOUT("lzma version %s\n", FIO_lzmaVersion()); + /* posix support */ #ifdef _POSIX_C_SOURCE DISPLAYOUT("_POSIX_C_SOURCE defined: %ldL\n", (long) _POSIX_C_SOURCE); @@ -628,6 +684,48 @@ static void printVersion(void) } } } +#define ZSTD_NB_STRATEGIES 9 +static const char* ZSTD_strategyMap[ZSTD_NB_STRATEGIES + 1] = { "", "ZSTD_fast", + "ZSTD_dfast", "ZSTD_greedy", "ZSTD_lazy", "ZSTD_lazy2", "ZSTD_btlazy2", + "ZSTD_btopt", "ZSTD_btultra", "ZSTD_btultra2"}; + +#ifndef ZSTD_NOCOMPRESS + +static void printDefaultCParams(const char* filename, const char* dictFileName, int cLevel) { + unsigned long long fileSize = UTIL_getFileSize(filename); + const size_t dictSize = dictFileName != NULL ? (size_t)UTIL_getFileSize(dictFileName) : 0; + const ZSTD_compressionParameters cParams = ZSTD_getCParams(cLevel, fileSize, dictSize); + if (fileSize != UTIL_FILESIZE_UNKNOWN) DISPLAY("%s (%u bytes)\n", filename, (unsigned)fileSize); + else DISPLAY("%s (src size unknown)\n", filename); + DISPLAY(" - windowLog : %u\n", cParams.windowLog); + DISPLAY(" - chainLog : %u\n", cParams.chainLog); + DISPLAY(" - hashLog : %u\n", cParams.hashLog); + DISPLAY(" - searchLog : %u\n", cParams.searchLog); + DISPLAY(" - minMatch : %u\n", cParams.minMatch); + DISPLAY(" - targetLength : %u\n", cParams.targetLength); + assert(cParams.strategy < ZSTD_NB_STRATEGIES + 1); + DISPLAY(" - strategy : %s (%u)\n", ZSTD_strategyMap[(int)cParams.strategy], (unsigned)cParams.strategy); +} + +static void printActualCParams(const char* filename, const char* dictFileName, int cLevel, const ZSTD_compressionParameters* cParams) { + unsigned long long fileSize = UTIL_getFileSize(filename); + const size_t dictSize = dictFileName != NULL ? (size_t)UTIL_getFileSize(dictFileName) : 0; + ZSTD_compressionParameters actualCParams = ZSTD_getCParams(cLevel, fileSize, dictSize); + assert(g_displayLevel >= 4); + actualCParams.windowLog = cParams->windowLog == 0 ? actualCParams.windowLog : cParams->windowLog; + actualCParams.chainLog = cParams->chainLog == 0 ? actualCParams.chainLog : cParams->chainLog; + actualCParams.hashLog = cParams->hashLog == 0 ? actualCParams.hashLog : cParams->hashLog; + actualCParams.searchLog = cParams->searchLog == 0 ? actualCParams.searchLog : cParams->searchLog; + actualCParams.minMatch = cParams->minMatch == 0 ? actualCParams.minMatch : cParams->minMatch; + actualCParams.targetLength = cParams->targetLength == 0 ? actualCParams.targetLength : cParams->targetLength; + actualCParams.strategy = cParams->strategy == 0 ? actualCParams.strategy : cParams->strategy; + DISPLAY("--zstd=wlog=%d,clog=%d,hlog=%d,slog=%d,mml=%d,tlen=%d,strat=%d\n", + actualCParams.windowLog, actualCParams.chainLog, actualCParams.hashLog, actualCParams.searchLog, + actualCParams.minMatch, actualCParams.targetLength, actualCParams.strategy); +} + +#endif + /* Environment variables for parameter setting */ #define ENV_CLEVEL "ZSTD_CLEVEL" #define ENV_NBTHREADS "ZSTD_NBTHREADS" /* takes lower precedence than directly specifying -T# in the CLI */ @@ -688,13 +786,13 @@ static unsigned init_nbThreads(void) { } else { \ argNb++; \ if (argNb >= argCount) { \ - DISPLAY("error: missing command argument \n"); \ + DISPLAYLEVEL(1, "error: missing command argument \n"); \ CLEAN_RETURN(1); \ } \ ptr = argv[argNb]; \ assert(ptr != NULL); \ if (ptr[0]=='-') { \ - DISPLAY("error: command cannot be separated from its argument by another command \n"); \ + DISPLAYLEVEL(1, "error: command cannot be separated from its argument by another command \n"); \ CLEAN_RETURN(1); \ } } } @@ -702,12 +800,19 @@ static unsigned init_nbThreads(void) { const char* __nb; \ NEXT_FIELD(__nb); \ val32 = readU32FromChar(&__nb); \ + if(*__nb != 0) { \ + errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed"); \ + } \ } -#define ZSTD_NB_STRATEGIES 9 -static const char* ZSTD_strategyMap[ZSTD_NB_STRATEGIES + 1] = { "", "ZSTD_fast", - "ZSTD_dfast", "ZSTD_greedy", "ZSTD_lazy", "ZSTD_lazy2", "ZSTD_btlazy2", - "ZSTD_btopt", "ZSTD_btultra", "ZSTD_btultra2"}; +#define NEXT_TSIZE(valTsize) { \ + const char* __nb; \ + NEXT_FIELD(__nb); \ + valTsize = readSizeTFromChar(&__nb); \ + if(*__nb != 0) { \ + errorOut("error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed"); \ + } \ +} typedef enum { zom_compress, zom_decompress, zom_test, zom_bench, zom_train, zom_list } zstd_operation_mode; @@ -722,7 +827,7 @@ typedef enum { zom_compress, zom_decompress, zom_test, zom_bench, zom_train, zom # define MAXCLEVEL ZSTD_maxCLevel() #endif -int main(int const argCount, const char* argv[]) +int main(int argCount, const char* argv[]) { int argNb, followLinks = 0, @@ -732,9 +837,7 @@ int main(int const argCount, const char* argv[]) hasStdout = 0, ldmFlag = 0, main_pause = 0, - nbWorkers = 0, adapt = 0, - useRowMatchFinder = 0, adaptMin = MINCLEVEL, adaptMax = MAXCLEVEL, rsyncable = 0, @@ -743,15 +846,21 @@ int main(int const argCount, const char* argv[]) separateFiles = 0, setRealTimePrio = 0, singleThread = 0, + defaultLogicalCores = 0, showDefaultCParams = 0, ultra=0, - contentSize=1; + contentSize=1, + removeSrcFile=0; + ZSTD_paramSwitch_e useRowMatchFinder = ZSTD_ps_auto; + FIO_compressionType_t cType = FIO_zstdCompression; + unsigned nbWorkers = 0; double compressibility = 0.5; unsigned bench_nbSeconds = 3; /* would be better if this value was synchronized from bench */ size_t blockSize = 0; FIO_prefs_t* const prefs = FIO_createPreferences(); FIO_ctx_t* const fCtx = FIO_createContext(); + FIO_progressSetting_e progress = FIO_ps_auto; zstd_operation_mode operation = zom_compress; ZSTD_compressionParameters compressionParams; int cLevel = init_cLevel(); @@ -772,6 +881,7 @@ int main(int const argCount, const char* argv[]) size_t streamSrcSize = 0; size_t targetCBlockSize = 0; size_t srcSizeHint = 0; + size_t nbInputFileNames = 0; int dictCLevel = g_defaultDictCLevel; unsigned dictSelect = g_defaultSelectivityLevel; #ifndef ZSTD_NODICT @@ -782,7 +892,7 @@ int main(int const argCount, const char* argv[]) #ifndef ZSTD_NOBENCH BMK_advancedParams_t benchParams = BMK_initAdvancedParams(); #endif - ZSTD_literalCompressionMode_e literalCompressionMode = ZSTD_lcm_auto; + ZSTD_paramSwitch_e literalCompressionMode = ZSTD_ps_auto; /* init */ @@ -790,7 +900,7 @@ int main(int const argCount, const char* argv[]) (void)recursive; (void)cLevelLast; /* not used when ZSTD_NOBENCH set */ (void)memLimit; assert(argCount >= 1); - if ((filenames==NULL) || (file_of_names==NULL)) { DISPLAY("zstd: allocation error \n"); exit(1); } + if ((filenames==NULL) || (file_of_names==NULL)) { DISPLAYLEVEL(1, "zstd: allocation error \n"); exit(1); } programName = lastNameFromPath(programName); #ifdef ZSTD_MULTITHREAD nbWorkers = init_nbThreads(); @@ -799,17 +909,20 @@ int main(int const argCount, const char* argv[]) /* preset behaviors */ if (exeNameMatch(programName, ZSTD_ZSTDMT)) nbWorkers=0, singleThread=0; if (exeNameMatch(programName, ZSTD_UNZSTD)) operation=zom_decompress; - if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ - if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_GZ)) { suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like gzip */ - if (exeNameMatch(programName, ZSTD_GUNZIP)) { operation=zom_decompress; FIO_setRemoveSrcFile(prefs, 1); } /* behave like gunzip, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like lzma */ - if (exeNameMatch(programName, ZSTD_UNLZMA)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_lzmaCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like unlzma, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_XZ)) { suffix = XZ_EXTENSION; FIO_setCompressionType(prefs, FIO_xzCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like xz */ - if (exeNameMatch(programName, ZSTD_UNXZ)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_xzCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like unxz, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_LZ4)) { suffix = LZ4_EXTENSION; FIO_setCompressionType(prefs, FIO_lz4Compression); } /* behave like lz4 */ - if (exeNameMatch(programName, ZSTD_UNLZ4)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_lz4Compression); } /* behave like unlz4, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ + if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + suffix = GZ_EXTENSION; cType = FIO_gzipCompression; removeSrcFile=1; + dictCLevel = cLevel = 6; /* gzip default is -6 */ + } + if (exeNameMatch(programName, ZSTD_GUNZIP)) { operation=zom_decompress; removeSrcFile=1; } /* behave like gunzip, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; cType = FIO_lzmaCompression; removeSrcFile=1; } /* behave like lzma */ + if (exeNameMatch(programName, ZSTD_UNLZMA)) { operation=zom_decompress; cType = FIO_lzmaCompression; removeSrcFile=1; } /* behave like unlzma, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_XZ)) { suffix = XZ_EXTENSION; cType = FIO_xzCompression; removeSrcFile=1; } /* behave like xz */ + if (exeNameMatch(programName, ZSTD_UNXZ)) { operation=zom_decompress; cType = FIO_xzCompression; removeSrcFile=1; } /* behave like unxz, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_LZ4)) { suffix = LZ4_EXTENSION; cType = FIO_lz4Compression; } /* behave like lz4 */ + if (exeNameMatch(programName, ZSTD_UNLZ4)) { operation=zom_decompress; cType = FIO_lz4Compression; } /* behave like unlz4, also supports multiple formats */ memset(&compressionParams, 0, sizeof(compressionParams)); /* init crash handler */ @@ -846,43 +959,55 @@ int main(int const argCount, const char* argv[]) if (!strcmp(argument, "--help")) { usage_advanced(programName); CLEAN_RETURN(0); } if (!strcmp(argument, "--verbose")) { g_displayLevel++; continue; } if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; } - if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; g_displayLevel-=(g_displayLevel==2); continue; } + if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; removeSrcFile=0; continue; } if (!strcmp(argument, "--ultra")) { ultra=1; continue; } if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(prefs, 2); continue; } if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; } if (!strcmp(argument, "--sparse")) { FIO_setSparseWrite(prefs, 2); continue; } if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(prefs, 0); continue; } + if (!strcmp(argument, "--pass-through")) { FIO_setPassThroughFlag(prefs, 1); continue; } + if (!strcmp(argument, "--no-pass-through")) { FIO_setPassThroughFlag(prefs, 0); continue; } if (!strcmp(argument, "--test")) { operation=zom_test; continue; } + if (!strcmp(argument, "--asyncio")) { FIO_setAsyncIOFlag(prefs, 1); continue;} + if (!strcmp(argument, "--no-asyncio")) { FIO_setAsyncIOFlag(prefs, 0); continue;} if (!strcmp(argument, "--train")) { operation=zom_train; if (outFileName==NULL) outFileName=g_defaultDictName; continue; } if (!strcmp(argument, "--no-dictID")) { FIO_setDictIDFlag(prefs, 0); continue; } - if (!strcmp(argument, "--keep")) { FIO_setRemoveSrcFile(prefs, 0); continue; } - if (!strcmp(argument, "--rm")) { FIO_setRemoveSrcFile(prefs, 1); continue; } + if (!strcmp(argument, "--keep")) { removeSrcFile=0; continue; } + if (!strcmp(argument, "--rm")) { removeSrcFile=1; continue; } if (!strcmp(argument, "--priority=rt")) { setRealTimePrio = 1; continue; } if (!strcmp(argument, "--show-default-cparams")) { showDefaultCParams = 1; continue; } if (!strcmp(argument, "--content-size")) { contentSize = 1; continue; } if (!strcmp(argument, "--no-content-size")) { contentSize = 0; continue; } if (!strcmp(argument, "--adapt")) { adapt = 1; continue; } - if (!strcmp(argument, "--no-row-match-finder")) { useRowMatchFinder = 1; continue; } - if (!strcmp(argument, "--row-match-finder")) { useRowMatchFinder = 2; continue; } + if (!strcmp(argument, "--no-row-match-finder")) { useRowMatchFinder = ZSTD_ps_disable; continue; } + if (!strcmp(argument, "--row-match-finder")) { useRowMatchFinder = ZSTD_ps_enable; continue; } if (longCommandWArg(&argument, "--adapt=")) { adapt = 1; if (!parseAdaptParameters(argument, &adaptMin, &adaptMax)) { badusage(programName); CLEAN_RETURN(1); } continue; } if (!strcmp(argument, "--single-thread")) { nbWorkers = 0; singleThread = 1; continue; } - if (!strcmp(argument, "--format=zstd")) { suffix = ZSTD_EXTENSION; FIO_setCompressionType(prefs, FIO_zstdCompression); continue; } + if (!strcmp(argument, "--format=zstd")) { suffix = ZSTD_EXTENSION; cType = FIO_zstdCompression; continue; } #ifdef ZSTD_GZCOMPRESS - if (!strcmp(argument, "--format=gzip")) { suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); continue; } + if (!strcmp(argument, "--format=gzip")) { suffix = GZ_EXTENSION; cType = FIO_gzipCompression; continue; } + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + if (!strcmp(argument, "--best")) { dictCLevel = cLevel = 9; continue; } + if (!strcmp(argument, "--no-name")) { /* ignore for now */; continue; } + } #endif #ifdef ZSTD_LZMACOMPRESS - if (!strcmp(argument, "--format=lzma")) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); continue; } - if (!strcmp(argument, "--format=xz")) { suffix = XZ_EXTENSION; FIO_setCompressionType(prefs, FIO_xzCompression); continue; } + if (!strcmp(argument, "--format=lzma")) { suffix = LZMA_EXTENSION; cType = FIO_lzmaCompression; continue; } + if (!strcmp(argument, "--format=xz")) { suffix = XZ_EXTENSION; cType = FIO_xzCompression; continue; } #endif #ifdef ZSTD_LZ4COMPRESS - if (!strcmp(argument, "--format=lz4")) { suffix = LZ4_EXTENSION; FIO_setCompressionType(prefs, FIO_lz4Compression); continue; } + if (!strcmp(argument, "--format=lz4")) { suffix = LZ4_EXTENSION; cType = FIO_lz4Compression; continue; } #endif if (!strcmp(argument, "--rsyncable")) { rsyncable = 1; continue; } - if (!strcmp(argument, "--compress-literals")) { literalCompressionMode = ZSTD_lcm_huffman; continue; } - if (!strcmp(argument, "--no-compress-literals")) { literalCompressionMode = ZSTD_lcm_uncompressed; continue; } - if (!strcmp(argument, "--no-progress")) { FIO_setProgressSetting(FIO_ps_never); continue; } - if (!strcmp(argument, "--progress")) { FIO_setProgressSetting(FIO_ps_always); continue; } + if (!strcmp(argument, "--compress-literals")) { literalCompressionMode = ZSTD_ps_enable; continue; } + if (!strcmp(argument, "--no-compress-literals")) { literalCompressionMode = ZSTD_ps_disable; continue; } + if (!strcmp(argument, "--no-progress")) { progress = FIO_ps_never; continue; } + if (!strcmp(argument, "--progress")) { progress = FIO_ps_always; continue; } if (!strcmp(argument, "--exclude-compressed")) { FIO_setExcludeCompressedFile(prefs, 1); continue; } + if (!strcmp(argument, "--fake-stdin-is-console")) { UTIL_fakeStdinIsConsole(); continue; } + if (!strcmp(argument, "--fake-stdout-is-console")) { UTIL_fakeStdoutIsConsole(); continue; } + if (!strcmp(argument, "--fake-stderr-is-console")) { UTIL_fakeStderrIsConsole(); continue; } + if (!strcmp(argument, "--trace-file-stat")) { UTIL_traceFileStat(); continue; } /* long commands with arguments */ #ifndef ZSTD_NODICT @@ -924,16 +1049,37 @@ int main(int const argCount, const char* argv[]) if (longCommandWArg(&argument, "--memlimit")) { NEXT_UINT32(memLimit); continue; } if (longCommandWArg(&argument, "--memory")) { NEXT_UINT32(memLimit); continue; } if (longCommandWArg(&argument, "--memlimit-decompress")) { NEXT_UINT32(memLimit); continue; } - if (longCommandWArg(&argument, "--block-size=")) { blockSize = readSizeTFromChar(&argument); continue; } + if (longCommandWArg(&argument, "--block-size")) { NEXT_TSIZE(blockSize); continue; } if (longCommandWArg(&argument, "--maxdict")) { NEXT_UINT32(maxDictSize); continue; } if (longCommandWArg(&argument, "--dictID")) { NEXT_UINT32(dictID); continue; } - if (longCommandWArg(&argument, "--zstd=")) { if (!parseCompressionParameters(argument, &compressionParams)) { badusage(programName); CLEAN_RETURN(1); } continue; } - if (longCommandWArg(&argument, "--stream-size=")) { streamSrcSize = readSizeTFromChar(&argument); continue; } - if (longCommandWArg(&argument, "--target-compressed-block-size=")) { targetCBlockSize = readSizeTFromChar(&argument); continue; } - if (longCommandWArg(&argument, "--size-hint=")) { srcSizeHint = readSizeTFromChar(&argument); continue; } - if (longCommandWArg(&argument, "--output-dir-flat")) { NEXT_FIELD(outDirName); continue; } + if (longCommandWArg(&argument, "--zstd=")) { if (!parseCompressionParameters(argument, &compressionParams)) { badusage(programName); CLEAN_RETURN(1); } ; cType = FIO_zstdCompression; continue; } + if (longCommandWArg(&argument, "--stream-size")) { NEXT_TSIZE(streamSrcSize); continue; } + if (longCommandWArg(&argument, "--target-compressed-block-size")) { NEXT_TSIZE(targetCBlockSize); continue; } + if (longCommandWArg(&argument, "--size-hint")) { NEXT_TSIZE(srcSizeHint); continue; } + if (longCommandWArg(&argument, "--output-dir-flat")) { + NEXT_FIELD(outDirName); + if (strlen(outDirName) == 0) { + DISPLAYLEVEL(1, "error: output dir cannot be empty string (did you mean to pass '.' instead?)\n"); + CLEAN_RETURN(1); + } + continue; + } + if (longCommandWArg(&argument, "--auto-threads")) { + const char* threadDefault = NULL; + NEXT_FIELD(threadDefault); + if (strcmp(threadDefault, "logical") == 0) + defaultLogicalCores = 1; + continue; + } #ifdef UTIL_HAS_MIRRORFILELIST - if (longCommandWArg(&argument, "--output-dir-mirror")) { NEXT_FIELD(outMirroredDirName); continue; } + if (longCommandWArg(&argument, "--output-dir-mirror")) { + NEXT_FIELD(outMirroredDirName); + if (strlen(outMirroredDirName) == 0) { + DISPLAYLEVEL(1, "error: output dir cannot be empty string (did you mean to pass '.' instead?)\n"); + CLEAN_RETURN(1); + } + continue; + } #endif #ifndef ZSTD_NOTRACE if (longCommandWArg(&argument, "--trace")) { char const* traceFile; NEXT_FIELD(traceFile); TRACE_enable(traceFile); continue; } @@ -950,6 +1096,8 @@ int main(int const argCount, const char* argv[]) /* Invalid character following --long */ badusage(programName); CLEAN_RETURN(1); + } else { + ldmWindowLog = g_defaultMaxWindowLog; } /* Only set windowLog if not already set by --zstd */ if (compressionParams.windowLog == 0) @@ -1007,8 +1155,8 @@ int main(int const argCount, const char* argv[]) { /* Display help */ case 'V': printVersion(); CLEAN_RETURN(0); /* Version Only */ - case 'H': - case 'h': usage_advanced(programName); CLEAN_RETURN(0); + case 'H': usage_advanced(programName); CLEAN_RETURN(0); + case 'h': usage(stdout, programName); CLEAN_RETURN(0); /* Compress */ case 'z': operation=zom_compress; argument++; break; @@ -1022,7 +1170,10 @@ int main(int const argCount, const char* argv[]) operation=zom_decompress; argument++; break; /* Force stdout, even if stdout==console */ - case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; + case 'c': forceStdout=1; outFileName=stdoutmark; removeSrcFile=0; argument++; break; + + /* do not store filename - gzip compatibility - nothing to do */ + case 'n': argument++; break; /* Use file content as dictionary */ case 'D': argument++; NEXT_FIELD(dictFileName); break; @@ -1037,7 +1188,7 @@ int main(int const argCount, const char* argv[]) case 'q': g_displayLevel--; argument++; break; /* keep source file (default) */ - case 'k': FIO_setRemoveSrcFile(prefs, 0); argument++; break; + case 'k': removeSrcFile=0; argument++; break; /* Checksum */ case 'C': FIO_setChecksumFlag(prefs, 2); argument++; break; @@ -1096,7 +1247,7 @@ int main(int const argCount, const char* argv[]) /* nb of threads (hidden option) */ case 'T': argument++; - nbWorkers = (int)readU32FromChar(&argument); + nbWorkers = readU32FromChar(&argument); break; /* Dictionary Selection level */ @@ -1136,17 +1287,26 @@ int main(int const argCount, const char* argv[]) DISPLAYLEVEL(3, WELCOME_MESSAGE); #ifdef ZSTD_MULTITHREAD + if ((operation==zom_decompress) && (!singleThread) && (nbWorkers > 1)) { + DISPLAYLEVEL(2, "Warning : decompression does not support multi-threading\n"); + } if ((nbWorkers==0) && (!singleThread)) { /* automatically set # workers based on # of reported cpus */ - nbWorkers = UTIL_countPhysicalCores(); - DISPLAYLEVEL(3, "Note: %d physical core(s) detected \n", nbWorkers); + if (defaultLogicalCores) { + nbWorkers = (unsigned)UTIL_countLogicalCores(); + DISPLAYLEVEL(3, "Note: %d logical core(s) detected \n", nbWorkers); + } else { + nbWorkers = (unsigned)UTIL_countPhysicalCores(); + DISPLAYLEVEL(3, "Note: %d physical core(s) detected \n", nbWorkers); + } } #else - (void)singleThread; (void)nbWorkers; + (void)singleThread; (void)nbWorkers; (void)defaultLogicalCores; #endif -#ifdef UTIL_HAS_CREATEFILELIST g_utilDisplayLevel = g_displayLevel; + +#ifdef UTIL_HAS_CREATEFILELIST if (!followLinks) { unsigned u, fileNamesNb; unsigned const nbFilenames = (unsigned)filenames->tableSize; @@ -1177,6 +1337,8 @@ int main(int const argCount, const char* argv[]) } } + nbInputFileNames = filenames->tableSize; /* saving number of input files */ + if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ UTIL_expandFNT(&filenames, followLinks); } @@ -1189,7 +1351,7 @@ int main(int const argCount, const char* argv[]) int const ret = FIO_listMultipleFiles((unsigned)filenames->tableSize, filenames->fileNames, g_displayLevel); CLEAN_RETURN(ret); #else - DISPLAY("file information is not supported \n"); + DISPLAYLEVEL(1, "file information is not supported \n"); CLEAN_RETURN(1); #endif } @@ -1197,14 +1359,18 @@ int main(int const argCount, const char* argv[]) /* Check if benchmark is selected */ if (operation==zom_bench) { #ifndef ZSTD_NOBENCH + if (cType != FIO_zstdCompression) { + DISPLAYLEVEL(1, "benchmark mode is only compatible with zstd format \n"); + CLEAN_RETURN(1); + } benchParams.blockSize = blockSize; - benchParams.nbWorkers = nbWorkers; + benchParams.nbWorkers = (int)nbWorkers; benchParams.realTime = (unsigned)setRealTimePrio; benchParams.nbSeconds = bench_nbSeconds; benchParams.ldmFlag = ldmFlag; benchParams.ldmMinMatch = (int)g_ldmMinMatch; benchParams.ldmHashLog = (int)g_ldmHashLog; - benchParams.useRowMatchFinder = useRowMatchFinder; + benchParams.useRowMatchFinder = (int)useRowMatchFinder; if (g_ldmBucketSizeLog != LDM_PARAM_DEFAULT) { benchParams.ldmBucketSizeLog = (int)g_ldmBucketSizeLog; } @@ -1225,15 +1391,18 @@ int main(int const argCount, const char* argv[]) int c; DISPLAYLEVEL(3, "Benchmarking %s \n", filenames->fileNames[i]); for(c = cLevel; c <= cLevelLast; c++) { - BMK_benchFilesAdvanced(&filenames->fileNames[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_benchFilesAdvanced(&filenames->fileNames[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } } else { for(; cLevel <= cLevelLast; cLevel++) { - BMK_benchFilesAdvanced(filenames->fileNames, (unsigned)filenames->tableSize, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_benchFilesAdvanced(filenames->fileNames, (unsigned)filenames->tableSize, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } } else { for(; cLevel <= cLevelLast; cLevel++) { - BMK_syntheticTest(cLevel, compressibility, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_syntheticTest(cLevel, compressibility, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } #else @@ -1253,18 +1422,18 @@ int main(int const argCount, const char* argv[]) int const optimize = !coverParams.k || !coverParams.d; coverParams.nbThreads = (unsigned)nbWorkers; coverParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, NULL, &coverParams, NULL, optimize); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (int)filenames->tableSize, blockSize, NULL, &coverParams, NULL, optimize, memLimit); } else if (dict == fastCover) { int const optimize = !fastCoverParams.k || !fastCoverParams.d; fastCoverParams.nbThreads = (unsigned)nbWorkers; fastCoverParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, NULL, NULL, &fastCoverParams, optimize); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (int)filenames->tableSize, blockSize, NULL, NULL, &fastCoverParams, optimize, memLimit); } else { ZDICT_legacy_params_t dictParams; memset(&dictParams, 0, sizeof(dictParams)); dictParams.selectivityLevel = dictSelect; dictParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, &dictParams, NULL, NULL, 0); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (int)filenames->tableSize, blockSize, &dictParams, NULL, NULL, 0, memLimit); } #else (void)dictCLevel; (void)dictSelect; (void)dictID; (void)maxDictSize; /* not used when ZSTD_NODICT set */ @@ -1275,24 +1444,34 @@ int main(int const argCount, const char* argv[]) } #ifndef ZSTD_NODECOMPRESS - if (operation==zom_test) { FIO_setTestMode(prefs, 1); outFileName=nulmark; FIO_setRemoveSrcFile(prefs, 0); } /* test mode */ + if (operation==zom_test) { FIO_setTestMode(prefs, 1); outFileName=nulmark; removeSrcFile=0; } /* test mode */ #endif /* No input filename ==> use stdin and stdout */ - if (filenames->tableSize == 0) UTIL_refFilename(filenames, stdinmark); - if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) + if (filenames->tableSize == 0) { + /* It is possible that the input + was a number of empty directories. In this case + stdin and stdout should not be used */ + if (nbInputFileNames > 0 ){ + DISPLAYLEVEL(1, "please provide correct input file(s) or non-empty directories -- ignored \n"); + CLEAN_RETURN(0); + } + UTIL_refFilename(filenames, stdinmark); + } + + if (filenames->tableSize == 1 && !strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ /* Check if input/output defined as console; trigger an error in this case */ if (!forceStdin - && !strcmp(filenames->fileNames[0], stdinmark) - && IS_CONSOLE(stdin) ) { + && (UTIL_searchFileNamesTable(filenames, stdinmark) != -1) + && UTIL_isConsole(stdin) ) { DISPLAYLEVEL(1, "stdin is a console, aborting\n"); CLEAN_RETURN(1); } - if ( outFileName && !strcmp(outFileName, stdoutmark) - && IS_CONSOLE(stdout) - && !strcmp(filenames->fileNames[0], stdinmark) + if ( (!outFileName || !strcmp(outFileName, stdoutmark)) + && UTIL_isConsole(stdout) + && (UTIL_searchFileNamesTable(filenames, stdinmark) != -1) && !forceStdout && operation!=zom_decompress ) { DISPLAYLEVEL(1, "stdout is a console, aborting\n"); @@ -1310,26 +1489,36 @@ int main(int const argCount, const char* argv[]) if (showDefaultCParams) { if (operation == zom_decompress) { - DISPLAY("error : can't use --show-default-cparams in decomrpession mode \n"); + DISPLAYLEVEL(1, "error : can't use --show-default-cparams in decompression mode \n"); CLEAN_RETURN(1); } } if (dictFileName != NULL && patchFromDictFileName != NULL) { - DISPLAY("error : can't use -D and --patch-from=# at the same time \n"); + DISPLAYLEVEL(1, "error : can't use -D and --patch-from=# at the same time \n"); CLEAN_RETURN(1); } if (patchFromDictFileName != NULL && filenames->tableSize > 1) { - DISPLAY("error : can't use --patch-from=# on multiple files \n"); + DISPLAYLEVEL(1, "error : can't use --patch-from=# on multiple files \n"); CLEAN_RETURN(1); } - /* No status message in pipe mode (stdin - stdout) */ + /* No status message by default when output is stdout */ hasStdout = outFileName && !strcmp(outFileName,stdoutmark); - if (hasStdout && (g_displayLevel==2)) g_displayLevel=1; + /* when stderr is not the console, do not pollute it with progress updates (unless requested) */ + if (!UTIL_isConsole(stderr) && (progress!=FIO_ps_always)) progress=FIO_ps_never; + FIO_setProgressSetting(progress); + + /* don't remove source files when output is stdout */; + if (hasStdout && removeSrcFile) { + DISPLAYLEVEL(3, "Note: src files are not removed when output is stdout \n"); + removeSrcFile = 0; + } + FIO_setRemoveSrcFile(prefs, removeSrcFile); + /* IO Stream/File */ FIO_setHasStdoutOutput(fCtx, hasStdout); FIO_setNbFilesTotal(fCtx, (int)filenames->tableSize); @@ -1348,8 +1537,9 @@ int main(int const argCount, const char* argv[]) FIO_setMemLimit(prefs, memLimit); if (operation==zom_compress) { #ifndef ZSTD_NOCOMPRESS + FIO_setCompressionType(prefs, cType); FIO_setContentSize(prefs, contentSize); - FIO_setNbWorkers(prefs, nbWorkers); + FIO_setNbWorkers(prefs, (int)nbWorkers); FIO_setBlockSize(prefs, (int)blockSize); if (g_overlapLog!=OVERLAP_LOG_DEFAULT) FIO_setOverlapLog(prefs, (int)g_overlapLog); FIO_setLdmFlag(prefs, (unsigned)ldmFlag); @@ -1357,8 +1547,8 @@ int main(int const argCount, const char* argv[]) FIO_setLdmMinMatch(prefs, (int)g_ldmMinMatch); if (g_ldmBucketSizeLog != LDM_PARAM_DEFAULT) FIO_setLdmBucketSizeLog(prefs, (int)g_ldmBucketSizeLog); if (g_ldmHashRateLog != LDM_PARAM_DEFAULT) FIO_setLdmHashRateLog(prefs, (int)g_ldmHashRateLog); - FIO_setAdaptiveMode(prefs, (unsigned)adapt); - FIO_setUseRowMatchFinder(prefs, useRowMatchFinder); + FIO_setAdaptiveMode(prefs, adapt); + FIO_setUseRowMatchFinder(prefs, (int)useRowMatchFinder); FIO_setAdaptMin(prefs, adaptMin); FIO_setAdaptMax(prefs, adaptMax); FIO_setRsyncable(prefs, rsyncable); @@ -1366,6 +1556,7 @@ int main(int const argCount, const char* argv[]) FIO_setTargetCBlockSize(prefs, targetCBlockSize); FIO_setSrcSizeHint(prefs, srcSizeHint); FIO_setLiteralCompressionMode(prefs, literalCompressionMode); + FIO_setSparseWrite(prefs, 0); if (adaptMin > cLevel) cLevel = adaptMin; if (adaptMax < cLevel) cLevel = adaptMax; @@ -1374,32 +1565,29 @@ int main(int const argCount, const char* argv[]) assert(ZSTD_NB_STRATEGIES == strategyBounds.upperBound); (void)strategyBounds; } - if (showDefaultCParams) { + if (showDefaultCParams || g_displayLevel >= 4) { size_t fileNb; for (fileNb = 0; fileNb < (size_t)filenames->tableSize; fileNb++) { - unsigned long long fileSize = UTIL_getFileSize(filenames->fileNames[fileNb]); - const size_t dictSize = dictFileName != NULL ? (size_t)UTIL_getFileSize(dictFileName) : 0; - const ZSTD_compressionParameters cParams = ZSTD_getCParams(cLevel, fileSize, dictSize); - if (fileSize != UTIL_FILESIZE_UNKNOWN) DISPLAY("%s (%u bytes)\n", filenames->fileNames[fileNb], (unsigned)fileSize); - else DISPLAY("%s (src size unknown)\n", filenames->fileNames[fileNb]); - DISPLAY(" - windowLog : %u\n", cParams.windowLog); - DISPLAY(" - chainLog : %u\n", cParams.chainLog); - DISPLAY(" - hashLog : %u\n", cParams.hashLog); - DISPLAY(" - searchLog : %u\n", cParams.searchLog); - DISPLAY(" - minMatch : %u\n", cParams.minMatch); - DISPLAY(" - targetLength : %u\n", cParams.targetLength); - assert(cParams.strategy < ZSTD_NB_STRATEGIES + 1); - DISPLAY(" - strategy : %s (%u)\n", ZSTD_strategyMap[(int)cParams.strategy], (unsigned)cParams.strategy); + if (showDefaultCParams) + printDefaultCParams(filenames->fileNames[fileNb], dictFileName, cLevel); + if (g_displayLevel >= 4) + printActualCParams(filenames->fileNames[fileNb], dictFileName, cLevel, &compressionParams); } } + if (g_displayLevel >= 4) + FIO_displayCompressionParameters(prefs); if ((filenames->tableSize==1) && outFileName) operationResult = FIO_compressFilename(fCtx, prefs, outFileName, filenames->fileNames[0], dictFileName, cLevel, compressionParams); else operationResult = FIO_compressMultipleFilenames(fCtx, prefs, filenames->fileNames, outMirroredDirName, outDirName, outFileName, suffix, dictFileName, cLevel, compressionParams); #else - (void)contentSize; (void)suffix; (void)adapt; (void)rsyncable; (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; (void)ZSTD_strategyMap; (void)useRowMatchFinder; /* not used when ZSTD_NOCOMPRESS set */ - DISPLAY("Compression not supported \n"); + /* these variables are only used when compression mode is enabled */ + (void)contentSize; (void)suffix; (void)adapt; (void)rsyncable; + (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; + (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; + (void)ZSTD_strategyMap; (void)useRowMatchFinder; (void)cType; + DISPLAYLEVEL(1, "Compression not supported \n"); #endif } else { /* decompression or test */ #ifndef ZSTD_NODECOMPRESS @@ -1409,7 +1597,7 @@ int main(int const argCount, const char* argv[]) operationResult = FIO_decompressMultipleFilenames(fCtx, prefs, filenames->fileNames, outMirroredDirName, outDirName, outFileName, dictFileName); } #else - DISPLAY("Decompression not supported \n"); + DISPLAYLEVEL(1, "Decompression not supported \n"); #endif } diff --git a/src/dependencies/zstd-1.5.0/programs/zstdcli_trace.c b/src/dependencies/zstd-1.5.4/programs/zstdcli_trace.c similarity index 98% rename from src/dependencies/zstd-1.5.0/programs/zstdcli_trace.c rename to src/dependencies/zstd-1.5.4/programs/zstdcli_trace.c index b3b977f..35075a5 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstdcli_trace.c +++ b/src/dependencies/zstd-1.5.4/programs/zstdcli_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/programs/zstdcli_trace.h b/src/dependencies/zstd-1.5.4/programs/zstdcli_trace.h similarity index 91% rename from src/dependencies/zstd-1.5.0/programs/zstdcli_trace.h rename to src/dependencies/zstd-1.5.4/programs/zstdcli_trace.h index 38c27dc..9c135d3 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstdcli_trace.h +++ b/src/dependencies/zstd-1.5.4/programs/zstdcli_trace.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/programs/zstdgrep b/src/dependencies/zstd-1.5.4/programs/zstdgrep similarity index 100% rename from src/dependencies/zstd-1.5.0/programs/zstdgrep rename to src/dependencies/zstd-1.5.4/programs/zstdgrep diff --git a/src/dependencies/zstd-1.5.4/programs/zstdgrep.1 b/src/dependencies/zstd-1.5.4/programs/zstdgrep.1 new file mode 100644 index 0000000..77d29b4 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/zstdgrep.1 @@ -0,0 +1,17 @@ +.TH "ZSTDGREP" "1" "February 2023" "zstd 1.5.4" "User Commands" +.SH "NAME" +\fBzstdgrep\fR \- print lines matching a pattern in zstandard\-compressed files +.SH "SYNOPSIS" +\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \|\.\|\.\|\.] +.SH "DESCRIPTION" +\fBzstdgrep\fR runs \fBgrep\fR(1) on files, or \fBstdin\fR if no files argument is given, after decompressing them with \fBzstdcat\fR(1)\. +.P +The \fIgrep\-flags\fR and \fIpattern\fR arguments are passed on to \fBgrep\fR(1)\. If an \fB\-e\fR flag is found in the \fIgrep\-flags\fR, \fBzstdgrep\fR will not look for a \fIpattern\fR argument\. +.P +Note that modern \fBgrep\fR alternatives such as \fBripgrep\fR (\fBrg\fR(1)) support \fBzstd\fR\-compressed files out of the box, and can prove better alternatives than \fBzstdgrep\fR notably for unsupported complex pattern searches\. Note though that such alternatives may also feature some minor command line differences\. +.SH "EXIT STATUS" +In case of missing arguments or missing pattern, 1 will be returned, otherwise 0\. +.SH "SEE ALSO" +\fBzstd\fR(1) +.SH "AUTHORS" +Thomas Klausner \fIwiz@NetBSD\.org\fR diff --git a/src/dependencies/zstd-1.5.4/programs/zstdgrep.1.md b/src/dependencies/zstd-1.5.4/programs/zstdgrep.1.md new file mode 100644 index 0000000..6370a81 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/zstdgrep.1.md @@ -0,0 +1,30 @@ +zstdgrep(1) -- print lines matching a pattern in zstandard-compressed files +============================================================================ + +SYNOPSIS +-------- + +`zstdgrep` [] [--] [ ...] + + +DESCRIPTION +----------- +`zstdgrep` runs `grep`(1) on files, or `stdin` if no files argument is given, after decompressing them with `zstdcat`(1). + +The and arguments are passed on to `grep`(1). If an `-e` flag is found in the , `zstdgrep` will not look for a argument. + +Note that modern `grep` alternatives such as `ripgrep` (`rg`(1)) support `zstd`-compressed files out of the box, +and can prove better alternatives than `zstdgrep` notably for unsupported complex pattern searches. +Note though that such alternatives may also feature some minor command line differences. + +EXIT STATUS +----------- +In case of missing arguments or missing pattern, 1 will be returned, otherwise 0. + +SEE ALSO +-------- +`zstd`(1) + +AUTHORS +------- +Thomas Klausner diff --git a/src/dependencies/zstd-1.5.4/programs/zstdless b/src/dependencies/zstd-1.5.4/programs/zstdless new file mode 100755 index 0000000..17726a4 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/zstdless @@ -0,0 +1,8 @@ +#!/bin/sh + +zstd=${ZSTD:-zstd} + +# TODO: Address quirks and bugs tied to old versions of less, provide a mechanism to pass flags directly to zstd + +export LESSOPEN="|-${zstd} -cdfq %s" +exec less "$@" diff --git a/src/dependencies/zstd-1.5.4/programs/zstdless.1 b/src/dependencies/zstd-1.5.4/programs/zstdless.1 new file mode 100644 index 0000000..6c82b9c --- /dev/null +++ b/src/dependencies/zstd-1.5.4/programs/zstdless.1 @@ -0,0 +1,9 @@ +.TH "ZSTDLESS" "1" "February 2023" "zstd 1.5.4" "User Commands" +.SH "NAME" +\fBzstdless\fR \- view zstandard\-compressed files +.SH "SYNOPSIS" +\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \|\.\|\.\|\.] +.SH "DESCRIPTION" +\fBzstdless\fR runs \fBless\fR(1) on files or stdin, if no \fIfile\fR argument is given, after decompressing them with \fBzstdcat\fR(1)\. +.SH "SEE ALSO" +\fBzstd\fR(1) diff --git a/src/dependencies/zstd-1.5.0/programs/zstdless.1.md b/src/dependencies/zstd-1.5.4/programs/zstdless.1.md similarity index 53% rename from src/dependencies/zstd-1.5.0/programs/zstdless.1.md rename to src/dependencies/zstd-1.5.4/programs/zstdless.1.md index d91d48a..67c1c76 100644 --- a/src/dependencies/zstd-1.5.0/programs/zstdless.1.md +++ b/src/dependencies/zstd-1.5.4/programs/zstdless.1.md @@ -4,13 +4,13 @@ zstdless(1) -- view zstandard-compressed files SYNOPSIS -------- -`zstdless` [*flags*] [_file_ ...] +`zstdless` [] [ ...] DESCRIPTION ----------- -`zstdless` runs `less (1)` on files or stdin, if no files argument is given, after decompressing them with `zstdcat (1)`. +`zstdless` runs `less`(1) on files or stdin, if no argument is given, after decompressing them with `zstdcat`(1). SEE ALSO -------- -`zstd (1)` +`zstd`(1) diff --git a/src/dependencies/zstd-1.5.0/tests/.gitignore b/src/dependencies/zstd-1.5.4/tests/.gitignore similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/.gitignore rename to src/dependencies/zstd-1.5.4/tests/.gitignore index 9a6939a..fcb865d 100644 --- a/src/dependencies/zstd-1.5.0/tests/.gitignore +++ b/src/dependencies/zstd-1.5.4/tests/.gitignore @@ -12,6 +12,7 @@ zstreamtest zstreamtest32 zstreamtest_asan zstreamtest_tsan +zstreamtest_ubsan zstreamtest-dll datagen paramgrill diff --git a/src/dependencies/zstd-1.5.0/tests/DEPRECATED-test-zstd-speed.py b/src/dependencies/zstd-1.5.4/tests/DEPRECATED-test-zstd-speed.py similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/DEPRECATED-test-zstd-speed.py rename to src/dependencies/zstd-1.5.4/tests/DEPRECATED-test-zstd-speed.py index 665e0a7..71d75b8 100755 --- a/src/dependencies/zstd-1.5.0/tests/DEPRECATED-test-zstd-speed.py +++ b/src/dependencies/zstd-1.5.4/tests/DEPRECATED-test-zstd-speed.py @@ -2,7 +2,7 @@ # THIS BENCHMARK IS BEING REPLACED BY automated-bencmarking.py # ################################################################ -# Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/Makefile b/src/dependencies/zstd-1.5.4/tests/Makefile similarity index 80% rename from src/dependencies/zstd-1.5.0/tests/Makefile rename to src/dependencies/zstd-1.5.4/tests/Makefile index 8555300..3eed19e 100644 --- a/src/dependencies/zstd-1.5.0/tests/Makefile +++ b/src/dependencies/zstd-1.5.4/tests/Makefile @@ -1,5 +1,6 @@ + # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -19,46 +20,43 @@ # zstreamtest32: Same as zstreamtest, but forced to compile in 32-bits mode # ########################################################################## -ZSTDDIR = ../lib +LIBZSTD = ../lib + +ZSTD_LEGACY_SUPPORT ?= 0 + +DEBUGLEVEL ?= 2 +export DEBUGLEVEL # transmit value to sub-makefiles + +include $(LIBZSTD)/libzstd.mk + +ZSTDDIR = $(LIBZSTD) PRGDIR = ../programs PYTHON ?= python3 TESTARTEFACT := versionsTest -DEBUGLEVEL ?= 2 -export DEBUGLEVEL # transmit value to sub-makefiles -DEBUGFLAGS = -g -DDEBUGLEVEL=$(DEBUGLEVEL) +DEBUGFLAGS += -g -Wno-c++-compat CPPFLAGS += -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(PRGDIR) \ - -DZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY=1 -ifeq ($(OS),Windows_NT) # MinGW assumed -CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting -endif -CFLAGS ?= -O3 -CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ - -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ - -Wstrict-prototypes -Wundef \ - -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ - -Wredundant-decls -Wmissing-prototypes -Wno-deprecated-declarations -CFLAGS += $(DEBUGFLAGS) -CPPFLAGS += $(MOREFLAGS) + -DZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY=1 - -ZSTDCOMMON_FILES := $(ZSTDDIR)/common/*.c -ZSTDCOMP_FILES := $(ZSTDDIR)/compress/*.c -ZSTDDECOMP_FILES := $(ZSTDDIR)/decompress/*.c +ZSTDCOMMON_FILES := $(sort $(ZSTD_COMMON_FILES)) +ZSTDCOMP_FILES := $(sort $(ZSTD_COMPRESS_FILES)) +ZSTDDECOMP_FILES := $(sort $(ZSTD_DECOMPRESS_FILES)) ZSTD_FILES := $(ZSTDDECOMP_FILES) $(ZSTDCOMMON_FILES) $(ZSTDCOMP_FILES) -ZDICT_FILES := $(ZSTDDIR)/dictBuilder/*.c +ZDICT_FILES := $(sort $(ZSTD_DICTBUILDER_FILES)) -ZSTD_F1 := $(wildcard $(ZSTD_FILES)) +ZSTD_F1 := $(sort $(wildcard $(ZSTD_FILES))) ZSTD_OBJ1 := $(subst $(ZSTDDIR)/common/,zstdm_,$(ZSTD_F1)) ZSTD_OBJ2 := $(subst $(ZSTDDIR)/compress/,zstdc_,$(ZSTD_OBJ1)) ZSTD_OBJ3 := $(subst $(ZSTDDIR)/decompress/,zstdd_,$(ZSTD_OBJ2)) -ZSTD_OBJECTS := $(ZSTD_OBJ3:.c=.o) +ZSTD_OBJ4 := $(ZSTD_OBJ3:.c=.o) +ZSTD_OBJECTS := $(ZSTD_OBJ4:.S=.o) ZSTDMT_OBJ1 := $(subst $(ZSTDDIR)/common/,zstdmt_m_,$(ZSTD_F1)) ZSTDMT_OBJ2 := $(subst $(ZSTDDIR)/compress/,zstdmt_c_,$(ZSTDMT_OBJ1)) ZSTDMT_OBJ3 := $(subst $(ZSTDDIR)/decompress/,zstdmt_d_,$(ZSTDMT_OBJ2)) -ZSTDMT_OBJECTS := $(ZSTDMT_OBJ3:.c=.o) +ZSTDMT_OBJ4 := $(ZSTDMT_OBJ3:.c=.o) +ZSTDMT_OBJECTS := $(ZSTDMT_OBJ4:.S=.o) # Define *.exe as extension for Windows systems ifneq (,$(filter Windows%,$(OS))) @@ -119,6 +117,9 @@ zstdc_%.o : $(ZSTDDIR)/compress/%.c zstdd_%.o : $(ZSTDDIR)/decompress/%.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ +zstdd_%.o : $(ZSTDDIR)/decompress/%.S + $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ + zstdmt%.o : CPPFLAGS += $(MULTITHREAD_CPP) zstdmt_m_%.o : $(ZSTDDIR)/common/%.c @@ -130,14 +131,20 @@ zstdmt_c_%.o : $(ZSTDDIR)/compress/%.c zstdmt_d_%.o : $(ZSTDDIR)/decompress/%.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ +zstdmt_d_%.o : $(ZSTDDIR)/decompress/%.S + $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ + +FULLBENCHS := fullbench fullbench32 +CLEAN += $(FULLBENCHS) fullbench32: CPPFLAGS += -m32 -fullbench fullbench32 : CPPFLAGS += $(MULTITHREAD_CPP) -Wno-deprecated-declarations -fullbench fullbench32 : LDFLAGS += $(MULTITHREAD_LD) -fullbench fullbench32 : DEBUGFLAGS = -DNDEBUG # turn off assert() for speed measurements -fullbench fullbench32 : $(ZSTD_FILES) -fullbench fullbench32 : $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PRGDIR)/benchfn.c fullbench.c +$(FULLBENCHS) : CPPFLAGS += $(MULTITHREAD_CPP) -Wno-deprecated-declarations +$(FULLBENCHS) : LDFLAGS += $(MULTITHREAD_LD) +$(FULLBENCHS) : DEBUGFLAGS = -DNDEBUG # turn off assert() for speed measurements +$(FULLBENCHS) : $(ZSTD_FILES) +$(FULLBENCHS) : $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PRGDIR)/benchfn.c fullbench.c $(LINK.c) $^ -o $@$(EXT) +CLEAN += fullbench-lib fullbench-lib : CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ fullbench-lib : $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PRGDIR)/benchfn.c $(ZSTDDIR)/libzstd.a fullbench.c $(LINK.c) $^ -o $@$(EXT) @@ -147,6 +154,7 @@ fullbench-dll: $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/benchfn.c $(PRGDIR # $(CC) $(FLAGS) $(filter %.c,$^) -o $@$(EXT) -DZSTD_DLL_IMPORT=1 $(ZSTDDIR)/dll/libzstd.dll $(LINK.c) $^ $(LDLIBS) -o $@$(EXT) +CLEAN += fuzzer fuzzer32 fuzzer : CPPFLAGS += $(MULTITHREAD_CPP) -Wno-deprecated-declarations fuzzer : LDFLAGS += $(MULTITHREAD_LD) fuzzer : $(ZSTDMT_OBJECTS) @@ -160,7 +168,8 @@ fuzzer32 : $(ZSTD_FILES) fuzzer-dll : $(ZSTDDIR)/common/xxhash.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PRGDIR)/datagen.c fuzzer.c $(CC) $(CPPFLAGS) $(CFLAGS) $(filter %.c,$^) $(LDFLAGS) -o $@$(EXT) -ZSTREAM_LOCAL_FILES := $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c seqgen.c zstreamtest.c +CLEAN += zstreamtest zstreamtest32 +ZSTREAM_LOCAL_FILES := $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c seqgen.c zstreamtest.c external_matchfinder.c ZSTREAM_PROPER_FILES := $(ZDICT_FILES) $(ZSTREAM_LOCAL_FILES) ZSTREAMFILES := $(ZSTD_FILES) $(ZSTREAM_PROPER_FILES) zstreamtest32 : CFLAGS += -m32 @@ -171,42 +180,58 @@ zstreamtest32 : $(ZSTREAMFILES) zstreamtest zstreamtest32 : $(LINK.c) $^ -o $@$(EXT) +CLEAN += zstreamtest_asan zstreamtest_asan : CFLAGS += -fsanitize=address zstreamtest_asan : $(ZSTREAMFILES) $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) +CLEAN += zstreamtest_tsan zstreamtest_tsan : CFLAGS += -fsanitize=thread zstreamtest_tsan : $(ZSTREAMFILES) $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) +CLEAN += zstreamtest_ubsan +zstreamtest_ubsan : CFLAGS += -fsanitize=undefined +zstreamtest_ubsan : $(ZSTREAMFILES) + $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) + # note : broken : requires symbols unavailable from dynamic library zstreamtest-dll : $(ZSTDDIR)/common/xxhash.c # xxh symbols not exposed from dll zstreamtest-dll : $(ZSTREAM_LOCAL_FILES) $(CC) $(CPPFLAGS) $(CFLAGS) $(filter %.c,$^) $(LDFLAGS) -o $@$(EXT) +CLEAN += paramgrill paramgrill : DEBUGFLAGS = # turn off debug for speed measurements paramgrill : LDLIBS += -lm paramgrill : $(ZSTD_FILES) $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PRGDIR)/benchfn.c $(PRGDIR)/benchzstd.c $(PRGDIR)/datagen.c paramgrill.c +CLEAN += datagen datagen : $(PRGDIR)/datagen.c datagencli.c $(LINK.c) $^ -o $@$(EXT) +CLEAN += roundTripCrash roundTripCrash: CFLAGS += $(MULTITHREAD) roundTripCrash : $(ZSTD_OBJECTS) roundTripCrash.c +CLEAN += longmatch longmatch : $(ZSTD_OBJECTS) longmatch.c +CLEAN += bigdict bigdict: CFLAGS += $(MULTITHREAD) bigdict: $(ZSTDMT_OBJECTS) $(PRGDIR)/datagen.c bigdict.c +CLEAN += invalidDictionaries invalidDictionaries : $(ZSTD_OBJECTS) invalidDictionaries.c -legacy : CPPFLAGS += -I$(ZSTDDIR)/legacy -DZSTD_LEGACY_SUPPORT=4 -legacy : $(ZSTD_FILES) $(wildcard $(ZSTDDIR)/legacy/*.c) legacy.c +CLEAN += legacy +legacy : CPPFLAGS += -I$(ZSTDDIR)/legacy -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=4 +legacy : $(ZSTD_FILES) $(sort $(wildcard $(ZSTDDIR)/legacy/*.c)) legacy.c +CLEAN += decodecorpus decodecorpus : LDLIBS += -lm decodecorpus : $(filter-out zstdc_zstd_compress.o, $(ZSTD_OBJECTS)) $(ZDICT_FILES) $(PRGDIR)/util.c $(PRGDIR)/timefn.c decodecorpus.c +CLEAN += poolTests poolTests : $(PRGDIR)/util.c $(PRGDIR)/timefn.c poolTests.c $(ZSTDDIR)/common/pool.c $(ZSTDDIR)/common/threading.c $(ZSTDDIR)/common/zstd_common.c $(ZSTDDIR)/common/error_private.c $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) @@ -218,7 +243,8 @@ versionsTest: clean automated_benchmarking: clean $(PYTHON) automated_benchmarking.py -# make checkTag +# make checkTag : check that release tag corresponds to release version +CLEAN += checkTag checkTag.o : $(ZSTDDIR)/zstd.h .PHONY: clean @@ -227,28 +253,22 @@ clean: $(MAKE) -C $(PRGDIR) clean $(RM) -fR $(TESTARTEFACT) $(RM) -rf tmp* # some test directories are named tmp* - $(RM) core *.o *.tmp result* *.gcda dictionary *.zst \ + $(RM) $(CLEAN) core *.o *.tmp result* *.gcda dictionary *.zst \ $(PRGDIR)/zstd$(EXT) $(PRGDIR)/zstd32$(EXT) \ - fullbench$(EXT) fullbench32$(EXT) \ - fullbench-lib$(EXT) fullbench-dll$(EXT) \ - fuzzer$(EXT) fuzzer32$(EXT) \ - fuzzer-dll$(EXT) zstreamtest-dll$(EXT) \ - zstreamtest$(EXT) zstreamtest32$(EXT) \ - datagen$(EXT) paramgrill$(EXT) roundTripCrash$(EXT) longmatch$(EXT) \ - symbols$(EXT) invalidDictionaries$(EXT) legacy$(EXT) poolTests$(EXT) \ - decodecorpus$(EXT) checkTag$(EXT) bigdict$(EXT) + fullbench-dll$(EXT) fuzzer-dll$(EXT) zstreamtest-dll$(EXT) @echo Cleaning completed #---------------------------------------------------------------------------------- -# valgrind tests are validated only for some posix platforms +# valgrind tests validated only for some posix platforms #---------------------------------------------------------------------------------- UNAME := $(shell uname) -ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS)) +ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS AIX)) HOST_OS = POSIX -valgrindTest: VALGRIND = valgrind --leak-check=full --show-leak-kinds=all --error-exitcode=1 -valgrindTest: zstd datagen fuzzer fullbench +.PHONY: test-valgrind +test-valgrind: VALGRIND = valgrind --leak-check=full --show-leak-kinds=all --error-exitcode=1 +test-valgrind: zstd datagen fuzzer fullbench @echo "\n ---- valgrind tests : memory analyzer ----" $(VALGRIND) ./datagen -g50M > $(VOID) $(VALGRIND) $(PRGDIR)/zstd ; if [ $$? -eq 0 ] ; then echo "zstd without argument should have failed"; false; fi @@ -257,13 +277,12 @@ valgrindTest: zstd datagen fuzzer fullbench ./datagen -g2930KB | $(VALGRIND) $(PRGDIR)/zstd -5 -vf - -o tmp $(VALGRIND) $(PRGDIR)/zstd -vdf tmp -c > $(VOID) ./datagen -g64MB | $(VALGRIND) $(PRGDIR)/zstd -vf - -c > $(VOID) - @rm tmp + $(RM) tmp $(VALGRIND) ./fuzzer -T1mn -t1 $(VALGRIND) ./fullbench -i1 endif - ifneq (,$(filter MINGW% MSYS%,$(UNAME))) HOST_OS = MSYS endif @@ -294,7 +313,7 @@ check: shortest fuzztest: test-fuzzer test-zstream test-decodecorpus .PHONY: test -test: test-zstd test-fullbench test-fuzzer test-zstream test-invalidDictionaries test-legacy test-decodecorpus +test: test-zstd test-fullbench test-fuzzer test-zstream test-invalidDictionaries test-legacy test-decodecorpus test-cli-tests ifeq ($(QEMU_SYS),) test: test-pool endif @@ -303,9 +322,9 @@ endif test32: test-zstd32 test-fullbench32 test-fuzzer32 test-zstream32 .PHONY: test-all -test-all: test test32 valgrindTest test-decodecorpus-cli +test-all: test test32 test-decodecorpus-cli -.PHONY: test-zstd test-zstd32 test-zstd-nolegacy test-zstdgrep +.PHONY: test-zstd test-zstd32 test-zstd-nolegacy test-zstd: ZSTD = $(PRGDIR)/zstd test-zstd: zstd @@ -319,29 +338,42 @@ test-zstd test-zstd32 test-zstd-nolegacy: datagen file $(ZSTD) EXE_PREFIX="$(QEMU_SYS)" ZSTD_BIN="$(ZSTD)" DATAGEN_BIN=./datagen ./playTests.sh $(ZSTDRTTEST) +.PHONY: test-cli-tests +test-cli-tests: ZSTD = $(PRGDIR)/zstd +test-cli-tests: zstd datagen + file $(ZSTD) + ./cli-tests/run.py --exec-prefix="$(QEMU_SYS)" --zstd="$(ZSTD)" --datagen=./datagen + +.PHONY: test-fullbench test-fullbench: fullbench datagen $(QEMU_SYS) ./fullbench -i1 $(QEMU_SYS) ./fullbench -i1 -P0 +.PHONY: test-fullbench32 test-fullbench32: fullbench32 datagen $(QEMU_SYS) ./fullbench32 -i1 $(QEMU_SYS) ./fullbench32 -i1 -P0 +.PHONY: test-fuzzer test-fuzzer: fuzzer $(QEMU_SYS) ./fuzzer -v $(FUZZERTEST) $(FUZZER_FLAGS) +# Note : this test presumes `fuzzer` will be built +.PHONY: test-fuzzer-stackmode test-fuzzer-stackmode: MOREFLAGS += -DZSTD_HEAPMODE=0 test-fuzzer-stackmode: test-fuzzer +.PHONY: test-fuzzer32 test-fuzzer32: fuzzer32 $(QEMU_SYS) ./fuzzer32 -v $(FUZZERTEST) $(FUZZER_FLAGS) +.PHONY: test-zstream test-zstream: zstreamtest $(QEMU_SYS) ./zstreamtest -v $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS) $(QEMU_SYS) ./zstreamtest --newapi -t1 $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS) test-zstream32: zstreamtest32 - $(QEMU_SYS) ./zstreamtest32 $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS) + $(QEMU_SYS) ./zstreamtest32 -v $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS) test-longmatch: longmatch $(QEMU_SYS) ./longmatch diff --git a/src/dependencies/zstd-1.5.0/tests/README.md b/src/dependencies/zstd-1.5.4/tests/README.md similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/README.md rename to src/dependencies/zstd-1.5.4/tests/README.md index cd255e9..2cf0e76 100644 --- a/src/dependencies/zstd-1.5.0/tests/README.md +++ b/src/dependencies/zstd-1.5.4/tests/README.md @@ -45,7 +45,7 @@ optional arguments: -h, --help show this help message and exit --directory DIRECTORY directory with files to benchmark - --levels LEVELS levels to test eg ('1,2,3') + --levels LEVELS levels to test e.g. ('1,2,3') --iterations ITERATIONS number of benchmark iterations to run --emails EMAILS email addresses of people who will be alerted upon @@ -56,7 +56,7 @@ optional arguments: --mode MODE 'fastmode', 'onetime', 'current', or 'continuous' (see README.md for details) --dict DICT filename of dictionary to use (when set, this - dictioanry will be used to compress the files provided + dictionary will be used to compress the files provided inside --directory) ``` @@ -70,7 +70,7 @@ After `sleepTime` (an optional parameter, default 300 seconds) seconds the scrip If a new commit is found it is compiled and a speed benchmark for this commit is performed. The results of the speed benchmark are compared to the previous results. If compression or decompression speed for one of zstd levels is lower than `lowerLimit` (an optional parameter, default 0.98) the speed benchmark is restarted. -If second results are also lower than `lowerLimit` the warning e-mail is send to recipients from the list (the `emails` parameter). +If second results are also lower than `lowerLimit` the warning e-mail is sent to recipients from the list (the `emails` parameter). Additional remarks: - To be sure that speed results are accurate the script should be run on a "stable" target system with no other jobs running in parallel @@ -168,7 +168,7 @@ Full list of arguments can use all --zstd parameter names and 'cParams' as a shorthand for all parameters used in ZSTD_compressionParameters (Default: display all params available) -P# : generated sample compressibility (when no file is provided) - -t# : Caps runtime of operation in seconds (default : 99999 seconds (about 27 hours )) + -t# : Caps runtime of operation in seconds (default: 99999 seconds (about 27 hours)) -v : Prints Benchmarking output -D : Next argument dictionary file -s : Benchmark all files separately diff --git a/src/dependencies/zstd-1.5.0/tests/automated_benchmarking.py b/src/dependencies/zstd-1.5.4/tests/automated_benchmarking.py similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/automated_benchmarking.py rename to src/dependencies/zstd-1.5.4/tests/automated_benchmarking.py index 458bda4..153e7db 100644 --- a/src/dependencies/zstd-1.5.0/tests/automated_benchmarking.py +++ b/src/dependencies/zstd-1.5.4/tests/automated_benchmarking.py @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -87,7 +87,7 @@ def clone_and_build(build): git clone {github_url} zstd-{user}-{sha} && cd zstd-{user}-{sha} && {checkout_command} - make && + make -j && cd ../ """.format( user=build["user"], @@ -100,7 +100,7 @@ def clone_and_build(build): ) return "zstd-{user}-{sha}/zstd".format(user=build["user"], sha=build["hash"]) else: - os.system("cd ../ && make && cd tests") + os.system("cd ../ && make -j && cd tests") return "../zstd" @@ -112,9 +112,9 @@ def parse_benchmark_output(output): def benchmark_single(executable, level, filename): return parse_benchmark_output(( subprocess.run( - [executable, "-qb{}".format(level), filename], stderr=subprocess.PIPE + [executable, "-qb{}".format(level), filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) - .stderr.decode("utf-8") + .stdout.decode("utf-8") .split(" ") )) @@ -145,7 +145,7 @@ def benchmark(build, filenames, levels, iterations): def benchmark_dictionary_single(executable, filenames_directory, dictionary_filename, level, iterations): cspeeds, dspeeds = [], [] for _ in range(iterations): - output = subprocess.run([executable, "-qb{}".format(level), "-D", dictionary_filename, "-r", filenames_directory], stderr=subprocess.PIPE).stderr.decode("utf-8").split(" ") + output = subprocess.run([executable, "-qb{}".format(level), "-D", dictionary_filename, "-r", filenames_directory], stdout=subprocess.PIPE).stdout.decode("utf-8").split(" ") cspeed, dspeed = parse_benchmark_output(output) cspeeds.append(cspeed) dspeeds.append(dspeed) @@ -291,12 +291,12 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--directory", help="directory with files to benchmark", default="golden-compression") - parser.add_argument("--levels", help="levels to test eg ('1,2,3')", default="1") + parser.add_argument("--levels", help="levels to test e.g. ('1,2,3')", default="1") parser.add_argument("--iterations", help="number of benchmark iterations to run", default="1") parser.add_argument("--emails", help="email addresses of people who will be alerted upon regression. Only for continuous mode", default=None) parser.add_argument("--frequency", help="specifies the number of seconds to wait before each successive check for new PRs in continuous mode", default=DEFAULT_MAX_API_CALL_FREQUENCY_SEC) parser.add_argument("--mode", help="'fastmode', 'onetime', 'current', or 'continuous' (see README.md for details)", default="current") - parser.add_argument("--dict", help="filename of dictionary to use (when set, this dictioanry will be used to compress the files provided inside --directory)", default=None) + parser.add_argument("--dict", help="filename of dictionary to use (when set, this dictionary will be used to compress the files provided inside --directory)", default=None) args = parser.parse_args() filenames = args.directory diff --git a/src/dependencies/zstd-1.5.0/tests/bigdict.c b/src/dependencies/zstd-1.5.4/tests/bigdict.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/bigdict.c rename to src/dependencies/zstd-1.5.4/tests/bigdict.c index fb08925..ff2bb2d 100644 --- a/src/dependencies/zstd-1.5.0/tests/bigdict.c +++ b/src/dependencies/zstd-1.5.4/tests/bigdict.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/checkTag.c b/src/dependencies/zstd-1.5.4/tests/checkTag.c similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/checkTag.c rename to src/dependencies/zstd-1.5.4/tests/checkTag.c index f6c5e97..26871ed 100644 --- a/src/dependencies/zstd-1.5.0/tests/checkTag.c +++ b/src/dependencies/zstd-1.5.4/tests/checkTag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/tests/check_size.py b/src/dependencies/zstd-1.5.4/tests/check_size.py new file mode 100755 index 0000000..028b0a9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/check_size.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# ################################################################ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# You may select, at your option, one of the above-listed licenses. +# ################################################################ + +import os +import subprocess +import sys + +if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} FILE SIZE_LIMIT") + sys.exit(1) + +file = sys.argv[1] +limit = int(sys.argv[2]) + +if not os.path.exists(file): + print(f"{file} does not exist") + sys.exit(1) + +size = os.path.getsize(file) + +if size > limit: + print(f"file {file} is {size} bytes, which is greater than the limit of {limit} bytes") + sys.exit(1) diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/.gitignore b/src/dependencies/zstd-1.5.4/tests/cli-tests/.gitignore new file mode 100644 index 0000000..0ad01b2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/.gitignore @@ -0,0 +1,6 @@ +!bin/ +!datagen +!zstdcat + +scratch/ +bin/symlinks diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/README.md b/src/dependencies/zstd-1.5.4/tests/cli-tests/README.md new file mode 100644 index 0000000..7ca07c3 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/README.md @@ -0,0 +1,258 @@ +# CLI tests + +The CLI tests are focused on testing the zstd CLI. +They are intended to be simple tests that the CLI and arguments work as advertised. +They are not intended to test the library, only the code in `programs/`. +The library will get incidental coverage, but if you find yourself trying to trigger a specific condition in the library, this is the wrong tool. + +## Test runner usage + +The test runner `run.py` will run tests against the in-tree build of `zstd` and `datagen` by default. Which means that `zstd` and `datagen` must be built. + +The `zstd` binary used can be passed with `--zstd /path/to/zstd`. +Additionally, to run `zstd` through a tool like `valgrind` or `qemu`, set the `--exec-prefix 'valgrind -q'` flag. + +Similarly, the `--datagen`, and `--zstdgrep` flags can be set to specify +the paths to their respective binaries. However, these tools do not use +the `EXEC_PREFIX`. + +Each test executes in its own scratch directory under `scratch/test/name`. E.g. `scratch/basic/help.sh/`. Normally these directories are removed after the test executes. However, the `--preserve` flag will preserve these directories after execution, and save the tests exit code, stdout, and stderr in the scratch directory to `exit`, `stderr`, and `stdout` respectively. This can be useful for debugging/editing a test and updating the expected output. + +### Running all the tests + +By default the test runner `run.py` will run all the tests, and report the results. + +Examples: + +``` +./run.py +./run.py --preserve +./run.py --zstd ../../build/programs/zstd --datagen ../../build/tests/datagen +``` + +### Running specific tests + +A set of test names can be passed to the test runner `run.py` to only execute those tests. +This can be useful for writing or debugging a test, especially with `--preserve`. + +The test name can either be the path to the test file, or the test name, which is the path relative to the test directory. + +Examples: + +``` +./run.py basic/help.sh +./run.py --preserve basic/help.sh basic/version.sh +./run.py --preserve --verbose basic/help.sh +``` + +### Updating exact output + +If a test is failing because a `.stderr.exact` or `.stdout.exact` no longer matches, you can re-run the tests with `--set-exact-output` and the correct output will be written. + +Example: +``` +./run.py --set-exact-output +./run.py basic/help.sh --set-exact-output +``` + +## Writing a test + +Test cases are arbitrary executables, and can be written in any language, but are generally shell scripts. +After the script executes, the exit code, stderr, and stdout are compared against the expectations. + +Each test is run in a clean directory that the test can use for intermediate files. This directory will be cleaned up at the end of the test, unless `--preserve` is passed to the test runner. Additionally, the `setup` script can prepare the directory before the test runs. + +### Calling zstd, utilities, and environment variables + +The `$PATH` for tests is prepended with the `bin/` sub-directory, which contains helper scripts for ease of testing. +The `zstd` binary will call the zstd binary specified by `run.py` with the correct `$EXEC_PREFIX`. +Similarly, `datagen`, `unzstd`, `zstdgrep`, `zstdcat`, etc, are provided. + +Helper utilities like `cmp_size`, `println`, and `die` are provided here too. See their scripts for details. + +Common shell script libraries are provided under `common/`, with helper variables and functions. They can be sourced with `source "$COMMON/library.sh`. + +Lastly, environment variables are provided for testing, which can be listed when calling `run.py` with `--verbose`. +They are generally used by the helper scripts in `bin/` to coordinate everything. + +### Basic test case + +When executing your `$TEST` executable, by default the exit code is expected to be `0`. However, you can provide an alternate expected exit code in a `$TEST.exit` file. + +When executing your `$TEST` executable, by default the expected stderr and stdout are empty. However, you can override the default by providing one of three files: + +* `$TEST.{stdout,stderr}.exact` +* `$TEST.{stdout,stderr}.glob` +* `$TEST.{stdout,stderr}.ignore` + +If you provide a `.exact` file, the output is expected to exactly match, byte-for-byte. + +If you provide a `.glob` file, the output is expected to match the expected file, where each line is interpreted as a glob syntax. Additionally, a line containing only `...` matches all lines until the next expected line matches. + +If you provide a `.ignore` file, the output is ignored. + +#### Passing examples + +All these examples pass. + +Exit 1, and change the expectation to be 1. + +``` +exit-1.sh +--- +#!/bin/sh +exit 1 +--- + +exit-1.sh.exit +--- +1 +--- +``` + +Check the stdout output exactly matches. + +``` +echo.sh +--- +#!/bin/sh +echo "hello world" +--- + +echo.sh.stdout.exact +--- +hello world +--- +``` + +Check the stderr output using a glob. + +``` +random.sh +--- +#!/bin/sh +head -c 10 < /dev/urandom | xxd >&2 +--- + +random.sh.stderr.glob +--- +00000000: * * * * * * +``` + +Multiple lines can be matched with ... + +``` +random-num-lines.sh +--- +#!/bin/sh +echo hello +seq 0 $RANDOM +echo world +--- + +random-num-lines.sh.stdout.glob +--- +hello +0 +... +world +--- +``` + +#### Failing examples + +Exit code is expected to be 0, but is 1. + +``` +exit-1.sh +--- +#!/bin/sh +exit 1 +--- +``` + +Stdout is expected to be empty, but isn't. + +``` +echo.sh +--- +#!/bin/sh +echo hello world +``` + +Stderr is expected to be hello but is world. + +``` +hello.sh +--- +#!/bin/sh +echo world >&2 +--- + +hello.sh.stderr.exact +--- +hello +--- +``` + +### Setup & teardown scripts + +Finally, test writing can be eased with setup and teardown scripts. +Each directory in the test directory is a test-suite consisting of all tests within that directory (but not sub-directories). +This test suite can come with 4 scripts to help test writing: + +* `setup_once` +* `teardown_once` +* `setup` +* `teardown` + +The `setup_once` and `teardown_once` are run once before and after all the tests in the suite respectively. +They operate in the scratch directory for the test suite, which is the parent directory of each scratch directory for each test case. +They can do work that is shared between tests to improve test efficiency. +For example, the `dictionaries/setup_once` script builds several dictionaries, for use in the `dictionaries` tests. + +The `setup` and `teardown` scripts run before and after each test case respectively, in the test case's scratch directory. +These scripts can do work that is shared between test cases to make tests more succinct. +For example, the `dictionaries/setup` script copies the dictionaries built by the `dictionaries/setup_once` script into the test's scratch directory, to make them easier to use, and make sure they aren't accidentally modified. + +#### Examples + +``` +basic/setup +--- +#!/bin/sh +# Create some files for testing with +datagen > file +datagen > file0 +datagen > file1 +--- + +basic/test.sh +--- +#!/bin/sh +zstd file file0 file1 +--- + +dictionaries/setup_once +--- +#!/bin/sh +set -e + +mkdir files/ dicts/ +for i in $(seq 10); do + datagen -g1000 > files/$i +done + +zstd --train -r files/ -o dicts/0 +--- + +dictionaries/setup +--- +#!/bin/sh + +# Runs in the test case's scratch directory. +# The test suite's scratch directory that +# `setup_once` operates in is the parent directory. +cp -r ../files ../dicts . +--- +``` diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh new file mode 100755 index 0000000..927c3ff --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +println "+ zstd -h" +zstd -h +println "+ zstd -H" +zstd -H +println "+ zstd --help" +zstd --help diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh.stdout.glob new file mode 100644 index 0000000..5580dc6 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/help.sh.stdout.glob @@ -0,0 +1,34 @@ ++ zstd -h +Compress or decompress the INPUT file(s); reads from STDIN if INPUT is `-` or not provided. + +Usage: zstd *OPTIONS...* *INPUT... | -* *-o OUTPUT* + +Options: + -o OUTPUT Write output to a single file, OUTPUT. + -k, --keep Preserve INPUT file(s). *Default* + --rm Remove INPUT file(s) after successful (de)compression. + + -# Desired compression level, where `#` is a number between 1 and 19; + lower numbers provide faster compression, higher numbers yield + better compression ratios. *Default: 3* + + -d, --decompress Perform decompression. + -D DICT Use DICT as the dictionary for compression or decompression. + + -f, --force Disable input and output checks. Allows overwriting existing files, + receiving input from the console, printing ouput to STDOUT, and + operating on links, block devices, etc. Unrecognized formats will be + passed-through through as-is. + + -h Display short usage and exit. + -H, --help Display full help and exit. + -V, --version Display the program version and exit. + ++ zstd -H +... +Advanced options: +... ++ zstd --help +... +Advanced options: +... diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh new file mode 100755 index 0000000..88d734d --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +echo "some data" > file + +println "+ zstd --memory=32LB file" +zstd --memory=32LB file && die "Should not allow bogus suffix" +println "+ zstd --memory=32LiB file" +zstd --memory=32LiB file && die "Should not allow bogus suffix" +println "+ zstd --memory=32A file" +zstd --memory=32A file && die "Should not allow bogus suffix" +println "+ zstd --memory=32r82347dn83 file" +zstd --memory=32r82347dn83 file && die "Should not allow bogus suffix" +println "+ zstd --memory=32asbdf file" +zstd --memory=32asbdf file && die "Should not allow bogus suffix" +println "+ zstd --memory=hello file" +zstd --memory=hello file && die "Should not allow non-numeric parameter" +println "+ zstd --memory=1 file" +zstd -q --memory=1 file && die "Should allow numeric parameter without suffix" +rm file.zst +println "+ zstd --memory=1K file" +zstd -q --memory=1K file && die "Should allow numeric parameter with expected suffix" +rm file.zst +println "+ zstd --memory=1KB file" +zstd -q --memory=1KB file && die "Should allow numeric parameter with expected suffix" +rm file.zst +println "+ zstd --memory=1KiB file" +zstd -q --memory=1KiB file && die "Should allow numeric parameter with expected suffix" +rm file.zst +println "+ zstd --memory=1M file" +zstd -q --memory=1M file && die "Should allow numeric parameter with expected suffix" +rm file.zst +println "+ zstd --memory=1MB file" +zstd -q --memory=1MB file && die "Should allow numeric parameter with expected suffix" +rm file.zst +println "+ zstd --memory=1MiB file" +zstd -q --memory=1MiB file && die "Should allow numeric parameter with expected suffix" +rm file.zst + +rm file +exit 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stderr.exact new file mode 100644 index 0000000..3785b0f --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stderr.exact @@ -0,0 +1,13 @@ +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +error: only numeric values with optional suffixes K, KB, KiB, M, MB, MiB are allowed +Should allow numeric parameter without suffix +Should allow numeric parameter with expected suffix +Should allow numeric parameter with expected suffix +Should allow numeric parameter with expected suffix +Should allow numeric parameter with expected suffix +Should allow numeric parameter with expected suffix +Should allow numeric parameter with expected suffix diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stdout.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stdout.exact new file mode 100644 index 0000000..1821648 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/memlimit.sh.stdout.exact @@ -0,0 +1,13 @@ ++ zstd --memory=32LB file ++ zstd --memory=32LiB file ++ zstd --memory=32A file ++ zstd --memory=32r82347dn83 file ++ zstd --memory=32asbdf file ++ zstd --memory=hello file ++ zstd --memory=1 file ++ zstd --memory=1K file ++ zstd --memory=1KB file ++ zstd --memory=1KiB file ++ zstd --memory=1M file ++ zstd --memory=1MB file ++ zstd --memory=1MiB file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh new file mode 100755 index 0000000..a8819d2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +println "+ zstd -r * --output-dir-mirror=\"\"" +zstd -r * --output-dir-mirror="" && die "Should not allow empty output dir!" +println "+ zstd -r * --output-dir-flat=\"\"" +zstd -r * --output-dir-flat="" && die "Should not allow empty output dir!" +exit 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stderr.exact new file mode 100644 index 0000000..e12b504 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stderr.exact @@ -0,0 +1,2 @@ +error: output dir cannot be empty string (did you mean to pass '.' instead?) +error: output dir cannot be empty string (did you mean to pass '.' instead?) diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stdout.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stdout.exact new file mode 100644 index 0000000..1e478cd --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/output_dir.sh.stdout.exact @@ -0,0 +1,2 @@ ++ zstd -r * --output-dir-mirror="" ++ zstd -r * --output-dir-flat="" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh new file mode 100755 index 0000000..f75eaa8 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +zstd -V +zstd --version diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh.stdout.glob new file mode 100644 index 0000000..4cc9fb9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/basic/version.sh.stdout.glob @@ -0,0 +1,2 @@ +*** Zstandard CLI (*-bit) v1.*.*, by Yann Collet *** +*** Zstandard CLI (*-bit) v1.*.*, by Yann Collet *** diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/cmp_size b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/cmp_size new file mode 100755 index 0000000..8e4bef8 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/cmp_size @@ -0,0 +1,44 @@ +#!/bin/sh + +set -e + +usage() +{ + printf "USAGE:\n\t$0 [-eq|-ne|-lt|-le|-gt|-ge] FILE1 FILE2\n" +} + +help() +{ + printf "Small utility to compare file sizes without printing them with set -x.\n\n" + usage +} + +case "$1" in + -h) help; exit 0 ;; + --help) help; exit 0 ;; +esac + +if ! test -f $2; then + printf "FILE1='%b' is not a file\n\n" "$2" + usage + exit 1 +fi + +if ! test -f $3; then + printf "FILE2='%b' is not a file\n\n" "$3" + usage + exit 1 +fi + + +size1=$(wc -c < $2) +size2=$(wc -c < $3) + +case "$1" in + -eq) [ "$size1" -eq "$size2" ] ;; + -ne) [ "$size1" -ne "$size2" ] ;; + -lt) [ "$size1" -lt "$size2" ] ;; + -le) [ "$size1" -le "$size2" ] ;; + -gt) [ "$size1" -gt "$size2" ] ;; + -ge) [ "$size1" -ge "$size2" ] ;; +esac diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/datagen b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/datagen new file mode 100755 index 0000000..8c60cbc --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/datagen @@ -0,0 +1,3 @@ +#!/bin/sh + +"$DATAGEN_BIN" $@ diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/die b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/die new file mode 100755 index 0000000..8633bc9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/die @@ -0,0 +1,4 @@ +#!/bin/sh + +println "${*}" 1>&2 +exit 1 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/println b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/println new file mode 100755 index 0000000..494eb18 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/println @@ -0,0 +1,2 @@ +#!/bin/sh +printf '%b\n' "${*}" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/unzstd b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/unzstd new file mode 100755 index 0000000..7a40aec --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/unzstd @@ -0,0 +1,9 @@ +#!/bin/sh + +zstdname=$(basename $0) + +if [ -z "$EXEC_PREFIX" ]; then + "$ZSTD_SYMLINK_DIR/$zstdname" $@ +else + $EXEC_PREFIX "$ZSTD_SYMLINK_DIR/$zstdname" $@ +fi diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstd b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstd new file mode 100755 index 0000000..7a40aec --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstd @@ -0,0 +1,9 @@ +#!/bin/sh + +zstdname=$(basename $0) + +if [ -z "$EXEC_PREFIX" ]; then + "$ZSTD_SYMLINK_DIR/$zstdname" $@ +else + $EXEC_PREFIX "$ZSTD_SYMLINK_DIR/$zstdname" $@ +fi diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdcat b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdcat new file mode 100755 index 0000000..7a40aec --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdcat @@ -0,0 +1,9 @@ +#!/bin/sh + +zstdname=$(basename $0) + +if [ -z "$EXEC_PREFIX" ]; then + "$ZSTD_SYMLINK_DIR/$zstdname" $@ +else + $EXEC_PREFIX "$ZSTD_SYMLINK_DIR/$zstdname" $@ +fi diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdgrep b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdgrep new file mode 100755 index 0000000..8821ebb --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdgrep @@ -0,0 +1,2 @@ +#!/bin/sh +"$ZSTDGREP_BIN" $@ diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdless b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdless new file mode 100755 index 0000000..d1d6f82 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/bin/zstdless @@ -0,0 +1,2 @@ +#!/bin/sh +"$ZSTDLESS_BIN" $@ diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/setup b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/setup new file mode 100755 index 0000000..3009bd5 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/setup @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +echo "1234" > file +zstd file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh new file mode 100755 index 0000000..6cd68b7 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +println "+ good path" +zstdgrep "1234" file file.zst +println "+ bad path" +zstdgrep "1234" bad.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.exit b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.exit new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.exit @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact new file mode 100644 index 0000000..f147f28 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact @@ -0,0 +1 @@ +zstd: can't stat bad.zst : No such file or directory -- ignored diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob new file mode 100644 index 0000000..96d4fa2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob @@ -0,0 +1,4 @@ ++ good path +file:1234 +file.zst:1234 ++ bad path diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh new file mode 100755 index 0000000..a0697bd --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +println "+ good path" +zstdless file.zst +println "+ pass parameters" +zstdless -N file.zst # This parameter does not produce line #s when piped, but still serves to test that the flag went to less and not zstd +println "+ bad path" +zstdless bad.zst >&2 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stderr.exact new file mode 100644 index 0000000..5a726f1 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stderr.exact @@ -0,0 +1,2 @@ +zstd: can't stat bad.zst : No such file or directory -- ignored +bad.zst: No such file or directory diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stdout.glob new file mode 100644 index 0000000..2784ddd --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/cltools/zstdless.sh.stdout.glob @@ -0,0 +1,5 @@ ++ good path +1234 ++ pass parameters +1234 ++ bad path diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/common/format.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/format.sh new file mode 100644 index 0000000..e574e97 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/format.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +. "$COMMON/platform.sh" + +zstd_supports_format() +{ + zstd -h | grep > $INTOVOID -- "--format=$1" +} + +format_extension() +{ + if [ "$1" = "zstd" ]; then + printf "zst" + elif [ "$1" = "gzip" ]; then + printf "gz" + else + printf "$1" + fi +} diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/common/mtime.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/mtime.sh new file mode 100644 index 0000000..344074d --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/mtime.sh @@ -0,0 +1,13 @@ +. "$COMMON/platform.sh" + +MTIME="stat -c %Y" +case "$UNAME" in + Darwin | FreeBSD | OpenBSD | NetBSD) MTIME="stat -f %m" ;; +esac + +assertSameMTime() { + MT1=$($MTIME "$1") + MT2=$($MTIME "$2") + echo MTIME $MT1 $MT2 + [ "$MT1" = "$MT2" ] || die "mtime on $1 doesn't match mtime on $2 ($MT1 != $MT2)" +} diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/common/permissions.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/permissions.sh new file mode 100644 index 0000000..6bce1f0 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/permissions.sh @@ -0,0 +1,18 @@ +. "$COMMON/platform.sh" + +GET_PERMS="stat -c %a" +case "$UNAME" in + Darwin | FreeBSD | OpenBSD | NetBSD) GET_PERMS="stat -f %Lp" ;; +esac + +assertFilePermissions() { + STAT1=$($GET_PERMS "$1") + STAT2=$2 + [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match expected ($STAT1 != $STAT2)" +} + +assertSamePermissions() { + STAT1=$($GET_PERMS "$1") + STAT2=$($GET_PERMS "$2") + [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match those on $2 ($STAT1 != $STAT2)" +} diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/common/platform.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/platform.sh new file mode 100644 index 0000000..6eb45ea --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/common/platform.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +UNAME=$(uname) + +isWindows=false +INTOVOID="/dev/null" +case "$UNAME" in + GNU) DEVDEVICE="/dev/random" ;; + *) DEVDEVICE="/dev/zero" ;; +esac +case "$OS" in + Windows*) + isWindows=true + INTOVOID="NUL" + DEVDEVICE="NUL" + ;; +esac + +case "$UNAME" in + Darwin) MD5SUM="md5 -r" ;; + FreeBSD) MD5SUM="gmd5sum" ;; + NetBSD) MD5SUM="md5 -n" ;; + OpenBSD) MD5SUM="md5" ;; + *) MD5SUM="md5sum" ;; +esac + +DIFF="diff" +case "$UNAME" in + SunOS) DIFF="gdiff" ;; +esac + +if echo hello | zstd -v -T2 2>&1 > $INTOVOID | grep -q 'multi-threading is disabled' +then + hasMT="" +else + hasMT="true" +fi diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/adapt.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/adapt.sh new file mode 100755 index 0000000..30b9afa --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/adapt.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +# Test --adapt +zstd -f file --adapt -c | zstd -t + +datagen -g100M > file100M + +# Pick parameters to force fast adaptation, even on slow systems +zstd --adapt -vvvv -19 --zstd=wlog=10 file100M -o /dev/null 2>&1 | grep -q "faster speed , lighter compression" + +# Adaption still happens with --no-progress +zstd --no-progress --adapt -vvvv -19 --zstd=wlog=10 file100M -o /dev/null 2>&1 | grep -q "faster speed , lighter compression" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/basic.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/basic.sh new file mode 100755 index 0000000..b6e2aa0 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/basic.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +set -e + +# Uncomment the set -v line for debugging +# set -v + +# Test compression flags and check that they work +zstd file ; zstd -t file.zst +zstd -f file ; zstd -t file.zst +zstd -f -z file ; zstd -t file.zst +zstd -f -k file ; zstd -t file.zst +zstd -f -C file ; zstd -t file.zst +zstd -f --check file ; zstd -t file.zst +zstd -f --no-check file ; zstd -t file.zst +zstd -f -- file ; zstd -t file.zst + +# Test output file compression +zstd -o file-out.zst ; zstd -t file-out.zst +zstd -fo file-out.zst; zstd -t file-out.zst + +# Test compression to stdout +zstd -c file | zstd -t +zstd --stdout file | zstd -t +println bob | zstd | zstd -t + +# Test keeping input file when compressing to stdout in gzip mode +$ZSTD_SYMLINK_DIR/gzip -c file | zstd -t ; test -f file +$ZSTD_SYMLINK_DIR/gzip --stdout file | zstd -t ; test -f file + +# Test --rm +cp file file-rm +zstd --rm file-rm; zstd -t file-rm.zst +test ! -f file-rm diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/compress-literals.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/compress-literals.sh new file mode 100755 index 0000000..573481a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/compress-literals.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +# Test --[no-]compress-literals +zstd file --no-compress-literals -1 -c | zstd -t +zstd file --no-compress-literals -19 -c | zstd -t +zstd file --no-compress-literals --fast=1 -c | zstd -t +zstd file --compress-literals -1 -c | zstd -t +zstd file --compress-literals --fast=1 -c | zstd -t diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/format.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/format.sh new file mode 100755 index 0000000..192fa2c --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/format.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +. "$COMMON/format.sh" + +set -e + +# Test --format +zstd --format=zstd file -f +zstd -t file.zst +for format in "gzip" "lz4" "xz" "lzma"; do + if zstd_supports_format $format; then + zstd --format=$format file + zstd -t file.$(format_extension $format) + zstd -c --format=$format file | zstd -t --format=$format + fi +done diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/golden.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/golden.sh new file mode 100755 index 0000000..85dd3fd --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/golden.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +GOLDEN_DIR="$ZSTD_REPO_DIR/tests/golden-compression/" +cp -r "$GOLDEN_DIR" golden/ + +zstd -rf golden/ --output-dir-mirror golden-compressed/ +zstd -r -t golden-compressed/ + +zstd --target-compressed-block-size=1024 -rf golden/ --output-dir-mirror golden-compressed/ +zstd -r -t golden-compressed/ diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/gzip-compat.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/gzip-compat.sh new file mode 100755 index 0000000..bb72e05 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/gzip-compat.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +# Uncomment the set -v line for debugging +# set -v + +# Test gzip specific compression option +$ZSTD_SYMLINK_DIR/gzip --fast file ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip --best file ; $ZSTD_SYMLINK_DIR/gzip -d file.gz + +# Test -n / --no-name: do not embed original filename in archive +$ZSTD_SYMLINK_DIR/gzip -n file ; grep -qv file file.gz ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip --no-name file ; grep -qv file file.gz ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip -c --no-name file | grep -qv file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh new file mode 100755 index 0000000..cc2700a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +set -e +set -v + +datagen > file + +# Compress with various levels and ensure that their sizes are ordered +zstd --fast=10 file -o file-f10.zst -q +zstd --fast=1 file -o file-f1.zst -q +zstd -1 file -o file-1.zst -q +zstd -19 file -o file-19.zst -q + +zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst + +cmp_size -lt file-19.zst file-1.zst +cmp_size -lt file-1.zst file-f1.zst +cmp_size -lt file-f1.zst file-f10.zst + +# Test default levels +zstd --fast file -f -q +cmp file.zst file-f1.zst || die "--fast is not level -1" + +zstd -0 file -o file-0.zst -q +zstd -f file -q +cmp file.zst file-0.zst || die "Level 0 is not the default level" + +# Test level clamping +zstd -99 file -o file-99.zst -q +cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19" +zstd --fast=200000 file -c | zstd -t + +zstd -5000000000 -f file && die "Level too large, must fail" ||: +zstd --fast=5000000000 -f file && die "Level too large, must fail" ||: + +# Test setting a level through the environment variable +ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst -q +ZSTD_CLEVEL=1 zstd file -o file-1-env.zst -q +ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst -q +ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst -q + +cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level" +cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level" +cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level" +cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level" + +# Test invalid environment clevel is the default level +zstd -f file -q +ZSTD_CLEVEL=- zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=+ zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=-a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=+a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst + +# Test environment clevel is overridden by command line +ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst -q +ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst -q + +cmp file-1.zst file-1-env.zst || die "Environment variable not overridden" +cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh.stderr.exact new file mode 100644 index 0000000..c8fb79c --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/levels.sh.stderr.exact @@ -0,0 +1,69 @@ + +datagen > file + +# Compress with various levels and ensure that their sizes are ordered +zstd --fast=10 file -o file-f10.zst -q +zstd --fast=1 file -o file-f1.zst -q +zstd -1 file -o file-1.zst -q +zstd -19 file -o file-19.zst -q + +zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst +4 files decompressed : 262148 bytes total + +cmp_size -lt file-19.zst file-1.zst +cmp_size -lt file-1.zst file-f1.zst +cmp_size -lt file-f1.zst file-f10.zst + +# Test default levels +zstd --fast file -f -q +cmp file.zst file-f1.zst || die "--fast is not level -1" + +zstd -0 file -o file-0.zst -q +zstd -f file -q +cmp file.zst file-0.zst || die "Level 0 is not the default level" + +# Test level clamping +zstd -99 file -o file-99.zst -q +cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19" +zstd --fast=200000 file -c | zstd -t +/*stdin*\ : 65537 bytes + +zstd -5000000000 -f file && die "Level too large, must fail" ||: +error: numeric value overflows 32-bit unsigned int +zstd --fast=5000000000 -f file && die "Level too large, must fail" ||: +error: numeric value overflows 32-bit unsigned int + +# Test setting a level through the environment variable +ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst -q +ZSTD_CLEVEL=1 zstd file -o file-1-env.zst -q +ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst -q +ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst -q + +cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level" +cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level" +cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level" +cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level" + +# Test invalid environment clevel is the default level +zstd -f file -q +ZSTD_CLEVEL=- zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=-: not a valid integer value +ZSTD_CLEVEL=+ zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=+: not a valid integer value +ZSTD_CLEVEL=a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=a: not a valid integer value +ZSTD_CLEVEL=-a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=-a: not a valid integer value +ZSTD_CLEVEL=+a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=+a: not a valid integer value +ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=3a7: not a valid integer value +ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=5000000000: numeric value too large + +# Test environment clevel is overridden by command line +ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst -q +ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst -q + +cmp file-1.zst file-1-env.zst || die "Environment variable not overridden" +cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/long-distance-matcher.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/long-distance-matcher.sh new file mode 100755 index 0000000..8f2c61b --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/long-distance-matcher.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test --long +zstd -f file --long ; zstd -t file.zst +zstd -f file --long=20; zstd -t file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh new file mode 100755 index 0000000..17a5eb5 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +# Test multi-threaded flags +zstd --single-thread file -f -q ; zstd -t file.zst +zstd -T2 -f file -q ; zstd -t file.zst +zstd --rsyncable -f file -q ; zstd -t file.zst +zstd -T0 -f file -q ; zstd -t file.zst +zstd -T0 --auto-threads=logical -f file -q ; zstd -t file.zst +zstd -T0 --auto-threads=physical -f file -q ; zstd -t file.zst + +# multi-thread decompression warning test +zstd -T0 -f file -q ; zstd -t file.zst; zstd -T0 -d file.zst -o file3 +zstd -T0 -f file -q ; zstd -t file.zst; zstd -T2 -d file.zst -o file4 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh.stderr.exact new file mode 100644 index 0000000..11daff6 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multi-threaded.sh.stderr.exact @@ -0,0 +1,11 @@ +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +file.zst : 65537 bytes +Warning : decompression does not support multi-threading +file.zst : 65537 bytes diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh new file mode 100755 index 0000000..aeb74cf --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +# setup +echo "file1" > file1 +echo "file2" > file2 + +echo "Test zstd ./file1 - file2" +rm -f ./file*.zst +echo "stdin" | zstd ./file1 - ./file2 | zstd -d +cat file1.zst | zstd -d +cat file2.zst | zstd -d + +echo "Test zstd -d ./file1.zst - file2.zst" +rm ./file1 ./file2 +echo "stdin" | zstd - | zstd -d ./file1.zst - file2.zst +cat file1 +cat file2 + +echo "zstd -d ./file1.zst - file2.zst -c" +echo "stdin" | zstd | zstd -d ./file1.zst - file2.zst -c diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh.stdout.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh.stdout.exact new file mode 100644 index 0000000..aad61d6 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/multiple-files.sh.stdout.exact @@ -0,0 +1,12 @@ +Test zstd ./file1 - file2 +stdin +file1 +file2 +Test zstd -d ./file1.zst - file2.zst +stdin +file1 +file2 +zstd -d ./file1.zst - file2.zst -c +file1 +stdin +file2 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/row-match-finder.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/row-match-finder.sh new file mode 100755 index 0000000..5b36017 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/row-match-finder.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test --[no-]row-match-finder +zstd file -7f --row-match-finder +zstd file -7f --no-row-match-finder diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/setup b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/setup new file mode 100755 index 0000000..96e2309 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/setup @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +datagen > file +datagen > file0 +datagen > file1 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/stream-size.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/stream-size.sh new file mode 100755 index 0000000..7344769 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/stream-size.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test stream size & hint +datagen -g7654 | zstd --stream-size=7654 | zstd -t +datagen -g7654 | zstd --size-hint=7000 | zstd -t diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh new file mode 100755 index 0000000..88ee11a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +. "$COMMON/platform.sh" + +zstd < file -vv -19 -o file.19.zst +zstd -vv -l file.19.zst + +zstd < file -vv -19 --long -o file.19.long.zst +zstd -vv -l file.19.long.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob new file mode 100644 index 0000000..1353471 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob @@ -0,0 +1,5 @@ +... +*wlog=23* +... +*wlog=27* +... diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob new file mode 100644 index 0000000..19913a1 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob @@ -0,0 +1,5 @@ +... +*Window Size: 8388608 B* +... +*Window Size: 134217728 B* +... diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh new file mode 100755 index 0000000..3b5e6fe --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh @@ -0,0 +1,9 @@ +#!/bin/sh +datagen -g1G > file +zstd --long=31 -1 --single-thread --no-content-size -f file +zstd -l -v file.zst + +# We want to ignore stderr (its outputting "*** zstd command line interface +# 64-bits v1.5.3, by Yann Collet ***") + +rm file file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stderr.ignore b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stderr.ignore new file mode 100644 index 0000000..e69de29 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stdout.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stdout.glob new file mode 100644 index 0000000..313d216 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/compression/window-resize.sh.stdout.glob @@ -0,0 +1,3 @@ +... +Window Size: 1.000 GiB (1073741824 B) +... diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/golden.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/golden.sh new file mode 100755 index 0000000..36919e6 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/golden.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +GOLDEN_DIR="$ZSTD_REPO_DIR/tests/golden-decompression/" + +zstd -r -t "$GOLDEN_DIR" diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh new file mode 100755 index 0000000..2cab463 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +set -e + +. "$COMMON/platform.sh" + +echo "" > 1 +echo "2" > 2 +echo "23" > 3 +echo "234" > 4 +echo "some data" > file + +println "+ passthrough enabled" + +zstd file + +# Test short files +zstd -dc --pass-through 1 2 3 4 + +# Test *cat symlinks +zstdcat file +"$ZSTD_SYMLINK_DIR/zcat" file +"$ZSTD_SYMLINK_DIR/gzcat" file + +# Test multiple files with mix of compressed & not +zstdcat file file.zst +zstdcat file.zst file + +# Test --pass-through +zstd -dc --pass-through file +zstd -d --pass-through file -o pass-through-file + +# Test legacy implicit passthrough with -fc +zstd -dcf file +zstd -dcf file file.zst +zstd -df < file +zstd -dcf < file file.zst - +zstd -dcf < file.zst file - + +$DIFF file pass-through-file + +println "+ passthrough disabled" + +# Test *cat +zstdcat --no-pass-through file && die "should fail" +"$ZSTD_SYMLINK_DIR/zcat" --no-pass-through file && die "should fail" +"$ZSTD_SYMLINK_DIR/gzcat" --no-pass-through file && die "should fail" +# Test zstd without implicit passthrough +zstd -d file -o no-pass-through-file && die "should fail" +zstd -d < file && die "should fail" + +# Test legacy implicit passthrough with -fc +zstd --no-pass-through -dcf file && die "should fail" +zstd --no-pass-through -dcf file file.zst && die "should fail" +zstd --no-pass-through -df < file && die "should fail" +zstd --no-pass-through -dcf < file file.zst - && die "should fail" +zstd --no-pass-through -dcf < file.zst file - && die "should fail" ||: diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stderr.exact new file mode 100644 index 0000000..62f96ae --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stderr.exact @@ -0,0 +1,11 @@ +file :230.00% ( 10 B => 23 B, file.zst) +zstd: file: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: /*stdin*\: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: /*stdin*\: unsupported format +zstd: /*stdin*\: unsupported format +zstd: file: unsupported format diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stdout.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stdout.exact new file mode 100644 index 0000000..b0d494c --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/decompression/pass-through.sh.stdout.exact @@ -0,0 +1,25 @@ ++ passthrough enabled + +2 +23 +234 +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data ++ passthrough disabled +some data +some data +some data diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh new file mode 100755 index 0000000..b500bfe --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e +for i in $(seq 50); do + datagen -s$i > file$i +done +touch empty + +set -v +zstd -q --train empty file* diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact new file mode 100644 index 0000000..2747e76 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact @@ -0,0 +1 @@ +zstd -q --train empty file* diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh new file mode 100755 index 0000000..416b837 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -v +zstd --train diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.exit b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.exit new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.exit @@ -0,0 +1 @@ +14 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact new file mode 100644 index 0000000..d7b3ea0 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact @@ -0,0 +1,5 @@ +zstd --train +! Warning : nb of samples too low for proper processing ! +! Please provide _one file per sample_. +! Alternatively, split files into fixed-size blocks representative of samples, with -B# +Error 14 : nb of samples too low diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh new file mode 100755 index 0000000..885cac2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +. "$COMMON/platform.sh" + +set -e + +if [ false ]; then + for seed in $(seq 100); do + datagen -g1000 -s$seed > file$seed + done + + zstd --train -r . -o dict0 -qq + + for seed in $(seq 101 200); do + datagen -g1000 -s$seed > file$seed + done + + zstd --train -r . -o dict1 -qq + + [ "$($MD5SUM < dict0)" != "$($MD5SUM < dict1)" ] || die "dictionaries must not match" + + datagen -g1000 -s0 > file0 +fi + +set -v +zstd files/0 -D dicts/0 -q +zstd -t files/0.zst -D dicts/0 +zstd -t files/0.zst -D dicts/1 && die "Must fail" ||: +zstd -t files/0.zst && die "Must fail" ||: diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact new file mode 100644 index 0000000..8896763 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact @@ -0,0 +1,7 @@ +zstd files/0 -D dicts/0 -q +zstd -t files/0.zst -D dicts/0 +files/0.zst : 1000 bytes +zstd -t files/0.zst -D dicts/1 && die "Must fail" ||: +files/0.zst : Decoding error (36) : Dictionary mismatch +zstd -t files/0.zst && die "Must fail" ||: +files/0.zst : Decoding error (36) : Dictionary mismatch diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/golden.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/golden.sh new file mode 100755 index 0000000..85da2ee --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/golden.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +GOLDEN_COMP_DIR="$ZSTD_REPO_DIR/tests/golden-compression/" +GOLDEN_DICT_DIR="$ZSTD_REPO_DIR/tests/golden-dictionaries/" + +zstd -D "$GOLDEN_DICT_DIR/http-dict-missing-symbols" "$GOLDEN_COMP_DIR/http" -o http.zst +zstd -D "$GOLDEN_DICT_DIR/http-dict-missing-symbols" -t http.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup new file mode 100755 index 0000000..616c73e --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +cp -r ../files . +cp -r ../dicts . diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup_once b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup_once new file mode 100755 index 0000000..1241c57 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/dictionaries/setup_once @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +. "$COMMON/platform.sh" + + +mkdir files/ dicts/ + +for seed in $(seq 50); do + datagen -g1000 -s$seed > files/$seed +done + +zstd --train -r files -o dicts/0 -qq + +for seed in $(seq 51 100); do + datagen -g1000 -s$seed > files/$seed +done + +zstd --train -r files -o dicts/1 -qq + +cmp dicts/0 dicts/1 && die "dictionaries must not match!" + +datagen -g1000 > files/0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh new file mode 100755 index 0000000..c5f5900 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +datagen > file +chmod 642 file + +zstd file -q --trace-file-stat -o file.zst +zstd -tq file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact new file mode 100644 index 0000000..a1ad09e --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact @@ -0,0 +1,42 @@ +Trace:FileStat: > UTIL_isLink(file) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 65537 +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isDirectoryStat() +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isSameFile(file, file.zst) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_getFileSize(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 65537 +Trace:FileStat: > UTIL_setFileStat(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_utime(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_chmod(file.zst, 0642) +Trace:FileStat: > chmod +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: < 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh new file mode 100755 index 0000000..99ebfc4 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +datagen > file + +zstd file -cq --trace-file-stat > file.zst +zstd -tq file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact new file mode 100644 index 0000000..7c690d2 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact @@ -0,0 +1,24 @@ +Trace:FileStat: > UTIL_isLink(file) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(1) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 65537 +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isDirectoryStat() +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isRegularFile(/*stdout*\) +Trace:FileStat: > UTIL_stat(/*stdout*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 65537 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh new file mode 100755 index 0000000..8379461 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +datagen > file + +zstd < file -q --trace-file-stat -o file.zst +zstd -tq file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact new file mode 100644 index 0000000..00afd97 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact @@ -0,0 +1,24 @@ +Trace:FileStat: > UTIL_isConsole(0) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < -1 +Trace:FileStat: > UTIL_isSameFile(/*stdin*\, file.zst) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_getFileSize(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < -1 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh new file mode 100755 index 0000000..64f4b03 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +datagen > file + +zstd < file -cq --trace-file-stat > file.zst +zstd -tq file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact new file mode 100644 index 0000000..8bf05e6 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact @@ -0,0 +1,18 @@ +Trace:FileStat: > UTIL_isConsole(0) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(1) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < -1 +Trace:FileStat: > UTIL_isRegularFile(/*stdout*\) +Trace:FileStat: > UTIL_stat(/*stdout*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_getFileSize(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < -1 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh new file mode 100755 index 0000000..9e68f8f --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +datagen | zstd -q > file.zst +chmod 642 file.zst + +zstd -dq --trace-file-stat file.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact new file mode 100644 index 0000000..d264c63 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact @@ -0,0 +1,38 @@ +Trace:FileStat: > UTIL_isLink(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(1) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isDirectory(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isDirectoryStat() +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isSameFile(file.zst, file) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_setFileStat(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_utime(file) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_chmod(file, 0642) +Trace:FileStat: > chmod +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: < 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh new file mode 100755 index 0000000..518c2a9 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +datagen | zstd -q > file.zst + +zstd -dcq --trace-file-stat file.zst > file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact new file mode 100644 index 0000000..7fe6dda --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact @@ -0,0 +1,18 @@ +Trace:FileStat: > UTIL_isLink(file.zst) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(1) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isDirectory(file.zst) +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isDirectoryStat() +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_stat(file.zst) +Trace:FileStat: < 1 +Trace:FileStat: > UTIL_isRegularFile(/*stdout*\) +Trace:FileStat: > UTIL_stat(/*stdout*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh new file mode 100755 index 0000000..135d755 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +datagen | zstd -q > file.zst + +zstd -dcq --trace-file-stat < file.zst -o file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact new file mode 100644 index 0000000..749fd39 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact @@ -0,0 +1,20 @@ +Trace:FileStat: > UTIL_isConsole(0) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isDirectory(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isSameFile(/*stdin*\, file) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(file) +Trace:FileStat: > UTIL_stat(file) +Trace:FileStat: < 1 +Trace:FileStat: < 1 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh new file mode 100755 index 0000000..495f07b --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +datagen | zstd -q > file.zst + +zstd -dcq --trace-file-stat < file.zst > file diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact new file mode 100644 index 0000000..e36cb9d --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact @@ -0,0 +1,14 @@ +Trace:FileStat: > UTIL_isConsole(0) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(1) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isConsole(2) +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isDirectory(/*stdin*\) +Trace:FileStat: > UTIL_stat(/*stdin*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 +Trace:FileStat: > UTIL_isRegularFile(/*stdout*\) +Trace:FileStat: > UTIL_stat(/*stdout*\) +Trace:FileStat: < 0 +Trace:FileStat: < 0 diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh new file mode 100755 index 0000000..708878f --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +#!/bin/sh + +. "$COMMON/platform.sh" + +set -e + +echo hello > hello +echo world > world + +zstd -q hello world + +println >&2 "Tests cases where progress information should not be printed" + +for args in \ + "" \ + "--fake-stderr-is-console -q" \ + "--fake-stderr-is-console -qq --progress" \ + "--no-progress --fake-stderr-is-console" \ + "--no-progress --fake-stderr-is-console -v" +do + println >&2 "args = $args" + println >&2 "compress file to file" + zstd $args -f hello + println >&2 "compress pipe to pipe" + zstd $args < hello > $INTOVOID + println >&2 "compress pipe to file" + zstd $args < hello -fo hello.zst + println >&2 "compress file to pipe" + zstd $args hello -c > $INTOVOID + println >&2 "compress 2 files" + zstd $args -f hello world + + println >&2 "decompress file to file" + zstd $args -d -f hello.zst + println >&2 "decompress pipe to pipe" + zstd $args -d < hello.zst > $INTOVOID + println >&2 "decompress pipe to file" + zstd $args -d < hello.zst -fo hello + println >&2 "decompress file to pipe" + zstd $args -d hello.zst -c > $INTOVOID + println >&2 "decompress 2 files" + zstd $args -d -f hello.zst world.zst + println >&2 "" +done diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh.stderr.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh.stderr.glob new file mode 100644 index 0000000..d0f9112 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/no-progress.sh.stderr.glob @@ -0,0 +1,96 @@ +Tests cases where progress information should not be printed +args = +compress file to file +hello*hello.zst* +compress pipe to pipe +compress pipe to file +*stdin*hello.zst* +compress file to pipe +compress 2 files +2 files compressed* +decompress file to file +hello.zst* +decompress pipe to pipe +decompress pipe to file +*stdin* +decompress file to pipe +decompress 2 files +2 files decompressed* + +args = --fake-stderr-is-console -q +compress file to file +compress pipe to pipe +compress pipe to file +compress file to pipe +compress 2 files +decompress file to file +decompress pipe to pipe +decompress pipe to file +decompress file to pipe +decompress 2 files + +args = --fake-stderr-is-console -qq --progress +compress file to file +compress pipe to pipe +compress pipe to file +compress file to pipe +compress 2 files +decompress file to file +decompress pipe to pipe +decompress pipe to file +decompress file to pipe +decompress 2 files + +args = --no-progress --fake-stderr-is-console +compress file to file +hello*hello.zst* +compress pipe to pipe +compress pipe to file +*stdin*hello.zst* +compress file to pipe +compress 2 files +2 files compressed* +decompress file to file +hello.zst* +decompress pipe to pipe +decompress pipe to file +*stdin* +decompress file to pipe +decompress 2 files +2 files decompressed* + +args = --no-progress --fake-stderr-is-console -v +compress file to file +*Zstandard CLI* +hello*hello.zst* +compress pipe to pipe +*Zstandard CLI* +*stdin*stdout* +compress pipe to file +*Zstandard CLI* +*stdin*hello.zst* +compress file to pipe +*Zstandard CLI* +*hello*stdout* +compress 2 files +*Zstandard CLI* +*hello*hello.zst* +*world*world.zst* +2 files compressed* +decompress file to file +*Zstandard CLI* +hello.zst* +decompress pipe to pipe +*Zstandard CLI* +*stdin* +decompress pipe to file +*Zstandard CLI* +*stdin* +decompress file to pipe +*Zstandard CLI* +hello.zst* +decompress 2 files +*Zstandard CLI* +hello.zst* +world.zst* +2 files decompressed* diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh new file mode 100755 index 0000000..eb46499 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +. "$COMMON/platform.sh" + +set -e + +println >&2 "Tests cases where progress information should be printed" + +echo hello > hello +echo world > world + +zstd -q hello world + +for args in \ + "--progress" \ + "--fake-stderr-is-console" \ + "--progress --fake-stderr-is-console -q"; do + println >&2 "args = $args" + println >&2 "compress file to file" + zstd $args -f hello + println >&2 "compress pipe to pipe" + zstd $args < hello > $INTOVOID + println >&2 "compress pipe to file" + zstd $args < hello -fo hello.zst + println >&2 "compress file to pipe" + zstd $args hello -c > $INTOVOID + println >&2 "compress 2 files" + zstd $args -f hello world + + println >&2 "decompress file to file" + zstd $args -d -f hello.zst + println >&2 "decompress pipe to pipe" + zstd $args -d < hello.zst > $INTOVOID + println >&2 "decompress pipe to file" + zstd $args -d < hello.zst -fo hello + println >&2 "decompress file to pipe" + zstd $args -d hello.zst -c > $INTOVOID + println >&2 "decompress 2 files" + zstd $args -d -f hello.zst world.zst + println >&2 "" +done diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh.stderr.glob b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh.stderr.glob new file mode 100644 index 0000000..ca620d3 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/progress/progress.sh.stderr.glob @@ -0,0 +1,62 @@ +Tests cases where progress information should be printed +args = --progress +compress file to file +*Read:*hello*hello.zst* +compress pipe to pipe +*Read:*stdin*stdout* +compress pipe to file +*Read:*stdin*hello.zst* +compress file to pipe +*Read:*hello*stdout* +compress 2 files +*Read*2 files compressed* +decompress file to file +*hello.zst*hello.zst* +decompress pipe to pipe +*stdin*stdin* +decompress pipe to file +*stdin*stdin* +decompress file to pipe +*hello.zst*hello.zst* +decompress 2 files +*hello.zst*2 files decompressed* + +args = --fake-stderr-is-console +compress file to file +*Read:*hello*hello.zst* +compress pipe to pipe +compress pipe to file +*Read:*stdin*hello.zst* +compress file to pipe +compress 2 files +*Read*2 files compressed* +decompress file to file +*hello.zst*hello.zst* +decompress pipe to pipe +decompress pipe to file +*stdin*stdin* +decompress file to pipe +decompress 2 files +*hello.zst*2 files decompressed* + +args = --progress --fake-stderr-is-console -q +compress file to file +*Read:*hello*hello.zst* +compress pipe to pipe +*Read:*stdin*stdout* +compress pipe to file +*Read:*stdin*hello.zst* +compress file to pipe +*Read:*hello*stdout* +compress 2 files +*Read*2 files compressed* +decompress file to file +*hello.zst*hello.zst* +decompress pipe to pipe +*stdin*stdin* +decompress pipe to file +*stdin*stdin* +decompress file to pipe +*hello.zst*hello.zst* +decompress 2 files +*hello.zst*2 files decompressed* diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/run.py b/src/dependencies/zstd-1.5.4/tests/cli-tests/run.py new file mode 100755 index 0000000..45af512 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/run.py @@ -0,0 +1,738 @@ +#!/usr/bin/env python3 +# ################################################################ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# You may select, at your option, one of the above-listed licenses. +# ########################################################################## + +import argparse +import contextlib +import copy +import fnmatch +import os +import shutil +import subprocess +import sys +import tempfile +import typing + + +ZSTD_SYMLINKS = [ + "zstd", + "zstdmt", + "unzstd", + "zstdcat", + "zcat", + "gzip", + "gunzip", + "gzcat", + "lzma", + "unlzma", + "xz", + "unxz", + "lz4", + "unlz4", +] + + +EXCLUDED_DIRS = { + "bin", + "common", + "scratch", +} + + +EXCLUDED_BASENAMES = { + "setup", + "setup_once", + "teardown", + "teardown_once", + "README.md", + "run.py", + ".gitignore", +} + +EXCLUDED_SUFFIXES = [ + ".exact", + ".glob", + ".ignore", + ".exit", +] + + +def exclude_dir(dirname: str) -> bool: + """ + Should files under the directory :dirname: be excluded from the test runner? + """ + if dirname in EXCLUDED_DIRS: + return True + return False + + +def exclude_file(filename: str) -> bool: + """Should the file :filename: be excluded from the test runner?""" + if filename in EXCLUDED_BASENAMES: + return True + for suffix in EXCLUDED_SUFFIXES: + if filename.endswith(suffix): + return True + return False + +def read_file(filename: str) -> bytes: + """Reads the file :filename: and returns the contents as bytes.""" + with open(filename, "rb") as f: + return f.read() + + +def diff(a: bytes, b: bytes) -> str: + """Returns a diff between two different byte-strings :a: and :b:.""" + assert a != b + with tempfile.NamedTemporaryFile("wb") as fa: + fa.write(a) + fa.flush() + with tempfile.NamedTemporaryFile("wb") as fb: + fb.write(b) + fb.flush() + + diff_bytes = subprocess.run(["diff", fa.name, fb.name], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout + return diff_bytes.decode("utf8") + + +def pop_line(data: bytes) -> typing.Tuple[typing.Optional[bytes], bytes]: + """ + Pop the first line from :data: and returns the first line and the remainder + of the data as a tuple. If :data: is empty, returns :(None, data):. Otherwise + the first line always ends in a :\n:, even if it is the last line and :data: + doesn't end in :\n:. + """ + NEWLINE = b"\n"[0] + + if data == b'': + return (None, data) + + newline_idx = data.find(b"\n") + if newline_idx == -1: + end_idx = len(data) + else: + end_idx = newline_idx + 1 + + line = data[:end_idx] + data = data[end_idx:] + + assert len(line) != 0 + if line[-1] != NEWLINE: + line += NEWLINE + + return (line, data) + + +def glob_line_matches(actual: bytes, expect: bytes) -> bool: + """ + Does the `actual` line match the expected glob line `expect`? + """ + return fnmatch.fnmatchcase(actual.strip(), expect.strip()) + + +def glob_diff(actual: bytes, expect: bytes) -> bytes: + """ + Returns None if the :actual: content matches the expected glob :expect:, + otherwise returns the diff bytes. + """ + diff = b'' + actual_line, actual = pop_line(actual) + expect_line, expect = pop_line(expect) + while True: + # Handle end of file conditions - allow extra newlines + while expect_line is None and actual_line == b"\n": + actual_line, actual = pop_line(actual) + while actual_line is None and expect_line == b"\n": + expect_line, expect = pop_line(expect) + + if expect_line is None and actual_line is None: + if diff == b'': + return None + return diff + elif expect_line is None: + diff += b"---\n" + while actual_line != None: + diff += b"> " + diff += actual_line + actual_line, actual = pop_line(actual) + return diff + elif actual_line is None: + diff += b"---\n" + while expect_line != None: + diff += b"< " + diff += expect_line + expect_line, expect = pop_line(expect) + return diff + + assert expect_line is not None + assert actual_line is not None + + if expect_line == b'...\n': + next_expect_line, expect = pop_line(expect) + if next_expect_line is None: + if diff == b'': + return None + return diff + while not glob_line_matches(actual_line, next_expect_line): + actual_line, actual = pop_line(actual) + if actual_line is None: + diff += b"---\n" + diff += b"< " + diff += next_expect_line + return diff + expect_line = next_expect_line + continue + + if not glob_line_matches(actual_line, expect_line): + diff += b'---\n' + diff += b'< ' + expect_line + diff += b'> ' + actual_line + + actual_line, actual = pop_line(actual) + expect_line, expect = pop_line(expect) + + +class Options: + """Options configuring how to run a :TestCase:.""" + def __init__( + self, + env: typing.Dict[str, str], + timeout: typing.Optional[int], + verbose: bool, + preserve: bool, + scratch_dir: str, + test_dir: str, + set_exact_output: bool, + ) -> None: + self.env = env + self.timeout = timeout + self.verbose = verbose + self.preserve = preserve + self.scratch_dir = scratch_dir + self.test_dir = test_dir + self.set_exact_output = set_exact_output + + +class TestCase: + """ + Logic and state related to running a single test case. + + 1. Initialize the test case. + 2. Launch the test case with :TestCase.launch():. + This will start the test execution in a subprocess, but + not wait for completion. So you could launch multiple test + cases in parallel. This will now print any test output. + 3. Analyze the results with :TestCase.analyze():. This will + join the test subprocess, check the results against the + expectations, and print the results to stdout. + + :TestCase.run(): is also provided which combines the launch & analyze + steps for single-threaded use-cases. + + All other methods, prefixed with _, are private helper functions. + """ + def __init__(self, test_filename: str, options: Options) -> None: + """ + Initialize the :TestCase: for the test located in :test_filename: + with the given :options:. + """ + self._opts = options + self._test_file = test_filename + self._test_name = os.path.normpath( + os.path.relpath(test_filename, start=self._opts.test_dir) + ) + self._success = {} + self._message = {} + self._test_stdin = None + self._scratch_dir = os.path.abspath(os.path.join(self._opts.scratch_dir, self._test_name)) + + @property + def name(self) -> str: + """Returns the unique name for the test.""" + return self._test_name + + def launch(self) -> None: + """ + Launch the test case as a subprocess, but do not block on completion. + This allows users to run multiple tests in parallel. Results aren't yet + printed out. + """ + self._launch_test() + + def analyze(self) -> bool: + """ + Must be called after :TestCase.launch():. Joins the test subprocess and + checks the results against expectations. Finally prints the results to + stdout and returns the success. + """ + self._join_test() + self._check_exit() + self._check_stderr() + self._check_stdout() + self._analyze_results() + return self._succeeded + + def run(self) -> bool: + """Shorthand for combining both :TestCase.launch(): and :TestCase.analyze():.""" + self.launch() + return self.analyze() + + def _log(self, *args, **kwargs) -> None: + """Logs test output.""" + print(file=sys.stdout, *args, **kwargs) + + def _vlog(self, *args, **kwargs) -> None: + """Logs verbose test output.""" + if self._opts.verbose: + print(file=sys.stdout, *args, **kwargs) + + def _test_environment(self) -> typing.Dict[str, str]: + """ + Returns the environment to be used for the + test subprocess. + """ + # We want to omit ZSTD cli flags so tests will be consistent across environments + env = {k: v for k, v in os.environ.items() if not k.startswith("ZSTD")} + for k, v in self._opts.env.items(): + self._vlog(f"${k}='{v}'") + env[k] = v + return env + + def _launch_test(self) -> None: + """Launch the test subprocess, but do not join it.""" + args = [os.path.abspath(self._test_file)] + stdin_name = f"{self._test_file}.stdin" + if os.path.exists(stdin_name): + self._test_stdin = open(stdin_name, "rb") + stdin = self._test_stdin + else: + stdin = subprocess.DEVNULL + cwd = self._scratch_dir + env = self._test_environment() + self._test_process = subprocess.Popen( + args=args, + stdin=stdin, + cwd=cwd, + env=env, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE + ) + + def _join_test(self) -> None: + """Join the test process and save stderr, stdout, and the exit code.""" + (stdout, stderr) = self._test_process.communicate(timeout=self._opts.timeout) + self._output = {} + self._output["stdout"] = stdout + self._output["stderr"] = stderr + self._exit_code = self._test_process.returncode + self._test_process = None + if self._test_stdin is not None: + self._test_stdin.close() + self._test_stdin = None + + def _check_output_exact(self, out_name: str, expected: bytes, exact_name: str) -> None: + """ + Check the output named :out_name: for an exact match against the :expected: content. + Saves the success and message. + """ + check_name = f"check_{out_name}" + actual = self._output[out_name] + if actual == expected: + self._success[check_name] = True + self._message[check_name] = f"{out_name} matches!" + else: + self._success[check_name] = False + self._message[check_name] = f"{out_name} does not match!\n> diff expected actual\n{diff(expected, actual)}" + + if self._opts.set_exact_output: + with open(exact_name, "wb") as f: + f.write(actual) + + def _check_output_glob(self, out_name: str, expected: bytes) -> None: + """ + Check the output named :out_name: for a glob match against the :expected: glob. + Saves the success and message. + """ + check_name = f"check_{out_name}" + actual = self._output[out_name] + diff = glob_diff(actual, expected) + if diff is None: + self._success[check_name] = True + self._message[check_name] = f"{out_name} matches!" + else: + utf8_diff = diff.decode('utf8') + self._success[check_name] = False + self._message[check_name] = f"{out_name} does not match!\n> diff expected actual\n{utf8_diff}" + + def _check_output(self, out_name: str) -> None: + """ + Checks the output named :out_name: for a match against the expectation. + We check for a .exact, .glob, and a .ignore file. If none are found we + expect that the output should be empty. + + If :Options.preserve: was set then we save the scratch directory and + save the stderr, stdout, and exit code to the scratch directory for + debugging. + """ + if self._opts.preserve: + # Save the output to the scratch directory + actual_name = os.path.join(self._scratch_dir, f"{out_name}") + with open(actual_name, "wb") as f: + f.write(self._output[out_name]) + + exact_name = f"{self._test_file}.{out_name}.exact" + glob_name = f"{self._test_file}.{out_name}.glob" + ignore_name = f"{self._test_file}.{out_name}.ignore" + + if os.path.exists(exact_name): + return self._check_output_exact(out_name, read_file(exact_name), exact_name) + elif os.path.exists(glob_name): + return self._check_output_glob(out_name, read_file(glob_name)) + else: + check_name = f"check_{out_name}" + self._success[check_name] = True + self._message[check_name] = f"{out_name} ignored!" + + def _check_stderr(self) -> None: + """Checks the stderr output against the expectation.""" + self._check_output("stderr") + + def _check_stdout(self) -> None: + """Checks the stdout output against the expectation.""" + self._check_output("stdout") + + def _check_exit(self) -> None: + """ + Checks the exit code against expectations. If a .exit file + exists, we expect that the exit code matches the contents. + Otherwise we expect the exit code to be zero. + + If :Options.preserve: is set we save the exit code to the + scratch directory under the filename "exit". + """ + if self._opts.preserve: + exit_name = os.path.join(self._scratch_dir, "exit") + with open(exit_name, "w") as f: + f.write(str(self._exit_code) + "\n") + exit_name = f"{self._test_file}.exit" + if os.path.exists(exit_name): + exit_code: int = int(read_file(exit_name)) + else: + exit_code: int = 0 + if exit_code == self._exit_code: + self._success["check_exit"] = True + self._message["check_exit"] = "Exit code matches!" + else: + self._success["check_exit"] = False + self._message["check_exit"] = f"Exit code mismatch! Expected {exit_code} but got {self._exit_code}" + + def _analyze_results(self) -> None: + """ + After all tests have been checked, collect all the successes + and messages, and print the results to stdout. + """ + STATUS = {True: "PASS", False: "FAIL"} + checks = sorted(self._success.keys()) + self._succeeded = all(self._success.values()) + self._log(f"{STATUS[self._succeeded]}: {self._test_name}") + + if not self._succeeded or self._opts.verbose: + for check in checks: + if self._opts.verbose or not self._success[check]: + self._log(f"{STATUS[self._success[check]]}: {self._test_name}.{check}") + self._log(self._message[check]) + + self._log("----------------------------------------") + + +class TestSuite: + """ + Setup & teardown test suite & cases. + This class is intended to be used as a context manager. + + TODO: Make setup/teardown failure emit messages, not throw exceptions. + """ + def __init__(self, test_directory: str, options: Options) -> None: + self._opts = options + self._test_dir = os.path.abspath(test_directory) + rel_test_dir = os.path.relpath(test_directory, start=self._opts.test_dir) + assert not rel_test_dir.startswith(os.path.sep) + self._scratch_dir = os.path.normpath(os.path.join(self._opts.scratch_dir, rel_test_dir)) + + def __enter__(self) -> 'TestSuite': + self._setup_once() + return self + + def __exit__(self, _exc_type, _exc_value, _traceback) -> None: + self._teardown_once() + + @contextlib.contextmanager + def test_case(self, test_basename: str) -> TestCase: + """ + Context manager for a test case in the test suite. + Pass the basename of the test relative to the :test_directory:. + """ + assert os.path.dirname(test_basename) == "" + try: + self._setup(test_basename) + test_filename = os.path.join(self._test_dir, test_basename) + yield TestCase(test_filename, self._opts) + finally: + self._teardown(test_basename) + + def _remove_scratch_dir(self, dir: str) -> None: + """Helper to remove a scratch directory with sanity checks""" + assert "scratch" in dir + assert dir.startswith(self._scratch_dir) + assert os.path.exists(dir) + shutil.rmtree(dir) + + def _setup_once(self) -> None: + if os.path.exists(self._scratch_dir): + self._remove_scratch_dir(self._scratch_dir) + os.makedirs(self._scratch_dir) + setup_script = os.path.join(self._test_dir, "setup_once") + if os.path.exists(setup_script): + self._run_script(setup_script, cwd=self._scratch_dir) + + def _teardown_once(self) -> None: + assert os.path.exists(self._scratch_dir) + teardown_script = os.path.join(self._test_dir, "teardown_once") + if os.path.exists(teardown_script): + self._run_script(teardown_script, cwd=self._scratch_dir) + if not self._opts.preserve: + self._remove_scratch_dir(self._scratch_dir) + + def _setup(self, test_basename: str) -> None: + test_scratch_dir = os.path.join(self._scratch_dir, test_basename) + assert not os.path.exists(test_scratch_dir) + os.makedirs(test_scratch_dir) + setup_script = os.path.join(self._test_dir, "setup") + if os.path.exists(setup_script): + self._run_script(setup_script, cwd=test_scratch_dir) + + def _teardown(self, test_basename: str) -> None: + test_scratch_dir = os.path.join(self._scratch_dir, test_basename) + assert os.path.exists(test_scratch_dir) + teardown_script = os.path.join(self._test_dir, "teardown") + if os.path.exists(teardown_script): + self._run_script(teardown_script, cwd=test_scratch_dir) + if not self._opts.preserve: + self._remove_scratch_dir(test_scratch_dir) + + def _run_script(self, script: str, cwd: str) -> None: + env = copy.copy(os.environ) + for k, v in self._opts.env.items(): + env[k] = v + try: + subprocess.run( + args=[script], + stdin=subprocess.DEVNULL, + capture_output=True, + cwd=cwd, + env=env, + check=True, + ) + except subprocess.CalledProcessError as e: + print(f"{script} failed with exit code {e.returncode}!") + print(f"stderr:\n{e.stderr}") + print(f"stdout:\n{e.stdout}") + raise + +TestSuites = typing.Dict[str, typing.List[str]] + +def get_all_tests(options: Options) -> TestSuites: + """ + Find all the test in the test directory and return the test suites. + """ + test_suites = {} + for root, dirs, files in os.walk(options.test_dir, topdown=True): + dirs[:] = [d for d in dirs if not exclude_dir(d)] + test_cases = [] + for file in files: + if not exclude_file(file): + test_cases.append(file) + assert root == os.path.normpath(root) + test_suites[root] = test_cases + return test_suites + + +def resolve_listed_tests( + tests: typing.List[str], options: Options +) -> TestSuites: + """ + Resolve the list of tests passed on the command line into their + respective test suites. Tests can either be paths, or test names + relative to the test directory. + """ + test_suites = {} + for test in tests: + if not os.path.exists(test): + test = os.path.join(options.test_dir, test) + if not os.path.exists(test): + raise RuntimeError(f"Test {test} does not exist!") + + test = os.path.normpath(os.path.abspath(test)) + assert test.startswith(options.test_dir) + test_suite = os.path.dirname(test) + test_case = os.path.basename(test) + test_suites.setdefault(test_suite, []).append(test_case) + + return test_suites + +def run_tests(test_suites: TestSuites, options: Options) -> bool: + """ + Runs all the test in the :test_suites: with the given :options:. + Prints the results to stdout. + """ + tests = {} + for test_dir, test_files in test_suites.items(): + with TestSuite(test_dir, options) as test_suite: + test_files = sorted(set(test_files)) + for test_file in test_files: + with test_suite.test_case(test_file) as test_case: + tests[test_case.name] = test_case.run() + + successes = 0 + for test, status in tests.items(): + if status: + successes += 1 + else: + print(f"FAIL: {test}") + if successes == len(tests): + print(f"PASSED all {len(tests)} tests!") + return True + else: + print(f"FAILED {len(tests) - successes} / {len(tests)} tests!") + return False + + +def setup_zstd_symlink_dir(zstd_symlink_dir: str, zstd: str) -> None: + assert os.path.join("bin", "symlinks") in zstd_symlink_dir + if not os.path.exists(zstd_symlink_dir): + os.makedirs(zstd_symlink_dir) + for symlink in ZSTD_SYMLINKS: + path = os.path.join(zstd_symlink_dir, symlink) + if os.path.exists(path): + os.remove(path) + os.symlink(zstd, path) + +if __name__ == "__main__": + CLI_TEST_DIR = os.path.dirname(sys.argv[0]) + REPO_DIR = os.path.join(CLI_TEST_DIR, "..", "..") + PROGRAMS_DIR = os.path.join(REPO_DIR, "programs") + TESTS_DIR = os.path.join(REPO_DIR, "tests") + ZSTD_PATH = os.path.join(PROGRAMS_DIR, "zstd") + ZSTDGREP_PATH = os.path.join(PROGRAMS_DIR, "zstdgrep") + ZSTDLESS_PATH = os.path.join(PROGRAMS_DIR, "zstdless") + DATAGEN_PATH = os.path.join(TESTS_DIR, "datagen") + + parser = argparse.ArgumentParser( + ( + "Runs the zstd CLI tests. Exits nonzero on failure. Default arguments are\n" + "generally correct. Pass --preserve to preserve test output for debugging,\n" + "and --verbose to get verbose test output.\n" + ) + ) + parser.add_argument( + "--preserve", + action="store_true", + help="Preserve the scratch directory TEST_DIR/scratch/ for debugging purposes." + ) + parser.add_argument("--verbose", action="store_true", help="Verbose test output.") + parser.add_argument("--timeout", default=60, type=int, help="Test case timeout in seconds. Set to 0 to disable timeouts.") + parser.add_argument( + "--exec-prefix", + default=None, + help="Sets the EXEC_PREFIX environment variable. Prefix to invocations of the zstd CLI." + ) + parser.add_argument( + "--zstd", + default=ZSTD_PATH, + help="Sets the ZSTD_BIN environment variable. Path of the zstd CLI." + ) + parser.add_argument( + "--zstdgrep", + default=ZSTDGREP_PATH, + help="Sets the ZSTDGREP_BIN environment variable. Path of the zstdgrep CLI." + ) + parser.add_argument( + "--zstdless", + default=ZSTDLESS_PATH, + help="Sets the ZSTDLESS_BIN environment variable. Path of the zstdless CLI." + ) + parser.add_argument( + "--datagen", + default=DATAGEN_PATH, + help="Sets the DATAGEN_BIN environment variable. Path to the datagen CLI." + ) + parser.add_argument( + "--test-dir", + default=CLI_TEST_DIR, + help=( + "Runs the tests under this directory. " + "Adds TEST_DIR/bin/ to path. " + "Scratch directory located in TEST_DIR/scratch/." + ) + ) + parser.add_argument( + "--set-exact-output", + action="store_true", + help="Set stderr.exact and stdout.exact for all failing tests, unless .ignore or .glob already exists" + ) + parser.add_argument( + "tests", + nargs="*", + help="Run only these test cases. Can either be paths or test names relative to TEST_DIR/" + ) + args = parser.parse_args() + + if args.timeout <= 0: + args.timeout = None + + args.test_dir = os.path.normpath(os.path.abspath(args.test_dir)) + bin_dir = os.path.abspath(os.path.join(args.test_dir, "bin")) + zstd_symlink_dir = os.path.join(bin_dir, "symlinks") + scratch_dir = os.path.join(args.test_dir, "scratch") + + setup_zstd_symlink_dir(zstd_symlink_dir, os.path.abspath(args.zstd)) + + env = {} + if args.exec_prefix is not None: + env["EXEC_PREFIX"] = args.exec_prefix + env["ZSTD_SYMLINK_DIR"] = zstd_symlink_dir + env["ZSTD_REPO_DIR"] = os.path.abspath(REPO_DIR) + env["DATAGEN_BIN"] = os.path.abspath(args.datagen) + env["ZSTDGREP_BIN"] = os.path.abspath(args.zstdgrep) + env["ZSTDLESS_BIN"] = os.path.abspath(args.zstdless) + env["COMMON"] = os.path.abspath(os.path.join(args.test_dir, "common")) + env["PATH"] = bin_dir + ":" + os.getenv("PATH", "") + env["LC_ALL"] = "C" + + opts = Options( + env=env, + timeout=args.timeout, + verbose=args.verbose, + preserve=args.preserve, + test_dir=args.test_dir, + scratch_dir=scratch_dir, + set_exact_output=args.set_exact_output, + ) + + if len(args.tests) == 0: + tests = get_all_tests(opts) + else: + tests = resolve_listed_tests(args.tests, opts) + + success = run_tests(tests, opts) + if success: + sys.exit(0) + else: + sys.exit(1) diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/setup b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/setup new file mode 100755 index 0000000..cf391ed --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/setup @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +println "hello" > hello +println "world" > world +zstd hello world diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh new file mode 100755 index 0000000..74ec063 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e + +# Test zstdcat symlink in bin/ +zstdcat hello.zst +zstdcat hello.zst world +zstdcat hello world.zst +zstdcat hello.zst world.zst + +# Test local zstdcat symlink +ln -s $(which zstd) ./zstdcat +./zstdcat hello.zst diff --git a/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact new file mode 100644 index 0000000..3205b05 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact @@ -0,0 +1,8 @@ +hello +hello +world +hello +world +hello +world +hello diff --git a/src/dependencies/zstd-1.5.0/tests/datagencli.c b/src/dependencies/zstd-1.5.4/tests/datagencli.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/datagencli.c rename to src/dependencies/zstd-1.5.4/tests/datagencli.c index ecc05f9..09ec5e9 100644 --- a/src/dependencies/zstd-1.5.0/tests/datagencli.c +++ b/src/dependencies/zstd-1.5.4/tests/datagencli.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -124,7 +124,7 @@ int main(int argc, const char** argv) DISPLAYLEVEL(3, "Seed = %u \n", (unsigned)seed); RDG_genStdout(size, (double)probaU32/100, litProba, seed); - DISPLAYLEVEL(1, "\n"); + DISPLAYLEVEL(3, "\n"); return 0; } diff --git a/src/dependencies/zstd-1.5.0/tests/decodecorpus.c b/src/dependencies/zstd-1.5.4/tests/decodecorpus.c similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/decodecorpus.c rename to src/dependencies/zstd-1.5.4/tests/decodecorpus.c index fa6a2d6..148088a 100644 --- a/src/dependencies/zstd-1.5.0/tests/decodecorpus.c +++ b/src/dependencies/zstd-1.5.4/tests/decodecorpus.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -14,6 +14,7 @@ #include #include #include +#include /* time(), for seed random initialization */ #include "util.h" #include "timefn.h" /* UTIL_clockSpanMicro, SEC_TO_MICRO, UTIL_TIME_INITIALIZER */ @@ -24,21 +25,13 @@ #include "zdict.h" /* Direct access to internal compression functions is required */ -#include "zstd_compress.c" +#include "compress/zstd_compress.c" /* ZSTD_resetSeqStore, ZSTD_storeSeq, *_TO_OFFBASE, HIST_countFast_wksp, HIST_isError */ #define XXH_STATIC_LINKING_ONLY #include "xxhash.h" /* XXH64 */ -#ifndef MIN - #define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef MAX_PATH - #ifdef PATH_MAX - #define MAX_PATH PATH_MAX - #else - #define MAX_PATH 256 - #endif +#if !(defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)) +# define inline /* disable */ #endif /*-************************************ @@ -70,6 +63,7 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; } \ } while (0) + /*-******************************************************* * Random function *********************************************************/ @@ -136,7 +130,7 @@ static void RAND_genDist(U32* seed, BYTE* dist, double weight) BYTE step = (BYTE) ((RAND(seed) % 256) | 1); /* force it to be odd so it's relatively prime to 256 */ while (i < DISTSIZE) { - size_t states = ((size_t)(weight * statesLeft)) + 1; + size_t states = ((size_t)(weight * (double)statesLeft)) + 1; size_t j; for (j = 0; j < states && i < DISTSIZE; j++, i++) { dist[i] = symb; @@ -165,7 +159,7 @@ static double RAND_exp(U32* seed, double mean) /*-******************************************************* * Constants and Structs *********************************************************/ -const char *BLOCK_TYPES[] = {"raw", "rle", "compressed"}; +const char* BLOCK_TYPES[] = {"raw", "rle", "compressed"}; #define MAX_DECOMPRESSED_SIZE_LOG 20 #define MAX_DECOMPRESSED_SIZE (1ULL << MAX_DECOMPRESSED_SIZE_LOG) @@ -175,6 +169,14 @@ const char *BLOCK_TYPES[] = {"raw", "rle", "compressed"}; #define MIN_SEQ_LEN (3) #define MAX_NB_SEQ ((ZSTD_BLOCKSIZE_MAX + MIN_SEQ_LEN - 1) / MIN_SEQ_LEN) +#ifndef MAX_PATH + #ifdef PATH_MAX + #define MAX_PATH PATH_MAX + #else + #define MAX_PATH 256 + #endif +#endif + BYTE CONTENT_BUFFER[MAX_DECOMPRESSED_SIZE]; BYTE FRAME_BUFFER[MAX_DECOMPRESSED_SIZE * 2]; BYTE LITERAL_BUFFER[ZSTD_BLOCKSIZE_MAX]; @@ -185,7 +187,7 @@ BYTE SEQUENCE_LLCODE[ZSTD_BLOCKSIZE_MAX]; BYTE SEQUENCE_MLCODE[ZSTD_BLOCKSIZE_MAX]; BYTE SEQUENCE_OFCODE[ZSTD_BLOCKSIZE_MAX]; -unsigned WKSP[HUF_WORKSPACE_SIZE_U32]; +U64 WKSP[HUF_WORKSPACE_SIZE_U64]; typedef struct { size_t contentSize; /* 0 means unknown (unless contentSize == windowSize == 0) */ @@ -199,7 +201,7 @@ typedef struct { int hufInit; /* the distribution used in the previous block for repeat mode */ BYTE hufDist[DISTSIZE]; - HUF_CElt hufTable [256]; + HUF_CElt hufTable [HUF_CTABLE_SIZE_ST(255)]; int fseInit; FSE_CTable offcodeCTable [FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)]; @@ -240,6 +242,10 @@ typedef enum { gt_block, /* generate compressed blocks without block/frame headers */ } genType_e; +#ifndef MIN + #define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + /*-******************************************************* * Global variables (set from command line) *********************************************************/ @@ -454,7 +460,7 @@ static size_t writeHufHeader(U32* seed, HUF_CElt* hufTable, void* dst, size_t ds } /* Write table description header */ - { size_t const hSize = HUF_writeCTable (op, dstSize, hufTable, maxSymbolValue, huffLog); + { size_t const hSize = HUF_writeCTable_wksp (op, dstSize, hufTable, maxSymbolValue, huffLog, WKSP, sizeof(WKSP)); if (hSize + 12 >= srcSize) return 0; /* not useful to try compression */ op += hSize; } @@ -558,10 +564,10 @@ static size_t writeLiteralsBlockCompressed(U32* seed, frame_t* frame, size_t con sizeFormat == 0 ? HUF_compress1X_usingCTable( op, opend - op, LITERAL_BUFFER, litSize, - frame->stats.hufTable) + frame->stats.hufTable, /* flags */ 0) : HUF_compress4X_usingCTable( op, opend - op, LITERAL_BUFFER, litSize, - frame->stats.hufTable); + frame->stats.hufTable, /* flags */ 0); CHECKERR(compressedSize); /* this only occurs when it could not compress or similar */ } while (compressedSize <= 0); @@ -633,17 +639,16 @@ static inline void initSeqStore(seqStore_t *seqStore) { } /* Randomly generate sequence commands */ -static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, - size_t contentSize, size_t literalsSize, dictInfo info) +static U32 +generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, + size_t contentSize, size_t literalsSize, dictInfo info) { /* The total length of all the matches */ size_t const remainingMatch = contentSize - literalsSize; size_t excessMatch = 0; U32 numSequences = 0; - U32 i; - const BYTE* literals = LITERAL_BUFFER; BYTE* srcPtr = frame->src; @@ -663,16 +668,16 @@ static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, * ensure nice numbers */ U32 matchLen = MIN_SEQ_LEN + - ROUND(RAND_exp(seed, excessMatch / (double)(numSequences - i))); + ROUND(RAND_exp(seed, (double)excessMatch / (double)(numSequences - i))); U32 literalLen = (RAND(seed) & 7) ? ROUND(RAND_exp(seed, - literalsSize / + (double)literalsSize / (double)(numSequences - i))) : 0; /* actual offset, code to send, and point to copy up to when shifting * codes in the repeat offsets history */ - U32 offset, offsetCode, repIndex; + U32 offset, offBase, repIndex; /* bounds checks */ matchLen = (U32) MIN(matchLen, excessMatch + MIN_SEQ_LEN); @@ -703,32 +708,31 @@ static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, lenPastStart = MIN(lenPastStart+MIN_SEQ_LEN, (U32)info.dictContentSize); offset = (U32)((BYTE*)srcPtr - (BYTE*)frame->srcStart) + lenPastStart; } - { - U32 const matchLenBound = MIN(frame->header.windowSize, lenPastStart); + { U32 const matchLenBound = MIN(frame->header.windowSize, lenPastStart); matchLen = MIN(matchLen, matchLenBound); } } } - offsetCode = offset + ZSTD_REP_MOVE; + offBase = OFFSET_TO_OFFBASE(offset); repIndex = 2; } else { /* do a repeat offset */ - offsetCode = RAND(seed) % 3; + U32 const randomRepIndex = RAND(seed) % 3; + offBase = REPCODE_TO_OFFBASE(randomRepIndex + 1); /* expects values between 1 & 3 */ if (literalLen > 0) { - offset = frame->stats.rep[offsetCode]; - repIndex = offsetCode; + offset = frame->stats.rep[randomRepIndex]; + repIndex = randomRepIndex; } else { - /* special case */ - offset = offsetCode == 2 ? frame->stats.rep[0] - 1 - : frame->stats.rep[offsetCode + 1]; - repIndex = MIN(2, offsetCode + 1); + /* special case : literalLen == 0 */ + offset = randomRepIndex == 2 ? frame->stats.rep[0] - 1 + : frame->stats.rep[randomRepIndex + 1]; + repIndex = MIN(2, randomRepIndex + 1); } } } while (((!info.useDict) && (offset > (size_t)((BYTE*)srcPtr - (BYTE*)frame->srcStart))) || offset == 0); - { + { BYTE* const dictEnd = info.dictContent + info.dictContentSize; size_t j; - BYTE* const dictEnd = info.dictContent + info.dictContentSize; for (j = 0; j < matchLen; j++) { if ((U32)((BYTE*)srcPtr - (BYTE*)frame->srcStart) < offset) { /* copy from dictionary instead of literals */ @@ -739,8 +743,7 @@ static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, *srcPtr = *(srcPtr-offset); } srcPtr++; - } - } + } } { int r; for (r = repIndex; r > 0; r--) { @@ -754,12 +757,12 @@ static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, DISPLAYLEVEL(7, " srcPos: %8u seqNb: %3u", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart), (unsigned)i); DISPLAYLEVEL(6, "\n"); - if (offsetCode < 3) { + if (OFFBASE_IS_REPCODE(offBase)) { /* expects sumtype numeric representation of ZSTD_storeSeq() */ DISPLAYLEVEL(7, " repeat offset: %d\n", (int)repIndex); } /* use libzstd sequence handling */ ZSTD_storeSeq(seqStore, literalLen, literals, literals + literalLen, - offsetCode, matchLen - MINMATCH); + offBase, matchLen); literalsSize -= literalLen; excessMatch -= (matchLen - MIN_SEQ_LEN); @@ -768,8 +771,8 @@ static U32 generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, memcpy(srcPtr, literals, literalsSize); srcPtr += literalsSize; - DISPLAYLEVEL(6, " excess literals: %5u", (unsigned)literalsSize); - DISPLAYLEVEL(7, " srcPos: %8u", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart)); + DISPLAYLEVEL(6, " excess literals: %5u ", (unsigned)literalsSize); + DISPLAYLEVEL(7, "srcPos: %8u ", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart)); DISPLAYLEVEL(6, "\n"); return numSequences; @@ -949,9 +952,9 @@ static size_t writeSequences(U32* seed, frame_t* frame, seqStore_t* seqStorePtr, FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]); BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]); + BIT_addBits(&blockStream, sequences[nbSeq-1].mlBase, ML_bits[mlCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]); + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, ofCodeTable[nbSeq-1]); BIT_flushBits(&blockStream); { size_t n; @@ -971,9 +974,9 @@ static size_t writeSequences(U32* seed, frame_t* frame, seqStore_t* seqStorePtr, BIT_flushBits(&blockStream); /* (7)*/ BIT_addBits(&blockStream, sequences[n].litLength, llBits); if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[n].matchLength, mlBits); + BIT_addBits(&blockStream, sequences[n].mlBase, mlBits); if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/ - BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */ + BIT_addBits(&blockStream, sequences[n].offBase, ofBits); /* 31 */ BIT_flushBits(&blockStream); /* (7)*/ } } diff --git a/src/dependencies/zstd-1.5.0/tests/dict-files/zero-weight-dict b/src/dependencies/zstd-1.5.4/tests/dict-files/zero-weight-dict similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/dict-files/zero-weight-dict rename to src/dependencies/zstd-1.5.4/tests/dict-files/zero-weight-dict diff --git a/src/dependencies/zstd-1.5.4/tests/external_matchfinder.c b/src/dependencies/zstd-1.5.4/tests/external_matchfinder.c new file mode 100644 index 0000000..76ad411 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/external_matchfinder.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "external_matchfinder.h" +#include +#include "zstd_compress_internal.h" + +#define HSIZE 1024 +static U32 const HLOG = 10; +static U32 const MLS = 4; +static U32 const BADIDX = 0xffffffff; + +static size_t simpleSequenceProducer( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +) { + const BYTE* const istart = (const BYTE*)src; + const BYTE* const iend = istart + srcSize; + const BYTE* ip = istart; + const BYTE* anchor = istart; + size_t seqCount = 0; + U32 hashTable[HSIZE]; + + (void)sequenceProducerState; + (void)dict; + (void)dictSize; + (void)outSeqsCapacity; + (void)compressionLevel; + + { int i; + for (i=0; i < HSIZE; i++) { + hashTable[i] = BADIDX; + } } + + while (ip + MLS < iend) { + size_t const hash = ZSTD_hashPtr(ip, HLOG, MLS); + U32 const matchIndex = hashTable[hash]; + hashTable[hash] = (U32)(ip - istart); + + if (matchIndex != BADIDX) { + const BYTE* const match = istart + matchIndex; + U32 const matchLen = (U32)ZSTD_count(ip, match, iend); + if (matchLen >= ZSTD_MINMATCH_MIN) { + U32 const litLen = (U32)(ip - anchor); + U32 const offset = (U32)(ip - match); + ZSTD_Sequence const seq = { + offset, litLen, matchLen, 0 + }; + + /* Note: it's crucial to stay within the window size! */ + if (offset <= windowSize) { + outSeqs[seqCount++] = seq; + ip += matchLen; + anchor = ip; + continue; + } + } + } + + ip++; + } + + { ZSTD_Sequence const finalSeq = { + 0, (U32)(iend - anchor), 0, 0 + }; + outSeqs[seqCount++] = finalSeq; + } + + return seqCount; +} + +size_t zstreamSequenceProducer( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +) { + EMF_testCase const testCase = *((EMF_testCase*)sequenceProducerState); + memset(outSeqs, 0, outSeqsCapacity); + + switch (testCase) { + case EMF_ZERO_SEQS: + return 0; + case EMF_ONE_BIG_SEQ: + outSeqs[0].offset = 0; + outSeqs[0].matchLength = 0; + outSeqs[0].litLength = (U32)(srcSize); + return 1; + case EMF_LOTS_OF_SEQS: + return simpleSequenceProducer( + sequenceProducerState, + outSeqs, outSeqsCapacity, + src, srcSize, + dict, dictSize, + compressionLevel, + windowSize + ); + case EMF_INVALID_OFFSET: + outSeqs[0].offset = 1 << 20; + outSeqs[0].matchLength = 4; + outSeqs[0].litLength = (U32)(srcSize - 4); + return 1; + case EMF_INVALID_MATCHLEN: + outSeqs[0].offset = 1; + outSeqs[0].matchLength = (U32)(srcSize); + outSeqs[0].litLength = 1; + return 1; + case EMF_INVALID_LITLEN: + outSeqs[0].offset = 0; + outSeqs[0].matchLength = 0; + outSeqs[0].litLength = (U32)(srcSize + 1); + return 1; + case EMF_INVALID_LAST_LITS: + outSeqs[0].offset = 1; + outSeqs[0].matchLength = 1; + outSeqs[0].litLength = 1; + outSeqs[1].offset = 0; + outSeqs[1].matchLength = 0; + outSeqs[1].litLength = (U32)(srcSize - 1); + return 2; + case EMF_SMALL_ERROR: + return outSeqsCapacity + 1; + case EMF_BIG_ERROR: + default: + return ZSTD_SEQUENCE_PRODUCER_ERROR; + } +} diff --git a/src/dependencies/zstd-1.5.4/tests/external_matchfinder.h b/src/dependencies/zstd-1.5.4/tests/external_matchfinder.h new file mode 100644 index 0000000..e38dc25 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/external_matchfinder.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef EXTERNAL_MATCHFINDER +#define EXTERNAL_MATCHFINDER + +#define ZSTD_STATIC_LINKING_ONLY +#include "zstd.h" + +/* See external_matchfinder.c for details on each test case */ +typedef enum { + EMF_ZERO_SEQS = 0, + EMF_ONE_BIG_SEQ = 1, + EMF_LOTS_OF_SEQS = 2, + EMF_BIG_ERROR = 3, + EMF_SMALL_ERROR = 4, + EMF_INVALID_OFFSET = 5, + EMF_INVALID_MATCHLEN = 6, + EMF_INVALID_LITLEN = 7, + EMF_INVALID_LAST_LITS = 8 +} EMF_testCase; + +size_t zstreamSequenceProducer( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +#endif /* EXTERNAL_MATCHFINDER */ diff --git a/src/dependencies/zstd-1.5.0/tests/fullbench.c b/src/dependencies/zstd-1.5.4/tests/fullbench.c similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/fullbench.c rename to src/dependencies/zstd-1.5.4/tests/fullbench.c index a71117e..3a72d89 100644 --- a/src/dependencies/zstd-1.5.0/tests/fullbench.c +++ b/src/dependencies/zstd-1.5.4/tests/fullbench.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -108,7 +108,25 @@ local_ZSTD_compress(const void* src, size_t srcSize, p.fParams = f; p.cParams = *(ZSTD_compressionParameters*)payload; return ZSTD_compress_advanced (g_zcc, dst, dstSize, src, srcSize, NULL ,0, p); - //return ZSTD_compress(dst, dstSize, src, srcSize, cLevel); +} + +static size_t +local_ZSTD_compress_freshCCtx(const void* src, size_t srcSize, + void* dst, size_t dstSize, + void* payload) +{ + ZSTD_parameters p; + ZSTD_frameParameters f = { 1 /* contentSizeHeader*/, 0, 0 }; + p.fParams = f; + p.cParams = *(ZSTD_compressionParameters*)payload; + if (g_zcc != NULL) ZSTD_freeCCtx(g_zcc); + g_zcc = ZSTD_createCCtx(); + assert(g_zcc != NULL); + { size_t const r = ZSTD_compress_advanced (g_zcc, dst, dstSize, src, srcSize, NULL ,0, p); + ZSTD_freeCCtx(g_zcc); + g_zcc = NULL; + return r; + } } static size_t g_cSize = 0; @@ -123,11 +141,15 @@ static size_t local_ZSTD_decompress(const void* src, size_t srcSize, static ZSTD_DCtx* g_zdc = NULL; #ifndef ZSTD_DLL_IMPORT -extern size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* ctx, const void* src, size_t srcSize); +typedef enum { + not_streaming = 0, + is_streaming = 1 +} streaming_operation; +extern size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* ctx, const void* src, size_t srcSize, void* dst, size_t dstCapacity, const streaming_operation streaming); static size_t local_ZSTD_decodeLiteralsBlock(const void* src, size_t srcSize, void* dst, size_t dstSize, void* buff2) { (void)src; (void)srcSize; (void)dst; (void)dstSize; - return ZSTD_decodeLiteralsBlock(g_zdc, buff2, g_cSize); + return ZSTD_decodeLiteralsBlock(g_zdc, buff2, g_cSize, dst, dstSize, not_streaming); } static size_t local_ZSTD_decodeSeqHeaders(const void* src, size_t srcSize, void* dst, size_t dstSize, void* buff2) @@ -149,6 +171,7 @@ FORCE_NOINLINE size_t ZSTD_decodeLiteralsHeader(ZSTD_DCtx* dctx, void const* src size_t lhSize, litSize, litCSize; U32 const lhlCode = (istart[0] >> 2) & 3; U32 const lhc = MEM_readLE32(istart); + int const flags = ZSTD_DCtx_get_bmi2(dctx) ? HUF_flags_bmi2 : 0; switch(lhlCode) { case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -173,16 +196,16 @@ FORCE_NOINLINE size_t ZSTD_decodeLiteralsHeader(ZSTD_DCtx* dctx, void const* src RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, ""); #ifndef HUF_FORCE_DECOMPRESS_X2 - return HUF_readDTableX1_wksp_bmi2( + return HUF_readDTableX1_wksp( dctx->entropy.hufTable, istart+lhSize, litCSize, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + flags); #else return HUF_readDTableX2_wksp( dctx->entropy.hufTable, istart+lhSize, litCSize, - dctx->workspace, sizeof(dctx->workspace)); + dctx->workspace, sizeof(dctx->workspace), flags); #endif } } @@ -226,14 +249,15 @@ local_ZSTD_compressStream_freshCCtx(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* payload) { - ZSTD_CCtx* const cctx = ZSTD_createCCtx(); - size_t r; - assert(cctx != NULL); + if (g_cstream != NULL) ZSTD_freeCCtx(g_cstream); + g_cstream = ZSTD_createCCtx(); + assert(g_cstream != NULL); - r = local_ZSTD_compressStream(src, srcSize, dst, dstCapacity, payload); - - ZSTD_freeCCtx(cctx); - return r; + { size_t const r = local_ZSTD_compressStream(src, srcSize, dst, dstCapacity, payload); + ZSTD_freeCCtx(g_cstream); + g_cstream = NULL; + return r; + } } static size_t @@ -426,6 +450,9 @@ static int benchMem(unsigned benchNb, case 2: benchFunction = local_ZSTD_decompress; benchName = "decompress"; break; + case 3: + benchFunction = local_ZSTD_compress_freshCCtx; benchName = "compress_freshCCtx"; + break; #ifndef ZSTD_DLL_IMPORT case 11: benchFunction = local_ZSTD_compressContinue; benchName = "compressContinue"; @@ -504,7 +531,6 @@ static int benchMem(unsigned benchNb, ZSTD_CCtx_setParameter(g_zcc, ZSTD_c_targetLength, (int)cparams.targetLength); ZSTD_CCtx_setParameter(g_zcc, ZSTD_c_strategy, cparams.strategy); - ZSTD_CCtx_setParameter(g_cstream, ZSTD_c_compressionLevel, cLevel); ZSTD_CCtx_setParameter(g_cstream, ZSTD_c_windowLog, (int)cparams.windowLog); ZSTD_CCtx_setParameter(g_cstream, ZSTD_c_hashLog, (int)cparams.hashLog); @@ -523,6 +549,9 @@ static int benchMem(unsigned benchNb, case 2: g_cSize = ZSTD_compress(dstBuff2, dstBuffSize, src, srcSize, cLevel); break; + case 3: + payload = &cparams; + break; #ifndef ZSTD_DLL_IMPORT case 11: payload = &cparams; @@ -577,7 +606,7 @@ static int benchMem(unsigned benchNb, ip += ZSTD_blockHeaderSize; /* skip block header */ ZSTD_decompressBegin(g_zdc); CONTROL(iend > ip); - ip += ZSTD_decodeLiteralsBlock(g_zdc, ip, (size_t)(iend-ip)); /* skip literal segment */ + ip += ZSTD_decodeLiteralsBlock(g_zdc, ip, (size_t)(iend-ip), dstBuff, dstBuffSize, not_streaming); /* skip literal segment */ g_cSize = (size_t)(iend-ip); memcpy(dstBuff2, ip, g_cSize); /* copy rest of block (it starts by SeqHeader) */ srcSize = srcSize > 128 KB ? 128 KB : srcSize; /* speed relative to block */ diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/.gitignore b/src/dependencies/zstd-1.5.4/tests/fuzz/.gitignore similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/fuzz/.gitignore rename to src/dependencies/zstd-1.5.4/tests/fuzz/.gitignore index 93d935a..28f2b8d 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/.gitignore +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/.gitignore @@ -17,6 +17,8 @@ decompress_dstSize_tooSmall fse_read_ncount sequence_compression_api seekable_roundtrip +huf_decompress +huf_round_trip fuzz-*.log rt_lib_* d_lib_* diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/Makefile b/src/dependencies/zstd-1.5.4/tests/fuzz/Makefile similarity index 80% rename from src/dependencies/zstd-1.5.0/tests/fuzz/Makefile rename to src/dependencies/zstd-1.5.4/tests/fuzz/Makefile index ccb574b..bbb262a 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/Makefile +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -12,6 +12,7 @@ CFLAGS ?= -O3 CXXFLAGS ?= -O3 CPPFLAGS ?= +ASFLAGS ?= LDFLAGS ?= ARFLAGS ?= LIB_FUZZING_ENGINE ?= libregression.a @@ -23,20 +24,32 @@ else endif CORPORA_URL_PREFIX:=https://github.com/facebook/zstd/releases/download/fuzz-corpora/ +LIBZSTD = ../../lib +DEBUGLEVEL ?= 2 +ZSTD_LEGACY_SUPPORT ?= 1 + +include $(LIBZSTD)/libzstd.mk + ZSTDDIR = ../../lib PRGDIR = ../../programs CONTRIBDIR = ../../contrib +# TODO(embg) make it possible to plug in an arbitrary matchfinder as a .o file +MATCHFINDER_DIR = $(CONTRIBDIR)/externalSequenceProducer +MATCHFINDER_SRC = $(MATCHFINDER_DIR)/sequence_producer.c + FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(ZSTDDIR)/legacy \ - -I$(CONTRIBDIR)/seekable_format -I$(PRGDIR) -DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS) + -I$(CONTRIBDIR)/seekable_format -I$(PRGDIR) -I$(MATCHFINDER_DIR) \ + -DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS) FUZZ_EXTRA_FLAGS := -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ -Wstrict-prototypes -Wundef \ -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ - -Wredundant-decls \ + -Wredundant-decls -Wno-deprecated-declarations \ -g -fno-omit-frame-pointer FUZZ_CFLAGS := $(FUZZ_EXTRA_FLAGS) $(CFLAGS) +FUZZ_ASFLAGS := $(FUZZ_EXTRA_FLAGS) $(ASFLAGS) FUZZ_CXXFLAGS := $(FUZZ_EXTRA_FLAGS) -std=c++11 $(CXXFLAGS) FUZZ_LDFLAGS := -pthread $(LDFLAGS) FUZZ_ARFLAGS := $(ARFLAGS) @@ -50,19 +63,20 @@ FUZZ_SRC := $(PRGDIR)/util.c ./fuzz_helpers.c ./zstd_helpers.c ./fuzz_data_produ SEEKABLE_HEADERS = $(CONTRIBDIR)/seekable_format/zstd_seekable.h SEEKABLE_OBJS = $(CONTRIBDIR)/seekable_format/zstdseek_compress.c $(CONTRIBDIR)/seekable_format/zstdseek_decompress.c -ZSTDCOMMON_SRC := $(ZSTDDIR)/common/*.c -ZSTDCOMP_SRC := $(ZSTDDIR)/compress/*.c -ZSTDDECOMP_SRC := $(ZSTDDIR)/decompress/*.c -ZSTDDICT_SRC := $(ZSTDDIR)/dictBuilder/*.c -ZSTDLEGACY_SRC := $(ZSTDDIR)/legacy/*.c +ZSTDCOMMON_SRC := $(ZSTD_COMMON_FILES) +ZSTDCOMP_SRC := $(ZSTD_COMPRESS_FILES) +ZSTDDECOMP_SRC := $(ZSTD_DECOMPRESS_FILES) +ZSTDDICT_SRC := $(ZSTD_DICTBUILDER_FILES) +ZSTDLEGACY_SRC := $(ZSTD_LEGACY_FILES) FUZZ_SRC := \ $(FUZZ_SRC) \ $(ZSTDDECOMP_SRC) \ $(ZSTDCOMMON_SRC) \ $(ZSTDCOMP_SRC) \ $(ZSTDDICT_SRC) \ - $(ZSTDLEGACY_SRC) -FUZZ_SRC := $(wildcard $(FUZZ_SRC)) + $(ZSTDLEGACY_SRC) \ + $(MATCHFINDER_SRC) +FUZZ_SRC := $(sort $(wildcard $(FUZZ_SRC))) FUZZ_D_OBJ1 := $(subst $(ZSTDDIR)/common/,d_lib_common_,$(FUZZ_SRC)) FUZZ_D_OBJ2 := $(subst $(ZSTDDIR)/compress/,d_lib_compress_,$(FUZZ_D_OBJ1)) @@ -70,8 +84,10 @@ FUZZ_D_OBJ3 := $(subst $(ZSTDDIR)/decompress/,d_lib_decompress_,$(FUZZ_D_OBJ2)) FUZZ_D_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,d_lib_dictBuilder_,$(FUZZ_D_OBJ3)) FUZZ_D_OBJ5 := $(subst $(ZSTDDIR)/legacy/,d_lib_legacy_,$(FUZZ_D_OBJ4)) FUZZ_D_OBJ6 := $(subst $(PRGDIR)/,d_prg_,$(FUZZ_D_OBJ5)) -FUZZ_D_OBJ7 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ6)) -FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ7:.c=.o) +FUZZ_D_OBJ7 := $(subst $(MATCHFINDER_DIR)/,d_matchfinder_,$(FUZZ_D_OBJ6)) +FUZZ_D_OBJ8 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ7)) +FUZZ_D_OBJ9 := $(FUZZ_D_OBJ8:.c=.o) +FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ9:.S=.o) FUZZ_RT_OBJ1 := $(subst $(ZSTDDIR)/common/,rt_lib_common_,$(FUZZ_SRC)) FUZZ_RT_OBJ2 := $(subst $(ZSTDDIR)/compress/,rt_lib_compress_,$(FUZZ_RT_OBJ1)) @@ -79,8 +95,10 @@ FUZZ_RT_OBJ3 := $(subst $(ZSTDDIR)/decompress/,rt_lib_decompress_,$(FUZZ_RT_OBJ2 FUZZ_RT_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,rt_lib_dictBuilder_,$(FUZZ_RT_OBJ3)) FUZZ_RT_OBJ5 := $(subst $(ZSTDDIR)/legacy/,rt_lib_legacy_,$(FUZZ_RT_OBJ4)) FUZZ_RT_OBJ6 := $(subst $(PRGDIR)/,rt_prg_,$(FUZZ_RT_OBJ5)) -FUZZ_RT_OBJ7 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ6)) -FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ7:.c=.o) +FUZZ_RT_OBJ7 := $(subst $(MATCHFINDER_DIR)/,rt_matchfinder_,$(FUZZ_RT_OBJ6)) +FUZZ_RT_OBJ8 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ7)) +FUZZ_RT_OBJ9 := $(FUZZ_RT_OBJ8:.c=.o) +FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ9:.S=.o) .PHONY: default all clean cleanall @@ -103,7 +121,9 @@ FUZZ_TARGETS := \ decompress_dstSize_tooSmall \ fse_read_ncount \ sequence_compression_api \ - seekable_roundtrip + seekable_roundtrip \ + huf_round_trip \ + huf_decompress all: libregression.a $(FUZZ_TARGETS) @@ -116,6 +136,9 @@ rt_lib_compress_%.o: $(ZSTDDIR)/compress/%.c rt_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ +rt_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.S + $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_ASFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ + rt_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ @@ -128,6 +151,9 @@ rt_prg_%.o: $(PRGDIR)/%.c rt_fuzz_%.o: %.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ +rt_matchfinder_%.o: $(MATCHFINDER_DIR)/%.c + $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ + d_lib_common_%.o: $(ZSTDDIR)/common/%.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ @@ -137,6 +163,9 @@ d_lib_compress_%.o: $(ZSTDDIR)/compress/%.c d_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ +d_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.S + $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_ASFLAGS) $< -c -o $@ + d_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ @@ -149,6 +178,9 @@ d_prg_%.o: $(PRGDIR)/%.c d_fuzz_%.o: %.c $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ +d_matchfinder_%.o: $(MATCHFINDER_DIR)/%.c + $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ + simple_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ @@ -200,6 +232,12 @@ sequence_compression_api: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_sequenc seekable_roundtrip: $(FUZZ_HEADERS) $(SEEKABLE_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) $(SEEKABLE_OBJS) rt_fuzz_seekable_roundtrip.o $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) $(SEEKABLE_OBJS) rt_fuzz_seekable_roundtrip.o $(LIB_FUZZING_ENGINE) -o $@ +huf_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_huf_round_trip.o + $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_huf_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ + +huf_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_huf_decompress.o + $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_huf_decompress.o $(LIB_FUZZING_ENGINE) -o $@ + libregression.a: $(FUZZ_HEADERS) $(PRGDIR)/util.h $(PRGDIR)/util.c d_fuzz_regression_driver.o $(AR) $(FUZZ_ARFLAGS) $@ d_fuzz_regression_driver.o diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/README.md b/src/dependencies/zstd-1.5.4/tests/fuzz/README.md similarity index 83% rename from src/dependencies/zstd-1.5.0/tests/fuzz/README.md rename to src/dependencies/zstd-1.5.4/tests/fuzz/README.md index 71afa40..4ff7fe3 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/README.md +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/README.md @@ -50,6 +50,20 @@ See the help of the relevant command for options. Flags not parsed by `fuzz.py` are passed to the fuzzing engine. The command used to run the fuzzer is printed for debugging. +Here's a helpful command to fuzz each target across all cores, +stopping only if a bug is found: +``` +for target in $(./fuzz.py list); do + ./fuzz.py libfuzzer $target -jobs=10 -workers=10 -max_total_time=1000 || break; +done +``` +Alternatively, you can fuzz all targets in parallel, using one core per target: +``` +python3 ./fuzz.py list | xargs -P$(python3 ./fuzz.py list | wc -l) -I__ sh -c "python3 ./fuzz.py libfuzzer __ 2>&1 | tee __.log" +``` +Either way, to double-check that no crashes were found, run `ls corpora/*crash`. +If any crashes were found, you can use the hashes to reproduce them. + ## LibFuzzer ``` diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/block_decompress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/block_decompress.c similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/fuzz/block_decompress.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/block_decompress.c index bdbf769..e4767b3 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/block_decompress.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/block_decompress.c @@ -1,5 +1,5 @@ /** - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/block_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/block_round_trip.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/block_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/block_round_trip.c index 46a84c7..54012a1 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/block_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/block_round_trip.c @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/decompress_dstSize_tooSmall.c b/src/dependencies/zstd-1.5.4/tests/fuzz/decompress_dstSize_tooSmall.c similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/fuzz/decompress_dstSize_tooSmall.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/decompress_dstSize_tooSmall.c index 3f7607b..8ad3ea1 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/decompress_dstSize_tooSmall.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/decompress_dstSize_tooSmall.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_decompress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_decompress.c similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_decompress.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_decompress.c index 33c58c8..8dea3e5 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_decompress.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_loader.c b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_loader.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_loader.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_loader.c index 5b60bc4..1ac2274 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_loader.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_loader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_round_trip.c similarity index 74% rename from src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_round_trip.c index 7bff4bd..6dd78c3 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_round_trip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -42,8 +42,23 @@ static size_t roundTripTest(void *result, size_t resultCapacity, src, srcSize, dict.buff, dict.size, cLevel); + FUZZ_ZASSERT(cSize); + // Compress a second time and check for determinism + { + size_t const cSize0 = cSize; + XXH64_hash_t const hash0 = XXH64(compressed, cSize, 0); + cSize = ZSTD_compress_usingDict(cctx, + compressed, compressedCapacity, + src, srcSize, + dict.buff, dict.size, + cLevel); + FUZZ_ASSERT(cSize == cSize0); + FUZZ_ASSERT(XXH64(compressed, cSize, 0) == hash0); + } } else { + size_t remainingBytes; dictContentType = FUZZ_dataProducer_uint32Range(producer, 0, 2); + remainingBytes = FUZZ_dataProducer_remainingBytes(producer); FUZZ_setRandomParameters(cctx, srcSize, producer); /* Disable checksum so we can use sizes smaller than compress bound. */ FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 0)); @@ -51,14 +66,29 @@ static size_t roundTripTest(void *result, size_t resultCapacity, FUZZ_ZASSERT(ZSTD_CCtx_refPrefix_advanced( cctx, dict.buff, dict.size, dictContentType)); - else + else FUZZ_ZASSERT(ZSTD_CCtx_loadDictionary_advanced( cctx, dict.buff, dict.size, (ZSTD_dictLoadMethod_e)FUZZ_dataProducer_uint32Range(producer, 0, 1), dictContentType)); cSize = ZSTD_compress2(cctx, compressed, compressedCapacity, src, srcSize); + FUZZ_ZASSERT(cSize); + // Compress a second time and check for determinism + { + size_t const cSize0 = cSize; + XXH64_hash_t const hash0 = XXH64(compressed, cSize, 0); + FUZZ_dataProducer_rollBack(producer, remainingBytes); + FUZZ_setRandomParameters(cctx, srcSize, producer); + FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 0)); + if (refPrefix) + FUZZ_ZASSERT(ZSTD_CCtx_refPrefix_advanced( + cctx, dict.buff, dict.size, + dictContentType)); + cSize = ZSTD_compress2(cctx, compressed, compressedCapacity, src, srcSize); + FUZZ_ASSERT(cSize == cSize0); + FUZZ_ASSERT(XXH64(compressed, cSize, 0) == hash0); + } } - FUZZ_ZASSERT(cSize); if (refPrefix) FUZZ_ZASSERT(ZSTD_DCtx_refPrefix_advanced( dctx, dict.buff, dict.size, diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_stream_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_stream_round_trip.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_stream_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_stream_round_trip.c index 9af712f..3ebbd84 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/dictionary_stream_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/dictionary_stream_round_trip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fse_read_ncount.c b/src/dependencies/zstd-1.5.4/tests/fuzz/fse_read_ncount.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fse_read_ncount.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/fse_read_ncount.c index c323860..29e1944 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fse_read_ncount.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fse_read_ncount.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.h b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.h similarity index 90% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.h rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.h index 810daa2..d1e439f 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.h +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -26,8 +26,7 @@ * @param MEM_FORCE_MEMORY_ACCESS: * This flag controls how the zstd library accesses unaligned memory. * It can be undefined, or 0 through 2. If it is undefined, it selects - * the method to use based on the compiler. If testing with UBSAN set - * MEM_FORCE_MEMORY_ACCESS=0 to use the standard compliant method. + * the method to use based on the compiler. * @param FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION * This is the canonical flag to enable deterministic builds for fuzzing. * Changes to zstd for fuzzing are gated behind this define. diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.py b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.py similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.py rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.py index d8dfa77..03ffeee 100755 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz.py +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -63,6 +63,8 @@ TARGET_INFO = { 'fse_read_ncount': TargetInfo(InputType.RAW_DATA), 'sequence_compression_api': TargetInfo(InputType.RAW_DATA), 'seekable_roundtrip': TargetInfo(InputType.RAW_DATA), + 'huf_round_trip': TargetInfo(InputType.RAW_DATA), + 'huf_decompress': TargetInfo(InputType.RAW_DATA), } TARGETS = list(TARGET_INFO.keys()) ALL_TARGETS = TARGETS + ['all'] @@ -634,7 +636,7 @@ def regression(args): try: description = """ Runs one or more regression tests. - The fuzzer should have been built with with + The fuzzer should have been built with LIB_FUZZING_ENGINE='libregression.a'. Takes input from CORPORA. """ diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.c b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.c similarity index 91% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.c index beb0155..a93e8ba 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -66,6 +66,12 @@ size_t FUZZ_dataProducer_remainingBytes(FUZZ_dataProducer_t *producer){ return producer->size; } +void FUZZ_dataProducer_rollBack(FUZZ_dataProducer_t *producer, size_t remainingBytes) +{ + FUZZ_ASSERT(remainingBytes >= producer->size); + producer->size = remainingBytes; +} + int FUZZ_dataProducer_empty(FUZZ_dataProducer_t *producer) { return producer->size == 0; } diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.h b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.h similarity index 91% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.h rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.h index 045aaff..8ca501f 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_data_producer.h +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_data_producer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -49,6 +49,9 @@ int32_t FUZZ_dataProducer_int32Range(FUZZ_dataProducer_t *producer, /* Returns the size of the remaining bytes of data in the producer */ size_t FUZZ_dataProducer_remainingBytes(FUZZ_dataProducer_t *producer); +/* Rolls back the data producer state to have remainingBytes remaining */ +void FUZZ_dataProducer_rollBack(FUZZ_dataProducer_t *producer, size_t remainingBytes); + /* Returns true if the data producer is out of bytes */ int FUZZ_dataProducer_empty(FUZZ_dataProducer_t *producer); diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.c b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.c similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.c index 61c0deb..1b6ad97 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.h b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.h similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.h rename to src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.h index c180478..aaf4c1d 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/fuzz_helpers.h +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/fuzz_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/tests/fuzz/huf_decompress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/huf_decompress.c new file mode 100644 index 0000000..fcd4b1a --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/huf_decompress.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/** + * This fuzz target performs a zstd round-trip test (compress & decompress), + * compares the result with the original, and calls abort() on corruption. + */ + +#include +#include +#include +#include +#include "common/cpu.h" +#include "common/huf.h" +#include "fuzz_helpers.h" +#include "fuzz_data_producer.h" + +int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) +{ + FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size); + /* Select random parameters: #streams, X1 or X2 decoding, bmi2 */ + int const streams = FUZZ_dataProducer_int32Range(producer, 0, 1); + int const symbols = FUZZ_dataProducer_int32Range(producer, 0, 1); + int const flags = 0 + | (ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_bmi2 : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_optimalDepth : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_preferRepeat : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_suspectUncompressible : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableAsm : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableFast : 0); + /* Select a random cBufSize - it may be too small */ + size_t const dBufSize = FUZZ_dataProducer_uint32Range(producer, 0, 8 * size + 500); + size_t const maxTableLog = FUZZ_dataProducer_uint32Range(producer, 1, HUF_TABLELOG_MAX); + HUF_DTable* dt = (HUF_DTable*)FUZZ_malloc(HUF_DTABLE_SIZE(maxTableLog) * sizeof(HUF_DTable)); + size_t const wkspSize = HUF_WORKSPACE_SIZE; + void* wksp = FUZZ_malloc(wkspSize); + void* dBuf = FUZZ_malloc(dBufSize); + dt[0] = maxTableLog * 0x01000001; + size = FUZZ_dataProducer_remainingBytes(producer); + + if (symbols == 0) { + size_t const err = HUF_readDTableX1_wksp(dt, src, size, wksp, wkspSize, flags); + if (ZSTD_isError(err)) + goto _out; + } else { + size_t const err = HUF_readDTableX2_wksp(dt, src, size, wksp, wkspSize, flags); + if (ZSTD_isError(err)) + goto _out; + } + if (streams == 0) + HUF_decompress1X_usingDTable(dBuf, dBufSize, src, size, dt, flags); + else + HUF_decompress4X_usingDTable(dBuf, dBufSize, src, size, dt, flags); + +_out: + free(dt); + free(wksp); + free(dBuf); + FUZZ_dataProducer_free(producer); + return 0; +} diff --git a/src/dependencies/zstd-1.5.4/tests/fuzz/huf_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/huf_round_trip.c new file mode 100644 index 0000000..4d0f8de --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/huf_round_trip.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/** + * This fuzz target performs a zstd round-trip test (compress & decompress), + * compares the result with the original, and calls abort() on corruption. + */ + +#include +#include +#include +#include +#include "common/cpu.h" +#include "compress/hist.h" +#include "common/huf.h" +#include "fuzz_helpers.h" +#include "fuzz_data_producer.h" +#include "common/bits.h" + +static size_t adjustTableLog(size_t tableLog, size_t maxSymbol) +{ + size_t const alphabetSize = maxSymbol + 1; + size_t minTableLog = ZSTD_highbit32(alphabetSize) + 1; + if ((alphabetSize & (alphabetSize - 1)) != 0) { + ++minTableLog; + } + assert(minTableLog <= 9); + if (tableLog < minTableLog) + return minTableLog; + else + return tableLog; +} + +int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) +{ + FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size); + /* Select random parameters: #streams, X1 or X2 decoding, bmi2 */ + int const streams = FUZZ_dataProducer_int32Range(producer, 0, 1); + int const symbols = FUZZ_dataProducer_int32Range(producer, 0, 1); + int const flags = 0 + | (ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_bmi2 : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_optimalDepth : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_preferRepeat : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_suspectUncompressible : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableAsm : 0) + | (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableFast : 0); + /* Select a random cBufSize - it may be too small */ + size_t const cBufSize = FUZZ_dataProducer_uint32Range(producer, 0, 4 * size); + /* Select a random tableLog - we'll adjust it up later */ + size_t tableLog = FUZZ_dataProducer_uint32Range(producer, 1, 12); + size_t const kMaxSize = 256 * 1024; + size = FUZZ_dataProducer_remainingBytes(producer); + if (size > kMaxSize) + size = kMaxSize; + + if (size <= 1) { + FUZZ_dataProducer_free(producer); + return 0; + } + + uint32_t maxSymbol = 255; + + U32 count[256]; + size_t const mostFrequent = HIST_count(count, &maxSymbol, src, size); + FUZZ_ZASSERT(mostFrequent); + if (mostFrequent == size) { + /* RLE */ + FUZZ_dataProducer_free(producer); + return 0; + + } + FUZZ_ASSERT(maxSymbol <= 255); + tableLog = adjustTableLog(tableLog, maxSymbol); + + size_t const wkspSize = HUF_WORKSPACE_SIZE; + void* wksp = FUZZ_malloc(wkspSize); + void* rBuf = FUZZ_malloc(size); + void* cBuf = FUZZ_malloc(cBufSize); + HUF_CElt* ct = (HUF_CElt*)FUZZ_malloc(HUF_CTABLE_SIZE(maxSymbol)); + HUF_DTable* dt = (HUF_DTable*)FUZZ_malloc(HUF_DTABLE_SIZE(tableLog) * sizeof(HUF_DTable)); + dt[0] = tableLog * 0x01000001; + + tableLog = HUF_optimalTableLog(tableLog, size, maxSymbol, wksp, wkspSize, ct, count, flags); + FUZZ_ASSERT(tableLog <= 12); + tableLog = HUF_buildCTable_wksp(ct, count, maxSymbol, tableLog, wksp, wkspSize); + FUZZ_ZASSERT(tableLog); + size_t const tableSize = HUF_writeCTable_wksp(cBuf, cBufSize, ct, maxSymbol, tableLog, wksp, wkspSize); + if (ERR_isError(tableSize)) { + /* Errors on uncompressible data or cBufSize too small */ + goto _out; + } + FUZZ_ZASSERT(tableSize); + if (symbols == 0) { + FUZZ_ZASSERT(HUF_readDTableX1_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags)); + } else { + size_t const ret = HUF_readDTableX2_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags); + if (ERR_getErrorCode(ret) == ZSTD_error_tableLog_tooLarge) { + FUZZ_ZASSERT(HUF_readDTableX1_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags)); + } else { + FUZZ_ZASSERT(ret); + } + } + + size_t cSize; + size_t rSize; + if (streams == 0) { + cSize = HUF_compress1X_usingCTable(cBuf, cBufSize, src, size, ct, flags); + FUZZ_ZASSERT(cSize); + if (cSize != 0) + rSize = HUF_decompress1X_usingDTable(rBuf, size, cBuf, cSize, dt, flags); + } else { + cSize = HUF_compress4X_usingCTable(cBuf, cBufSize, src, size, ct, flags); + FUZZ_ZASSERT(cSize); + if (cSize != 0) + rSize = HUF_decompress4X_usingDTable(rBuf, size, cBuf, cSize, dt, flags); + } + if (cSize != 0) { + FUZZ_ZASSERT(rSize); + FUZZ_ASSERT_MSG(rSize == size, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, rBuf, size), "Corruption!"); + } +_out: + free(rBuf); + free(cBuf); + free(ct); + free(dt); + free(wksp); + FUZZ_dataProducer_free(producer); + return 0; +} diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/raw_dictionary_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/raw_dictionary_round_trip.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/raw_dictionary_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/raw_dictionary_round_trip.c index 0e65176..7ceab2b 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/raw_dictionary_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/raw_dictionary_round_trip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/regression_driver.c b/src/dependencies/zstd-1.5.4/tests/fuzz/regression_driver.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/regression_driver.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/regression_driver.c index e6d2dec..550c65d 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/regression_driver.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/regression_driver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/seekable_roundtrip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/seekable_roundtrip.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/fuzz/seekable_roundtrip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/seekable_roundtrip.c index dcdcaae..6f0aa28 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/seekable_roundtrip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/seekable_roundtrip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.4/tests/fuzz/sequence_compression_api.c b/src/dependencies/zstd-1.5.4/tests/fuzz/sequence_compression_api.c new file mode 100644 index 0000000..9d3f0a1 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/sequence_compression_api.c @@ -0,0 +1,377 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/** + * This fuzz target performs a zstd round-trip test by generating an arbitrary + * array of sequences, generating the associated source buffer, calling + * ZSTD_compressSequences(), and then decompresses and compares the result with + * the original generated source buffer. + */ + +#define ZSTD_STATIC_LINKING_ONLY + +#include +#include +#include +#include +#include +#include "fuzz_helpers.h" +#include "zstd_helpers.h" +#include "fuzz_data_producer.h" + +static ZSTD_CCtx* cctx = NULL; +static ZSTD_DCtx* dctx = NULL; +static void* literalsBuffer = NULL; +static void* generatedSrc = NULL; +static ZSTD_Sequence* generatedSequences = NULL; + +static void* dictBuffer = NULL; +static ZSTD_CDict* cdict = NULL; +static ZSTD_DDict* ddict = NULL; + +#define ZSTD_FUZZ_GENERATED_SRC_MAXSIZE (1 << 20) /* Allow up to 1MB generated data */ +#define ZSTD_FUZZ_GENERATED_LITERALS_SIZE (1 << 20) /* Fixed size 1MB literals buffer */ +#define ZSTD_FUZZ_MATCHLENGTH_MAXSIZE (1 << 18) /* Allow up to 256KB matches */ +#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << ZSTD_WINDOWLOG_MAX_32) /* Allow up to 1 << ZSTD_WINDOWLOG_MAX_32 dictionary */ +#define ZSTD_FUZZ_MAX_NBSEQ (1 << 17) /* Maximum of 128K sequences */ + +/* Deterministic random number generator */ +#define FUZZ_RDG_rotl32(x,r) ((x << r) | (x >> (32 - r))) +static uint32_t FUZZ_RDG_rand(uint32_t* src) +{ + static const uint32_t prime1 = 2654435761U; + static const uint32_t prime2 = 2246822519U; + uint32_t rand32 = *src; + rand32 *= prime1; + rand32 ^= prime2; + rand32 = FUZZ_RDG_rotl32(rand32, 13); + *src = rand32; + return rand32 >> 5; +} + +/* Make a pseudorandom string - this simple function exists to avoid + * taking a dependency on datagen.h to have RDG_genBuffer(). + */ +static char* generatePseudoRandomString(char* str, size_t size, FUZZ_dataProducer_t* producer) { + const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1234567890!@#$^&*()_"; + uint32_t seed = FUZZ_dataProducer_uint32(producer); + if (size) { + for (size_t n = 0; n < size; n++) { + int key = FUZZ_RDG_rand(&seed) % (int) (sizeof charset - 1); + str[n] = charset[key]; + } + } + return str; +} + +/* Returns size of source buffer */ +static size_t decodeSequences(void* dst, size_t nbSequences, + size_t literalsSize, + const void* dict, size_t dictSize, + ZSTD_sequenceFormat_e mode) +{ + const uint8_t* litPtr = literalsBuffer; + const uint8_t* const litBegin = literalsBuffer; + const uint8_t* const litEnd = litBegin + literalsSize; + const uint8_t* dictPtr = dict; + uint8_t* op = dst; + const uint8_t* const oend = (uint8_t*)dst + ZSTD_FUZZ_GENERATED_SRC_MAXSIZE; + size_t generatedSrcBufferSize = 0; + size_t bytesWritten = 0; + + for (size_t i = 0; i < nbSequences; ++i) { + /* block boundary */ + if (generatedSequences[i].offset == 0) + FUZZ_ASSERT(generatedSequences[i].matchLength == 0); + + if (litPtr + generatedSequences[i].litLength > litEnd) { + litPtr = litBegin; + } + memcpy(op, litPtr, generatedSequences[i].litLength); + bytesWritten += generatedSequences[i].litLength; + op += generatedSequences[i].litLength; + litPtr += generatedSequences[i].litLength; + + /* Copy over the match */ + { size_t matchLength = generatedSequences[i].matchLength; + size_t j = 0; + size_t k = 0; + if (dictSize != 0) { + if (generatedSequences[i].offset > bytesWritten) { /* Offset goes into the dictionary */ + size_t dictOffset = generatedSequences[i].offset - bytesWritten; + size_t matchInDict = MIN(matchLength, dictOffset); + for (; k < matchInDict; ++k) { + op[k] = dictPtr[dictSize - dictOffset + k]; + } + matchLength -= matchInDict; + op += matchInDict; + } + } + for (; j < matchLength; ++j) { + op[j] = op[j - generatedSequences[i].offset]; + } + op += j; + FUZZ_ASSERT(generatedSequences[i].matchLength == j + k); + bytesWritten += generatedSequences[i].matchLength; + } + } + generatedSrcBufferSize = bytesWritten; + FUZZ_ASSERT(litPtr <= litEnd); + if (mode == ZSTD_sf_noBlockDelimiters) { + const uint32_t lastLLSize = (uint32_t)(litEnd - litPtr); + if (lastLLSize <= oend - op) { + memcpy(op, litPtr, lastLLSize); + generatedSrcBufferSize += lastLLSize; + } } + return generatedSrcBufferSize; +} + +/* Returns nb sequences generated + * Note : random sequences are always valid in ZSTD_sf_noBlockDelimiters mode. + * However, it can fail with ZSTD_sf_explicitBlockDelimiters, + * due to potential lack of space in + */ +static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, + size_t literalsSizeLimit, size_t dictSize, + size_t windowLog, ZSTD_sequenceFormat_e mode) +{ + const uint32_t repCode = 0; /* not used by sequence ingestion api */ + size_t windowSize = 1ULL << windowLog; + size_t blockSizeMax = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); + uint32_t matchLengthMax = ZSTD_FUZZ_MATCHLENGTH_MAXSIZE; + uint32_t bytesGenerated = 0; + uint32_t nbSeqGenerated = 0; + uint32_t isFirstSequence = 1; + uint32_t blockSize = 0; + + if (mode == ZSTD_sf_explicitBlockDelimiters) { + /* ensure that no sequence can be larger than one block */ + literalsSizeLimit = MIN(literalsSizeLimit, blockSizeMax/2); + matchLengthMax = MIN(matchLengthMax, blockSizeMax/2); + } + + while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ - 3 /* extra room for explicit delimiters */ + && bytesGenerated < ZSTD_FUZZ_GENERATED_SRC_MAXSIZE + && !FUZZ_dataProducer_empty(producer)) { + uint32_t matchLength; + uint32_t matchBound = matchLengthMax; + uint32_t offset; + uint32_t offsetBound; + const uint32_t minLitLength = (isFirstSequence && (dictSize == 0)); + const uint32_t litLength = FUZZ_dataProducer_uint32Range(producer, minLitLength, (uint32_t)literalsSizeLimit); + bytesGenerated += litLength; + if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { + break; + } + offsetBound = (bytesGenerated > windowSize) ? windowSize : bytesGenerated + (uint32_t)dictSize; + offset = FUZZ_dataProducer_uint32Range(producer, 1, offsetBound); + if (dictSize > 0 && bytesGenerated <= windowSize) { + /* Prevent match length from being such that it would be associated with an offset too large + * from the decoder's perspective. If not possible (match would be too small), + * then reduce the offset if necessary. + */ + const size_t bytesToReachWindowSize = windowSize - bytesGenerated; + if (bytesToReachWindowSize < ZSTD_MINMATCH_MIN) { + const uint32_t newOffsetBound = offsetBound > windowSize ? windowSize : offsetBound; + offset = FUZZ_dataProducer_uint32Range(producer, 1, newOffsetBound); + } else { + matchBound = MIN(matchLengthMax, (uint32_t)bytesToReachWindowSize); + } + } + matchLength = FUZZ_dataProducer_uint32Range(producer, ZSTD_MINMATCH_MIN, matchBound); + bytesGenerated += matchLength; + if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { + break; + } + { ZSTD_Sequence seq = {offset, litLength, matchLength, repCode}; + const uint32_t lastLits = FUZZ_dataProducer_uint32Range(producer, 0, litLength); + #define SPLITPROB 6000 + #define SPLITMARK 5234 + const int split = (FUZZ_dataProducer_uint32Range(producer, 0, SPLITPROB) == SPLITMARK); + if (mode == ZSTD_sf_explicitBlockDelimiters) { + const size_t seqSize = seq.litLength + seq.matchLength; + if (blockSize + seqSize > blockSizeMax) { /* reaching limit : must end block now */ + const ZSTD_Sequence endBlock = {0, 0, 0, 0}; + generatedSequences[nbSeqGenerated++] = endBlock; + blockSize = seqSize; + } + if (split) { + const ZSTD_Sequence endBlock = {0, lastLits, 0, 0}; + generatedSequences[nbSeqGenerated++] = endBlock; + assert(lastLits <= seq.litLength); + seq.litLength -= lastLits; + blockSize = seqSize - lastLits; + } else { + blockSize += seqSize; + } + } + generatedSequences[nbSeqGenerated++] = seq; + isFirstSequence = 0; + } + } + + if (mode == ZSTD_sf_explicitBlockDelimiters) { + /* always end sequences with a block delimiter */ + const ZSTD_Sequence endBlock = {0, 0, 0, 0}; + assert(nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ); + generatedSequences[nbSeqGenerated++] = endBlock; + } + return nbSeqGenerated; +} + +static size_t roundTripTest(void* result, size_t resultCapacity, + void* compressed, size_t compressedCapacity, + const void* src, size_t srcSize, + const ZSTD_Sequence* seqs, size_t seqSize, + unsigned hasDict, + ZSTD_sequenceFormat_e mode) +{ + size_t cSize; + size_t dSize; + + if (hasDict) { + FUZZ_ZASSERT(ZSTD_CCtx_refCDict(cctx, cdict)); + FUZZ_ZASSERT(ZSTD_DCtx_refDDict(dctx, ddict)); + } + + cSize = ZSTD_compressSequences(cctx, compressed, compressedCapacity, + seqs, seqSize, + src, srcSize); + if ( (ZSTD_getErrorCode(cSize) == ZSTD_error_dstSize_tooSmall) + && (mode == ZSTD_sf_explicitBlockDelimiters) ) { + /* Valid scenario : in explicit delimiter mode, + * it might be possible for the compressed size to outgrow dstCapacity. + * In which case, it's still a valid fuzzer scenario, + * but no roundtrip shall be possible */ + return 0; + } + /* round-trip */ + FUZZ_ZASSERT(cSize); + dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize); + FUZZ_ZASSERT(dSize); + FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, result, srcSize), "Corruption!"); + return dSize; +} + +int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) +{ + void* rBuf; + size_t rBufSize; + void* cBuf; + size_t cBufSize; + size_t generatedSrcSize; + size_t nbSequences; + size_t dictSize = 0; + unsigned hasDict; + unsigned wLog; + int cLevel; + ZSTD_sequenceFormat_e mode; + + FUZZ_dataProducer_t* const producer = FUZZ_dataProducer_create(src, size); + FUZZ_ASSERT(producer); + + if (!cctx) { + cctx = ZSTD_createCCtx(); + FUZZ_ASSERT(cctx); + } + if (!dctx) { + dctx = ZSTD_createDCtx(); + FUZZ_ASSERT(dctx); + } + + /* Generate window log first so we don't generate offsets too large */ + wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX); + cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22); + mode = (ZSTD_sequenceFormat_e)FUZZ_dataProducer_int32Range(producer, 0, 1); + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, cLevel); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, wLog); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, ZSTD_MINMATCH_MIN); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, mode); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach); + + if (!literalsBuffer) { + literalsBuffer = FUZZ_malloc(ZSTD_FUZZ_GENERATED_LITERALS_SIZE); + FUZZ_ASSERT(literalsBuffer); + literalsBuffer = generatePseudoRandomString(literalsBuffer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, producer); + } + + if (!dictBuffer) { /* Generate global dictionary buffer */ + ZSTD_compressionParameters cParams; + + /* Generate a large dictionary buffer */ + dictBuffer = calloc(ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, 1); + FUZZ_ASSERT(dictBuffer); + + /* Create global cdict and ddict */ + cParams = ZSTD_getCParams(1, ZSTD_FUZZ_GENERATED_SRC_MAXSIZE, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE); + cParams.minMatch = ZSTD_MINMATCH_MIN; + cParams.hashLog = ZSTD_HASHLOG_MIN; + cParams.chainLog = ZSTD_CHAINLOG_MIN; + + cdict = ZSTD_createCDict_advanced(dictBuffer, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, ZSTD_dlm_byRef, ZSTD_dct_rawContent, cParams, ZSTD_defaultCMem); + ddict = ZSTD_createDDict_advanced(dictBuffer, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, ZSTD_dlm_byRef, ZSTD_dct_rawContent, ZSTD_defaultCMem); + FUZZ_ASSERT(cdict); + FUZZ_ASSERT(ddict); + } + + FUZZ_ASSERT(cdict); + FUZZ_ASSERT(ddict); + + hasDict = FUZZ_dataProducer_uint32Range(producer, 0, 1); + if (hasDict) { + dictSize = ZSTD_FUZZ_GENERATED_DICT_MAXSIZE; + } + + if (!generatedSequences) { + generatedSequences = FUZZ_malloc(sizeof(ZSTD_Sequence)*ZSTD_FUZZ_MAX_NBSEQ); + } + if (!generatedSrc) { + generatedSrc = FUZZ_malloc(ZSTD_FUZZ_GENERATED_SRC_MAXSIZE); + } + + nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog, mode); + generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize, mode); + + /* Note : in explicit block delimiters mode, + * the fuzzer might generate a lot of small blocks. + * In which case, the final compressed size might be > ZSTD_compressBound(). + * This is still a valid scenario fuzzer though, which makes it possible to check under-sized dstCapacity. + * The test just doesn't roundtrip. */ + cBufSize = ZSTD_compressBound(generatedSrcSize); + cBuf = FUZZ_malloc(cBufSize); + + rBufSize = generatedSrcSize; + rBuf = FUZZ_malloc(rBufSize); + + { const size_t result = roundTripTest(rBuf, rBufSize, + cBuf, cBufSize, + generatedSrc, generatedSrcSize, + generatedSequences, nbSequences, + hasDict, mode); + FUZZ_ASSERT(result <= generatedSrcSize); /* can be 0 when no round-trip */ + } + + free(rBuf); + free(cBuf); + FUZZ_dataProducer_free(producer); +#ifndef STATEFUL_FUZZING + ZSTD_freeCCtx(cctx); cctx = NULL; + ZSTD_freeDCtx(dctx); dctx = NULL; + free(generatedSequences); generatedSequences = NULL; + free(generatedSrc); generatedSrc = NULL; + free(literalsBuffer); literalsBuffer = NULL; +#endif + return 0; +} diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_compress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_compress.c similarity index 92% rename from src/dependencies/zstd-1.5.0/tests/fuzz/simple_compress.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/simple_compress.c index 3716d0d..c9fea22 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_compress.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_compress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -9,7 +9,7 @@ */ /** - * This fuzz target attempts to comprss the fuzzed data with the simple + * This fuzz target attempts to compress the fuzzed data with the simple * compression function with an output buffer that may be too small to * ensure that the compressor never crashes. */ diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_decompress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_decompress.c similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/fuzz/simple_decompress.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/simple_decompress.c index dfff11c..ce5f9f0 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_decompress.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_round_trip.c similarity index 59% rename from src/dependencies/zstd-1.5.0/tests/fuzz/simple_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/simple_round_trip.c index c9fac26..c2c69d9 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/simple_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/simple_round_trip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -26,6 +26,23 @@ static ZSTD_CCtx *cctx = NULL; static ZSTD_DCtx *dctx = NULL; +static size_t getDecompressionMargin(void const* compressed, size_t cSize, size_t srcSize, int hasSmallBlocks) +{ + size_t margin = ZSTD_decompressionMargin(compressed, cSize); + if (!hasSmallBlocks) { + /* The macro should be correct in this case, but it may be smaller + * because of e.g. block splitting, so take the smaller of the two. + */ + ZSTD_frameHeader zfh; + size_t marginM; + FUZZ_ZASSERT(ZSTD_getFrameHeader(&zfh, compressed, cSize)); + marginM = ZSTD_DECOMPRESSION_MARGIN(srcSize, zfh.blockSizeMax); + if (marginM < margin) + margin = marginM; + } + return margin; +} + static size_t roundTripTest(void *result, size_t resultCapacity, void *compressed, size_t compressedCapacity, const void *src, size_t srcSize, @@ -35,18 +52,57 @@ static size_t roundTripTest(void *result, size_t resultCapacity, size_t dSize; int targetCBlockSize = 0; if (FUZZ_dataProducer_uint32Range(producer, 0, 1)) { + size_t const remainingBytes = FUZZ_dataProducer_remainingBytes(producer); FUZZ_setRandomParameters(cctx, srcSize, producer); cSize = ZSTD_compress2(cctx, compressed, compressedCapacity, src, srcSize); + FUZZ_ZASSERT(cSize); FUZZ_ZASSERT(ZSTD_CCtx_getParameter(cctx, ZSTD_c_targetCBlockSize, &targetCBlockSize)); + // Compress a second time and check for determinism + { + size_t const cSize0 = cSize; + XXH64_hash_t const hash0 = XXH64(compressed, cSize, 0); + FUZZ_dataProducer_rollBack(producer, remainingBytes); + FUZZ_setRandomParameters(cctx, srcSize, producer); + cSize = ZSTD_compress2(cctx, compressed, compressedCapacity, src, srcSize); + FUZZ_ASSERT(cSize == cSize0); + FUZZ_ASSERT(XXH64(compressed, cSize, 0) == hash0); + } } else { - int const cLevel = FUZZ_dataProducer_int32Range(producer, kMinClevel, kMaxClevel); - + int const cLevel = FUZZ_dataProducer_int32Range(producer, kMinClevel, kMaxClevel); cSize = ZSTD_compressCCtx( cctx, compressed, compressedCapacity, src, srcSize, cLevel); + FUZZ_ZASSERT(cSize); + // Compress a second time and check for determinism + { + size_t const cSize0 = cSize; + XXH64_hash_t const hash0 = XXH64(compressed, cSize, 0); + cSize = ZSTD_compressCCtx( + cctx, compressed, compressedCapacity, src, srcSize, cLevel); + FUZZ_ASSERT(cSize == cSize0); + FUZZ_ASSERT(XXH64(compressed, cSize, 0) == hash0); + } } - FUZZ_ZASSERT(cSize); dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize); FUZZ_ZASSERT(dSize); + FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, result, dSize), "Corruption!"); + + { + size_t margin = getDecompressionMargin(compressed, cSize, srcSize, targetCBlockSize); + size_t const outputSize = srcSize + margin; + char* const output = (char*)FUZZ_malloc(outputSize); + char* const input = output + outputSize - cSize; + FUZZ_ASSERT(outputSize >= cSize); + memcpy(input, compressed, cSize); + + dSize = ZSTD_decompressDCtx(dctx, output, outputSize, input, cSize); + FUZZ_ZASSERT(dSize); + FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, output, srcSize), "Corruption!"); + + free(output); + } + /* When superblock is enabled make sure we don't expand the block more than expected. * NOTE: This test is currently disabled because superblock mode can arbitrarily * expand the block in the worst case. Once superblock mode has been improved we can @@ -100,13 +156,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) FUZZ_ASSERT(dctx); } - { - size_t const result = - roundTripTest(rBuf, rBufSize, cBuf, cBufSize, src, size, producer); - FUZZ_ZASSERT(result); - FUZZ_ASSERT_MSG(result == size, "Incorrect regenerated size"); - FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, rBuf, size), "Corruption!"); - } + roundTripTest(rBuf, rBufSize, cBuf, cBufSize, src, size, producer); free(rBuf); free(cBuf); FUZZ_dataProducer_free(producer); diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/stream_decompress.c b/src/dependencies/zstd-1.5.4/tests/fuzz/stream_decompress.c similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/fuzz/stream_decompress.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/stream_decompress.c index e0cdd34..0254d06 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/stream_decompress.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/stream_decompress.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -99,14 +99,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) while (size > 0) { ZSTD_inBuffer in = makeInBuffer(&src, &size, producer); - while (in.pos != in.size) { + do { + size_t const rc = ZSTD_decompressStream(dstream, &out, &in); + if (ZSTD_isError(rc)) goto error; if (out.pos == out.size) { if (stableOutBuffer) goto error; out = makeOutBuffer(producer, buf, bufSize); } - size_t const rc = ZSTD_decompressStream(dstream, &out, &in); - if (ZSTD_isError(rc)) goto error; - } + } while (in.pos != in.size); } error: diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/stream_round_trip.c b/src/dependencies/zstd-1.5.4/tests/fuzz/stream_round_trip.c similarity index 87% rename from src/dependencies/zstd-1.5.0/tests/fuzz/stream_round_trip.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/stream_round_trip.c index 719eac4..fae9ccb 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/stream_round_trip.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/stream_round_trip.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -166,6 +166,24 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) FUZZ_ZASSERT(rSize); FUZZ_ASSERT_MSG(rSize == size, "Incorrect regenerated size"); FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, rBuf, size), "Corruption!"); + + /* Test in-place decompression (note the macro doesn't work in this case) */ + { + size_t const margin = ZSTD_decompressionMargin(cBuf, cSize); + size_t const outputSize = size + margin; + char* const output = (char*)FUZZ_malloc(outputSize); + char* const input = output + outputSize - cSize; + size_t dSize; + FUZZ_ASSERT(outputSize >= cSize); + memcpy(input, cBuf, cSize); + + dSize = ZSTD_decompressDCtx(dctx, output, outputSize, input, cSize); + FUZZ_ZASSERT(dSize); + FUZZ_ASSERT_MSG(dSize == size, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, output, size), "Corruption!"); + + free(output); + } } FUZZ_dataProducer_free(producer); diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_frame_info.c b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_frame_info.c similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/fuzz/zstd_frame_info.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/zstd_frame_info.c index 9ce645d..95dbdd4 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_frame_info.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_frame_info.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.c b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.c similarity index 75% rename from src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.c rename to src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.c index 4d889de..411b639 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -17,6 +17,7 @@ #include "fuzz_helpers.h" #include "zstd.h" #include "zdict.h" +#include "sequence_producer.h" const int kMinClevel = -3; const int kMaxClevel = 19; @@ -26,9 +27,14 @@ static void set(ZSTD_CCtx *cctx, ZSTD_cParameter param, int value) FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, param, value)); } +static unsigned produceParamValue(unsigned min, unsigned max, + FUZZ_dataProducer_t *producer) { + return FUZZ_dataProducer_uint32Range(producer, min, max); +} + static void setRand(ZSTD_CCtx *cctx, ZSTD_cParameter param, unsigned min, unsigned max, FUZZ_dataProducer_t *producer) { - unsigned const value = FUZZ_dataProducer_uint32Range(producer, min, max); + unsigned const value = produceParamValue(min, max, producer); set(cctx, param, value); } @@ -65,6 +71,17 @@ ZSTD_parameters FUZZ_randomParams(size_t srcSize, FUZZ_dataProducer_t *producer) return params; } +static void setSequenceProducerParams(ZSTD_CCtx *cctx, FUZZ_dataProducer_t *producer) { + ZSTD_registerSequenceProducer( + cctx, + NULL, + simpleSequenceProducer + ); + setRand(cctx, ZSTD_c_enableSeqProducerFallback, 0, 1, producer); + FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0)); + FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_disable)); +} + void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer_t *producer) { ZSTD_compressionParameters cParams = FUZZ_randomCParams(srcSize, producer); @@ -80,7 +97,7 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer setRand(cctx, ZSTD_c_checksumFlag, 0, 1, producer); setRand(cctx, ZSTD_c_dictIDFlag, 0, 1, producer); /* Select long distance matching parameters */ - setRand(cctx, ZSTD_c_enableLongDistanceMatching, 0, 1, producer); + setRand(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_auto, ZSTD_ps_disable, producer); setRand(cctx, ZSTD_c_ldmHashLog, ZSTD_HASHLOG_MIN, 16, producer); setRand(cctx, ZSTD_c_ldmMinMatch, ZSTD_LDM_MINMATCH_MIN, ZSTD_LDM_MINMATCH_MAX, producer); @@ -89,21 +106,42 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer setRand(cctx, ZSTD_c_ldmHashRateLog, ZSTD_LDM_HASHRATELOG_MIN, ZSTD_LDM_HASHRATELOG_MAX, producer); /* Set misc parameters */ +#ifndef ZSTD_MULTITHREAD + // To reproduce with or without ZSTD_MULTITHREAD, we are going to use + // the same amount of entropy. + unsigned const nbWorkers_value = produceParamValue(0, 2, producer); + unsigned const rsyncable_value = produceParamValue(0, 1, producer); + (void)nbWorkers_value; + (void)rsyncable_value; + set(cctx, ZSTD_c_nbWorkers, 0); + set(cctx, ZSTD_c_rsyncable, 0); +#else setRand(cctx, ZSTD_c_nbWorkers, 0, 2, producer); setRand(cctx, ZSTD_c_rsyncable, 0, 1, producer); +#endif setRand(cctx, ZSTD_c_useRowMatchFinder, 0, 2, producer); setRand(cctx, ZSTD_c_enableDedicatedDictSearch, 0, 1, producer); setRand(cctx, ZSTD_c_forceMaxWindow, 0, 1, producer); setRand(cctx, ZSTD_c_literalCompressionMode, 0, 2, producer); setRand(cctx, ZSTD_c_forceAttachDict, 0, 2, producer); - setRand(cctx, ZSTD_c_splitBlocks, 0, 1, producer); + setRand(cctx, ZSTD_c_useBlockSplitter, 0, 2, producer); setRand(cctx, ZSTD_c_deterministicRefPrefix, 0, 1, producer); + setRand(cctx, ZSTD_c_prefetchCDictTables, 0, 2, producer); + setRand(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN, ZSTD_BLOCKSIZE_MAX, producer); + setRand(cctx, ZSTD_c_validateSequences, 0, 1, producer); + setRand(cctx, ZSTD_c_searchForExternalRepcodes, 0, 2, producer); if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) { setRand(cctx, ZSTD_c_srcSizeHint, ZSTD_SRCSIZEHINT_MIN, 2 * srcSize, producer); } if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) { setRand(cctx, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MIN, ZSTD_TARGETCBLOCKSIZE_MAX, producer); } + + if (FUZZ_dataProducer_uint32Range(producer, 0, 10) == 1) { + setSequenceProducerParams(cctx, producer); + } else { + ZSTD_registerSequenceProducer(cctx, NULL, NULL); + } } FUZZ_dict_t FUZZ_train(void const* src, size_t srcSize, FUZZ_dataProducer_t *producer) @@ -123,7 +161,7 @@ FUZZ_dict_t FUZZ_train(void const* src, size_t srcSize, FUZZ_dataProducer_t *pro size_t const offset = FUZZ_dataProducer_uint32Range(producer, 0, MAX(srcSize, 1) - 1); size_t const limit = MIN(srcSize - offset, remaining); size_t const toCopy = MIN(limit, remaining / (nbSamples - sample)); - memcpy(samples + pos, src + offset, toCopy); + memcpy(samples + pos, (const char*)src + offset, toCopy); pos += toCopy; samplesSizes[sample] = toCopy; } diff --git a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.h b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.h similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.h rename to src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.h index 7813884..a4cfe32 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzz/zstd_helpers.h +++ b/src/dependencies/zstd-1.5.4/tests/fuzz/zstd_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -17,6 +17,7 @@ #define ZSTD_STATIC_LINKING_ONLY #include "zstd.h" +#include "zstd_errors.h" #include "fuzz_data_producer.h" #include diff --git a/src/dependencies/zstd-1.5.0/tests/fuzzer.c b/src/dependencies/zstd-1.5.4/tests/fuzzer.c similarity index 84% rename from src/dependencies/zstd-1.5.0/tests/fuzzer.c rename to src/dependencies/zstd-1.5.4/tests/fuzzer.c index 1ea6521..fc78c7f 100644 --- a/src/dependencies/zstd-1.5.0/tests/fuzzer.c +++ b/src/dependencies/zstd-1.5.4/tests/fuzzer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,7 +25,8 @@ #include /* free */ #include /* fgets, sscanf */ #include /* strcmp */ -#undef NDEBUG +#include /* time(), time_t */ +#undef NDEBUG /* always enable assert() */ #include #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */ #include "debug.h" /* DEBUG_STATIC_ASSERT */ @@ -42,7 +43,7 @@ #include "util.h" #include "timefn.h" /* SEC_TO_MICRO, UTIL_time_t, UTIL_TIME_INITIALIZER, UTIL_clockSpanMicro, UTIL_getTime */ /* must be included after util.h, due to ERROR macro redefinition issue on Visual Studio */ -#include "zstd_internal.h" /* ZSTD_WORKSPACETOOLARGE_MAXDURATION, ZSTD_WORKSPACETOOLARGE_FACTOR, KB, MB */ +#include "zstd_internal.h" /* ZSTD_WORKSPACETOOLARGE_MAXDURATION, ZSTD_WORKSPACETOOLARGE_FACTOR, KB, MB */ #include "threading.h" /* ZSTD_pthread_create, ZSTD_pthread_join */ @@ -82,8 +83,8 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; void FUZ_bug976(void); void FUZ_bug976(void) { /* these constants shall not depend on MIN() macro */ - assert(ZSTD_HASHLOG_MAX < 31); - assert(ZSTD_CHAINLOG_MAX < 31); + DEBUG_STATIC_ASSERT(ZSTD_HASHLOG_MAX < 31); + DEBUG_STATIC_ASSERT(ZSTD_CHAINLOG_MAX < 31); } @@ -118,23 +119,24 @@ static U32 FUZ_highbit32(U32 v32) /*============================================= * Test macros =============================================*/ -#define CHECK_Z(f) { \ - size_t const err = f; \ - if (ZSTD_isError(err)) { \ - DISPLAY("Error => %s : %s ", \ - #f, ZSTD_getErrorName(err)); \ - exit(1); \ +#define CHECK(fn) { if(!(fn)) { DISPLAYLEVEL(1, "Error : test (%s) failed \n", #fn); exit(1); } } + +#define CHECK_Z(f) { \ + size_t const err = f; \ + if (ZSTD_isError(err)) { \ + DISPLAY("Error => %s : %s ", \ + #f, ZSTD_getErrorName(err)); \ + exit(1); \ } } -#define CHECK_VAR(var, fn) var = fn; if (ZSTD_isError(var)) { DISPLAYLEVEL(1, "%s : fails : %s \n", #fn, ZSTD_getErrorName(var)); goto _output_error; } +#define CHECK_VAR(var, fn) var = fn; if (ZSTD_isError(var)) { DISPLAYLEVEL(1, "%s : fails : %s \n", #fn, ZSTD_getErrorName(var)); exit(1); } #define CHECK_NEWV(var, fn) size_t const CHECK_VAR(var, fn) -#define CHECK(fn) { CHECK_NEWV(err, fn); } #define CHECKPLUS(var, fn, more) { CHECK_NEWV(var, fn); more; } #define CHECK_OP(op, lhs, rhs) { \ if (!((lhs) op (rhs))) { \ DISPLAY("Error L%u => FAILED %s %s %s ", __LINE__, #lhs, #op, #rhs); \ - goto _output_error; \ + exit(1); \ } \ } #define CHECK_EQ(lhs, rhs) CHECK_OP(==, lhs, rhs) @@ -338,6 +340,7 @@ static void FUZ_decodeSequences(BYTE* dst, ZSTD_Sequence* seqs, size_t seqsSize, } #ifdef ZSTD_MULTITHREAD + typedef struct { ZSTD_CCtx* cctx; ZSTD_threadPool* pool; @@ -429,8 +432,8 @@ static int threadPoolTests(void) { ZSTD_pthread_create(&t1, NULL, threadPoolTests_compressionJob, &p1); ZSTD_pthread_create(&t2, NULL, threadPoolTests_compressionJob, &p2); - ZSTD_pthread_join(t1, NULL); - ZSTD_pthread_join(t2, NULL); + ZSTD_pthread_join(t1); + ZSTD_pthread_join(t2); assert(!memcmp(decodedBuffer, decodedBuffer2, CNBuffSize)); free(decodedBuffer2); @@ -461,6 +464,101 @@ _output_error: * Unit tests =============================================*/ +static void test_compressBound(unsigned tnb) +{ + DISPLAYLEVEL(3, "test%3u : compressBound : ", tnb); + + /* check ZSTD_compressBound == ZSTD_COMPRESSBOUND + * for a large range of known valid values */ + DEBUG_STATIC_ASSERT(sizeof(size_t) >= 4); + { int s; + for (s=0; s<30; s++) { + size_t const w = (size_t)1 << s; + CHECK_EQ(ZSTD_compressBound(w), ZSTD_COMPRESSBOUND(w)); + } } + + /* Ensure error if srcSize too big */ + { size_t const w = ZSTD_MAX_INPUT_SIZE + 1; + CHECK(ZSTD_isError(ZSTD_compressBound(w))); /* must fail */ + CHECK_EQ(ZSTD_COMPRESSBOUND(w), 0); + } + + DISPLAYLEVEL(3, "OK \n"); +} + +static void test_decompressBound(unsigned tnb) +{ + DISPLAYLEVEL(3, "test%3u : decompressBound : ", tnb); + + /* Simple compression, with size : should provide size; */ + { const char example[] = "abcd"; + char cBuffer[ZSTD_COMPRESSBOUND(sizeof(example))]; + size_t const cSize = ZSTD_compress(cBuffer, sizeof(cBuffer), example, sizeof(example), 0); + CHECK_Z(cSize); + CHECK_EQ(ZSTD_decompressBound(cBuffer, cSize), (unsigned long long)sizeof(example)); + } + + /* Simple small compression without size : should provide 1 block size */ + { char cBuffer[ZSTD_COMPRESSBOUND(0)]; + ZSTD_outBuffer out = { cBuffer, sizeof(cBuffer), 0 }; + ZSTD_inBuffer in = { NULL, 0, 0 }; + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + assert(cctx); + CHECK_Z( ZSTD_initCStream(cctx, 0) ); + CHECK_Z( ZSTD_compressStream(cctx, &out, &in) ); + CHECK_EQ( ZSTD_endStream(cctx, &out), 0 ); + CHECK_EQ( ZSTD_decompressBound(cBuffer, out.pos), ZSTD_BLOCKSIZE_MAX ); + ZSTD_freeCCtx(cctx); + } + + /* Attempt to overflow 32-bit intermediate multiplication result + * This requires dBound >= 4 GB, aka 2^32. + * This requires 2^32 / 2^17 = 2^15 blocks + * => create 2^15 blocks (can be empty, or just 1 byte). */ + { const char input[] = "a"; + size_t const nbBlocks = (1 << 15) + 1; + size_t blockNb; + size_t const outCapacity = 1 << 18; /* large margin */ + char* const outBuffer = malloc (outCapacity); + ZSTD_outBuffer out = { outBuffer, outCapacity, 0 }; + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + assert(cctx); + assert(outBuffer); + CHECK_Z( ZSTD_initCStream(cctx, 0) ); + for (blockNb=0; blockNb 0x100000000LLU /* 4 GB */ ); + ZSTD_freeCCtx(cctx); + free(outBuffer); + } + + DISPLAYLEVEL(3, "OK \n"); +} + +static void test_setCParams(unsigned tnb) +{ + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + ZSTD_compressionParameters cparams; + assert(cctx); + + DISPLAYLEVEL(3, "test%3u : ZSTD_CCtx_setCParams : ", tnb); + + /* valid cparams */ + cparams = ZSTD_getCParams(1, 0, 0); + CHECK_Z(ZSTD_CCtx_setCParams(cctx, cparams)); + + /* invalid cparams (must fail) */ + cparams.windowLog = 99; + CHECK(ZSTD_isError(ZSTD_CCtx_setCParams(cctx, cparams))); + + free(cctx); + DISPLAYLEVEL(3, "OK \n"); +} + static int basicUnitTests(U32 const seed, double compressibility) { size_t const CNBuffSize = 5 MB; @@ -507,6 +605,12 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "%u (OK) \n", vn); } + test_compressBound(testNb++); + + test_decompressBound(testNb++); + + test_setCParams(testNb++); + DISPLAYLEVEL(3, "test%3u : ZSTD_adjustCParams : ", testNb++); { ZSTD_compressionParameters params; @@ -580,6 +684,17 @@ static int basicUnitTests(U32 const seed, double compressibility) if (r != CNBuffSize) goto _output_error; } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : decompress %u bytes with Huffman assembly disabled : ", testNb++, (unsigned)CNBuffSize); + { + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + size_t r; + CHECK_Z(ZSTD_DCtx_setParameter(dctx, ZSTD_d_disableHuffmanAssembly, 1)); + r = ZSTD_decompress(decodedBuffer, CNBuffSize, compressedBuffer, cSize); + if (r != CNBuffSize || memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error; + ZSTD_freeDCtx(dctx); + } + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : check decompressed result : ", testNb++); { size_t u; for (u=0; u 10 * refPrefixLdmComrpessedSize); - /* make sure the ldm comrpessed size is less than 1% of original */ - assert((double)refPrefixLdmComrpessedSize / (double)size < 0.01); + assert(refPrefixCompressedSize > 10 * refPrefixLdmCompressedSize); + /* make sure the ldm compressed size is less than 1% of original */ + assert((double)refPrefixLdmCompressedSize / (double)size < 0.01); ZSTD_freeDCtx(dctx); ZSTD_freeCCtx(cctx); @@ -1117,6 +1232,60 @@ static int basicUnitTests(U32 const seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : in-place decompression : ", testNb++); + cSize = ZSTD_compress(compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize, -ZSTD_BLOCKSIZE_MAX); + CHECK_Z(cSize); + CHECK_LT(CNBuffSize, cSize); + { + size_t const margin = ZSTD_decompressionMargin(compressedBuffer, cSize); + size_t const outputSize = (CNBuffSize + margin); + char* output = malloc(outputSize); + char* input = output + outputSize - cSize; + CHECK_LT(cSize, CNBuffSize + margin); + CHECK(output != NULL); + CHECK_Z(margin); + CHECK(margin <= ZSTD_DECOMPRESSION_MARGIN(CNBuffSize, ZSTD_BLOCKSIZE_MAX)); + memcpy(input, compressedBuffer, cSize); + + { + size_t const dSize = ZSTD_decompress(output, outputSize, input, cSize); + CHECK_Z(dSize); + CHECK_EQ(dSize, CNBuffSize); + } + CHECK(!memcmp(output, CNBuffer, CNBuffSize)); + free(output); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : in-place decompression with 2 frames : ", testNb++); + cSize = ZSTD_compress(compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize / 3, -ZSTD_BLOCKSIZE_MAX); + CHECK_Z(cSize); + { + size_t const cSize2 = ZSTD_compress((char*)compressedBuffer + cSize, compressedBufferSize - cSize, (char const*)CNBuffer + (CNBuffSize / 3), CNBuffSize / 3, -ZSTD_BLOCKSIZE_MAX); + CHECK_Z(cSize2); + cSize += cSize2; + } + { + size_t const srcSize = (CNBuffSize / 3) * 2; + size_t const margin = ZSTD_decompressionMargin(compressedBuffer, cSize); + size_t const outputSize = (CNBuffSize + margin); + char* output = malloc(outputSize); + char* input = output + outputSize - cSize; + CHECK_LT(cSize, CNBuffSize + margin); + CHECK(output != NULL); + CHECK_Z(margin); + memcpy(input, compressedBuffer, cSize); + + { + size_t const dSize = ZSTD_decompress(output, outputSize, input, cSize); + CHECK_Z(dSize); + CHECK_EQ(dSize, srcSize); + } + CHECK(!memcmp(output, CNBuffer, srcSize)); + free(output); + } + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3d: superblock uncompressible data, too many nocompress superblocks : ", testNb++); { ZSTD_CCtx* const cctx = ZSTD_createCCtx(); @@ -1206,7 +1375,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : compress a NULL input with each level : ", testNb++); { int level = -1; - ZSTD_CCtx* cctx = ZSTD_createCCtx(); + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); if (!cctx) goto _output_error; for (level = -1; level <= ZSTD_maxCLevel(); ++level) { CHECK_Z( ZSTD_compress(compressedBuffer, compressedBufferSize, NULL, 0, level) ); @@ -1528,7 +1697,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : resize context to full CCtx size : ", testNb++); staticCCtx = ZSTD_initStaticCStream(staticCCtxBuffer, staticCCtxSize); - DISPLAYLEVEL(4, "staticCCtxBuffer = %p, staticCCtx = %p , ", staticCCtxBuffer, staticCCtx); + DISPLAYLEVEL(4, "staticCCtxBuffer = %p, staticCCtx = %p , ", staticCCtxBuffer, (void*)staticCCtx); if (staticCCtx == NULL) goto _output_error; DISPLAYLEVEL(3, "OK \n"); @@ -1579,7 +1748,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : init CCtx for small level %u (should work again) : ", testNb++, 1); - CHECK( ZSTD_compressBegin(staticCCtx, 1) ); + CHECK_Z( ZSTD_compressBegin(staticCCtx, 1) ); DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : use CStream on CCtx-sized static context (should fail) : ", testNb++); @@ -1622,6 +1791,94 @@ static int basicUnitTests(U32 const seed, double compressibility) if (!ZSTD_isError(r)) goto _output_error; } DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : test estimation functions with default cctx params : ", testNb++); + { + // Test ZSTD_estimateCCtxSize_usingCCtxParams + { + ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); + size_t const cctxSizeDefault = ZSTD_estimateCCtxSize_usingCCtxParams(params); + staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault); + CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx, + compressedBuffer, compressedBufferSize, + CNBuffer, CNBuffSize, 3)); + + { + size_t const r = ZSTD_decompressDCtx(staticDCtx, + decodedBuffer, CNBuffSize, + compressedBuffer, cSize); + if (r != CNBuffSize) goto _output_error; + if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error; + } + ZSTD_freeCCtxParams(params); + } + + // Test ZSTD_estimateCStreamSize_usingCCtxParams + { + ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); + size_t const cctxSizeDefault = ZSTD_estimateCStreamSize_usingCCtxParams(params); + staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault); + CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx, + compressedBuffer, compressedBufferSize, + CNBuffer, CNBuffSize, 3) ); + + { + size_t const r = ZSTD_decompressDCtx(staticDCtx, + decodedBuffer, CNBuffSize, + compressedBuffer, cSize); + if (r != CNBuffSize) goto _output_error; + if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error; + } + ZSTD_freeCCtxParams(params); + } + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : test estimation functions with maxBlockSize = 0 : ", testNb++); + { + // Test ZSTD_estimateCCtxSize_usingCCtxParams + { + ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); + size_t cctxSizeDefault; + CHECK_Z(ZSTD_CCtxParams_setParameter(params, ZSTD_c_maxBlockSize, 0)); + cctxSizeDefault = ZSTD_estimateCCtxSize_usingCCtxParams(params); + staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault); + CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx, + compressedBuffer, compressedBufferSize, + CNBuffer, CNBuffSize, 3) ); + + { + size_t const r = ZSTD_decompressDCtx(staticDCtx, + decodedBuffer, CNBuffSize, + compressedBuffer, cSize); + if (r != CNBuffSize) goto _output_error; + if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error; + } + ZSTD_freeCCtxParams(params); + } + + // Test ZSTD_estimateCStreamSize_usingCCtxParams + { + ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); + size_t cctxSizeDefault; + CHECK_Z(ZSTD_CCtxParams_setParameter(params, ZSTD_c_maxBlockSize, 0)); + cctxSizeDefault = ZSTD_estimateCStreamSize_usingCCtxParams(params); + staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault); + CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx, + compressedBuffer, compressedBufferSize, + CNBuffer, CNBuffSize, 3) ); + + { + size_t const r = ZSTD_decompressDCtx(staticDCtx, + decodedBuffer, CNBuffSize, + compressedBuffer, cSize); + if (r != CNBuffSize) goto _output_error; + if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error; + } + ZSTD_freeCCtxParams(params); + } + } + DISPLAYLEVEL(3, "OK \n"); } free(staticCCtxBuffer); free(staticDCtxBuffer); @@ -1647,8 +1904,8 @@ static int basicUnitTests(U32 const seed, double compressibility) testResult = 1; goto _end; } - CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_nbWorkers, 2) ); - CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_compressionLevel, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_nbWorkers, 2) ); + CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_compressionLevel, 1) ); DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3u : compress %u bytes with 2 threads : ", testNb++, (unsigned)CNBuffSize); @@ -1678,9 +1935,9 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : compress -T2 with checksum : ", testNb++); - CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_checksumFlag, 1) ); - CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_contentSizeFlag, 1) ); - CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_overlapLog, 3) ); + CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_checksumFlag, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_contentSizeFlag, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_overlapLog, 3) ); CHECK_VAR(cSize, ZSTD_compress2(mtctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize) ); @@ -1699,11 +1956,11 @@ static int basicUnitTests(U32 const seed, double compressibility) ZSTD_DCtx* const dctx = ZSTD_createDCtx(); char out[32]; if (cctx == NULL || dctx == NULL) goto _output_error; - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0) ); CHECK_VAR(cSize, ZSTD_compress2(cctx, out, sizeof(out), NULL, 0) ); DISPLAYLEVEL(3, "OK (%u bytes)\n", (unsigned)cSize); - CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 10) ); + CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 10) ); { char const* outPtr = out; ZSTD_inBuffer inBuffer = { outPtr, cSize, 0 }; ZSTD_outBuffer outBuffer = { NULL, 0, 0 }; @@ -1718,9 +1975,9 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : compress with block splitting : ", testNb++) { ZSTD_CCtx* cctx = ZSTD_createCCtx(); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_splitBlocks, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_useBlockSplitter, ZSTD_ps_enable) ); cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); - CHECK(cSize); + CHECK_Z(cSize); ZSTD_freeCCtx(cctx); } DISPLAYLEVEL(3, "OK \n"); @@ -1728,13 +1985,13 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : compress -T2 with/without literals compression : ", testNb++) { ZSTD_CCtx* cctx = ZSTD_createCCtx(); size_t cSize1, cSize2; - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) ); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2) ); cSize1 = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); - CHECK(cSize1); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_literalCompressionMode, ZSTD_lcm_uncompressed) ); + CHECK_Z(cSize1); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_literalCompressionMode, ZSTD_ps_disable) ); cSize2 = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); - CHECK(cSize2); + CHECK_Z(cSize2); CHECK_LT(cSize1, cSize2); ZSTD_freeCCtx(cctx); } @@ -1745,10 +2002,10 @@ static int basicUnitTests(U32 const seed, double compressibility) /* Set rsyncable and don't give the ZSTD_compressBound(CNBuffSize) so * ZSTDMT is forced to not take the shortcut. */ - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) ); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1) ); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_rsyncable, 1) ); - CHECK( ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize - 1, CNBuffer, CNBuffSize) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_rsyncable, 1) ); + CHECK_Z( ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize - 1, CNBuffer, CNBuffSize) ); ZSTD_freeCCtx(cctx); } DISPLAYLEVEL(3, "OK \n"); @@ -1758,22 +2015,22 @@ static int basicUnitTests(U32 const seed, double compressibility) int const jobSize = 512 KB; int value; /* Check that the overlap log and job size are unset. */ - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); CHECK_EQ(value, 0); - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); CHECK_EQ(value, 0); /* Set and check the overlap log and job size. */ - CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_overlapLog, 5) ); - CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_jobSize, jobSize) ); - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); + CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_overlapLog, 5) ); + CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_jobSize, jobSize) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); CHECK_EQ(value, 5); - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); CHECK_EQ(value, jobSize); /* Set the number of workers and check the overlap log and job size. */ - CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_nbWorkers, 2) ); - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); + CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_nbWorkers, 2) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) ); CHECK_EQ(value, 5); - CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); + CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) ); CHECK_EQ(value, jobSize); ZSTD_freeCCtxParams(params); } @@ -1830,6 +2087,47 @@ static int basicUnitTests(U32 const seed, double compressibility) if (memcmp(decodedBuffer, CNBuffer, CNBuffSize / 2) != 0) goto _output_error; DISPLAYLEVEL(3, "OK \n"); + /* Simple API skippable frame test */ + DISPLAYLEVEL(3, "test%3i : read/write a skippable frame : ", testNb++); + { U32 i; + unsigned readMagic; + unsigned long long receivedSize; + size_t skippableSize; + const U32 skipLen = 129 KB; + char* const skipBuff = (char*)malloc(skipLen); + assert(skipBuff != NULL); + for (i = 0; i < skipLen; i++) + skipBuff[i] = (char) ((seed + i) % 256); + skippableSize = ZSTD_writeSkippableFrame( + compressedBuffer, compressedBufferSize, + skipBuff, skipLen, seed % 15); + CHECK_Z(skippableSize); + CHECK_EQ(1, ZSTD_isSkippableFrame(compressedBuffer, skippableSize)); + receivedSize = ZSTD_readSkippableFrame(decodedBuffer, CNBuffSize, &readMagic, compressedBuffer, skippableSize); + CHECK_EQ(skippableSize, receivedSize + ZSTD_SKIPPABLEHEADERSIZE); + CHECK_EQ(seed % 15, readMagic); + if (memcmp(decodedBuffer, skipBuff, skipLen) != 0) goto _output_error; + + free(skipBuff); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : read/write an empty skippable frame : ", testNb++); + { + unsigned readMagic; + unsigned long long receivedSize; + size_t skippableSize; + skippableSize = ZSTD_writeSkippableFrame( + compressedBuffer, compressedBufferSize, + CNBuffer, 0, seed % 15); + CHECK_EQ(ZSTD_SKIPPABLEHEADERSIZE, skippableSize); + CHECK_EQ(1, ZSTD_isSkippableFrame(compressedBuffer, skippableSize)); + receivedSize = ZSTD_readSkippableFrame(NULL, 0, &readMagic, compressedBuffer, skippableSize); + CHECK_EQ(skippableSize, receivedSize + ZSTD_SKIPPABLEHEADERSIZE); + CHECK_EQ(seed % 15, readMagic); + } + DISPLAYLEVEL(3, "OK \n"); + /* Dictionary and CCtx Duplication tests */ { ZSTD_CCtx* const ctxOrig = ZSTD_createCCtx(); ZSTD_CCtx* const ctxDuplicated = ZSTD_createCCtx(); @@ -1843,8 +2141,8 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : load dictionary into context : ", testNb++); - CHECK( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) ); - CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */ + CHECK_Z( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) ); + CHECK_Z( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */ DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : compress with flat dictionary : ", testNb++); @@ -1904,8 +2202,8 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : check content size on duplicated context : ", testNb++); { size_t const testSize = CNBuffSize / 3; - CHECK( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) ); - CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) ); + CHECK_Z( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) ); + CHECK_Z( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) ); CHECK_VAR(cSize, ZSTD_compressEnd(ctxDuplicated, compressedBuffer, ZSTD_compressBound(testSize), (const char*)CNBuffer + dictSize, testSize) ); @@ -1915,29 +2213,37 @@ static int basicUnitTests(U32 const seed, double compressibility) } } DISPLAYLEVEL(3, "OK \n"); + /* Note : these tests should be replaced by proper regression tests, + * but existing ones do not focus on small data + dictionary + all levels. + */ if ((int)(compressibility * 100 + 0.1) == FUZ_compressibility_default) { /* test only valid with known input */ size_t const flatdictSize = 22 KB; size_t const contentSize = 9 KB; const void* const dict = (const char*)CNBuffer; const void* const contentStart = (const char*)dict + flatdictSize; /* These upper bounds are generally within a few bytes of the compressed size */ - size_t const target_nodict_cSize[22+1] = { 3840, 3770, 3870, 3830, 3770, - 3770, 3770, 3770, 3750, 3750, - 3742, 3670, 3670, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660 }; - size_t const target_wdict_cSize[22+1] = { 2830, 2890, 2890, 2820, 2940, + size_t target_nodict_cSize[22+1] = { 3840, 3770, 3870, 3830, 3770, + 3770, 3770, 3770, 3750, 3750, + 3742, 3675, 3674, 3665, 3664, + 3663, 3662, 3661, 3660, 3660, + 3660, 3660, 3660 }; + size_t const target_wdict_cSize[22+1] = { 2830, 2896, 2893, 2820, 2940, 2950, 2950, 2925, 2900, 2891, - 2910, 2910, 2910, 2770, 2760, - 2750, 2750, 2750, 2750, 2750, - 2750, 2750, 2750 }; + 2910, 2910, 2910, 2780, 2775, + 2765, 2760, 2755, 2754, 2753, + 2753, 2753, 2753 }; int l = 1; int const maxLevel = ZSTD_maxCLevel(); + /* clevels with strategies that support rowhash on small inputs */ + int rowLevel = 4; + int const rowLevelEnd = 8; DISPLAYLEVEL(3, "test%3i : flat-dictionary efficiency test : \n", testNb++); assert(maxLevel == 22); RDG_genBuffer(CNBuffer, flatdictSize + contentSize, compressibility, 0., seed); - DISPLAYLEVEL(4, "content hash : %016llx; dict hash : %016llx \n", XXH64(contentStart, contentSize, 0), XXH64(dict, flatdictSize, 0)); + DISPLAYLEVEL(4, "content hash : %016llx; dict hash : %016llx \n", + (unsigned long long)XXH64(contentStart, contentSize, 0), + (unsigned long long)XXH64(dict, flatdictSize, 0)); for ( ; l <= maxLevel; l++) { size_t const nodict_cSize = ZSTD_compress(compressedBuffer, compressedBufferSize, @@ -1964,6 +2270,27 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(4, "level %i with dictionary : max expected %u >= reached %u \n", l, (unsigned)target_wdict_cSize[l], (unsigned)wdict_cSize); } + /* Compression with ZSTD_compress2 and row match finder force enabled. + * Give some slack for force-enabled row matchfinder since we're on a small input (9KB) + */ + for ( ; rowLevel <= rowLevelEnd; ++rowLevel) target_nodict_cSize[rowLevel] += 5; + for (l=1 ; l <= maxLevel; l++) { + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + size_t nodict_cSize; + ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, l); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_useRowMatchFinder, ZSTD_ps_enable); + nodict_cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, + contentStart, contentSize); + if (nodict_cSize > target_nodict_cSize[l]) { + DISPLAYLEVEL(1, "error : compression with compress2 at level %i worse than expected (%u > %u) \n", + l, (unsigned)nodict_cSize, (unsigned)target_nodict_cSize[l]); + ZSTD_freeCCtx(cctx); + goto _output_error; + } + DISPLAYLEVEL(4, "level %i with compress2 : max expected %u >= reached %u \n", + l, (unsigned)target_nodict_cSize[l], (unsigned)nodict_cSize); + ZSTD_freeCCtx(cctx); + } /* Dict compression with DMS */ for ( l=1 ; l <= maxLevel; l++) { size_t wdict_cSize; @@ -1971,6 +2298,7 @@ static int basicUnitTests(U32 const seed, double compressibility) CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_compressionLevel, l) ); CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_enableDedicatedDictSearch, 0) ); CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach) ); + CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_prefetchCDictTables, seed % 3) ); wdict_cSize = ZSTD_compress2(ctxOrig, compressedBuffer, compressedBufferSize, contentStart, contentSize); if (wdict_cSize > target_wdict_cSize[l]) { DISPLAYLEVEL(1, "error : compression with dictionary and compress2 at level %i worse than expected (%u > %u) \n", @@ -2275,6 +2603,27 @@ static int basicUnitTests(U32 const seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3d : bufferless api with cdict : ", testNb++); + { ZSTD_CDict* const cdict = ZSTD_createCDict(dictBuffer, dictSize, 1); + ZSTD_DCtx* const dctx = ZSTD_createDCtx(); + ZSTD_frameParameters const fParams = { 0, 1, 0 }; + size_t cBlockSize; + cSize = 0; + CHECK_Z(ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, ZSTD_CONTENTSIZE_UNKNOWN)); + cBlockSize = ZSTD_compressContinue(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, CNBuffer, 1000); + CHECK_Z(cBlockSize); + cSize += cBlockSize; + cBlockSize = ZSTD_compressEnd(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, (char const*)CNBuffer + 2000, 1000); + CHECK_Z(cBlockSize); + cSize += cBlockSize; + + CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize)); + + ZSTD_freeCDict(cdict); + ZSTD_freeDCtx(dctx); + } + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : Building cdict w/ ZSTD_dct_fullDict on a good dictionary : ", testNb++); { ZSTD_compressionParameters const cParams = ZSTD_getCParams(1, CNBuffSize, dictSize); ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_fullDict, cParams, ZSTD_defaultCMem); @@ -2470,7 +2819,7 @@ static int basicUnitTests(U32 const seed, double compressibility) ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); CHECK_Z( ZSTD_DCtx_loadDictionary(dctx, dictBuffer, dictSize) ); CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) ); - /* The dictionary should presist across calls. */ + /* The dictionary should persist across calls. */ CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) ); /* When we reset the context the dictionary is cleared. */ ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); @@ -2489,7 +2838,7 @@ static int basicUnitTests(U32 const seed, double compressibility) ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); CHECK_Z( ZSTD_DCtx_refDDict(dctx, ddict) ); CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) ); - /* The ddict should presist across calls. */ + /* The ddict should persist across calls. */ CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) ); /* When we reset the context the ddict is cleared. */ ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); @@ -2515,6 +2864,90 @@ static int basicUnitTests(U32 const seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : ZSTD_fast attach dictionary with hashLog = 25 and chainLog = 25 : ", testNb++); + { + ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams(); + ZSTD_customMem customMem = {NULL, NULL, NULL}; + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + ZSTD_CDict* cdict; + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_fast)); + /* Set windowLog to 25 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 25)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 25)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_chainLog, 25)); + /* Set srcSizeHint to 2^25 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 25)); + cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem); + CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); + CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict)); + cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); + CHECK_Z(cSize); + CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize)); + ZSTD_freeCDict(cdict); + ZSTD_freeDCtx(dctx); + ZSTD_freeCCtxParams(cctxParams); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : ZSTD_dfast attach dictionary with hashLog = 25 and chainLog = 25 : ", testNb++); + { + ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams(); + ZSTD_customMem customMem = {NULL, NULL, NULL}; + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + ZSTD_CDict* cdict; + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_dfast)); + /* Set windowLog to 25 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 25)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 25)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_chainLog, 25)); + /* Set srcSizeHint to 2^25 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 25)); + cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem); + CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); + CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict)); + cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); + CHECK_Z(cSize); + CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize)); + ZSTD_freeCDict(cdict); + ZSTD_freeDCtx(dctx); + ZSTD_freeCCtxParams(cctxParams); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : ZSTD_lazy attach dictionary with hashLog = 29 and searchLog = 4 : ", testNb++); + if (MEM_64bits()) { + ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams(); + ZSTD_customMem customMem = {NULL, NULL, NULL}; + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + ZSTD_CDict* cdict; + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_lazy)); + /* Force enable row based match finder, and disable dedicated dict search. */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_useRowMatchFinder, ZSTD_ps_enable)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_enableDedicatedDictSearch, 0)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_searchLog, 4)); + /* Set windowLog to 29 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 29)); + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 29)); + /* Set srcSizeHint to 2^29 so hash/chain logs don't get sized down */ + CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 29)); + cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem); + CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); + CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict)); + cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); + CHECK_Z(cSize); + CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize)); + ZSTD_freeCDict(cdict); + ZSTD_freeDCtx(dctx); + ZSTD_freeCCtxParams(cctxParams); + } + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : Dictionary with non-default repcodes : ", testNb++); { U32 u; for (u=0; u %u bytes)\n", (unsigned)inputSize, (unsigned)result); @@ -2785,7 +3218,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : get dParameter bounds ", testNb++); { ZSTD_bounds const bounds = ZSTD_dParam_getBounds(ZSTD_d_windowLogMax); - CHECK(bounds.error); + CHECK_Z(bounds.error); } DISPLAYLEVEL(3, "OK \n"); @@ -2819,7 +3252,7 @@ static int basicUnitTests(U32 const seed, double compressibility) /* basic block compression */ DISPLAYLEVEL(3, "test%3i : magic-less format test : ", testNb++); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) ); { ZSTD_inBuffer in = { CNBuffer, inputSize, 0 }; ZSTD_outBuffer out = { compressedBuffer, ZSTD_compressBound(inputSize), 0 }; size_t const result = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end); @@ -2837,7 +3270,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : decompress of magic-less frame : ", testNb++); ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); - CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) ); + CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) ); { ZSTD_frameHeader zfh; size_t const zfhrt = ZSTD_getFrameHeader_advanced(&zfh, compressedBuffer, cSize, ZSTD_f_zstd1_magicless); if (zfhrt != 0) goto _output_error; @@ -2859,7 +3292,7 @@ static int basicUnitTests(U32 const seed, double compressibility) /* basic block compression */ DISPLAYLEVEL(3, "test%3i : empty magic-less format test : ", testNb++); - CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) ); { ZSTD_inBuffer in = { CNBuffer, 0, 0 }; ZSTD_outBuffer out = { compressedBuffer, ZSTD_compressBound(0), 0 }; size_t const result = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end); @@ -2871,7 +3304,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : decompress of empty magic-less frame : ", testNb++); ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters); - CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) ); + CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) ); /* one shot */ { size_t const result = ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize); if (result != 0) goto _output_error; @@ -2906,13 +3339,13 @@ static int basicUnitTests(U32 const seed, double compressibility) int check; if (ZSTD_isError(bounds.error)) continue; - CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &value1)); + CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &value1)); value2 = (value1 != bounds.lowerBound) ? bounds.lowerBound : bounds.upperBound; - CHECK(ZSTD_DCtx_setParameter(dctx, dParam, value2)); - CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &check)); + CHECK_Z(ZSTD_DCtx_setParameter(dctx, dParam, value2)); + CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &check)); if (check != value2) goto _output_error; - CHECK(ZSTD_DCtx_reset(dctx, ZSTD_reset_parameters)); - CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &check)); + CHECK_Z(ZSTD_DCtx_reset(dctx, ZSTD_reset_parameters)); + CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &check)); if (check != value1) goto _output_error; } ZSTD_freeDCtx(dctx); @@ -2929,21 +3362,21 @@ static int basicUnitTests(U32 const seed, double compressibility) /* basic block compression */ DISPLAYLEVEL(3, "test%3i : Block compression test : ", testNb++); - CHECK( ZSTD_compressBegin(cctx, 5) ); - CHECK( ZSTD_getBlockSize(cctx) >= blockSize); + CHECK_Z( ZSTD_compressBegin(cctx, 5) ); + CHECK_Z( ZSTD_getBlockSize(cctx) >= blockSize); CHECK_VAR(cSize, ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), CNBuffer, blockSize) ); DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : Block decompression test : ", testNb++); - CHECK( ZSTD_decompressBegin(dctx) ); + CHECK_Z( ZSTD_decompressBegin(dctx) ); { CHECK_NEWV(r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) ); if (r != blockSize) goto _output_error; } DISPLAYLEVEL(3, "OK \n"); /* very long stream of block compression */ DISPLAYLEVEL(3, "test%3i : Huge block streaming compression test : ", testNb++); - CHECK( ZSTD_compressBegin(cctx, -199) ); /* we just want to quickly overflow internal U32 index */ - CHECK( ZSTD_getBlockSize(cctx) >= blockSize); + CHECK_Z( ZSTD_compressBegin(cctx, -199) ); /* we just want to quickly overflow internal U32 index */ + CHECK_Z( ZSTD_getBlockSize(cctx) >= blockSize); { U64 const toCompress = 5000000000ULL; /* > 4 GB */ U64 compressed = 0; while (compressed < toCompress) { @@ -2956,7 +3389,7 @@ static int basicUnitTests(U32 const seed, double compressibility) /* dictionary block compression */ DISPLAYLEVEL(3, "test%3i : Dictionary Block compression test : ", testNb++); - CHECK( ZSTD_compressBegin_usingDict(cctx, CNBuffer, dictSize, 5) ); + CHECK_Z( ZSTD_compressBegin_usingDict(cctx, CNBuffer, dictSize, 5) ); CHECK_VAR(cSize, ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize)); RDG_genBuffer((char*)CNBuffer+dictSize+blockSize, blockSize, 0.0, 0.0, seed); /* create a non-compressible second block */ { CHECK_NEWV(r, ZSTD_compressBlock(cctx, (char*)compressedBuffer+cSize, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize+blockSize, blockSize) ); /* for cctx history consistency */ @@ -2967,7 +3400,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : Dictionary Block decompression test : ", testNb++); - CHECK( ZSTD_decompressBegin_usingDict(dctx, CNBuffer, dictSize) ); + CHECK_Z( ZSTD_decompressBegin_usingDict(dctx, CNBuffer, dictSize) ); { CHECK_NEWV( r, ZSTD_decompressBlock(dctx, decodedBuffer, blockSize, compressedBuffer, cSize) ); if (r != blockSize) { DISPLAYLEVEL(1, "ZSTD_decompressBlock() with _usingDict() fails : %u, instead of %u expected \n", (unsigned)r, (unsigned)blockSize); @@ -2986,8 +3419,8 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : Block compression with CDict : ", testNb++); { ZSTD_CDict* const cdict = ZSTD_createCDict(CNBuffer, dictSize, 3); if (cdict==NULL) goto _output_error; - CHECK( ZSTD_compressBegin_usingCDict(cctx, cdict) ); - CHECK( ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize) ); + CHECK_Z( ZSTD_compressBegin_usingCDict(cctx, cdict) ); + CHECK_Z( ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize) ); ZSTD_freeCDict(cdict); } DISPLAYLEVEL(3, "OK \n"); @@ -3044,18 +3477,17 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : ZSTD_getSequences followed by ZSTD_compressSequences : ", testNb++); { - size_t srcSize = 500 KB; - BYTE* src = (BYTE*)CNBuffer; - BYTE* dst = (BYTE*)compressedBuffer; - size_t dstSize = ZSTD_compressBound(srcSize); - size_t decompressSize = srcSize; - char* decompressBuffer = (char*)malloc(decompressSize); + const size_t srcSize = 500 KB; + const BYTE* const src = (BYTE*)CNBuffer; + BYTE* const dst = (BYTE*)compressedBuffer; + const size_t dstCapacity = ZSTD_compressBound(srcSize); + const size_t decompressSize = srcSize; + char* const decompressBuffer = (char*)malloc(decompressSize); size_t compressedSize; - size_t dSize; - ZSTD_CCtx* cctx = ZSTD_createCCtx(); - ZSTD_Sequence* seqs = (ZSTD_Sequence*)malloc(srcSize * sizeof(ZSTD_Sequence)); - size_t seqsSize; + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + ZSTD_Sequence* const seqs = (ZSTD_Sequence*)malloc(srcSize * sizeof(ZSTD_Sequence)); + size_t nbSeqs; if (seqs == NULL) goto _output_error; assert(cctx != NULL); @@ -3063,36 +3495,37 @@ static int basicUnitTests(U32 const seed, double compressibility) /* Populate src with random data */ RDG_genBuffer(CNBuffer, srcSize, compressibility, 0., seed); - /* Test with block delimiters roundtrip */ - seqsSize = ZSTD_generateSequences(cctx, seqs, srcSize, src, srcSize); + /* Roundtrip Test with block delimiters generated by ZSTD_generateSequences() */ + nbSeqs = ZSTD_generateSequences(cctx, seqs, srcSize, src, srcSize); ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters); - compressedSize = ZSTD_compressSequences(cctx, dst, dstSize, seqs, seqsSize, src, srcSize); + compressedSize = ZSTD_compressSequences(cctx, dst, dstCapacity, seqs, nbSeqs, src, srcSize); if (ZSTD_isError(compressedSize)) { DISPLAY("Error in sequence compression with block delims\n"); goto _output_error; } - dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); - if (ZSTD_isError(dSize)) { - DISPLAY("Error in sequence compression roundtrip with block delims\n"); - goto _output_error; - } + { size_t const dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); + if (ZSTD_isError(dSize)) { + DISPLAY("Error in sequence compression roundtrip with block delims\n"); + goto _output_error; + } } assert(!memcmp(decompressBuffer, src, srcSize)); - /* Test with no block delimiters roundtrip */ - seqsSize = ZSTD_mergeBlockDelimiters(seqs, seqsSize); - ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); - compressedSize = ZSTD_compressSequences(cctx, dst, dstSize, seqs, seqsSize, src, srcSize); + /* Roundtrip Test with no block delimiters */ + { size_t const nbSeqsAfterMerge = ZSTD_mergeBlockDelimiters(seqs, nbSeqs); + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); + compressedSize = ZSTD_compressSequences(cctx, dst, dstCapacity, seqs, nbSeqsAfterMerge, src, srcSize); + } if (ZSTD_isError(compressedSize)) { DISPLAY("Error in sequence compression with no block delims\n"); goto _output_error; } - dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); - if (ZSTD_isError(dSize)) { - DISPLAY("Error in sequence compression roundtrip with no block delims\n"); - goto _output_error; - } + { size_t const dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); + if (ZSTD_isError(dSize)) { + DISPLAY("Error in sequence compression roundtrip with no block delims\n"); + goto _output_error; + } } assert(!memcmp(decompressBuffer, src, srcSize)); ZSTD_freeCCtx(cctx); @@ -3156,7 +3589,7 @@ static int basicUnitTests(U32 const seed, double compressibility) size_t const bound = ZSTD_compressBound(_3BYTESTESTLENGTH); size_t nbSeq = 1; while (nbSeq <= maxNbSeq) { - CHECK(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, nbSeq * 3, 19)); + CHECK_Z(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, nbSeq * 3, 19)); /* Check every sequence for the first 100, then skip more rapidly. */ if (nbSeq < 100) { ++nbSeq; @@ -3185,7 +3618,7 @@ static int basicUnitTests(U32 const seed, double compressibility) size_t const bound = ZSTD_compressBound(CNBuffSize); size_t size = 1; while (size <= CNBuffSize) { - CHECK(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, size, 3)); + CHECK_Z(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, size, 3)); /* Check every size for the first 100, then skip more rapidly. */ if (size < 100) { ++size; @@ -3213,15 +3646,14 @@ static int basicUnitTests(U32 const seed, double compressibility) { U32 u; for (u = 0; u < CNBuffSize; ++u) { ((BYTE*)CNBuffer)[u] = 255 - ((BYTE*)CNBuffer)[u]; - } - } + } } { /* Compress the data */ size_t const inputSize = 500; size_t const outputSize = ZSTD_compressBound(inputSize); void* const outputBuffer = malloc(outputSize); ZSTD_CCtx* const cctx = ZSTD_createCCtx(); if (!outputBuffer || !cctx) goto _output_error; - CHECK(ZSTD_compress_usingDict(cctx, outputBuffer, outputSize, CNBuffer, inputSize, dictBuffer, dictSize, 1)); + CHECK_Z(ZSTD_compress_usingDict(cctx, outputBuffer, outputSize, CNBuffer, inputSize, dictBuffer, dictSize, 1)); free(outputBuffer); ZSTD_freeCCtx(cctx); } @@ -3289,6 +3721,91 @@ static int basicUnitTests(U32 const seed, double compressibility) FSE_normalizeCount(norm, tableLog, count, nbSeq, maxSymbolValue, /* useLowProbCount */ 1); } DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : testing FSE_writeNCount() PR#2779: ", testNb++); + { + size_t const outBufSize = 9; + short const count[11] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 9, 18}; + unsigned const tableLog = 5; + unsigned const maxSymbolValue = 10; + BYTE* outBuf = (BYTE*)malloc(outBufSize*sizeof(BYTE)); + + /* Ensure that this write doesn't write out of bounds, and that + * FSE_writeNCount_generic() is *not* called with writeIsSafe == 1. + */ + FSE_writeNCount(outBuf, outBufSize, count, maxSymbolValue, tableLog); + free(outBuf); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : testing bitwise intrinsics PR#3045: ", testNb++); + { + U32 seed_copy = seed; /* need non-const seed to avoid compiler warning for FUZ_rand(&seed) */ + U32 rand32 = FUZ_rand(&seed_copy); + U64 rand64 = ((U64)FUZ_rand(&seed_copy) << 32) | FUZ_rand(&seed_copy); + U32 lowbit_only_32 = 1; + U64 lowbit_only_64 = 1; + U32 highbit_only_32 = (U32)1 << 31; + U64 highbit_only_64 = (U64)1 << 63; + U32 i; + if (rand32 == 0) rand32 = 1; /* CLZ and CTZ are undefined on 0 */ + if (rand64 == 0) rand64 = 1; /* CLZ and CTZ are undefined on 0 */ + + /* Test ZSTD_countTrailingZeros32 */ + CHECK_EQ(ZSTD_countTrailingZeros32(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_countTrailingZeros32(highbit_only_32), 31u); + CHECK_EQ(ZSTD_countTrailingZeros32(rand32), ZSTD_countTrailingZeros32_fallback(rand32)); + + /* Test ZSTD_countLeadingZeros32 */ + CHECK_EQ(ZSTD_countLeadingZeros32(lowbit_only_32), 31u); + CHECK_EQ(ZSTD_countLeadingZeros32(highbit_only_32), 0u); + CHECK_EQ(ZSTD_countLeadingZeros32(rand32), ZSTD_countLeadingZeros32_fallback(rand32)); + + /* Test ZSTD_countTrailingZeros64 */ + CHECK_EQ(ZSTD_countTrailingZeros64(lowbit_only_64), 0u); + CHECK_EQ(ZSTD_countTrailingZeros64(highbit_only_64), 63u); + + /* Test ZSTD_countLeadingZeros64 */ + CHECK_EQ(ZSTD_countLeadingZeros64(lowbit_only_64), 63u); + CHECK_EQ(ZSTD_countLeadingZeros64(highbit_only_64), 0u); + + /* Test ZSTD_highbit32 */ + CHECK_EQ(ZSTD_highbit32(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_highbit32(highbit_only_32), 31u); + + /* Test ZSTD_NbCommonBytes */ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 3u); + } else { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 3u); + } + } else { + if (MEM_64bits()) { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 7u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 4u); + } else { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 3u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 0u); + } + } + + /* Test MEM_ intrinsics */ + CHECK_EQ(MEM_swap32(rand32), MEM_swap32_fallback(rand32)); + CHECK_EQ(MEM_swap64(rand64), MEM_swap64_fallback(rand64)); + + /* Test fallbacks vs intrinsics on a range of small integers */ + for (i=1; i <= 1000; i++) { + CHECK_EQ(MEM_swap32(i), MEM_swap32_fallback(i)); + CHECK_EQ(MEM_swap64((U64)i), MEM_swap64_fallback((U64)i)); + CHECK_EQ(ZSTD_countTrailingZeros32(i), ZSTD_countTrailingZeros32_fallback(i)); + CHECK_EQ(ZSTD_countLeadingZeros32(i), ZSTD_countLeadingZeros32_fallback(i)); + } + } + DISPLAYLEVEL(3, "OK \n"); + #ifdef ZSTD_MULTITHREAD DISPLAYLEVEL(3, "test%3i : passing wrong full dict should fail on compressStream2 refPrefix ", testNb++); { ZSTD_CCtx* cctx = ZSTD_createCCtx(); @@ -3337,7 +3854,7 @@ static int basicUnitTests(U32 const seed, double compressibility) /* Enable MT, LDM, and use refPrefix() for a small dict */ CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2)); - CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, 1)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable)); CHECK_Z(ZSTD_CCtx_refPrefix(cctx, dict, dictSize)); CHECK_Z(ZSTD_compress2(cctx, dst, dstSize, src, srcSize)); @@ -3407,11 +3924,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "error! l: %d dict: %zu srcSize: %zu cctx size cpar: %zu, cctx size level: %zu\n", level, dictSize, srcSize, cctxSizeUsingCParams, cctxSizeUsingLevel); goto _output_error; - } - } - } - } - } + } } } } } DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : thread pool API tests : \n", testNb++) @@ -3477,7 +3990,7 @@ static int longUnitTests(U32 const seed, double compressibility) while (approxIndex <= (maxIndex / 4) * 3) { CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush)); approxIndex += in.pos; - CHECK(in.pos == in.size); + CHECK_Z(in.pos == in.size); in.pos = 0; out.pos = 0; } @@ -3503,7 +4016,7 @@ static int longUnitTests(U32 const seed, double compressibility) while (approxIndex <= maxIndex) { CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush)); approxIndex += in.pos; - CHECK(in.pos == in.size); + CHECK_Z(in.pos == in.size); in.pos = 0; out.pos = 0; } @@ -3527,8 +4040,7 @@ static int longUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "longtest%3i : testing ldm no regressions in size for opt parser : ", testNb++); - { - size_t cSizeLdm; + { size_t cSizeLdm; size_t cSizeNoLdm; ZSTD_CCtx* const cctx = ZSTD_createCCtx(); @@ -3536,7 +4048,7 @@ static int longUnitTests(U32 const seed, double compressibility) /* Enable checksum to verify round trip. */ CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); - CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, 1)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 19)); /* Round trip once with ldm. */ @@ -3546,7 +4058,7 @@ static int longUnitTests(U32 const seed, double compressibility) ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); - CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, 0)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_disable)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 19)); /* Round trip once without ldm. */ @@ -3587,7 +4099,7 @@ static int longUnitTests(U32 const seed, double compressibility) RDG_genBuffer(dict, dictSize, 0.5, 0.5, seed); RDG_genBuffer(CNBuffer, CNBuffSize, 0.6, 0.6, seed); - CHECK(cctx_params != NULL); + CHECK_Z(cctx_params != NULL); for (dictSize = CNBuffSize; dictSize; dictSize = dictSize >> 3) { DISPLAYLEVEL(3, "\n Testing with dictSize %u ", (U32)dictSize); @@ -3606,7 +4118,7 @@ static int longUnitTests(U32 const seed, double compressibility) CHECK(cdict != NULL); CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict)); - CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, attachPref)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, (int)attachPref)); cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize); CHECK_Z(cSize); @@ -3630,11 +4142,6 @@ _end: free(compressedBuffer); free(decodedBuffer); return testResult; - -_output_error: - testResult = 1; - DISPLAY("Error detected in Unit tests ! \n"); - goto _end; } @@ -3887,9 +4394,9 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, U32 const DISPLAYLEVEL(5, "fuzzer t%u: Bufferless streaming compression test \n", testNb); { U32 const testLog = FUZ_rand(&lseed) % maxSrcLog; U32 const dictLog = FUZ_rand(&lseed) % maxSrcLog; - int const cLevel = (FUZ_rand(&lseed) % - (ZSTD_maxCLevel() - - (MAX(testLog, dictLog) / cLevelLimiter))) + + int const cLevel = (int)(FUZ_rand(&lseed) % + ((U32)ZSTD_maxCLevel() - + (MAX(testLog, dictLog) / (U32)cLevelLimiter))) + 1; maxTestSize = FUZ_rLogLength(&lseed, testLog); if (maxTestSize >= dstBufferSize) maxTestSize = dstBufferSize-1; @@ -3985,7 +4492,7 @@ _cleanup: free(cBuffer); free(dstBuffer); free(mirrorBuffer); - return result; + return (int)result; _output_error: result = 1; @@ -4022,7 +4529,7 @@ static unsigned readU32FromChar(const char** stringPtr) { unsigned result = 0; while ((**stringPtr >='0') && (**stringPtr <='9')) - result *= 10, result += **stringPtr - '0', (*stringPtr)++ ; + result *= 10, result += (unsigned)(**stringPtr - '0'), (*stringPtr)++ ; if ((**stringPtr=='K') || (**stringPtr=='M')) { result <<= 10; if (**stringPtr=='M') result <<= 10; @@ -4164,7 +4671,7 @@ int main(int argc, const char** argv) } } if (!result) - result = fuzzerTests(seed, nbTests, testNb, maxDuration, ((double)proba) / 100, bigTests); + result = fuzzerTests(seed, (unsigned)nbTests, (unsigned)testNb, maxDuration, ((double)proba) / 100, bigTests); if (mainPause) { int unused; DISPLAY("Press Enter \n"); diff --git a/src/dependencies/zstd-1.5.0/tests/golden-compression/http b/src/dependencies/zstd-1.5.4/tests/golden-compression/http similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/golden-compression/http rename to src/dependencies/zstd-1.5.4/tests/golden-compression/http diff --git a/src/dependencies/zstd-1.5.0/tests/golden-compression/huffman-compressed-larger b/src/dependencies/zstd-1.5.4/tests/golden-compression/huffman-compressed-larger similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/golden-compression/huffman-compressed-larger rename to src/dependencies/zstd-1.5.4/tests/golden-compression/huffman-compressed-larger diff --git a/src/dependencies/zstd-1.5.4/tests/golden-compression/large-literal-and-match-lengths b/src/dependencies/zstd-1.5.4/tests/golden-compression/large-literal-and-match-lengths new file mode 100644 index 0000000000000000000000000000000000000000..fb63c32c50f44563ccb9dc3544216cab833ad6c8 GIT binary patch literal 199998 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 A&Hw-a literal 0 HcmV?d00001 diff --git a/src/dependencies/zstd-1.5.0/tests/golden-dictionaries/http-dict-missing-symbols b/src/dependencies/zstd-1.5.4/tests/golden-dictionaries/http-dict-missing-symbols similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/golden-dictionaries/http-dict-missing-symbols rename to src/dependencies/zstd-1.5.4/tests/golden-dictionaries/http-dict-missing-symbols diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/Makefile b/src/dependencies/zstd-1.5.4/tests/gzip/Makefile similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/gzip/Makefile rename to src/dependencies/zstd-1.5.4/tests/gzip/Makefile index a50350f..cca3109 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/Makefile +++ b/src/dependencies/zstd-1.5.4/tests/gzip/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/gzip-env.sh b/src/dependencies/zstd-1.5.4/tests/gzip/gzip-env.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/gzip-env.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/gzip-env.sh index 120e52d..4570e81 100755 --- a/src/dependencies/zstd-1.5.0/tests/gzip/gzip-env.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/gzip-env.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/helin-segv.sh b/src/dependencies/zstd-1.5.4/tests/gzip/helin-segv.sh similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/gzip/helin-segv.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/helin-segv.sh index f182c80..b400c24 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/helin-segv.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/helin-segv.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/help-version.sh b/src/dependencies/zstd-1.5.4/tests/gzip/help-version.sh similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/gzip/help-version.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/help-version.sh index ee0c19f..fcda1c3 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/help-version.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/help-version.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # Ensure that $SHELL is set to *some* value and exported. # This is required for dircolors, which would fail e.g., when diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/hufts-segv.gz b/src/dependencies/zstd-1.5.4/tests/gzip/hufts-segv.gz similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/gzip/hufts-segv.gz rename to src/dependencies/zstd-1.5.4/tests/gzip/hufts-segv.gz diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/hufts.sh b/src/dependencies/zstd-1.5.4/tests/gzip/hufts.sh similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/gzip/hufts.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/hufts.sh index 9b9576c..49c3695 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/hufts.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/hufts.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/init.cfg b/src/dependencies/zstd-1.5.4/tests/gzip/init.cfg similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/gzip/init.cfg rename to src/dependencies/zstd-1.5.4/tests/gzip/init.cfg diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/init.sh b/src/dependencies/zstd-1.5.4/tests/gzip/init.sh similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/gzip/init.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/init.sh index 97e4e4b..ebd8410 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/init.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/init.sh @@ -13,7 +13,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # Using this file in a test # ========================= diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/keep.sh b/src/dependencies/zstd-1.5.4/tests/gzip/keep.sh similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/gzip/keep.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/keep.sh index ab9a218..f87b1a4 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/keep.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/keep.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/list.sh b/src/dependencies/zstd-1.5.4/tests/gzip/list.sh similarity index 92% rename from src/dependencies/zstd-1.5.0/tests/gzip/list.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/list.sh index 75912e1..e218d75 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/list.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/list.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/memcpy-abuse.sh b/src/dependencies/zstd-1.5.4/tests/gzip/memcpy-abuse.sh similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/gzip/memcpy-abuse.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/memcpy-abuse.sh index 7d5c056..1478890 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/memcpy-abuse.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/memcpy-abuse.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/mixed.sh b/src/dependencies/zstd-1.5.4/tests/gzip/mixed.sh similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/gzip/mixed.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/mixed.sh index 383a54f..b47f4a5 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/mixed.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/mixed.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/null-suffix-clobber.sh b/src/dependencies/zstd-1.5.4/tests/gzip/null-suffix-clobber.sh similarity index 93% rename from src/dependencies/zstd-1.5.0/tests/gzip/null-suffix-clobber.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/null-suffix-clobber.sh index 0efd0e3..5acfb32 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/null-suffix-clobber.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/null-suffix-clobber.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/stdin.sh b/src/dependencies/zstd-1.5.4/tests/gzip/stdin.sh similarity index 92% rename from src/dependencies/zstd-1.5.0/tests/gzip/stdin.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/stdin.sh index eef4cd8..d697ab8 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/stdin.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/stdin.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/test-driver.sh b/src/dependencies/zstd-1.5.4/tests/gzip/test-driver.sh similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/gzip/test-driver.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/test-driver.sh index 649c084..0529cc8 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/test-driver.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/test-driver.sh @@ -16,7 +16,7 @@ scriptversion=2016-01-11.22; # UTC # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/trailing-nul.sh b/src/dependencies/zstd-1.5.4/tests/gzip/trailing-nul.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/trailing-nul.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/trailing-nul.sh index 7b15d5e..b33b98f 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/trailing-nul.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/trailing-nul.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/unpack-invalid.sh b/src/dependencies/zstd-1.5.4/tests/gzip/unpack-invalid.sh similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/gzip/unpack-invalid.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/unpack-invalid.sh index fe8384d..ceda5ff 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/unpack-invalid.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/unpack-invalid.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/z-suffix.sh b/src/dependencies/zstd-1.5.4/tests/gzip/z-suffix.sh similarity index 92% rename from src/dependencies/zstd-1.5.0/tests/gzip/z-suffix.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/z-suffix.sh index a870a54..c0bf509 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/z-suffix.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/z-suffix.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/zdiff.sh b/src/dependencies/zstd-1.5.4/tests/gzip/zdiff.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/zdiff.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/zdiff.sh index d62a846..6e99b66 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/zdiff.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/zdiff.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-context.sh b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-context.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/zgrep-context.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/zgrep-context.sh index c8648b7..d213426 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-context.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-context.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-f.sh b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-f.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/zgrep-f.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/zgrep-f.sh index d0cf27f..1e73ed2 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-f.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-f.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-signal.sh b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-signal.sh similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/gzip/zgrep-signal.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/zgrep-signal.sh index a8c5388..dd8442c 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/zgrep-signal.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/zgrep-signal.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/gzip/znew-k.sh b/src/dependencies/zstd-1.5.4/tests/gzip/znew-k.sh similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/gzip/znew-k.sh rename to src/dependencies/zstd-1.5.4/tests/gzip/znew-k.sh index 6c239e2..5cf99ed 100644 --- a/src/dependencies/zstd-1.5.0/tests/gzip/znew-k.sh +++ b/src/dependencies/zstd-1.5.4/tests/gzip/znew-k.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # limit so don't run it by default. . "${srcdir=.}/init.sh"; path_prepend_ . diff --git a/src/dependencies/zstd-1.5.0/tests/invalidDictionaries.c b/src/dependencies/zstd-1.5.4/tests/invalidDictionaries.c similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/invalidDictionaries.c rename to src/dependencies/zstd-1.5.4/tests/invalidDictionaries.c index b71f741..66caa9e 100644 --- a/src/dependencies/zstd-1.5.0/tests/invalidDictionaries.c +++ b/src/dependencies/zstd-1.5.4/tests/invalidDictionaries.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/legacy.c b/src/dependencies/zstd-1.5.4/tests/legacy.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/legacy.c rename to src/dependencies/zstd-1.5.4/tests/legacy.c index ac4938f..3be3864 100644 --- a/src/dependencies/zstd-1.5.0/tests/legacy.c +++ b/src/dependencies/zstd-1.5.4/tests/legacy.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/libzstd_partial_builds.sh b/src/dependencies/zstd-1.5.4/tests/libzstd_builds.sh similarity index 92% rename from src/dependencies/zstd-1.5.0/tests/libzstd_partial_builds.sh rename to src/dependencies/zstd-1.5.4/tests/libzstd_builds.sh index 05dad8f..f9e1e76 100755 --- a/src/dependencies/zstd-1.5.0/tests/libzstd_partial_builds.sh +++ b/src/dependencies/zstd-1.5.4/tests/libzstd_builds.sh @@ -23,14 +23,19 @@ mustBeAbsent() { # default compilation : all features enabled - no zbuff $ECHO "testing default library compilation" -CFLAGS= make -C $DIR/../lib libzstd.a > $INTOVOID +CFLAGS= make -C $DIR/../lib libzstd libzstd.a > $INTOVOID nm $DIR/../lib/libzstd.a | $GREP "\.o" > tmplog isPresent "zstd_compress.o" isPresent "zstd_decompress.o" isPresent "zdict.o" isPresent "zstd_v07.o" mustBeAbsent "zbuff_compress.o" -$RM $DIR/../lib/libzstd.a tmplog +$RM tmplog + +# Check that the exec-stack bit isn't set +readelf -lW $DIR/../lib/libzstd.so | $GREP "GNU_STACK" > tmplog +mustBeAbsent "RWE" +$RM $DIR/../lib/libzstd.a $DIR/../lib/libzstd.so* tmplog # compression disabled => also disable zdict $ECHO "testing with compression disabled" diff --git a/src/dependencies/zstd-1.5.0/tests/longmatch.c b/src/dependencies/zstd-1.5.4/tests/longmatch.c similarity index 77% rename from src/dependencies/zstd-1.5.0/tests/longmatch.c rename to src/dependencies/zstd-1.5.4/tests/longmatch.c index a171c0e..547b261 100644 --- a/src/dependencies/zstd-1.5.0/tests/longmatch.c +++ b/src/dependencies/zstd-1.5.4/tests/longmatch.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -36,27 +36,27 @@ compress(ZSTD_CStream *ctx, ZSTD_outBuffer out, const void *data, size_t size) int main(int argc, const char** argv) { ZSTD_CStream* ctx; - ZSTD_parameters params; - size_t rc; - unsigned windowLog; + unsigned windowLog = 18; (void)argc; (void)argv; /* Create stream */ - ctx = ZSTD_createCStream(); + ctx = ZSTD_createCCtx(); if (!ctx) { return 1; } /* Set parameters */ - memset(¶ms, 0, sizeof(params)); - params.cParams.windowLog = 18; - params.cParams.chainLog = 13; - params.cParams.hashLog = 14; - params.cParams.searchLog = 1; - params.cParams.minMatch = 7; - params.cParams.targetLength = 16; - params.cParams.strategy = ZSTD_fast; - windowLog = params.cParams.windowLog; - /* Initialize stream */ - rc = ZSTD_initCStream_advanced(ctx, NULL, 0, params, 0); - if (ZSTD_isError(rc)) { return 2; } + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_windowLog, windowLog))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_chainLog, 13))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_hashLog, 14))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_searchLog, 1))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_minMatch, 7))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_targetLength, 16))) + return 2; + if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_strategy, ZSTD_fast))) + return 2; { U64 compressed = 0; const U64 toCompress = ((U64)1) << 33; @@ -97,5 +97,6 @@ int main(int argc, const char** argv) free(srcBuffer); free(dstBuffer); } + ZSTD_freeCCtx(ctx); return 0; } diff --git a/src/dependencies/zstd-1.5.0/tests/paramgrill.c b/src/dependencies/zstd-1.5.4/tests/paramgrill.c similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/paramgrill.c rename to src/dependencies/zstd-1.5.4/tests/paramgrill.c index a0cfa58..8971c65 100644 --- a/src/dependencies/zstd-1.5.0/tests/paramgrill.c +++ b/src/dependencies/zstd-1.5.4/tests/paramgrill.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -555,7 +555,7 @@ static int feasible(const BMK_benchResult_t results, const constraint_t target) } /* hill climbing value for part 1 */ -/* Scoring here is a linear reward for all set constraints normalized between 0 to 1 +/* Scoring here is a linear reward for all set constraints normalized between 0 and 1 * (with 0 at 0 and 1 being fully fulfilling the constraint), summed with a logarithmic * bonus to exceeding the constraint value. We also give linear ratio for compression ratio. * The constant factors are experimental. @@ -566,10 +566,10 @@ resultScore(const BMK_benchResult_t res, const size_t srcSize, const constraint_ double cs = 0., ds = 0., rt, cm = 0.; const double r1 = 1, r2 = 0.1, rtr = 0.5; double ret; - if(target.cSpeed) { cs = res.cSpeed / (double)target.cSpeed; } - if(target.dSpeed) { ds = res.dSpeed / (double)target.dSpeed; } - if(target.cMem != (U32)-1) { cm = (double)target.cMem / res.cMem; } - rt = ((double)srcSize / res.cSize); + if(target.cSpeed) { cs = (double)res.cSpeed / (double)target.cSpeed; } + if(target.dSpeed) { ds = (double)res.dSpeed / (double)target.dSpeed; } + if(target.cMem != (U32)-1) { cm = (double)target.cMem / (double)res.cMem; } + rt = ((double)srcSize / (double)res.cSize); ret = (MIN(1, cs) + MIN(1, ds) + MIN(1, cm))*r1 + rt * rtr + (MAX(0, log(cs))+ MAX(0, log(ds))+ MAX(0, log(cm))) * r2; @@ -581,8 +581,8 @@ resultScore(const BMK_benchResult_t res, const size_t srcSize, const constraint_ static double resultDistLvl(const BMK_benchResult_t result1, const BMK_benchResult_t lvlRes) { - double normalizedCSpeedGain1 = ((double)result1.cSpeed / lvlRes.cSpeed) - 1; - double normalizedRatioGain1 = ((double)lvlRes.cSize / result1.cSize) - 1; + double normalizedCSpeedGain1 = ((double)result1.cSpeed / (double)lvlRes.cSpeed) - 1; + double normalizedRatioGain1 = ((double)lvlRes.cSize / (double)result1.cSize) - 1; if(normalizedRatioGain1 < 0 || normalizedCSpeedGain1 < 0) { return 0.0; } @@ -854,7 +854,7 @@ BMK_displayOneResult(FILE* f, winnerInfo_t res, const size_t srcSize) } { double const ratio = res.result.cSize ? - (double)srcSize / res.result.cSize : 0; + (double)srcSize / (double)res.result.cSize : 0; double const cSpeedMBps = (double)res.result.cSpeed / MB_UNIT; double const dSpeedMBps = (double)res.result.dSpeed / MB_UNIT; @@ -937,7 +937,7 @@ BMK_printWinnerOpt(FILE* f, const U32 cLevel, const BMK_benchResult_t result, co } fprintf(f, "================================\n"); fprintf(f, "Level Bounds: R: > %.3f AND C: < %.1f MB/s \n\n", - (double)srcSize / g_lvltarget.cSize, (double)g_lvltarget.cSpeed / MB_UNIT); + (double)srcSize / (double)g_lvltarget.cSize, (double)g_lvltarget.cSpeed / MB_UNIT); fprintf(f, "Overall Winner: \n"); @@ -977,7 +977,7 @@ BMK_print_cLevelEntry(FILE* f, const int cLevel, } /* print comment */ { double const ratio = result.cSize ? - (double)srcSize / result.cSize : 0; + (double)srcSize / (double)result.cSize : 0; double const cSpeedMBps = (double)result.cSpeed / MB_UNIT; double const dSpeedMBps = (double)result.dSpeed / MB_UNIT; @@ -1726,19 +1726,19 @@ static int allBench(BMK_benchResult_t* resultPtr, /* calculate uncertainty in compression / decompression runs */ if (benchres.cSpeed) { - U64 const loopDurationC = (((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.cSpeed); + double const loopDurationC = (double)(((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.cSpeed); uncertaintyConstantC = ((loopDurationC + (double)(2 * g_clockGranularity))/loopDurationC); } if (benchres.dSpeed) { - U64 const loopDurationD = (((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.dSpeed); + double const loopDurationD = (double)(((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.dSpeed); uncertaintyConstantD = ((loopDurationD + (double)(2 * g_clockGranularity))/loopDurationD); } /* optimistic assumption of benchres */ { BMK_benchResult_t resultMax = benchres; - resultMax.cSpeed = (unsigned long long)(resultMax.cSpeed * uncertaintyConstantC * VARIANCE); - resultMax.dSpeed = (unsigned long long)(resultMax.dSpeed * uncertaintyConstantD * VARIANCE); + resultMax.cSpeed = (unsigned long long)((double)resultMax.cSpeed * uncertaintyConstantC * VARIANCE); + resultMax.dSpeed = (unsigned long long)((double)resultMax.dSpeed * uncertaintyConstantD * VARIANCE); /* disregard infeasible results in feas mode */ /* disregard if resultMax < winner in infeas mode */ @@ -1850,8 +1850,8 @@ static int BMK_seed(winnerInfo_t* winners, if ((double)testResult.cSize <= ((double)winners[cLevel].result.cSize * (1. + (0.02 / cLevel))) ) { /* Validate solution is "good enough" */ - double W_ratio = (double)buf.srcSize / testResult.cSize; - double O_ratio = (double)buf.srcSize / winners[cLevel].result.cSize; + double W_ratio = (double)buf.srcSize / (double)testResult.cSize; + double O_ratio = (double)buf.srcSize / (double)winners[cLevel].result.cSize; double W_ratioNote = log (W_ratio); double O_ratioNote = log (O_ratio); size_t W_DMemUsed = (1 << params.vals[wlog_ind]) + (16 KB); @@ -1864,11 +1864,11 @@ static int BMK_seed(winnerInfo_t* winners, double W_CMemUsed_note = W_ratioNote * ( 50 + 13*cLevel) - log((double)W_CMemUsed); double O_CMemUsed_note = O_ratioNote * ( 50 + 13*cLevel) - log((double)O_CMemUsed); - double W_CSpeed_note = W_ratioNote * (double)( 30 + 10*cLevel) + log(testResult.cSpeed); - double O_CSpeed_note = O_ratioNote * (double)( 30 + 10*cLevel) + log(winners[cLevel].result.cSpeed); + double W_CSpeed_note = W_ratioNote * (double)( 30 + 10*cLevel) + log((double)testResult.cSpeed); + double O_CSpeed_note = O_ratioNote * (double)( 30 + 10*cLevel) + log((double)winners[cLevel].result.cSpeed); - double W_DSpeed_note = W_ratioNote * (double)( 20 + 2*cLevel) + log(testResult.dSpeed); - double O_DSpeed_note = O_ratioNote * (double)( 20 + 2*cLevel) + log(winners[cLevel].result.dSpeed); + double W_DSpeed_note = W_ratioNote * (double)( 20 + 2*cLevel) + log((double)testResult.dSpeed); + double O_DSpeed_note = O_ratioNote * (double)( 20 + 2*cLevel) + log((double)winners[cLevel].result.dSpeed); if (W_DMemUsed_note < O_DMemUsed_note) { /* uses too much Decompression memory for too little benefit */ @@ -2652,7 +2652,7 @@ static int usage_advanced(void) (unsigned)g_timeLimit_s, (double)g_timeLimit_s / 3600); DISPLAY( " -v : Prints Benchmarking output\n"); DISPLAY( " -D : Next argument dictionary file\n"); - DISPLAY( " -s : Seperate Files\n"); + DISPLAY( " -s : Separate Files\n"); return 0; } @@ -2707,7 +2707,7 @@ int main(int argc, const char** argv) const char* dictFileName = NULL; U32 main_pause = 0; int cLevelOpt = 0, cLevelRun = 0; - int seperateFiles = 0; + int separateFiles = 0; double compressibility = COMPRESSIBILITY_DEFAULT; U32 memoTableLog = PARAM_UNSET; constraint_t target = { 0, 0, (U32)-1 }; @@ -2895,7 +2895,7 @@ int main(int argc, const char** argv) case 's': argument++; - seperateFiles = 1; + separateFiles = 1; break; case 'q': @@ -2940,7 +2940,7 @@ int main(int argc, const char** argv) result = benchSample(compressibility, cLevelRun); } } else { - if(seperateFiles) { + if(separateFiles) { for(i = 0; i < argc - filenamesStart; i++) { if (g_optimizer) { result = optimizeForSize(argv+filenamesStart + i, 1, dictFileName, target, paramTarget, cLevelOpt, cLevelRun, memoTableLog); diff --git a/src/dependencies/zstd-1.5.0/tests/playTests.sh b/src/dependencies/zstd-1.5.4/tests/playTests.sh similarity index 86% rename from src/dependencies/zstd-1.5.0/tests/playTests.sh rename to src/dependencies/zstd-1.5.4/tests/playTests.sh index fa748c0..5f595f6 100755 --- a/src/dependencies/zstd-1.5.0/tests/playTests.sh +++ b/src/dependencies/zstd-1.5.4/tests/playTests.sh @@ -2,6 +2,10 @@ set -e +unset ZSTD_CLEVEL +unset ZSTD_NBTHREADS + + die() { println "$@" 1>&2 exit 1 @@ -88,7 +92,6 @@ SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) PRGDIR="$SCRIPT_DIR/../programs" TESTDIR="$SCRIPT_DIR/../tests" UNAME=$(uname) -ZSTDGREP="$PRGDIR/zstdgrep" detectedTerminal=false if [ -t 0 ] && [ -t 1 ] @@ -124,6 +127,13 @@ case "$UNAME" in Darwin | FreeBSD | OpenBSD | NetBSD) MTIME="stat -f %m" ;; esac +assertSameMTime() { + MT1=$($MTIME "$1") + MT2=$($MTIME "$2") + echo MTIME $MT1 $MT2 + [ "$MT1" = "$MT2" ] || die "mtime on $1 doesn't match mtime on $2 ($MT1 != $MT2)" +} + GET_PERMS="stat -c %a" case "$UNAME" in Darwin | FreeBSD | OpenBSD | NetBSD) GET_PERMS="stat -f %Lp" ;; @@ -159,10 +169,11 @@ if [ -z "${DATAGEN_BIN}" ]; then DATAGEN_BIN="$TESTDIR/datagen" fi -ZSTD_BIN="$EXE_PREFIX$ZSTD_BIN" +# Why was this line here ? Generates a strange ZSTD_BIN when EXE_PREFIX is non empty +# ZSTD_BIN="$EXE_PREFIX$ZSTD_BIN" # assertions -[ -n "$ZSTD_BIN" ] || die "zstd not found at $ZSTD_BIN! \n Please define ZSTD_BIN pointing to the zstd binary. You might also consider rebuilding zstd follwing the instructions in README.md" +[ -n "$ZSTD_BIN" ] || die "zstd not found at $ZSTD_BIN! \n Please define ZSTD_BIN pointing to the zstd binary. You might also consider rebuilding zstd following the instructions in README.md" [ -n "$DATAGEN_BIN" ] || die "datagen not found at $DATAGEN_BIN! \n Please define DATAGEN_BIN pointing to the datagen binary. You might also consider rebuilding zstd tests following the instructions in README.md. " println "\nStarting playTests.sh isWindows=$isWindows EXE_PREFIX='$EXE_PREFIX' ZSTD_BIN='$ZSTD_BIN' DATAGEN_BIN='$DATAGEN_BIN'" @@ -174,12 +185,19 @@ else fi +zstd -vvV println "\n===> simple tests " datagen > tmp +zstd -h +zstd -H +zstd -V println "test : basic compression " zstd -f tmp # trivial compression case, creates tmp.zst +zstd -f -z tmp +zstd -f -k tmp +zstd -f -C tmp println "test : basic decompression" zstd -df tmp.zst # trivial decompression case (overwrites tmp) println "test : too large compression level => auto-fix" @@ -194,6 +212,7 @@ zstd -c --fast=0 tmp > $INTOVOID && die "--fast must not accept value 0" println "test : too large numeric argument" zstd --fast=9999999999 -f tmp && die "should have refused numeric value" println "test : set compression level with environment variable ZSTD_CLEVEL" + ZSTD_CLEVEL=12 zstd -f tmp # positive compression level ZSTD_CLEVEL=-12 zstd -f tmp # negative compression level ZSTD_CLEVEL=+12 zstd -f tmp # valid: verbose '+' sign @@ -205,6 +224,11 @@ ZSTD_CLEVEL=3a7 zstd -f tmp # malformed env var, warn and revert to default sett ZSTD_CLEVEL=50000000000 zstd -f tmp # numeric value too large, warn and revert to default setting println "test : override ZSTD_CLEVEL with command line option" ZSTD_CLEVEL=12 zstd --fast=3 -f tmp # overridden by command line option + +# temporary envvar changes in the above tests would actually persist in macos /bin/sh +unset ZSTD_CLEVEL + + println "test : compress to stdout" zstd tmp -c > tmpCompressed zstd tmp --stdout > tmpCompressed # long command format @@ -244,10 +268,13 @@ zstd -dc - < tmp.zst > $INTOVOID zstd -d < tmp.zst > $INTOVOID # implicit stdout when stdin is used zstd -d - < tmp.zst > $INTOVOID println "test : impose memory limitation (must fail)" -zstd -d -f tmp.zst -M2K -c > $INTOVOID && die "decompression needs more memory than allowed" -zstd -d -f tmp.zst --memlimit=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command -zstd -d -f tmp.zst --memory=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command -zstd -d -f tmp.zst --memlimit-decompress=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +datagen -g500K > tmplimit +zstd -f tmplimit +zstd -d -f tmplimit.zst -M2K -c > $INTOVOID && die "decompression needs more memory than allowed" +zstd -d -f tmplimit.zst --memlimit=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +zstd -d -f tmplimit.zst --memory=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +zstd -d -f tmplimit.zst --memlimit-decompress=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +rm -f tmplimit tmplimit.zst println "test : overwrite protection" zstd -q tmp && die "overwrite check failed!" println "test : force overwrite" @@ -263,6 +290,10 @@ zstd -q -f tmpro println "test: --no-progress flag" zstd tmpro -c --no-progress | zstd -d -f -o "$INTOVOID" --no-progress zstd tmpro -cv --no-progress | zstd -dv -f -o "$INTOVOID" --no-progress +println "test: --progress flag" +zstd tmpro -c | zstd -d -f -o "$INTOVOID" --progress 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes" +zstd tmpro -c | zstd -d -f -q -o "$INTOVOID" --progress 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes" +zstd tmpro -c | zstd -d -f -v -o "$INTOVOID" 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes" rm -f tmpro tmpro.zst println "test: overwrite input file (must fail)" zstd tmp -fo tmp && die "zstd compression overwrote the input file" @@ -286,16 +317,12 @@ zstd -d -f tmp_corrupt.zst --no-check zstd -d -f tmp_corrupt.zst --check --no-check # final flag overrides zstd -d -f tmp.zst --no-check -println "\n===> zstdgrep tests" -ln -sf "$ZSTD_BIN" zstdcat -rm -f tmp_grep -echo "1234" > tmp_grep -zstd -f tmp_grep -lines=$(ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep tmp_grep.zst | wc -l) -test 2 -eq $lines -ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst && die "Should have failed" -ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst | grep "No such file or directory" || true -rm -f tmp_grep* +if [ "$isWindows" = false ] && [ "$UNAME" != "AIX" ]; then + if [ -n "$(which readelf)" ]; then + println "test: check if binary has executable stack (#2963)" + readelf -lW "$ZSTD_BIN" | grep 'GNU_STACK .* RW ' || die "zstd binary has executable stack!" + fi +fi println "\n===> --exclude-compressed flag" rm -rf precompressedFilterTestDir @@ -325,6 +352,7 @@ zstd --long --rm -r precompressedFilterTestDir # Files should get compressed again without the --exclude-compressed flag. test -f precompressedFilterTestDir/input.5.zst.zst test -f precompressedFilterTestDir/input.6.zst.zst +rm -rf precompressedFilterTestDir println "Test completed" @@ -338,8 +366,8 @@ zstd < tmpPrompt -o tmpPrompt.zst -f # should successfully overwrite with -f zstd -q -d -f tmpPrompt.zst -o tmpPromptRegenerated $DIFF tmpPromptRegenerated tmpPrompt # the first 'y' character should not be swallowed -echo 'yes' | zstd tmpPrompt -o tmpPrompt.zst # accept piped "y" input to force overwrite when using files -echo 'yes' | zstd < tmpPrompt -o tmpPrompt.zst && die "should have aborted immediately and failed to overwrite" +echo 'yes' | zstd tmpPrompt -v -o tmpPrompt.zst # accept piped "y" input to force overwrite when using files +echo 'yes' | zstd < tmpPrompt -v -o tmpPrompt.zst && die "should have aborted immediately and failed to overwrite" zstd tmpPrompt - < tmpPrompt -o tmpPromp.zst --rm && die "should have aborted immediately and failed to remove" println "Test completed" @@ -349,18 +377,45 @@ println "\n===> recursive mode test " # combination of -r with empty list of input file zstd -c -r < tmp > tmp.zst +# combination of -r with empty folder +mkdir -p tmpEmptyDir +zstd -r tmpEmptyDir +rm -rf tmpEmptyDir + println "\n===> file removal" zstd -f --rm tmp test ! -f tmp # tmp should no longer be present zstd -f -d --rm tmp.zst -test ! -f tmp.zst # tmp.zst should no longer be present +test ! -f tmp.zst # tmp.zst should no longer be present +println "test: --rm is disabled when output is stdout" +test -f tmp +zstd --rm tmp -c > $INTOVOID +test -f tmp # tmp shall still be there +zstd -f --rm tmp -c > $INTOVOID +test -f tmp # tmp shall still be there +zstd -f tmp -c > $INTOVOID --rm +test -f tmp # tmp shall still be there +println "test: --rm is disabled when multiple inputs are concatenated into a single output" +cp tmp tmp2 +zstd --rm tmp tmp2 -c > $INTOVOID +test -f tmp +test -f tmp2 +rm -f tmp3.zst +echo 'y' | zstd -v tmp tmp2 -o tmp3.zst --rm # prompt for confirmation +test -f tmp +test -f tmp2 +zstd -f tmp tmp2 -o tmp3.zst --rm # just warns, no prompt +test -f tmp +test -f tmp2 +zstd -q tmp tmp2 -o tmp3.zst --rm && die "should refuse to concatenate" + println "test : should quietly not remove non-regular file" println hello > tmp zstd tmp -f -o "$DEVDEVICE" 2>tmplog > "$INTOVOID" -grep -v "Refusing to remove non-regular file" tmplog +grep "Refusing to remove non-regular file" tmplog && die rm -f tmplog -zstd tmp -f -o "$INTOVOID" 2>&1 | grep -v "Refusing to remove non-regular file" +zstd tmp -f -o "$INTOVOID" 2>&1 | grep "Refusing to remove non-regular file" && die println "test : --rm on stdin" println a | zstd --rm > $INTOVOID # --rm should remain silent rm -f tmp @@ -385,44 +440,46 @@ println "\n===> decompression only tests " dd bs=1048576 count=1 if=/dev/zero of=tmp zstd -d -o tmp1 "$TESTDIR/golden-decompression/rle-first-block.zst" $DIFF -s tmp1 tmp -rm -f tmp* +touch tmp_empty +zstd -d -o tmp2 "$TESTDIR/golden-decompression/empty-block.zst" +$DIFF -s tmp2 tmp_empty +rm -f tmp* println "\n===> compress multiple files" println hello > tmp1 println world > tmp2 zstd tmp1 tmp2 -o "$INTOVOID" -f zstd tmp1 tmp2 -c | zstd -t -zstd tmp1 tmp2 -o tmp.zst +echo 'y' | zstd -v tmp1 tmp2 -o tmp.zst test ! -f tmp1.zst test ! -f tmp2.zst zstd tmp1 tmp2 zstd -t tmp1.zst tmp2.zst zstd -dc tmp1.zst tmp2.zst zstd tmp1.zst tmp2.zst -o "$INTOVOID" -f -zstd -d tmp1.zst tmp2.zst -o tmp +echo 'y' | zstd -v -d tmp1.zst tmp2.zst -o tmp touch tmpexists zstd tmp1 tmp2 -f -o tmpexists zstd tmp1 tmp2 -q -o tmpexists && die "should have refused to overwrite" println gooder > tmp_rm1 println boi > tmp_rm2 println worldly > tmp_rm3 -echo 'y' | zstd tmp_rm1 tmp_rm2 -o tmp_rm3.zst --rm # tests the warning prompt for --rm with multiple inputs into once source -test ! -f tmp_rm1 -test ! -f tmp_rm2 +echo 'y' | zstd -v tmp_rm1 tmp_rm2 -v -o tmp_rm3.zst +test -f tmp_rm1 +test -f tmp_rm2 cp tmp_rm3.zst tmp_rm4.zst -echo 'Y' | zstd -d tmp_rm3.zst tmp_rm4.zst -o tmp_rm_out --rm -test ! -f tmp_rm3.zst -test ! -f tmp_rm4.zst -echo 'yes' | zstd tmp_rm_out tmp_rm3 -c --rm && die "compressing multiple files to stdout with --rm should fail unless -f is specified" -echo 'yes' | zstd tmp_rm_out tmp_rm3 -c --rm -v && die "compressing multiple files to stdout with --rm should fail unless -f is specified" +echo 'Y' | zstd -v -d tmp_rm3.zst tmp_rm4.zst -v -o tmp_rm_out --rm +test -f tmp_rm3.zst +test -f tmp_rm4.zst println gooder > tmpexists1 zstd tmpexists1 tmpexists -c --rm -f > $INTOVOID - # Bug: PR #972 if [ "$?" -eq 139 ]; then die "should not have segfaulted" fi +test -f tmpexists1 +test -f tmpexists println "\n===> multiple files and shell completion " datagen -s1 > tmp1 2> $INTOVOID datagen -s2 -g100K > tmp2 2> $INTOVOID @@ -526,19 +583,9 @@ if [ "$isWindows" = false ] ; then zstd -f -d tmp1.zst -o tmp1.out assertFilePermissions tmp1.out 400 - rm -f tmp1.zst tmp1.out - umask 0666 chmod 0666 tmp1 tmp2 - println "test : respect umask when copying permissions in file -> file compression " - zstd -f tmp1 -o tmp1.zst - assertFilePermissions tmp1.zst 0 - println "test : respect umask when copying permissions in file -> file decompression " - chmod 0666 tmp1.zst - zstd -f -d tmp1.zst -o tmp1.out - assertFilePermissions tmp1.out 0 - rm -f tmp1.zst tmp1.out println "test : respect umask when compressing from stdin input " @@ -583,6 +630,17 @@ if [ -n "$READFROMBLOCKDEVICE" ] ; then rm -f tmp.img tmp.img.zst tmp.img.copy fi +println "\n===> zstd created file timestamp tests" +datagen > tmp +touch -m -t 200001010000.00 tmp +println "test : copy mtime in file -> file compression " +zstd -f tmp -o tmp.zst +assertSameMTime tmp tmp.zst +println "test : copy mtime in file -> file decompression " +zstd -f -d tmp.zst -o tmp.out +assertSameMTime tmp.zst tmp.out +rm -f tmp + println "\n===> compress multiple files into an output directory, --output-dir-flat" println henlo > tmp1 mkdir tmpInputTestDir @@ -689,9 +747,13 @@ test -f tmp2 test -f tmp3 test -f tmp4 +println "test : survive the list of files with too long filenames (--filelist=FILE)" +datagen -g5M > tmp_badList +zstd -qq -f --filelist=tmp_badList && die "should have failed : file name length is too long" # printing very long text garbage on console will cause CI failure + println "test : survive a list of files which is text garbage (--filelist=FILE)" datagen > tmp_badList -zstd -f --filelist=tmp_badList && die "should have failed : list is text garbage" +zstd -qq -f --filelist=tmp_badList && die "should have failed : list is text garbage" # printing very long text garbage on console will cause CI failure println "test : survive a list of files which is binary garbage (--filelist=FILE)" datagen -P0 -g1M > tmp_badList @@ -719,6 +781,7 @@ rm -rf tmp* println "test : show-default-cparams regular" datagen > tmp zstd --show-default-cparams -f tmp +zstd --show-default-cparams -d tmp.zst && die "error: can't use --show-default-cparams in decompression mode" rm -rf tmp* println "test : show-default-cparams recursive" @@ -729,6 +792,13 @@ datagen -g257000 > tmp_files/tmp3 zstd --show-default-cparams -f -r tmp_files rm -rf tmp* +println "test : show compression parameters in verbose mode" +datagen > tmp +zstd -vv tmp 2>&1 | \ +grep -q -E -- "--zstd=wlog=[[:digit:]]+,clog=[[:digit:]]+,hlog=[[:digit:]]+,\ +slog=[[:digit:]]+,mml=[[:digit:]]+,tlen=[[:digit:]]+,strat=[[:digit:]]+" +rm -rf tmp* + println "\n===> Advanced compression parameters " println "Hello world!" | zstd --zstd=windowLog=21, - -o tmp.zst && die "wrong parameters not detected!" println "Hello world!" | zstd --zstd=windowLo=21 - -o tmp.zst && die "wrong parameters not detected!" @@ -749,6 +819,16 @@ println "Hello world 1!" | zstd -df println "Hello world 2!" | zstd -dcf println "Hello world 3!" > tmp1 zstd -dcf tmp1 +println "" | zstd -df > tmp1 +println "" > tmp2 +$DIFF -q tmp1 tmp2 +println "1" | zstd -df > tmp1 +println "1" > tmp2 +$DIFF -q tmp1 tmp2 +println "12" | zstd -df > tmp1 +println "12" > tmp2 +$DIFF -q tmp1 tmp2 +rm -rf tmp* println "\n===> frame concatenation " @@ -757,6 +837,9 @@ println "world!" > world.tmp cat hello.tmp world.tmp > helloworld.tmp zstd -c hello.tmp > hello.zst zstd -c world.tmp > world.zst +zstd -c hello.tmp world.tmp > helloworld.zst +zstd -dc helloworld.zst > result.tmp +$DIFF helloworld.tmp result.tmp cat hello.zst world.zst > helloworld.zst zstd -dc helloworld.zst > result.tmp cat result.tmp @@ -787,7 +870,7 @@ rm -f ./*.tmp ./*.zstd println "frame concatenation tests completed" -if [ "$isWindows" = false ] && [ "$UNAME" != 'SunOS' ] && [ "$UNAME" != "OpenBSD" ] ; then +if [ "$isWindows" = false ] && [ "$UNAME" != 'SunOS' ] && [ "$UNAME" != "OpenBSD" ] && [ "$UNAME" != "AIX" ]; then println "\n**** flush write error test **** " println "println foo | zstd > /dev/full" @@ -909,11 +992,23 @@ cat tmp | zstd -14 -f --size-hint=11050 | zstd -t # slightly too high cat tmp | zstd -14 -f --size-hint=10950 | zstd -t # slightly too low cat tmp | zstd -14 -f --size-hint=22000 | zstd -t # considerably too high cat tmp | zstd -14 -f --size-hint=5500 | zstd -t # considerably too low +println "test : allows and interprets K,KB,KiB,M,MB and MiB suffix" +cat tmp | zstd -14 -f --size-hint=11K | zstd -t +cat tmp | zstd -14 -f --size-hint=11KB | zstd -t +cat tmp | zstd -14 -f --size-hint=11KiB | zstd -t +cat tmp | zstd -14 -f --size-hint=1M | zstd -t +cat tmp | zstd -14 -f --size-hint=1MB | zstd -t +cat tmp | zstd -14 -f --size-hint=1MiB | zstd -t println "\n===> dictionary tests " - -println "- test with raw dict (content only) " +println "- Test high/low compressibility corpus training" +datagen -g12M -P90 > tmpCorpusHighCompress +datagen -g12M -P5 > tmpCorpusLowCompress +zstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress +zstd --train -B2K tmpCorpusLowCompress -o tmpDictLowCompress +rm -f tmpCorpusHighCompress tmpCorpusLowCompress tmpDictHighCompress tmpDictLowCompress +println "- Test with raw dict (content only) " datagen > tmpDict datagen -g1M | $MD5SUM > tmp1 datagen -g1M | zstd -D tmpDict | zstd -D tmpDict -dvq | $MD5SUM > tmp2 @@ -934,6 +1029,11 @@ println "- Dictionary compression with btlazy2 strategy" zstd -f tmp -D tmpDict --zstd=strategy=6 zstd -d tmp.zst -D tmpDict -fo result $DIFF "$TESTFILE" result +if [ -e /proc/self/fd/0 ]; then + println "- Test rejecting irregular dictionary file" + cat tmpDict | zstd -f tmp -D /proc/self/fd/0 && die "Piped dictionary should fail!" + cat tmpDict | zstd -d tmp.zst -D /proc/self/fd/0 -f && die "Piped dictionary should fail!" +fi if [ -n "$hasMT" ] then println "- Test dictionary compression with multithreading " @@ -982,17 +1082,20 @@ zstd -o tmpDict --train "$TESTDIR"/*.c "$PRGDIR"/*.c test -f tmpDict zstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c test -f dictionary -println "- Test dictionary training fails" -echo "000000000000000000000000000000000" > tmpz -zstd --train tmpz tmpz tmpz tmpz tmpz tmpz tmpz tmpz tmpz && die "Dictionary training should fail : source is all zeros" if [ -n "$hasMT" ] then - zstd --train -T0 tmpz tmpz tmpz tmpz tmpz tmpz tmpz tmpz tmpz && die "Dictionary training should fail : source is all zeros" println "- Create dictionary with multithreading enabled" zstd --train -T0 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict fi rm -f tmp* dictionary +println "- Test --memory for dictionary compression" +datagen -g12M -P90 > tmpCorpusHighCompress +zstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress --memory=10K && die "Dictionary training should fail : --memory too low (10K)" +zstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress --memory=5MB 2> zstTrainWithMemLimitStdErr +cat zstTrainWithMemLimitStdErr | grep "setting manual memory limit for dictionary training data at 5 MB" +cat zstTrainWithMemLimitStdErr | grep "Training samples set too large (12 MB); training on 5 MB only..." +rm zstTrainWithMemLimitStdErr println "\n===> fastCover dictionary builder : advanced options " TESTFILE="$PRGDIR"/zstdcli.c @@ -1014,6 +1117,7 @@ println "- Create dictionaries with shrink-dict flag enabled" zstd --train-fastcover=steps=1,shrink "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict zstd --train-fastcover=steps=1,shrink=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict1 zstd --train-fastcover=steps=1,shrink=5 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict2 +zstd --train-fastcover=shrink=5,steps=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict3 println "- Create dictionary with size limit" zstd --train-fastcover=steps=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict2 --maxdict=4K println "- Create dictionary using all samples for both training and testing" @@ -1083,6 +1187,10 @@ zstd -t tmp3 && die "bad file not detected !" # detects 0-sized files as bad println "test --rm and --test combined " zstd -t --rm tmp1.zst test -f tmp1.zst # check file is still present +cp tmp1.zst tmp2.zst +zstd -t tmp1.zst tmp2.zst --rm +test -f tmp1.zst # check file is still present +test -f tmp2.zst # check file is still present split -b16384 tmp1.zst tmpSplit. zstd -t tmpSplit.* && die "bad file not detected !" datagen | zstd -c | zstd -t @@ -1109,7 +1217,15 @@ zstd -rqi0b1e2 tmp1 println "benchmark decompression only" zstd -f tmp1 zstd -b -d -i0 tmp1.zst +println "benchmark can fail - decompression on invalid data" +zstd -b -d -i0 tmp1 && die "invalid .zst data => benchmark should have failed" +GZIPMODE=1 +zstd --format=gzip -V || GZIPMODE=0 +if [ $GZIPMODE -eq 1 ]; then + println "benchmark mode is only compatible with zstd" + zstd --format=gzip -b tmp1 && die "-b should be incompatible with gzip format!" +fi println "\n===> zstd compatibility tests " @@ -1285,7 +1401,7 @@ println "\n===> tar extension tests " rm -f tmp tmp.tar tmp.tzst tmp.tgz tmp.txz tmp.tlz4 tmp1.zstd datagen > tmp -tar cf tmp.tar tmp +tar -cf tmp.tar tmp zstd tmp.tar -o tmp.tzst rm -f tmp.tar zstd -d tmp.tzst @@ -1293,21 +1409,21 @@ zstd -d tmp.tzst rm -f tmp.tar tmp.tzst if [ $GZIPMODE -eq 1 ]; then - tar czf tmp.tgz tmp + tar -f - -c tmp | gzip > tmp.tgz zstd -d tmp.tgz [ -e tmp.tar ] || die ".tgz failed to decompress to .tar!" rm -f tmp.tar tmp.tgz fi if [ $LZMAMODE -eq 1 ]; then - tar c tmp | zstd --format=xz > tmp.txz + tar -f - -c tmp | zstd --format=xz > tmp.txz zstd -d tmp.txz [ -e tmp.tar ] || die ".txz failed to decompress to .tar!" rm -f tmp.tar tmp.txz fi if [ $LZ4MODE -eq 1 ]; then - tar c tmp | zstd --format=lz4 > tmp.tlz4 + tar -f - -c tmp | zstd --format=lz4 > tmp.tlz4 zstd -d tmp.tlz4 [ -e tmp.tar ] || die ".tlz4 failed to decompress to .tar!" rm -f tmp.tar tmp.tlz4 @@ -1347,6 +1463,8 @@ if [ -n "$hasMT" ] then println "\n===> zstdmt round-trip tests " roundTripTest -g4M "1 -T0" + roundTripTest -g4M "1 -T0 --auto-threads=physical" + roundTripTest -g4M "1 -T0 --auto-threads=logical" roundTripTest -g8M "3 -T2" roundTripTest -g8M "19 --long" roundTripTest -g8000K "2 --threads=2" @@ -1366,6 +1484,8 @@ then ZSTD_NBTHREADS=50000000000 zstd -f mt_tmp # numeric value too large, warn and revert to default setting= ZSTD_NBTHREADS=2 zstd -f mt_tmp # correct usage ZSTD_NBTHREADS=1 zstd -f mt_tmp # correct usage: single thread + # temporary envvar changes in the above tests would actually persist in macos /bin/sh + unset ZSTD_NBTHREADS rm -f mt_tmp* println "\n===> ovLog tests " @@ -1441,7 +1561,7 @@ datagen -g0 > tmp5 zstd tmp5 zstd -l tmp5.zst zstd -l tmp5* && die "-l must fail on non-zstd file" -zstd -lv tmp5.zst | grep "Decompressed Size: 0.00 KB (0 B)" # check that 0 size is present in header +zstd -lv tmp5.zst | grep "Decompressed Size: 0 B (0 B)" # check that 0 size is present in header zstd -lv tmp5* && die "-l must fail on non-zstd file" println "\n===> zstd --list/-l test with no content size field " @@ -1500,6 +1620,44 @@ elif [ "$longCSize19wlog23" -gt "$optCSize19wlog23" ]; then exit 1 fi +println "\n===> zstd asyncio tests " + +addFrame() { + datagen -g2M -s$2 >> tmp_uncompressed + datagen -g2M -s$2 | zstd -1 --format=$1 >> tmp_compressed.zst +} + +addTwoFrames() { + addFrame $1 1 + addFrame $1 2 +} + +testAsyncIO() { + roundTripTest -g2M "3 --asyncio --format=$1" + roundTripTest -g2M "3 --no-asyncio --format=$1" +} + +rm -f tmp_compressed tmp_uncompressed +testAsyncIO zstd +addTwoFrames zstd +if [ $GZIPMODE -eq 1 ]; then + testAsyncIO gzip + addTwoFrames gzip +fi +if [ $LZMAMODE -eq 1 ]; then + testAsyncIO lzma + addTwoFrames lzma +fi +if [ $LZ4MODE -eq 1 ]; then + testAsyncIO lz4 + addTwoFrames lz4 +fi +cat tmp_uncompressed | $MD5SUM > tmp2 +zstd -d tmp_compressed.zst --asyncio -c | $MD5SUM > tmp1 +$DIFF -q tmp1 tmp2 +rm tmp1 +zstd -d tmp_compressed.zst --no-asyncio -c | $MD5SUM > tmp1 +$DIFF -q tmp1 tmp2 if [ "$1" != "--test-large-data" ]; then println "Skipping large data tests" @@ -1515,8 +1673,10 @@ then println "\n===> adaptive mode " roundTripTest -g270000000 " --adapt" roundTripTest -g27000000 " --adapt=min=1,max=4" + roundTripTest -g27000000 " --adapt=min=-2,max=-1" println "===> test: --adapt must fail on incoherent bounds " datagen > tmp + zstd --adapt= tmp && die "invalid compression parameter" zstd -f -vv --adapt=min=10,max=9 tmp && die "--adapt must fail on incoherent bounds" println "\n===> rsyncable mode " @@ -1635,6 +1795,7 @@ println "- Create first dictionary" zstd --train-cover=k=46,d=8,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict cp "$TESTFILE" tmp zstd -f tmp -D tmpDict +zstd -f tmp -D tmpDict --patch-from=tmpDict && die "error: can't use -D and --patch-from=#at the same time" zstd -d tmp.zst -D tmpDict -fo result $DIFF "$TESTFILE" result zstd --train-cover=k=56,d=8 && die "Create dictionary without input file (should error)" @@ -1645,6 +1806,7 @@ println "- Create dictionary using shrink-dict flag" zstd --train-cover=steps=256,shrink "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict zstd --train-cover=steps=256,shrink=1 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict1 zstd --train-cover=steps=256,shrink=5 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict2 +zstd --train-cover=shrink=5,steps=256 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict3 println "- Create dictionary with short dictID" zstd --train-cover=k=46,d=8,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpDict1 cmp tmpDict tmpDict1 && die "dictionaries should have different ID !" diff --git a/src/dependencies/zstd-1.5.0/tests/poolTests.c b/src/dependencies/zstd-1.5.4/tests/poolTests.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/poolTests.c rename to src/dependencies/zstd-1.5.4/tests/poolTests.c index 08f31c0..9e62722 100644 --- a/src/dependencies/zstd-1.5.0/tests/poolTests.c +++ b/src/dependencies/zstd-1.5.4/tests/poolTests.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/rateLimiter.py b/src/dependencies/zstd-1.5.4/tests/rateLimiter.py similarity index 95% rename from src/dependencies/zstd-1.5.0/tests/rateLimiter.py rename to src/dependencies/zstd-1.5.4/tests/rateLimiter.py index 2629372..3e65081 100755 --- a/src/dependencies/zstd-1.5.0/tests/rateLimiter.py +++ b/src/dependencies/zstd-1.5.4/tests/rateLimiter.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/.gitignore b/src/dependencies/zstd-1.5.4/tests/regression/.gitignore similarity index 88% rename from src/dependencies/zstd-1.5.0/tests/regression/.gitignore rename to src/dependencies/zstd-1.5.4/tests/regression/.gitignore index 1b2618f..3da209d 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/.gitignore +++ b/src/dependencies/zstd-1.5.4/tests/regression/.gitignore @@ -1,3 +1,4 @@ # regression test artifacts data-cache +cache test diff --git a/src/dependencies/zstd-1.5.0/tests/regression/Makefile b/src/dependencies/zstd-1.5.4/tests/regression/Makefile similarity index 91% rename from src/dependencies/zstd-1.5.0/tests/regression/Makefile rename to src/dependencies/zstd-1.5.4/tests/regression/Makefile index d0d7bcf..ba8b430 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/Makefile +++ b/src/dependencies/zstd-1.5.4/tests/regression/Makefile @@ -1,5 +1,5 @@ # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -15,7 +15,7 @@ CURL_LDFLAGS := $(shell curl-config --libs) -pthread PROGDIR := ../../programs LIBDIR := ../../lib -ZSTD_CPPFLAGS := -I$(PROGDIR) -I$(LIBDIR) -I$(LIBDIR)/common +ZSTD_CPPFLAGS := -I$(PROGDIR) -I$(LIBDIR) -I$(LIBDIR)/common -Wno-deprecated-declarations REGRESSION_CFLAGS = $(CFLAGS) $(CURL_CFLAGS) REGRESSION_CPPFLAGS = $(CPPFLAGS) $(ZSTD_CPPFLAGS) @@ -46,6 +46,7 @@ result.o: result.c result.h test.o: test.c data.h config.h method.h $(CC) $(REGRESSION_CFLAGS) $(REGRESSION_CPPFLAGS) $< -c -o $@ +.PHONY: libzstd.a libzstd.a: $(MAKE) -C $(LIBDIR) libzstd.a-mt cp $(LIBDIR)/libzstd.a . diff --git a/src/dependencies/zstd-1.5.0/tests/regression/README.md b/src/dependencies/zstd-1.5.4/tests/regression/README.md similarity index 100% rename from src/dependencies/zstd-1.5.0/tests/regression/README.md rename to src/dependencies/zstd-1.5.4/tests/regression/README.md diff --git a/src/dependencies/zstd-1.5.0/tests/regression/config.c b/src/dependencies/zstd-1.5.4/tests/regression/config.c similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/regression/config.c rename to src/dependencies/zstd-1.5.4/tests/regression/config.c index 4c66dd1..1d86fff 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/config.c +++ b/src/dependencies/zstd-1.5.4/tests/regression/config.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -183,7 +183,7 @@ static config_t no_pledged_src_size_with_dict = { }; static param_value_t const ldm_param_values[] = { - {.param = ZSTD_c_enableLongDistanceMatching, .value = 1}, + {.param = ZSTD_c_enableLongDistanceMatching, .value = ZSTD_ps_enable}, }; static config_t ldm = { @@ -204,7 +204,7 @@ static config_t mt = { static param_value_t const mt_ldm_param_values[] = { {.param = ZSTD_c_nbWorkers, .value = 2}, - {.param = ZSTD_c_enableLongDistanceMatching, .value = 1}, + {.param = ZSTD_c_enableLongDistanceMatching, .value = ZSTD_ps_enable}, }; static config_t mt_ldm = { @@ -215,7 +215,7 @@ static config_t mt_ldm = { static param_value_t mt_advanced_param_values[] = { {.param = ZSTD_c_nbWorkers, .value = 2}, - {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_lcm_uncompressed}, + {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable}, }; static config_t mt_advanced = { @@ -258,7 +258,7 @@ static config_t small_clog = { static param_value_t const uncompressed_literals_param_values[] = { {.param = ZSTD_c_compressionLevel, .value = 3}, - {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_lcm_uncompressed}, + {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable}, }; static config_t uncompressed_literals = { @@ -269,7 +269,7 @@ static config_t uncompressed_literals = { static param_value_t const uncompressed_literals_opt_param_values[] = { {.param = ZSTD_c_compressionLevel, .value = 19}, - {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_lcm_uncompressed}, + {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable}, }; static config_t uncompressed_literals_opt = { @@ -280,7 +280,7 @@ static config_t uncompressed_literals_opt = { static param_value_t const huffman_literals_param_values[] = { {.param = ZSTD_c_compressionLevel, .value = -1}, - {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_lcm_huffman}, + {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_enable}, }; static config_t huffman_literals = { diff --git a/src/dependencies/zstd-1.5.0/tests/regression/config.h b/src/dependencies/zstd-1.5.4/tests/regression/config.h similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/regression/config.h rename to src/dependencies/zstd-1.5.4/tests/regression/config.h index dd88937..a4b542a 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/config.h +++ b/src/dependencies/zstd-1.5.4/tests/regression/config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/data.c b/src/dependencies/zstd-1.5.4/tests/regression/data.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/regression/data.c rename to src/dependencies/zstd-1.5.4/tests/regression/data.c index 341b02d..43f085f 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/data.c +++ b/src/dependencies/zstd-1.5.4/tests/regression/data.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/data.h b/src/dependencies/zstd-1.5.4/tests/regression/data.h similarity index 98% rename from src/dependencies/zstd-1.5.0/tests/regression/data.h rename to src/dependencies/zstd-1.5.4/tests/regression/data.h index e54e6a1..a4ee920 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/data.h +++ b/src/dependencies/zstd-1.5.4/tests/regression/data.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/levels.h b/src/dependencies/zstd-1.5.4/tests/regression/levels.h similarity index 75% rename from src/dependencies/zstd-1.5.0/tests/regression/levels.h rename to src/dependencies/zstd-1.5.4/tests/regression/levels.h index 3b211f8..d15b120 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/levels.h +++ b/src/dependencies/zstd-1.5.4/tests/regression/levels.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -35,21 +35,23 @@ LEVEL(1) LEVEL(3) LEVEL(4) /* ROW_LEVEL triggers the row hash (force enabled and disabled) with different - * dictionary strategies, and 16/32 row entries based on the level/searchLog. - * 1 == disabled, 2 == enabled. + * dictionary strategies, and 16/32/64 row entries based on the level/searchLog. + * 1 == enabled, 2 == disabled. */ ROW_LEVEL(5, 1) -ROW_LEVEL(5, 2) +ROW_LEVEL(5, 2) /* 16-entry rows */ LEVEL(5) LEVEL(6) ROW_LEVEL(7, 1) -ROW_LEVEL(7, 2) +ROW_LEVEL(7, 2) /* 16-entry rows */ LEVEL(7) LEVEL(9) +ROW_LEVEL(11, 1) +ROW_LEVEL(11, 2) /* 32-entry rows */ ROW_LEVEL(12, 1) -ROW_LEVEL(12, 2) +ROW_LEVEL(12, 2) /* 64-entry rows */ LEVEL(13) LEVEL(16) diff --git a/src/dependencies/zstd-1.5.0/tests/regression/method.c b/src/dependencies/zstd-1.5.4/tests/regression/method.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/regression/method.c rename to src/dependencies/zstd-1.5.4/tests/regression/method.c index 55b1154..f84a15e 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/method.c +++ b/src/dependencies/zstd-1.5.4/tests/regression/method.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/method.h b/src/dependencies/zstd-1.5.4/tests/regression/method.h similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/regression/method.h rename to src/dependencies/zstd-1.5.4/tests/regression/method.h index 1a36a93..8efdd33 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/method.h +++ b/src/dependencies/zstd-1.5.4/tests/regression/method.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/result.c b/src/dependencies/zstd-1.5.4/tests/regression/result.c similarity index 94% rename from src/dependencies/zstd-1.5.0/tests/regression/result.c rename to src/dependencies/zstd-1.5.4/tests/regression/result.c index 1f879c1..8ccb875 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/result.c +++ b/src/dependencies/zstd-1.5.4/tests/regression/result.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/result.h b/src/dependencies/zstd-1.5.4/tests/regression/result.h similarity index 97% rename from src/dependencies/zstd-1.5.0/tests/regression/result.h rename to src/dependencies/zstd-1.5.4/tests/regression/result.h index 197fa90..8a761ea 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/result.h +++ b/src/dependencies/zstd-1.5.4/tests/regression/result.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/regression/results.csv b/src/dependencies/zstd-1.5.4/tests/regression/results.csv similarity index 67% rename from src/dependencies/zstd-1.5.0/tests/regression/results.csv rename to src/dependencies/zstd-1.5.4/tests/regression/results.csv index b94d550..188eea9 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/results.csv +++ b/src/dependencies/zstd-1.5.4/tests/regression/results.csv @@ -1,74 +1,74 @@ Data, Config, Method, Total compressed size -silesia.tar, level -5, compress simple, 6738593 -silesia.tar, level -3, compress simple, 6446372 -silesia.tar, level -1, compress simple, 6186042 -silesia.tar, level 0, compress simple, 4861425 -silesia.tar, level 1, compress simple, 5334885 -silesia.tar, level 3, compress simple, 4861425 -silesia.tar, level 4, compress simple, 4799630 -silesia.tar, level 5, compress simple, 4719256 -silesia.tar, level 6, compress simple, 4677721 -silesia.tar, level 7, compress simple, 4613541 -silesia.tar, level 9, compress simple, 4555426 -silesia.tar, level 13, compress simple, 4491764 -silesia.tar, level 16, compress simple, 4381332 -silesia.tar, level 19, compress simple, 4281605 -silesia.tar, uncompressed literals, compress simple, 4861425 -silesia.tar, uncompressed literals optimal, compress simple, 4281605 -silesia.tar, huffman literals, compress simple, 6186042 -github.tar, level -5, compress simple, 46856 -github.tar, level -3, compress simple, 43754 -github.tar, level -1, compress simple, 42490 -github.tar, level 0, compress simple, 38441 -github.tar, level 1, compress simple, 39265 -github.tar, level 3, compress simple, 38441 -github.tar, level 4, compress simple, 38467 -github.tar, level 5, compress simple, 39693 -github.tar, level 6, compress simple, 39621 -github.tar, level 7, compress simple, 39213 -github.tar, level 9, compress simple, 36758 -github.tar, level 13, compress simple, 35621 -github.tar, level 16, compress simple, 40255 -github.tar, level 19, compress simple, 32837 -github.tar, uncompressed literals, compress simple, 38441 -github.tar, uncompressed literals optimal, compress simple, 32837 -github.tar, huffman literals, compress simple, 42490 -silesia, level -5, compress cctx, 6737607 -silesia, level -3, compress cctx, 6444677 -silesia, level -1, compress cctx, 6178460 -silesia, level 0, compress cctx, 4849552 -silesia, level 1, compress cctx, 5313204 -silesia, level 3, compress cctx, 4849552 -silesia, level 4, compress cctx, 4786970 -silesia, level 5, compress cctx, 4707794 -silesia, level 6, compress cctx, 4666383 -silesia, level 7, compress cctx, 4603381 -silesia, level 9, compress cctx, 4546001 -silesia, level 13, compress cctx, 4482135 -silesia, level 16, compress cctx, 4377465 -silesia, level 19, compress cctx, 4293330 -silesia, long distance mode, compress cctx, 4849552 -silesia, multithreaded, compress cctx, 4849552 -silesia, multithreaded long distance mode, compress cctx, 4849552 -silesia, small window log, compress cctx, 7084179 -silesia, small hash log, compress cctx, 6555021 -silesia, small chain log, compress cctx, 4931148 -silesia, explicit params, compress cctx, 4794479 -silesia, uncompressed literals, compress cctx, 4849552 -silesia, uncompressed literals optimal, compress cctx, 4293330 -silesia, huffman literals, compress cctx, 6178460 -silesia, multithreaded with advanced params, compress cctx, 4849552 -github, level -5, compress cctx, 205285 -github, level -5 with dict, compress cctx, 47294 -github, level -3, compress cctx, 190643 -github, level -3 with dict, compress cctx, 48047 -github, level -1, compress cctx, 175568 -github, level -1 with dict, compress cctx, 43527 -github, level 0, compress cctx, 136335 +silesia.tar, level -5, compress simple, 6861055 +silesia.tar, level -3, compress simple, 6505483 +silesia.tar, level -1, compress simple, 6179047 +silesia.tar, level 0, compress simple, 4854086 +silesia.tar, level 1, compress simple, 5327717 +silesia.tar, level 3, compress simple, 4854086 +silesia.tar, level 4, compress simple, 4791503 +silesia.tar, level 5, compress simple, 4677740 +silesia.tar, level 6, compress simple, 4613242 +silesia.tar, level 7, compress simple, 4576661 +silesia.tar, level 9, compress simple, 4552899 +silesia.tar, level 13, compress simple, 4502956 +silesia.tar, level 16, compress simple, 4360546 +silesia.tar, level 19, compress simple, 4265911 +silesia.tar, uncompressed literals, compress simple, 4854086 +silesia.tar, uncompressed literals optimal, compress simple, 4265911 +silesia.tar, huffman literals, compress simple, 6179047 +github.tar, level -5, compress simple, 52115 +github.tar, level -3, compress simple, 45678 +github.tar, level -1, compress simple, 42560 +github.tar, level 0, compress simple, 38831 +github.tar, level 1, compress simple, 39200 +github.tar, level 3, compress simple, 38831 +github.tar, level 4, compress simple, 38893 +github.tar, level 5, compress simple, 39651 +github.tar, level 6, compress simple, 39282 +github.tar, level 7, compress simple, 38110 +github.tar, level 9, compress simple, 36760 +github.tar, level 13, compress simple, 35501 +github.tar, level 16, compress simple, 40466 +github.tar, level 19, compress simple, 32276 +github.tar, uncompressed literals, compress simple, 38831 +github.tar, uncompressed literals optimal, compress simple, 32276 +github.tar, huffman literals, compress simple, 42560 +silesia, level -5, compress cctx, 6857372 +silesia, level -3, compress cctx, 6503412 +silesia, level -1, compress cctx, 6172202 +silesia, level 0, compress cctx, 4842075 +silesia, level 1, compress cctx, 5306632 +silesia, level 3, compress cctx, 4842075 +silesia, level 4, compress cctx, 4779186 +silesia, level 5, compress cctx, 4666323 +silesia, level 6, compress cctx, 4603066 +silesia, level 7, compress cctx, 4566984 +silesia, level 9, compress cctx, 4543018 +silesia, level 13, compress cctx, 4493990 +silesia, level 16, compress cctx, 4360041 +silesia, level 19, compress cctx, 4296055 +silesia, long distance mode, compress cctx, 4842075 +silesia, multithreaded, compress cctx, 4842075 +silesia, multithreaded long distance mode, compress cctx, 4842075 +silesia, small window log, compress cctx, 7082951 +silesia, small hash log, compress cctx, 6526141 +silesia, small chain log, compress cctx, 4912197 +silesia, explicit params, compress cctx, 4794052 +silesia, uncompressed literals, compress cctx, 4842075 +silesia, uncompressed literals optimal, compress cctx, 4296055 +silesia, huffman literals, compress cctx, 6172202 +silesia, multithreaded with advanced params, compress cctx, 4842075 +github, level -5, compress cctx, 204407 +github, level -5 with dict, compress cctx, 52059 +github, level -3, compress cctx, 193253 +github, level -3 with dict, compress cctx, 46787 +github, level -1, compress cctx, 175468 +github, level -1 with dict, compress cctx, 43585 +github, level 0, compress cctx, 136332 github, level 0 with dict, compress cctx, 41534 -github, level 1, compress cctx, 142465 -github, level 1 with dict, compress cctx, 42157 -github, level 3, compress cctx, 136335 +github, level 1, compress cctx, 142365 +github, level 1 with dict, compress cctx, 42259 +github, level 3, compress cctx, 136332 github, level 3 with dict, compress cctx, 41534 github, level 4, compress cctx, 136199 github, level 4 with dict, compress cctx, 41725 @@ -80,237 +80,241 @@ github, level 7, compress github, level 7 with dict, compress cctx, 38755 github, level 9, compress cctx, 135122 github, level 9 with dict, compress cctx, 39398 -github, level 13, compress cctx, 134064 +github, level 13, compress cctx, 132878 github, level 13 with dict, compress cctx, 39948 -github, level 16, compress cctx, 134064 +github, level 16, compress cctx, 133209 github, level 16 with dict, compress cctx, 37568 -github, level 19, compress cctx, 134064 +github, level 19, compress cctx, 132879 github, level 19 with dict, compress cctx, 37567 -github, long distance mode, compress cctx, 141102 -github, multithreaded, compress cctx, 141102 -github, multithreaded long distance mode, compress cctx, 141102 -github, small window log, compress cctx, 141102 +github, long distance mode, compress cctx, 141069 +github, multithreaded, compress cctx, 141069 +github, multithreaded long distance mode, compress cctx, 141069 +github, small window log, compress cctx, 141069 github, small hash log, compress cctx, 138949 github, small chain log, compress cctx, 139242 github, explicit params, compress cctx, 140932 -github, uncompressed literals, compress cctx, 136335 -github, uncompressed literals optimal, compress cctx, 134064 -github, huffman literals, compress cctx, 175568 -github, multithreaded with advanced params, compress cctx, 141102 -silesia, level -5, zstdcli, 6737655 -silesia, level -3, zstdcli, 6444725 -silesia, level -1, zstdcli, 6178508 -silesia, level 0, zstdcli, 4849600 -silesia, level 1, zstdcli, 5313252 -silesia, level 3, zstdcli, 4849600 -silesia, level 4, zstdcli, 4787018 -silesia, level 5, zstdcli, 4707842 -silesia, level 6, zstdcli, 4666431 -silesia, level 7, zstdcli, 4603429 -silesia, level 9, zstdcli, 4546049 -silesia, level 13, zstdcli, 4482183 -silesia, level 16, zstdcli, 4360299 -silesia, level 19, zstdcli, 4283285 -silesia, long distance mode, zstdcli, 4840806 -silesia, multithreaded, zstdcli, 4849600 -silesia, multithreaded long distance mode, zstdcli, 4840806 -silesia, small window log, zstdcli, 7095967 +github, uncompressed literals, compress cctx, 136332 +github, uncompressed literals optimal, compress cctx, 132879 +github, huffman literals, compress cctx, 175468 +github, multithreaded with advanced params, compress cctx, 141069 +silesia, level -5, zstdcli, 6857420 +silesia, level -3, zstdcli, 6503460 +silesia, level -1, zstdcli, 6172250 +silesia, level 0, zstdcli, 4842123 +silesia, level 1, zstdcli, 5306680 +silesia, level 3, zstdcli, 4842123 +silesia, level 4, zstdcli, 4779234 +silesia, level 5, zstdcli, 4666371 +silesia, level 6, zstdcli, 4603114 +silesia, level 7, zstdcli, 4567032 +silesia, level 9, zstdcli, 4543066 +silesia, level 13, zstdcli, 4494038 +silesia, level 16, zstdcli, 4360089 +silesia, level 19, zstdcli, 4296103 +silesia, long distance mode, zstdcli, 4833785 +silesia, multithreaded, zstdcli, 4842123 +silesia, multithreaded long distance mode, zstdcli, 4833785 +silesia, small window log, zstdcli, 7095048 silesia, small hash log, zstdcli, 6526189 silesia, small chain log, zstdcli, 4912245 -silesia, explicit params, zstdcli, 4795856 -silesia, uncompressed literals, zstdcli, 5128030 -silesia, uncompressed literals optimal, zstdcli, 4317944 -silesia, huffman literals, zstdcli, 5326316 -silesia, multithreaded with advanced params, zstdcli, 5128030 -silesia.tar, level -5, zstdcli, 6738934 -silesia.tar, level -3, zstdcli, 6448419 -silesia.tar, level -1, zstdcli, 6186912 -silesia.tar, level 0, zstdcli, 4861512 -silesia.tar, level 1, zstdcli, 5336318 -silesia.tar, level 3, zstdcli, 4861512 -silesia.tar, level 4, zstdcli, 4800529 -silesia.tar, level 5, zstdcli, 4720121 -silesia.tar, level 6, zstdcli, 4678661 -silesia.tar, level 7, zstdcli, 4614424 -silesia.tar, level 9, zstdcli, 4556062 -silesia.tar, level 13, zstdcli, 4491768 -silesia.tar, level 16, zstdcli, 4356831 -silesia.tar, level 19, zstdcli, 4264491 -silesia.tar, no source size, zstdcli, 4861508 -silesia.tar, long distance mode, zstdcli, 4853226 -silesia.tar, multithreaded, zstdcli, 4861512 -silesia.tar, multithreaded long distance mode, zstdcli, 4853226 -silesia.tar, small window log, zstdcli, 7101576 -silesia.tar, small hash log, zstdcli, 6529290 +silesia, explicit params, zstdcli, 4795432 +silesia, uncompressed literals, zstdcli, 5120614 +silesia, uncompressed literals optimal, zstdcli, 4319566 +silesia, huffman literals, zstdcli, 5321417 +silesia, multithreaded with advanced params, zstdcli, 5120614 +silesia.tar, level -5, zstdcli, 6862049 +silesia.tar, level -3, zstdcli, 6506509 +silesia.tar, level -1, zstdcli, 6179789 +silesia.tar, level 0, zstdcli, 4854164 +silesia.tar, level 1, zstdcli, 5329010 +silesia.tar, level 3, zstdcli, 4854164 +silesia.tar, level 4, zstdcli, 4792352 +silesia.tar, level 5, zstdcli, 4678682 +silesia.tar, level 6, zstdcli, 4614125 +silesia.tar, level 7, zstdcli, 4578719 +silesia.tar, level 9, zstdcli, 4552903 +silesia.tar, level 13, zstdcli, 4502960 +silesia.tar, level 16, zstdcli, 4360550 +silesia.tar, level 19, zstdcli, 4265915 +silesia.tar, no source size, zstdcli, 4854160 +silesia.tar, long distance mode, zstdcli, 4845745 +silesia.tar, multithreaded, zstdcli, 4854164 +silesia.tar, multithreaded long distance mode, zstdcli, 4845745 +silesia.tar, small window log, zstdcli, 7100701 +silesia.tar, small hash log, zstdcli, 6529264 silesia.tar, small chain log, zstdcli, 4917022 -silesia.tar, explicit params, zstdcli, 4821274 -silesia.tar, uncompressed literals, zstdcli, 5129559 -silesia.tar, uncompressed literals optimal, zstdcli, 4307457 -silesia.tar, huffman literals, zstdcli, 5347610 -silesia.tar, multithreaded with advanced params, zstdcli, 5129559 -github, level -5, zstdcli, 207285 +silesia.tar, explicit params, zstdcli, 4820713 +silesia.tar, uncompressed literals, zstdcli, 5122571 +silesia.tar, uncompressed literals optimal, zstdcli, 4310145 +silesia.tar, huffman literals, zstdcli, 5342074 +silesia.tar, multithreaded with advanced params, zstdcli, 5122571 +github, level -5, zstdcli, 206407 github, level -5 with dict, zstdcli, 48718 -github, level -3, zstdcli, 192643 +github, level -3, zstdcli, 195253 github, level -3 with dict, zstdcli, 47395 -github, level -1, zstdcli, 177568 +github, level -1, zstdcli, 177468 github, level -1 with dict, zstdcli, 45170 -github, level 0, zstdcli, 138335 +github, level 0, zstdcli, 138332 github, level 0 with dict, zstdcli, 43148 -github, level 1, zstdcli, 144465 +github, level 1, zstdcli, 144365 github, level 1 with dict, zstdcli, 43682 -github, level 3, zstdcli, 138335 +github, level 3, zstdcli, 138332 github, level 3 with dict, zstdcli, 43148 github, level 4, zstdcli, 138199 github, level 4 with dict, zstdcli, 43251 github, level 5, zstdcli, 137121 github, level 5 with dict, zstdcli, 40728 github, level 6, zstdcli, 137122 -github, level 6 with dict, zstdcli, 40630 +github, level 6 with dict, zstdcli, 40636 github, level 7, zstdcli, 137122 -github, level 7 with dict, zstdcli, 40747 +github, level 7 with dict, zstdcli, 40745 github, level 9, zstdcli, 137122 -github, level 9 with dict, zstdcli, 41338 -github, level 13, zstdcli, 136064 -github, level 13 with dict, zstdcli, 41743 -github, level 16, zstdcli, 136064 +github, level 9 with dict, zstdcli, 41393 +github, level 13, zstdcli, 134878 +github, level 13 with dict, zstdcli, 41900 +github, level 16, zstdcli, 135209 github, level 16 with dict, zstdcli, 39577 -github, level 19, zstdcli, 136064 +github, level 19, zstdcli, 134879 github, level 19 with dict, zstdcli, 39576 -github, long distance mode, zstdcli, 138335 -github, multithreaded, zstdcli, 138335 -github, multithreaded long distance mode, zstdcli, 138335 -github, small window log, zstdcli, 138335 +github, long distance mode, zstdcli, 138332 +github, multithreaded, zstdcli, 138332 +github, multithreaded long distance mode, zstdcli, 138332 +github, small window log, zstdcli, 138332 github, small hash log, zstdcli, 137590 github, small chain log, zstdcli, 138341 github, explicit params, zstdcli, 136197 -github, uncompressed literals, zstdcli, 167915 -github, uncompressed literals optimal, zstdcli, 159227 -github, huffman literals, zstdcli, 144465 -github, multithreaded with advanced params, zstdcli, 167915 -github.tar, level -5, zstdcli, 46860 -github.tar, level -5 with dict, zstdcli, 44575 -github.tar, level -3, zstdcli, 43758 -github.tar, level -3 with dict, zstdcli, 41451 -github.tar, level -1, zstdcli, 42494 -github.tar, level -1 with dict, zstdcli, 41135 -github.tar, level 0, zstdcli, 38445 +github, uncompressed literals, zstdcli, 167911 +github, uncompressed literals optimal, zstdcli, 154667 +github, huffman literals, zstdcli, 144365 +github, multithreaded with advanced params, zstdcli, 167911 +github.tar, level -5, zstdcli, 52119 +github.tar, level -5 with dict, zstdcli, 50978 +github.tar, level -3, zstdcli, 45682 +github.tar, level -3 with dict, zstdcli, 44660 +github.tar, level -1, zstdcli, 42564 +github.tar, level -1 with dict, zstdcli, 41155 +github.tar, level 0, zstdcli, 38835 github.tar, level 0 with dict, zstdcli, 37999 -github.tar, level 1, zstdcli, 39269 -github.tar, level 1 with dict, zstdcli, 38284 -github.tar, level 3, zstdcli, 38445 +github.tar, level 1, zstdcli, 39204 +github.tar, level 1 with dict, zstdcli, 38093 +github.tar, level 3, zstdcli, 38835 github.tar, level 3 with dict, zstdcli, 37999 -github.tar, level 4, zstdcli, 38471 +github.tar, level 4, zstdcli, 38897 github.tar, level 4 with dict, zstdcli, 37952 -github.tar, level 5, zstdcli, 39697 -github.tar, level 5 with dict, zstdcli, 39032 -github.tar, level 6, zstdcli, 39625 -github.tar, level 6 with dict, zstdcli, 38614 -github.tar, level 7, zstdcli, 39217 -github.tar, level 7 with dict, zstdcli, 37871 -github.tar, level 9, zstdcli, 36762 -github.tar, level 9 with dict, zstdcli, 36641 -github.tar, level 13, zstdcli, 35625 -github.tar, level 13 with dict, zstdcli, 38730 -github.tar, level 16, zstdcli, 40259 -github.tar, level 16 with dict, zstdcli, 33643 -github.tar, level 19, zstdcli, 32841 -github.tar, level 19 with dict, zstdcli, 32899 -github.tar, no source size, zstdcli, 38442 +github.tar, level 5, zstdcli, 39655 +github.tar, level 5 with dict, zstdcli, 39071 +github.tar, level 6, zstdcli, 39286 +github.tar, level 6 with dict, zstdcli, 38638 +github.tar, level 7, zstdcli, 38114 +github.tar, level 7 with dict, zstdcli, 37886 +github.tar, level 9, zstdcli, 36764 +github.tar, level 9 with dict, zstdcli, 36632 +github.tar, level 13, zstdcli, 35505 +github.tar, level 13 with dict, zstdcli, 37134 +github.tar, level 16, zstdcli, 40470 +github.tar, level 16 with dict, zstdcli, 33378 +github.tar, level 19, zstdcli, 32280 +github.tar, level 19 with dict, zstdcli, 32716 +github.tar, no source size, zstdcli, 38832 github.tar, no source size with dict, zstdcli, 38004 -github.tar, long distance mode, zstdcli, 39730 -github.tar, multithreaded, zstdcli, 38445 -github.tar, multithreaded long distance mode, zstdcli, 39730 +github.tar, long distance mode, zstdcli, 40236 +github.tar, multithreaded, zstdcli, 38835 +github.tar, multithreaded long distance mode, zstdcli, 40236 github.tar, small window log, zstdcli, 198544 github.tar, small hash log, zstdcli, 129874 github.tar, small chain log, zstdcli, 41673 -github.tar, explicit params, zstdcli, 41227 -github.tar, uncompressed literals, zstdcli, 41126 -github.tar, uncompressed literals optimal, zstdcli, 35392 -github.tar, huffman literals, zstdcli, 38781 -github.tar, multithreaded with advanced params, zstdcli, 41126 -silesia, level -5, advanced one pass, 6737607 -silesia, level -3, advanced one pass, 6444677 -silesia, level -1, advanced one pass, 6178460 -silesia, level 0, advanced one pass, 4849552 -silesia, level 1, advanced one pass, 5313204 -silesia, level 3, advanced one pass, 4849552 -silesia, level 4, advanced one pass, 4786970 -silesia, level 5 row 1, advanced one pass, 4710236 -silesia, level 5 row 2, advanced one pass, 4707794 -silesia, level 5, advanced one pass, 4707794 -silesia, level 6, advanced one pass, 4666383 -silesia, level 7 row 1, advanced one pass, 4596296 -silesia, level 7 row 2, advanced one pass, 4603381 -silesia, level 7, advanced one pass, 4603381 -silesia, level 9, advanced one pass, 4546001 -silesia, level 12 row 1, advanced one pass, 4519288 -silesia, level 12 row 2, advanced one pass, 4521397 -silesia, level 13, advanced one pass, 4482135 -silesia, level 16, advanced one pass, 4360251 -silesia, level 19, advanced one pass, 4283237 -silesia, no source size, advanced one pass, 4849552 -silesia, long distance mode, advanced one pass, 4840738 -silesia, multithreaded, advanced one pass, 4849552 -silesia, multithreaded long distance mode, advanced one pass, 4840758 -silesia, small window log, advanced one pass, 7095919 +github.tar, explicit params, zstdcli, 41385 +github.tar, uncompressed literals, zstdcli, 41529 +github.tar, uncompressed literals optimal, zstdcli, 35401 +github.tar, huffman literals, zstdcli, 38857 +github.tar, multithreaded with advanced params, zstdcli, 41529 +silesia, level -5, advanced one pass, 6857372 +silesia, level -3, advanced one pass, 6503412 +silesia, level -1, advanced one pass, 6172202 +silesia, level 0, advanced one pass, 4842075 +silesia, level 1, advanced one pass, 5306632 +silesia, level 3, advanced one pass, 4842075 +silesia, level 4, advanced one pass, 4779186 +silesia, level 5 row 1, advanced one pass, 4666323 +silesia, level 5 row 2, advanced one pass, 4670136 +silesia, level 5, advanced one pass, 4666323 +silesia, level 6, advanced one pass, 4603066 +silesia, level 7 row 1, advanced one pass, 4566984 +silesia, level 7 row 2, advanced one pass, 4564868 +silesia, level 7, advanced one pass, 4566984 +silesia, level 9, advanced one pass, 4543018 +silesia, level 11 row 1, advanced one pass, 4505046 +silesia, level 11 row 2, advanced one pass, 4503116 +silesia, level 12 row 1, advanced one pass, 4505046 +silesia, level 12 row 2, advanced one pass, 4503116 +silesia, level 13, advanced one pass, 4493990 +silesia, level 16, advanced one pass, 4360041 +silesia, level 19, advanced one pass, 4296055 +silesia, no source size, advanced one pass, 4842075 +silesia, long distance mode, advanced one pass, 4833710 +silesia, multithreaded, advanced one pass, 4842075 +silesia, multithreaded long distance mode, advanced one pass, 4833737 +silesia, small window log, advanced one pass, 7095000 silesia, small hash log, advanced one pass, 6526141 silesia, small chain log, advanced one pass, 4912197 -silesia, explicit params, advanced one pass, 4795856 -silesia, uncompressed literals, advanced one pass, 5127982 -silesia, uncompressed literals optimal, advanced one pass, 4317896 -silesia, huffman literals, advanced one pass, 5326268 -silesia, multithreaded with advanced params, advanced one pass, 5127982 -silesia.tar, level -5, advanced one pass, 6738593 -silesia.tar, level -3, advanced one pass, 6446372 -silesia.tar, level -1, advanced one pass, 6186042 -silesia.tar, level 0, advanced one pass, 4861425 -silesia.tar, level 1, advanced one pass, 5334885 -silesia.tar, level 3, advanced one pass, 4861425 -silesia.tar, level 4, advanced one pass, 4799630 -silesia.tar, level 5 row 1, advanced one pass, 4722324 -silesia.tar, level 5 row 2, advanced one pass, 4719256 -silesia.tar, level 5, advanced one pass, 4719256 -silesia.tar, level 6, advanced one pass, 4677721 -silesia.tar, level 7 row 1, advanced one pass, 4606715 -silesia.tar, level 7 row 2, advanced one pass, 4613541 -silesia.tar, level 7, advanced one pass, 4613541 -silesia.tar, level 9, advanced one pass, 4555426 -silesia.tar, level 12 row 1, advanced one pass, 4529459 -silesia.tar, level 12 row 2, advanced one pass, 4530256 -silesia.tar, level 13, advanced one pass, 4491764 -silesia.tar, level 16, advanced one pass, 4356827 -silesia.tar, level 19, advanced one pass, 4264487 -silesia.tar, no source size, advanced one pass, 4861425 -silesia.tar, long distance mode, advanced one pass, 4847754 -silesia.tar, multithreaded, advanced one pass, 4861508 -silesia.tar, multithreaded long distance mode, advanced one pass, 4853222 -silesia.tar, small window log, advanced one pass, 7101530 -silesia.tar, small hash log, advanced one pass, 6529232 +silesia, explicit params, advanced one pass, 4795432 +silesia, uncompressed literals, advanced one pass, 5120566 +silesia, uncompressed literals optimal, advanced one pass, 4319518 +silesia, huffman literals, advanced one pass, 5321369 +silesia, multithreaded with advanced params, advanced one pass, 5120566 +silesia.tar, level -5, advanced one pass, 6861055 +silesia.tar, level -3, advanced one pass, 6505483 +silesia.tar, level -1, advanced one pass, 6179047 +silesia.tar, level 0, advanced one pass, 4854086 +silesia.tar, level 1, advanced one pass, 5327717 +silesia.tar, level 3, advanced one pass, 4854086 +silesia.tar, level 4, advanced one pass, 4791503 +silesia.tar, level 5 row 1, advanced one pass, 4677740 +silesia.tar, level 5 row 2, advanced one pass, 4682161 +silesia.tar, level 5, advanced one pass, 4677740 +silesia.tar, level 6, advanced one pass, 4613242 +silesia.tar, level 7 row 1, advanced one pass, 4576661 +silesia.tar, level 7 row 2, advanced one pass, 4575393 +silesia.tar, level 7, advanced one pass, 4576661 +silesia.tar, level 9, advanced one pass, 4552899 +silesia.tar, level 11 row 1, advanced one pass, 4514432 +silesia.tar, level 11 row 2, advanced one pass, 4513604 +silesia.tar, level 12 row 1, advanced one pass, 4514049 +silesia.tar, level 12 row 2, advanced one pass, 4513797 +silesia.tar, level 13, advanced one pass, 4502956 +silesia.tar, level 16, advanced one pass, 4360546 +silesia.tar, level 19, advanced one pass, 4265911 +silesia.tar, no source size, advanced one pass, 4854086 +silesia.tar, long distance mode, advanced one pass, 4840452 +silesia.tar, multithreaded, advanced one pass, 4854160 +silesia.tar, multithreaded long distance mode, advanced one pass, 4845741 +silesia.tar, small window log, advanced one pass, 7100655 +silesia.tar, small hash log, advanced one pass, 6529206 silesia.tar, small chain log, advanced one pass, 4917041 -silesia.tar, explicit params, advanced one pass, 4807380 -silesia.tar, uncompressed literals, advanced one pass, 5129458 -silesia.tar, uncompressed literals optimal, advanced one pass, 4307453 -silesia.tar, huffman literals, advanced one pass, 5347335 -silesia.tar, multithreaded with advanced params, advanced one pass, 5129555 -github, level -5, advanced one pass, 205285 +silesia.tar, explicit params, advanced one pass, 4806855 +silesia.tar, uncompressed literals, advanced one pass, 5122473 +silesia.tar, uncompressed literals optimal, advanced one pass, 4310141 +silesia.tar, huffman literals, advanced one pass, 5341705 +silesia.tar, multithreaded with advanced params, advanced one pass, 5122567 +github, level -5, advanced one pass, 204407 github, level -5 with dict, advanced one pass, 46718 -github, level -3, advanced one pass, 190643 +github, level -3, advanced one pass, 193253 github, level -3 with dict, advanced one pass, 45395 -github, level -1, advanced one pass, 175568 +github, level -1, advanced one pass, 175468 github, level -1 with dict, advanced one pass, 43170 -github, level 0, advanced one pass, 136335 +github, level 0, advanced one pass, 136332 github, level 0 with dict, advanced one pass, 41148 github, level 0 with dict dms, advanced one pass, 41148 github, level 0 with dict dds, advanced one pass, 41148 github, level 0 with dict copy, advanced one pass, 41124 github, level 0 with dict load, advanced one pass, 42252 -github, level 1, advanced one pass, 142465 +github, level 1, advanced one pass, 142365 github, level 1 with dict, advanced one pass, 41682 github, level 1 with dict dms, advanced one pass, 41682 github, level 1 with dict dds, advanced one pass, 41682 -github, level 1 with dict copy, advanced one pass, 41674 -github, level 1 with dict load, advanced one pass, 43755 -github, level 3, advanced one pass, 136335 +github, level 1 with dict copy, advanced one pass, 41698 +github, level 1 with dict load, advanced one pass, 43814 +github, level 3, advanced one pass, 136332 github, level 3 with dict, advanced one pass, 41148 github, level 3 with dict dms, advanced one pass, 41148 github, level 3 with dict dds, advanced one pass, 41148 @@ -322,16 +326,16 @@ github, level 4 with dict dms, advanced github, level 4 with dict dds, advanced one pass, 41251 github, level 4 with dict copy, advanced one pass, 41216 github, level 4 with dict load, advanced one pass, 41159 -github, level 5 row 1, advanced one pass, 135121 -github, level 5 row 1 with dict dms, advanced one pass, 38938 -github, level 5 row 1 with dict dds, advanced one pass, 38732 -github, level 5 row 1 with dict copy, advanced one pass, 38934 -github, level 5 row 1 with dict load, advanced one pass, 40725 -github, level 5 row 2, advanced one pass, 134584 -github, level 5 row 2 with dict dms, advanced one pass, 38758 -github, level 5 row 2 with dict dds, advanced one pass, 38728 -github, level 5 row 2 with dict copy, advanced one pass, 38759 -github, level 5 row 2 with dict load, advanced one pass, 41518 +github, level 5 row 1, advanced one pass, 134584 +github, level 5 row 1 with dict dms, advanced one pass, 38758 +github, level 5 row 1 with dict dds, advanced one pass, 38728 +github, level 5 row 1 with dict copy, advanced one pass, 38759 +github, level 5 row 1 with dict load, advanced one pass, 41518 +github, level 5 row 2, advanced one pass, 135121 +github, level 5 row 2 with dict dms, advanced one pass, 38938 +github, level 5 row 2 with dict dds, advanced one pass, 38732 +github, level 5 row 2 with dict copy, advanced one pass, 38934 +github, level 5 row 2 with dict load, advanced one pass, 40725 github, level 5, advanced one pass, 135121 github, level 5 with dict, advanced one pass, 38758 github, level 5 with dict dms, advanced one pass, 38758 @@ -341,270 +345,294 @@ github, level 5 with dict load, advanced github, level 6, advanced one pass, 135122 github, level 6 with dict, advanced one pass, 38671 github, level 6 with dict dms, advanced one pass, 38671 -github, level 6 with dict dds, advanced one pass, 38630 +github, level 6 with dict dds, advanced one pass, 38636 github, level 6 with dict copy, advanced one pass, 38669 github, level 6 with dict load, advanced one pass, 40695 -github, level 7 row 1, advanced one pass, 135122 -github, level 7 row 1 with dict dms, advanced one pass, 38771 -github, level 7 row 1 with dict dds, advanced one pass, 38771 -github, level 7 row 1 with dict copy, advanced one pass, 38745 -github, level 7 row 1 with dict load, advanced one pass, 40695 -github, level 7 row 2, advanced one pass, 134584 -github, level 7 row 2 with dict dms, advanced one pass, 38758 -github, level 7 row 2 with dict dds, advanced one pass, 38747 -github, level 7 row 2 with dict copy, advanced one pass, 38755 -github, level 7 row 2 with dict load, advanced one pass, 41030 +github, level 7 row 1, advanced one pass, 134584 +github, level 7 row 1 with dict dms, advanced one pass, 38758 +github, level 7 row 1 with dict dds, advanced one pass, 38745 +github, level 7 row 1 with dict copy, advanced one pass, 38755 +github, level 7 row 1 with dict load, advanced one pass, 43154 +github, level 7 row 2, advanced one pass, 135122 +github, level 7 row 2 with dict dms, advanced one pass, 38860 +github, level 7 row 2 with dict dds, advanced one pass, 38766 +github, level 7 row 2 with dict copy, advanced one pass, 38834 +github, level 7 row 2 with dict load, advanced one pass, 40695 github, level 7, advanced one pass, 135122 github, level 7 with dict, advanced one pass, 38758 github, level 7 with dict dms, advanced one pass, 38758 -github, level 7 with dict dds, advanced one pass, 38747 +github, level 7 with dict dds, advanced one pass, 38745 github, level 7 with dict copy, advanced one pass, 38755 github, level 7 with dict load, advanced one pass, 40695 github, level 9, advanced one pass, 135122 github, level 9 with dict, advanced one pass, 39437 github, level 9 with dict dms, advanced one pass, 39437 -github, level 9 with dict dds, advanced one pass, 39338 +github, level 9 with dict dds, advanced one pass, 39393 github, level 9 with dict copy, advanced one pass, 39398 github, level 9 with dict load, advanced one pass, 41710 -github, level 12 row 1, advanced one pass, 134180 +github, level 11 row 1, advanced one pass, 135367 +github, level 11 row 1 with dict dms, advanced one pass, 39671 +github, level 11 row 1 with dict dds, advanced one pass, 39671 +github, level 11 row 1 with dict copy, advanced one pass, 39651 +github, level 11 row 1 with dict load, advanced one pass, 41360 +github, level 11 row 2, advanced one pass, 135367 +github, level 11 row 2 with dict dms, advanced one pass, 39671 +github, level 11 row 2 with dict dds, advanced one pass, 39671 +github, level 11 row 2 with dict copy, advanced one pass, 39651 +github, level 11 row 2 with dict load, advanced one pass, 41360 +github, level 12 row 1, advanced one pass, 134402 github, level 12 row 1 with dict dms, advanced one pass, 39677 github, level 12 row 1 with dict dds, advanced one pass, 39677 github, level 12 row 1 with dict copy, advanced one pass, 39677 github, level 12 row 1 with dict load, advanced one pass, 41166 -github, level 12 row 2, advanced one pass, 134180 +github, level 12 row 2, advanced one pass, 134402 github, level 12 row 2 with dict dms, advanced one pass, 39677 github, level 12 row 2 with dict dds, advanced one pass, 39677 github, level 12 row 2 with dict copy, advanced one pass, 39677 github, level 12 row 2 with dict load, advanced one pass, 41166 -github, level 13, advanced one pass, 134064 -github, level 13 with dict, advanced one pass, 39743 -github, level 13 with dict dms, advanced one pass, 39743 -github, level 13 with dict dds, advanced one pass, 39743 +github, level 13, advanced one pass, 132878 +github, level 13 with dict, advanced one pass, 39900 +github, level 13 with dict dms, advanced one pass, 39900 +github, level 13 with dict dds, advanced one pass, 39900 github, level 13 with dict copy, advanced one pass, 39948 -github, level 13 with dict load, advanced one pass, 42626 -github, level 16, advanced one pass, 134064 +github, level 13 with dict load, advanced one pass, 42624 +github, level 16, advanced one pass, 133209 github, level 16 with dict, advanced one pass, 37577 github, level 16 with dict dms, advanced one pass, 37577 github, level 16 with dict dds, advanced one pass, 37577 github, level 16 with dict copy, advanced one pass, 37568 -github, level 16 with dict load, advanced one pass, 42340 -github, level 19, advanced one pass, 134064 +github, level 16 with dict load, advanced one pass, 42338 +github, level 19, advanced one pass, 132879 github, level 19 with dict, advanced one pass, 37576 github, level 19 with dict dms, advanced one pass, 37576 github, level 19 with dict dds, advanced one pass, 37576 github, level 19 with dict copy, advanced one pass, 37567 github, level 19 with dict load, advanced one pass, 39613 -github, no source size, advanced one pass, 136335 +github, no source size, advanced one pass, 136332 github, no source size with dict, advanced one pass, 41148 -github, long distance mode, advanced one pass, 136335 -github, multithreaded, advanced one pass, 136335 -github, multithreaded long distance mode, advanced one pass, 136335 -github, small window log, advanced one pass, 136335 +github, long distance mode, advanced one pass, 136332 +github, multithreaded, advanced one pass, 136332 +github, multithreaded long distance mode, advanced one pass, 136332 +github, small window log, advanced one pass, 136332 github, small hash log, advanced one pass, 135590 github, small chain log, advanced one pass, 136341 github, explicit params, advanced one pass, 137727 -github, uncompressed literals, advanced one pass, 165915 -github, uncompressed literals optimal, advanced one pass, 157227 -github, huffman literals, advanced one pass, 142465 -github, multithreaded with advanced params, advanced one pass, 165915 -github.tar, level -5, advanced one pass, 46856 -github.tar, level -5 with dict, advanced one pass, 44571 -github.tar, level -3, advanced one pass, 43754 -github.tar, level -3 with dict, advanced one pass, 41447 -github.tar, level -1, advanced one pass, 42490 -github.tar, level -1 with dict, advanced one pass, 41131 -github.tar, level 0, advanced one pass, 38441 +github, uncompressed literals, advanced one pass, 165911 +github, uncompressed literals optimal, advanced one pass, 152667 +github, huffman literals, advanced one pass, 142365 +github, multithreaded with advanced params, advanced one pass, 165911 +github.tar, level -5, advanced one pass, 52115 +github.tar, level -5 with dict, advanced one pass, 50974 +github.tar, level -3, advanced one pass, 45678 +github.tar, level -3 with dict, advanced one pass, 44656 +github.tar, level -1, advanced one pass, 42560 +github.tar, level -1 with dict, advanced one pass, 41151 +github.tar, level 0, advanced one pass, 38831 github.tar, level 0 with dict, advanced one pass, 37995 github.tar, level 0 with dict dms, advanced one pass, 38003 github.tar, level 0 with dict dds, advanced one pass, 38003 github.tar, level 0 with dict copy, advanced one pass, 37995 github.tar, level 0 with dict load, advanced one pass, 37956 -github.tar, level 1, advanced one pass, 39265 -github.tar, level 1 with dict, advanced one pass, 38280 -github.tar, level 1 with dict dms, advanced one pass, 38290 -github.tar, level 1 with dict dds, advanced one pass, 38290 -github.tar, level 1 with dict copy, advanced one pass, 38280 -github.tar, level 1 with dict load, advanced one pass, 38729 -github.tar, level 3, advanced one pass, 38441 +github.tar, level 1, advanced one pass, 39200 +github.tar, level 1 with dict, advanced one pass, 38089 +github.tar, level 1 with dict dms, advanced one pass, 38294 +github.tar, level 1 with dict dds, advanced one pass, 38294 +github.tar, level 1 with dict copy, advanced one pass, 38089 +github.tar, level 1 with dict load, advanced one pass, 38364 +github.tar, level 3, advanced one pass, 38831 github.tar, level 3 with dict, advanced one pass, 37995 github.tar, level 3 with dict dms, advanced one pass, 38003 github.tar, level 3 with dict dds, advanced one pass, 38003 github.tar, level 3 with dict copy, advanced one pass, 37995 github.tar, level 3 with dict load, advanced one pass, 37956 -github.tar, level 4, advanced one pass, 38467 +github.tar, level 4, advanced one pass, 38893 github.tar, level 4 with dict, advanced one pass, 37948 github.tar, level 4 with dict dms, advanced one pass, 37954 github.tar, level 4 with dict dds, advanced one pass, 37954 github.tar, level 4 with dict copy, advanced one pass, 37948 github.tar, level 4 with dict load, advanced one pass, 37927 -github.tar, level 5 row 1, advanced one pass, 39788 -github.tar, level 5 row 1 with dict dms, advanced one pass, 39365 -github.tar, level 5 row 1 with dict dds, advanced one pass, 39233 -github.tar, level 5 row 1 with dict copy, advanced one pass, 39715 -github.tar, level 5 row 1 with dict load, advanced one pass, 39209 -github.tar, level 5 row 2, advanced one pass, 39693 -github.tar, level 5 row 2 with dict dms, advanced one pass, 39024 -github.tar, level 5 row 2 with dict dds, advanced one pass, 39028 -github.tar, level 5 row 2 with dict copy, advanced one pass, 39040 -github.tar, level 5 row 2 with dict load, advanced one pass, 39037 -github.tar, level 5, advanced one pass, 39693 -github.tar, level 5 with dict, advanced one pass, 39040 -github.tar, level 5 with dict dms, advanced one pass, 39024 -github.tar, level 5 with dict dds, advanced one pass, 39028 -github.tar, level 5 with dict copy, advanced one pass, 39040 -github.tar, level 5 with dict load, advanced one pass, 39037 -github.tar, level 6, advanced one pass, 39621 -github.tar, level 6 with dict, advanced one pass, 38622 -github.tar, level 6 with dict dms, advanced one pass, 38608 -github.tar, level 6 with dict dds, advanced one pass, 38610 -github.tar, level 6 with dict copy, advanced one pass, 38622 -github.tar, level 6 with dict load, advanced one pass, 38962 -github.tar, level 7 row 1, advanced one pass, 39206 -github.tar, level 7 row 1 with dict dms, advanced one pass, 37954 -github.tar, level 7 row 1 with dict dds, advanced one pass, 37954 -github.tar, level 7 row 1 with dict copy, advanced one pass, 38071 -github.tar, level 7 row 1 with dict load, advanced one pass, 38584 -github.tar, level 7 row 2, advanced one pass, 39213 -github.tar, level 7 row 2 with dict dms, advanced one pass, 37848 -github.tar, level 7 row 2 with dict dds, advanced one pass, 37867 -github.tar, level 7 row 2 with dict copy, advanced one pass, 37848 -github.tar, level 7 row 2 with dict load, advanced one pass, 38582 -github.tar, level 7, advanced one pass, 39213 -github.tar, level 7 with dict, advanced one pass, 37848 -github.tar, level 7 with dict dms, advanced one pass, 37848 -github.tar, level 7 with dict dds, advanced one pass, 37867 -github.tar, level 7 with dict copy, advanced one pass, 37848 -github.tar, level 7 with dict load, advanced one pass, 38582 -github.tar, level 9, advanced one pass, 36758 -github.tar, level 9 with dict, advanced one pass, 36457 -github.tar, level 9 with dict dms, advanced one pass, 36549 -github.tar, level 9 with dict dds, advanced one pass, 36637 -github.tar, level 9 with dict copy, advanced one pass, 36457 -github.tar, level 9 with dict load, advanced one pass, 36350 -github.tar, level 12 row 1, advanced one pass, 36435 +github.tar, level 5 row 1, advanced one pass, 39651 +github.tar, level 5 row 1 with dict dms, advanced one pass, 39059 +github.tar, level 5 row 1 with dict dds, advanced one pass, 39067 +github.tar, level 5 row 1 with dict copy, advanced one pass, 39082 +github.tar, level 5 row 1 with dict load, advanced one pass, 38999 +github.tar, level 5 row 2, advanced one pass, 39701 +github.tar, level 5 row 2 with dict dms, advanced one pass, 39365 +github.tar, level 5 row 2 with dict dds, advanced one pass, 39233 +github.tar, level 5 row 2 with dict copy, advanced one pass, 39715 +github.tar, level 5 row 2 with dict load, advanced one pass, 39158 +github.tar, level 5, advanced one pass, 39651 +github.tar, level 5 with dict, advanced one pass, 39082 +github.tar, level 5 with dict dms, advanced one pass, 39059 +github.tar, level 5 with dict dds, advanced one pass, 39067 +github.tar, level 5 with dict copy, advanced one pass, 39082 +github.tar, level 5 with dict load, advanced one pass, 38999 +github.tar, level 6, advanced one pass, 39282 +github.tar, level 6 with dict, advanced one pass, 38656 +github.tar, level 6 with dict dms, advanced one pass, 38636 +github.tar, level 6 with dict dds, advanced one pass, 38634 +github.tar, level 6 with dict copy, advanced one pass, 38656 +github.tar, level 6 with dict load, advanced one pass, 38648 +github.tar, level 7 row 1, advanced one pass, 38110 +github.tar, level 7 row 1 with dict dms, advanced one pass, 37858 +github.tar, level 7 row 1 with dict dds, advanced one pass, 37882 +github.tar, level 7 row 1 with dict copy, advanced one pass, 37865 +github.tar, level 7 row 1 with dict load, advanced one pass, 37436 +github.tar, level 7 row 2, advanced one pass, 38077 +github.tar, level 7 row 2 with dict dms, advanced one pass, 38012 +github.tar, level 7 row 2 with dict dds, advanced one pass, 38014 +github.tar, level 7 row 2 with dict copy, advanced one pass, 38101 +github.tar, level 7 row 2 with dict load, advanced one pass, 37402 +github.tar, level 7, advanced one pass, 38110 +github.tar, level 7 with dict, advanced one pass, 37865 +github.tar, level 7 with dict dms, advanced one pass, 37858 +github.tar, level 7 with dict dds, advanced one pass, 37882 +github.tar, level 7 with dict copy, advanced one pass, 37865 +github.tar, level 7 with dict load, advanced one pass, 37436 +github.tar, level 9, advanced one pass, 36760 +github.tar, level 9 with dict, advanced one pass, 36484 +github.tar, level 9 with dict dms, advanced one pass, 36567 +github.tar, level 9 with dict dds, advanced one pass, 36628 +github.tar, level 9 with dict copy, advanced one pass, 36484 +github.tar, level 9 with dict load, advanced one pass, 36401 +github.tar, level 11 row 1, advanced one pass, 36081 +github.tar, level 11 row 1 with dict dms, advanced one pass, 36963 +github.tar, level 11 row 1 with dict dds, advanced one pass, 36963 +github.tar, level 11 row 1 with dict copy, advanced one pass, 36557 +github.tar, level 11 row 1 with dict load, advanced one pass, 36434 +github.tar, level 11 row 2, advanced one pass, 36110 +github.tar, level 11 row 2 with dict dms, advanced one pass, 36963 +github.tar, level 11 row 2 with dict dds, advanced one pass, 36963 +github.tar, level 11 row 2 with dict copy, advanced one pass, 36557 +github.tar, level 11 row 2 with dict load, advanced one pass, 36459 +github.tar, level 12 row 1, advanced one pass, 36081 github.tar, level 12 row 1 with dict dms, advanced one pass, 36986 github.tar, level 12 row 1 with dict dds, advanced one pass, 36986 github.tar, level 12 row 1 with dict copy, advanced one pass, 36609 -github.tar, level 12 row 1 with dict load, advanced one pass, 36419 -github.tar, level 12 row 2, advanced one pass, 36435 +github.tar, level 12 row 1 with dict load, advanced one pass, 36434 +github.tar, level 12 row 2, advanced one pass, 36110 github.tar, level 12 row 2 with dict dms, advanced one pass, 36986 github.tar, level 12 row 2 with dict dds, advanced one pass, 36986 github.tar, level 12 row 2 with dict copy, advanced one pass, 36609 -github.tar, level 12 row 2 with dict load, advanced one pass, 36424 -github.tar, level 13, advanced one pass, 35621 -github.tar, level 13 with dict, advanced one pass, 38726 -github.tar, level 13 with dict dms, advanced one pass, 38903 -github.tar, level 13 with dict dds, advanced one pass, 38903 -github.tar, level 13 with dict copy, advanced one pass, 38726 -github.tar, level 13 with dict load, advanced one pass, 36372 -github.tar, level 16, advanced one pass, 40255 -github.tar, level 16 with dict, advanced one pass, 33639 -github.tar, level 16 with dict dms, advanced one pass, 33544 -github.tar, level 16 with dict dds, advanced one pass, 33544 -github.tar, level 16 with dict copy, advanced one pass, 33639 -github.tar, level 16 with dict load, advanced one pass, 39353 -github.tar, level 19, advanced one pass, 32837 -github.tar, level 19 with dict, advanced one pass, 32895 -github.tar, level 19 with dict dms, advanced one pass, 32672 -github.tar, level 19 with dict dds, advanced one pass, 32672 -github.tar, level 19 with dict copy, advanced one pass, 32895 -github.tar, level 19 with dict load, advanced one pass, 32676 -github.tar, no source size, advanced one pass, 38441 +github.tar, level 12 row 2 with dict load, advanced one pass, 36459 +github.tar, level 13, advanced one pass, 35501 +github.tar, level 13 with dict, advanced one pass, 37130 +github.tar, level 13 with dict dms, advanced one pass, 37220 +github.tar, level 13 with dict dds, advanced one pass, 37220 +github.tar, level 13 with dict copy, advanced one pass, 37130 +github.tar, level 13 with dict load, advanced one pass, 36010 +github.tar, level 16, advanced one pass, 40466 +github.tar, level 16 with dict, advanced one pass, 33374 +github.tar, level 16 with dict dms, advanced one pass, 33206 +github.tar, level 16 with dict dds, advanced one pass, 33206 +github.tar, level 16 with dict copy, advanced one pass, 33374 +github.tar, level 16 with dict load, advanced one pass, 39081 +github.tar, level 19, advanced one pass, 32276 +github.tar, level 19 with dict, advanced one pass, 32712 +github.tar, level 19 with dict dms, advanced one pass, 32555 +github.tar, level 19 with dict dds, advanced one pass, 32555 +github.tar, level 19 with dict copy, advanced one pass, 32712 +github.tar, level 19 with dict load, advanced one pass, 32479 +github.tar, no source size, advanced one pass, 38831 github.tar, no source size with dict, advanced one pass, 37995 -github.tar, long distance mode, advanced one pass, 39757 -github.tar, multithreaded, advanced one pass, 38441 -github.tar, multithreaded long distance mode, advanced one pass, 39726 +github.tar, long distance mode, advanced one pass, 40252 +github.tar, multithreaded, advanced one pass, 38831 +github.tar, multithreaded long distance mode, advanced one pass, 40232 github.tar, small window log, advanced one pass, 198540 github.tar, small hash log, advanced one pass, 129870 github.tar, small chain log, advanced one pass, 41669 -github.tar, explicit params, advanced one pass, 41227 -github.tar, uncompressed literals, advanced one pass, 41122 -github.tar, uncompressed literals optimal, advanced one pass, 35388 -github.tar, huffman literals, advanced one pass, 38777 -github.tar, multithreaded with advanced params, advanced one pass, 41122 -silesia, level -5, advanced one pass small out, 6737607 -silesia, level -3, advanced one pass small out, 6444677 -silesia, level -1, advanced one pass small out, 6178460 -silesia, level 0, advanced one pass small out, 4849552 -silesia, level 1, advanced one pass small out, 5313204 -silesia, level 3, advanced one pass small out, 4849552 -silesia, level 4, advanced one pass small out, 4786970 -silesia, level 5 row 1, advanced one pass small out, 4710236 -silesia, level 5 row 2, advanced one pass small out, 4707794 -silesia, level 5, advanced one pass small out, 4707794 -silesia, level 6, advanced one pass small out, 4666383 -silesia, level 7 row 1, advanced one pass small out, 4596296 -silesia, level 7 row 2, advanced one pass small out, 4603381 -silesia, level 7, advanced one pass small out, 4603381 -silesia, level 9, advanced one pass small out, 4546001 -silesia, level 12 row 1, advanced one pass small out, 4519288 -silesia, level 12 row 2, advanced one pass small out, 4521397 -silesia, level 13, advanced one pass small out, 4482135 -silesia, level 16, advanced one pass small out, 4360251 -silesia, level 19, advanced one pass small out, 4283237 -silesia, no source size, advanced one pass small out, 4849552 -silesia, long distance mode, advanced one pass small out, 4840738 -silesia, multithreaded, advanced one pass small out, 4849552 -silesia, multithreaded long distance mode, advanced one pass small out, 4840758 -silesia, small window log, advanced one pass small out, 7095919 +github.tar, explicit params, advanced one pass, 41385 +github.tar, uncompressed literals, advanced one pass, 41525 +github.tar, uncompressed literals optimal, advanced one pass, 35397 +github.tar, huffman literals, advanced one pass, 38853 +github.tar, multithreaded with advanced params, advanced one pass, 41525 +silesia, level -5, advanced one pass small out, 6857372 +silesia, level -3, advanced one pass small out, 6503412 +silesia, level -1, advanced one pass small out, 6172202 +silesia, level 0, advanced one pass small out, 4842075 +silesia, level 1, advanced one pass small out, 5306632 +silesia, level 3, advanced one pass small out, 4842075 +silesia, level 4, advanced one pass small out, 4779186 +silesia, level 5 row 1, advanced one pass small out, 4666323 +silesia, level 5 row 2, advanced one pass small out, 4670136 +silesia, level 5, advanced one pass small out, 4666323 +silesia, level 6, advanced one pass small out, 4603066 +silesia, level 7 row 1, advanced one pass small out, 4566984 +silesia, level 7 row 2, advanced one pass small out, 4564868 +silesia, level 7, advanced one pass small out, 4566984 +silesia, level 9, advanced one pass small out, 4543018 +silesia, level 11 row 1, advanced one pass small out, 4505046 +silesia, level 11 row 2, advanced one pass small out, 4503116 +silesia, level 12 row 1, advanced one pass small out, 4505046 +silesia, level 12 row 2, advanced one pass small out, 4503116 +silesia, level 13, advanced one pass small out, 4493990 +silesia, level 16, advanced one pass small out, 4360041 +silesia, level 19, advanced one pass small out, 4296055 +silesia, no source size, advanced one pass small out, 4842075 +silesia, long distance mode, advanced one pass small out, 4833710 +silesia, multithreaded, advanced one pass small out, 4842075 +silesia, multithreaded long distance mode, advanced one pass small out, 4833737 +silesia, small window log, advanced one pass small out, 7095000 silesia, small hash log, advanced one pass small out, 6526141 silesia, small chain log, advanced one pass small out, 4912197 -silesia, explicit params, advanced one pass small out, 4795856 -silesia, uncompressed literals, advanced one pass small out, 5127982 -silesia, uncompressed literals optimal, advanced one pass small out, 4317896 -silesia, huffman literals, advanced one pass small out, 5326268 -silesia, multithreaded with advanced params, advanced one pass small out, 5127982 -silesia.tar, level -5, advanced one pass small out, 6738593 -silesia.tar, level -3, advanced one pass small out, 6446372 -silesia.tar, level -1, advanced one pass small out, 6186042 -silesia.tar, level 0, advanced one pass small out, 4861425 -silesia.tar, level 1, advanced one pass small out, 5334885 -silesia.tar, level 3, advanced one pass small out, 4861425 -silesia.tar, level 4, advanced one pass small out, 4799630 -silesia.tar, level 5 row 1, advanced one pass small out, 4722324 -silesia.tar, level 5 row 2, advanced one pass small out, 4719256 -silesia.tar, level 5, advanced one pass small out, 4719256 -silesia.tar, level 6, advanced one pass small out, 4677721 -silesia.tar, level 7 row 1, advanced one pass small out, 4606715 -silesia.tar, level 7 row 2, advanced one pass small out, 4613541 -silesia.tar, level 7, advanced one pass small out, 4613541 -silesia.tar, level 9, advanced one pass small out, 4555426 -silesia.tar, level 12 row 1, advanced one pass small out, 4529459 -silesia.tar, level 12 row 2, advanced one pass small out, 4530256 -silesia.tar, level 13, advanced one pass small out, 4491764 -silesia.tar, level 16, advanced one pass small out, 4356827 -silesia.tar, level 19, advanced one pass small out, 4264487 -silesia.tar, no source size, advanced one pass small out, 4861425 -silesia.tar, long distance mode, advanced one pass small out, 4847754 -silesia.tar, multithreaded, advanced one pass small out, 4861508 -silesia.tar, multithreaded long distance mode, advanced one pass small out, 4853222 -silesia.tar, small window log, advanced one pass small out, 7101530 -silesia.tar, small hash log, advanced one pass small out, 6529232 +silesia, explicit params, advanced one pass small out, 4795432 +silesia, uncompressed literals, advanced one pass small out, 5120566 +silesia, uncompressed literals optimal, advanced one pass small out, 4319518 +silesia, huffman literals, advanced one pass small out, 5321369 +silesia, multithreaded with advanced params, advanced one pass small out, 5120566 +silesia.tar, level -5, advanced one pass small out, 6861055 +silesia.tar, level -3, advanced one pass small out, 6505483 +silesia.tar, level -1, advanced one pass small out, 6179047 +silesia.tar, level 0, advanced one pass small out, 4854086 +silesia.tar, level 1, advanced one pass small out, 5327717 +silesia.tar, level 3, advanced one pass small out, 4854086 +silesia.tar, level 4, advanced one pass small out, 4791503 +silesia.tar, level 5 row 1, advanced one pass small out, 4677740 +silesia.tar, level 5 row 2, advanced one pass small out, 4682161 +silesia.tar, level 5, advanced one pass small out, 4677740 +silesia.tar, level 6, advanced one pass small out, 4613242 +silesia.tar, level 7 row 1, advanced one pass small out, 4576661 +silesia.tar, level 7 row 2, advanced one pass small out, 4575393 +silesia.tar, level 7, advanced one pass small out, 4576661 +silesia.tar, level 9, advanced one pass small out, 4552899 +silesia.tar, level 11 row 1, advanced one pass small out, 4514432 +silesia.tar, level 11 row 2, advanced one pass small out, 4513604 +silesia.tar, level 12 row 1, advanced one pass small out, 4514049 +silesia.tar, level 12 row 2, advanced one pass small out, 4513797 +silesia.tar, level 13, advanced one pass small out, 4502956 +silesia.tar, level 16, advanced one pass small out, 4360546 +silesia.tar, level 19, advanced one pass small out, 4265911 +silesia.tar, no source size, advanced one pass small out, 4854086 +silesia.tar, long distance mode, advanced one pass small out, 4840452 +silesia.tar, multithreaded, advanced one pass small out, 4854160 +silesia.tar, multithreaded long distance mode, advanced one pass small out, 4845741 +silesia.tar, small window log, advanced one pass small out, 7100655 +silesia.tar, small hash log, advanced one pass small out, 6529206 silesia.tar, small chain log, advanced one pass small out, 4917041 -silesia.tar, explicit params, advanced one pass small out, 4807380 -silesia.tar, uncompressed literals, advanced one pass small out, 5129458 -silesia.tar, uncompressed literals optimal, advanced one pass small out, 4307453 -silesia.tar, huffman literals, advanced one pass small out, 5347335 -silesia.tar, multithreaded with advanced params, advanced one pass small out, 5129555 -github, level -5, advanced one pass small out, 205285 +silesia.tar, explicit params, advanced one pass small out, 4806855 +silesia.tar, uncompressed literals, advanced one pass small out, 5122473 +silesia.tar, uncompressed literals optimal, advanced one pass small out, 4310141 +silesia.tar, huffman literals, advanced one pass small out, 5341705 +silesia.tar, multithreaded with advanced params, advanced one pass small out, 5122567 +github, level -5, advanced one pass small out, 204407 github, level -5 with dict, advanced one pass small out, 46718 -github, level -3, advanced one pass small out, 190643 +github, level -3, advanced one pass small out, 193253 github, level -3 with dict, advanced one pass small out, 45395 -github, level -1, advanced one pass small out, 175568 +github, level -1, advanced one pass small out, 175468 github, level -1 with dict, advanced one pass small out, 43170 -github, level 0, advanced one pass small out, 136335 +github, level 0, advanced one pass small out, 136332 github, level 0 with dict, advanced one pass small out, 41148 github, level 0 with dict dms, advanced one pass small out, 41148 github, level 0 with dict dds, advanced one pass small out, 41148 github, level 0 with dict copy, advanced one pass small out, 41124 github, level 0 with dict load, advanced one pass small out, 42252 -github, level 1, advanced one pass small out, 142465 +github, level 1, advanced one pass small out, 142365 github, level 1 with dict, advanced one pass small out, 41682 github, level 1 with dict dms, advanced one pass small out, 41682 github, level 1 with dict dds, advanced one pass small out, 41682 -github, level 1 with dict copy, advanced one pass small out, 41674 -github, level 1 with dict load, advanced one pass small out, 43755 -github, level 3, advanced one pass small out, 136335 +github, level 1 with dict copy, advanced one pass small out, 41698 +github, level 1 with dict load, advanced one pass small out, 43814 +github, level 3, advanced one pass small out, 136332 github, level 3 with dict, advanced one pass small out, 41148 github, level 3 with dict dms, advanced one pass small out, 41148 github, level 3 with dict dds, advanced one pass small out, 41148 @@ -616,16 +644,16 @@ github, level 4 with dict dms, advanced github, level 4 with dict dds, advanced one pass small out, 41251 github, level 4 with dict copy, advanced one pass small out, 41216 github, level 4 with dict load, advanced one pass small out, 41159 -github, level 5 row 1, advanced one pass small out, 135121 -github, level 5 row 1 with dict dms, advanced one pass small out, 38938 -github, level 5 row 1 with dict dds, advanced one pass small out, 38732 -github, level 5 row 1 with dict copy, advanced one pass small out, 38934 -github, level 5 row 1 with dict load, advanced one pass small out, 40725 -github, level 5 row 2, advanced one pass small out, 134584 -github, level 5 row 2 with dict dms, advanced one pass small out, 38758 -github, level 5 row 2 with dict dds, advanced one pass small out, 38728 -github, level 5 row 2 with dict copy, advanced one pass small out, 38759 -github, level 5 row 2 with dict load, advanced one pass small out, 41518 +github, level 5 row 1, advanced one pass small out, 134584 +github, level 5 row 1 with dict dms, advanced one pass small out, 38758 +github, level 5 row 1 with dict dds, advanced one pass small out, 38728 +github, level 5 row 1 with dict copy, advanced one pass small out, 38759 +github, level 5 row 1 with dict load, advanced one pass small out, 41518 +github, level 5 row 2, advanced one pass small out, 135121 +github, level 5 row 2 with dict dms, advanced one pass small out, 38938 +github, level 5 row 2 with dict dds, advanced one pass small out, 38732 +github, level 5 row 2 with dict copy, advanced one pass small out, 38934 +github, level 5 row 2 with dict load, advanced one pass small out, 40725 github, level 5, advanced one pass small out, 135121 github, level 5 with dict, advanced one pass small out, 38758 github, level 5 with dict dms, advanced one pass small out, 38758 @@ -635,270 +663,294 @@ github, level 5 with dict load, advanced github, level 6, advanced one pass small out, 135122 github, level 6 with dict, advanced one pass small out, 38671 github, level 6 with dict dms, advanced one pass small out, 38671 -github, level 6 with dict dds, advanced one pass small out, 38630 +github, level 6 with dict dds, advanced one pass small out, 38636 github, level 6 with dict copy, advanced one pass small out, 38669 github, level 6 with dict load, advanced one pass small out, 40695 -github, level 7 row 1, advanced one pass small out, 135122 -github, level 7 row 1 with dict dms, advanced one pass small out, 38771 -github, level 7 row 1 with dict dds, advanced one pass small out, 38771 -github, level 7 row 1 with dict copy, advanced one pass small out, 38745 -github, level 7 row 1 with dict load, advanced one pass small out, 40695 -github, level 7 row 2, advanced one pass small out, 134584 -github, level 7 row 2 with dict dms, advanced one pass small out, 38758 -github, level 7 row 2 with dict dds, advanced one pass small out, 38747 -github, level 7 row 2 with dict copy, advanced one pass small out, 38755 -github, level 7 row 2 with dict load, advanced one pass small out, 41030 +github, level 7 row 1, advanced one pass small out, 134584 +github, level 7 row 1 with dict dms, advanced one pass small out, 38758 +github, level 7 row 1 with dict dds, advanced one pass small out, 38745 +github, level 7 row 1 with dict copy, advanced one pass small out, 38755 +github, level 7 row 1 with dict load, advanced one pass small out, 43154 +github, level 7 row 2, advanced one pass small out, 135122 +github, level 7 row 2 with dict dms, advanced one pass small out, 38860 +github, level 7 row 2 with dict dds, advanced one pass small out, 38766 +github, level 7 row 2 with dict copy, advanced one pass small out, 38834 +github, level 7 row 2 with dict load, advanced one pass small out, 40695 github, level 7, advanced one pass small out, 135122 github, level 7 with dict, advanced one pass small out, 38758 github, level 7 with dict dms, advanced one pass small out, 38758 -github, level 7 with dict dds, advanced one pass small out, 38747 +github, level 7 with dict dds, advanced one pass small out, 38745 github, level 7 with dict copy, advanced one pass small out, 38755 github, level 7 with dict load, advanced one pass small out, 40695 github, level 9, advanced one pass small out, 135122 github, level 9 with dict, advanced one pass small out, 39437 github, level 9 with dict dms, advanced one pass small out, 39437 -github, level 9 with dict dds, advanced one pass small out, 39338 +github, level 9 with dict dds, advanced one pass small out, 39393 github, level 9 with dict copy, advanced one pass small out, 39398 github, level 9 with dict load, advanced one pass small out, 41710 -github, level 12 row 1, advanced one pass small out, 134180 +github, level 11 row 1, advanced one pass small out, 135367 +github, level 11 row 1 with dict dms, advanced one pass small out, 39671 +github, level 11 row 1 with dict dds, advanced one pass small out, 39671 +github, level 11 row 1 with dict copy, advanced one pass small out, 39651 +github, level 11 row 1 with dict load, advanced one pass small out, 41360 +github, level 11 row 2, advanced one pass small out, 135367 +github, level 11 row 2 with dict dms, advanced one pass small out, 39671 +github, level 11 row 2 with dict dds, advanced one pass small out, 39671 +github, level 11 row 2 with dict copy, advanced one pass small out, 39651 +github, level 11 row 2 with dict load, advanced one pass small out, 41360 +github, level 12 row 1, advanced one pass small out, 134402 github, level 12 row 1 with dict dms, advanced one pass small out, 39677 github, level 12 row 1 with dict dds, advanced one pass small out, 39677 github, level 12 row 1 with dict copy, advanced one pass small out, 39677 github, level 12 row 1 with dict load, advanced one pass small out, 41166 -github, level 12 row 2, advanced one pass small out, 134180 +github, level 12 row 2, advanced one pass small out, 134402 github, level 12 row 2 with dict dms, advanced one pass small out, 39677 github, level 12 row 2 with dict dds, advanced one pass small out, 39677 github, level 12 row 2 with dict copy, advanced one pass small out, 39677 github, level 12 row 2 with dict load, advanced one pass small out, 41166 -github, level 13, advanced one pass small out, 134064 -github, level 13 with dict, advanced one pass small out, 39743 -github, level 13 with dict dms, advanced one pass small out, 39743 -github, level 13 with dict dds, advanced one pass small out, 39743 +github, level 13, advanced one pass small out, 132878 +github, level 13 with dict, advanced one pass small out, 39900 +github, level 13 with dict dms, advanced one pass small out, 39900 +github, level 13 with dict dds, advanced one pass small out, 39900 github, level 13 with dict copy, advanced one pass small out, 39948 -github, level 13 with dict load, advanced one pass small out, 42626 -github, level 16, advanced one pass small out, 134064 +github, level 13 with dict load, advanced one pass small out, 42624 +github, level 16, advanced one pass small out, 133209 github, level 16 with dict, advanced one pass small out, 37577 github, level 16 with dict dms, advanced one pass small out, 37577 github, level 16 with dict dds, advanced one pass small out, 37577 github, level 16 with dict copy, advanced one pass small out, 37568 -github, level 16 with dict load, advanced one pass small out, 42340 -github, level 19, advanced one pass small out, 134064 +github, level 16 with dict load, advanced one pass small out, 42338 +github, level 19, advanced one pass small out, 132879 github, level 19 with dict, advanced one pass small out, 37576 github, level 19 with dict dms, advanced one pass small out, 37576 github, level 19 with dict dds, advanced one pass small out, 37576 github, level 19 with dict copy, advanced one pass small out, 37567 github, level 19 with dict load, advanced one pass small out, 39613 -github, no source size, advanced one pass small out, 136335 +github, no source size, advanced one pass small out, 136332 github, no source size with dict, advanced one pass small out, 41148 -github, long distance mode, advanced one pass small out, 136335 -github, multithreaded, advanced one pass small out, 136335 -github, multithreaded long distance mode, advanced one pass small out, 136335 -github, small window log, advanced one pass small out, 136335 +github, long distance mode, advanced one pass small out, 136332 +github, multithreaded, advanced one pass small out, 136332 +github, multithreaded long distance mode, advanced one pass small out, 136332 +github, small window log, advanced one pass small out, 136332 github, small hash log, advanced one pass small out, 135590 github, small chain log, advanced one pass small out, 136341 github, explicit params, advanced one pass small out, 137727 -github, uncompressed literals, advanced one pass small out, 165915 -github, uncompressed literals optimal, advanced one pass small out, 157227 -github, huffman literals, advanced one pass small out, 142465 -github, multithreaded with advanced params, advanced one pass small out, 165915 -github.tar, level -5, advanced one pass small out, 46856 -github.tar, level -5 with dict, advanced one pass small out, 44571 -github.tar, level -3, advanced one pass small out, 43754 -github.tar, level -3 with dict, advanced one pass small out, 41447 -github.tar, level -1, advanced one pass small out, 42490 -github.tar, level -1 with dict, advanced one pass small out, 41131 -github.tar, level 0, advanced one pass small out, 38441 +github, uncompressed literals, advanced one pass small out, 165911 +github, uncompressed literals optimal, advanced one pass small out, 152667 +github, huffman literals, advanced one pass small out, 142365 +github, multithreaded with advanced params, advanced one pass small out, 165911 +github.tar, level -5, advanced one pass small out, 52115 +github.tar, level -5 with dict, advanced one pass small out, 50974 +github.tar, level -3, advanced one pass small out, 45678 +github.tar, level -3 with dict, advanced one pass small out, 44656 +github.tar, level -1, advanced one pass small out, 42560 +github.tar, level -1 with dict, advanced one pass small out, 41151 +github.tar, level 0, advanced one pass small out, 38831 github.tar, level 0 with dict, advanced one pass small out, 37995 github.tar, level 0 with dict dms, advanced one pass small out, 38003 github.tar, level 0 with dict dds, advanced one pass small out, 38003 github.tar, level 0 with dict copy, advanced one pass small out, 37995 github.tar, level 0 with dict load, advanced one pass small out, 37956 -github.tar, level 1, advanced one pass small out, 39265 -github.tar, level 1 with dict, advanced one pass small out, 38280 -github.tar, level 1 with dict dms, advanced one pass small out, 38290 -github.tar, level 1 with dict dds, advanced one pass small out, 38290 -github.tar, level 1 with dict copy, advanced one pass small out, 38280 -github.tar, level 1 with dict load, advanced one pass small out, 38729 -github.tar, level 3, advanced one pass small out, 38441 +github.tar, level 1, advanced one pass small out, 39200 +github.tar, level 1 with dict, advanced one pass small out, 38089 +github.tar, level 1 with dict dms, advanced one pass small out, 38294 +github.tar, level 1 with dict dds, advanced one pass small out, 38294 +github.tar, level 1 with dict copy, advanced one pass small out, 38089 +github.tar, level 1 with dict load, advanced one pass small out, 38364 +github.tar, level 3, advanced one pass small out, 38831 github.tar, level 3 with dict, advanced one pass small out, 37995 github.tar, level 3 with dict dms, advanced one pass small out, 38003 github.tar, level 3 with dict dds, advanced one pass small out, 38003 github.tar, level 3 with dict copy, advanced one pass small out, 37995 github.tar, level 3 with dict load, advanced one pass small out, 37956 -github.tar, level 4, advanced one pass small out, 38467 +github.tar, level 4, advanced one pass small out, 38893 github.tar, level 4 with dict, advanced one pass small out, 37948 github.tar, level 4 with dict dms, advanced one pass small out, 37954 github.tar, level 4 with dict dds, advanced one pass small out, 37954 github.tar, level 4 with dict copy, advanced one pass small out, 37948 github.tar, level 4 with dict load, advanced one pass small out, 37927 -github.tar, level 5 row 1, advanced one pass small out, 39788 -github.tar, level 5 row 1 with dict dms, advanced one pass small out, 39365 -github.tar, level 5 row 1 with dict dds, advanced one pass small out, 39233 -github.tar, level 5 row 1 with dict copy, advanced one pass small out, 39715 -github.tar, level 5 row 1 with dict load, advanced one pass small out, 39209 -github.tar, level 5 row 2, advanced one pass small out, 39693 -github.tar, level 5 row 2 with dict dms, advanced one pass small out, 39024 -github.tar, level 5 row 2 with dict dds, advanced one pass small out, 39028 -github.tar, level 5 row 2 with dict copy, advanced one pass small out, 39040 -github.tar, level 5 row 2 with dict load, advanced one pass small out, 39037 -github.tar, level 5, advanced one pass small out, 39693 -github.tar, level 5 with dict, advanced one pass small out, 39040 -github.tar, level 5 with dict dms, advanced one pass small out, 39024 -github.tar, level 5 with dict dds, advanced one pass small out, 39028 -github.tar, level 5 with dict copy, advanced one pass small out, 39040 -github.tar, level 5 with dict load, advanced one pass small out, 39037 -github.tar, level 6, advanced one pass small out, 39621 -github.tar, level 6 with dict, advanced one pass small out, 38622 -github.tar, level 6 with dict dms, advanced one pass small out, 38608 -github.tar, level 6 with dict dds, advanced one pass small out, 38610 -github.tar, level 6 with dict copy, advanced one pass small out, 38622 -github.tar, level 6 with dict load, advanced one pass small out, 38962 -github.tar, level 7 row 1, advanced one pass small out, 39206 -github.tar, level 7 row 1 with dict dms, advanced one pass small out, 37954 -github.tar, level 7 row 1 with dict dds, advanced one pass small out, 37954 -github.tar, level 7 row 1 with dict copy, advanced one pass small out, 38071 -github.tar, level 7 row 1 with dict load, advanced one pass small out, 38584 -github.tar, level 7 row 2, advanced one pass small out, 39213 -github.tar, level 7 row 2 with dict dms, advanced one pass small out, 37848 -github.tar, level 7 row 2 with dict dds, advanced one pass small out, 37867 -github.tar, level 7 row 2 with dict copy, advanced one pass small out, 37848 -github.tar, level 7 row 2 with dict load, advanced one pass small out, 38582 -github.tar, level 7, advanced one pass small out, 39213 -github.tar, level 7 with dict, advanced one pass small out, 37848 -github.tar, level 7 with dict dms, advanced one pass small out, 37848 -github.tar, level 7 with dict dds, advanced one pass small out, 37867 -github.tar, level 7 with dict copy, advanced one pass small out, 37848 -github.tar, level 7 with dict load, advanced one pass small out, 38582 -github.tar, level 9, advanced one pass small out, 36758 -github.tar, level 9 with dict, advanced one pass small out, 36457 -github.tar, level 9 with dict dms, advanced one pass small out, 36549 -github.tar, level 9 with dict dds, advanced one pass small out, 36637 -github.tar, level 9 with dict copy, advanced one pass small out, 36457 -github.tar, level 9 with dict load, advanced one pass small out, 36350 -github.tar, level 12 row 1, advanced one pass small out, 36435 +github.tar, level 5 row 1, advanced one pass small out, 39651 +github.tar, level 5 row 1 with dict dms, advanced one pass small out, 39059 +github.tar, level 5 row 1 with dict dds, advanced one pass small out, 39067 +github.tar, level 5 row 1 with dict copy, advanced one pass small out, 39082 +github.tar, level 5 row 1 with dict load, advanced one pass small out, 38999 +github.tar, level 5 row 2, advanced one pass small out, 39701 +github.tar, level 5 row 2 with dict dms, advanced one pass small out, 39365 +github.tar, level 5 row 2 with dict dds, advanced one pass small out, 39233 +github.tar, level 5 row 2 with dict copy, advanced one pass small out, 39715 +github.tar, level 5 row 2 with dict load, advanced one pass small out, 39158 +github.tar, level 5, advanced one pass small out, 39651 +github.tar, level 5 with dict, advanced one pass small out, 39082 +github.tar, level 5 with dict dms, advanced one pass small out, 39059 +github.tar, level 5 with dict dds, advanced one pass small out, 39067 +github.tar, level 5 with dict copy, advanced one pass small out, 39082 +github.tar, level 5 with dict load, advanced one pass small out, 38999 +github.tar, level 6, advanced one pass small out, 39282 +github.tar, level 6 with dict, advanced one pass small out, 38656 +github.tar, level 6 with dict dms, advanced one pass small out, 38636 +github.tar, level 6 with dict dds, advanced one pass small out, 38634 +github.tar, level 6 with dict copy, advanced one pass small out, 38656 +github.tar, level 6 with dict load, advanced one pass small out, 38648 +github.tar, level 7 row 1, advanced one pass small out, 38110 +github.tar, level 7 row 1 with dict dms, advanced one pass small out, 37858 +github.tar, level 7 row 1 with dict dds, advanced one pass small out, 37882 +github.tar, level 7 row 1 with dict copy, advanced one pass small out, 37865 +github.tar, level 7 row 1 with dict load, advanced one pass small out, 37436 +github.tar, level 7 row 2, advanced one pass small out, 38077 +github.tar, level 7 row 2 with dict dms, advanced one pass small out, 38012 +github.tar, level 7 row 2 with dict dds, advanced one pass small out, 38014 +github.tar, level 7 row 2 with dict copy, advanced one pass small out, 38101 +github.tar, level 7 row 2 with dict load, advanced one pass small out, 37402 +github.tar, level 7, advanced one pass small out, 38110 +github.tar, level 7 with dict, advanced one pass small out, 37865 +github.tar, level 7 with dict dms, advanced one pass small out, 37858 +github.tar, level 7 with dict dds, advanced one pass small out, 37882 +github.tar, level 7 with dict copy, advanced one pass small out, 37865 +github.tar, level 7 with dict load, advanced one pass small out, 37436 +github.tar, level 9, advanced one pass small out, 36760 +github.tar, level 9 with dict, advanced one pass small out, 36484 +github.tar, level 9 with dict dms, advanced one pass small out, 36567 +github.tar, level 9 with dict dds, advanced one pass small out, 36628 +github.tar, level 9 with dict copy, advanced one pass small out, 36484 +github.tar, level 9 with dict load, advanced one pass small out, 36401 +github.tar, level 11 row 1, advanced one pass small out, 36081 +github.tar, level 11 row 1 with dict dms, advanced one pass small out, 36963 +github.tar, level 11 row 1 with dict dds, advanced one pass small out, 36963 +github.tar, level 11 row 1 with dict copy, advanced one pass small out, 36557 +github.tar, level 11 row 1 with dict load, advanced one pass small out, 36434 +github.tar, level 11 row 2, advanced one pass small out, 36110 +github.tar, level 11 row 2 with dict dms, advanced one pass small out, 36963 +github.tar, level 11 row 2 with dict dds, advanced one pass small out, 36963 +github.tar, level 11 row 2 with dict copy, advanced one pass small out, 36557 +github.tar, level 11 row 2 with dict load, advanced one pass small out, 36459 +github.tar, level 12 row 1, advanced one pass small out, 36081 github.tar, level 12 row 1 with dict dms, advanced one pass small out, 36986 github.tar, level 12 row 1 with dict dds, advanced one pass small out, 36986 github.tar, level 12 row 1 with dict copy, advanced one pass small out, 36609 -github.tar, level 12 row 1 with dict load, advanced one pass small out, 36419 -github.tar, level 12 row 2, advanced one pass small out, 36435 +github.tar, level 12 row 1 with dict load, advanced one pass small out, 36434 +github.tar, level 12 row 2, advanced one pass small out, 36110 github.tar, level 12 row 2 with dict dms, advanced one pass small out, 36986 github.tar, level 12 row 2 with dict dds, advanced one pass small out, 36986 github.tar, level 12 row 2 with dict copy, advanced one pass small out, 36609 -github.tar, level 12 row 2 with dict load, advanced one pass small out, 36424 -github.tar, level 13, advanced one pass small out, 35621 -github.tar, level 13 with dict, advanced one pass small out, 38726 -github.tar, level 13 with dict dms, advanced one pass small out, 38903 -github.tar, level 13 with dict dds, advanced one pass small out, 38903 -github.tar, level 13 with dict copy, advanced one pass small out, 38726 -github.tar, level 13 with dict load, advanced one pass small out, 36372 -github.tar, level 16, advanced one pass small out, 40255 -github.tar, level 16 with dict, advanced one pass small out, 33639 -github.tar, level 16 with dict dms, advanced one pass small out, 33544 -github.tar, level 16 with dict dds, advanced one pass small out, 33544 -github.tar, level 16 with dict copy, advanced one pass small out, 33639 -github.tar, level 16 with dict load, advanced one pass small out, 39353 -github.tar, level 19, advanced one pass small out, 32837 -github.tar, level 19 with dict, advanced one pass small out, 32895 -github.tar, level 19 with dict dms, advanced one pass small out, 32672 -github.tar, level 19 with dict dds, advanced one pass small out, 32672 -github.tar, level 19 with dict copy, advanced one pass small out, 32895 -github.tar, level 19 with dict load, advanced one pass small out, 32676 -github.tar, no source size, advanced one pass small out, 38441 +github.tar, level 12 row 2 with dict load, advanced one pass small out, 36459 +github.tar, level 13, advanced one pass small out, 35501 +github.tar, level 13 with dict, advanced one pass small out, 37130 +github.tar, level 13 with dict dms, advanced one pass small out, 37220 +github.tar, level 13 with dict dds, advanced one pass small out, 37220 +github.tar, level 13 with dict copy, advanced one pass small out, 37130 +github.tar, level 13 with dict load, advanced one pass small out, 36010 +github.tar, level 16, advanced one pass small out, 40466 +github.tar, level 16 with dict, advanced one pass small out, 33374 +github.tar, level 16 with dict dms, advanced one pass small out, 33206 +github.tar, level 16 with dict dds, advanced one pass small out, 33206 +github.tar, level 16 with dict copy, advanced one pass small out, 33374 +github.tar, level 16 with dict load, advanced one pass small out, 39081 +github.tar, level 19, advanced one pass small out, 32276 +github.tar, level 19 with dict, advanced one pass small out, 32712 +github.tar, level 19 with dict dms, advanced one pass small out, 32555 +github.tar, level 19 with dict dds, advanced one pass small out, 32555 +github.tar, level 19 with dict copy, advanced one pass small out, 32712 +github.tar, level 19 with dict load, advanced one pass small out, 32479 +github.tar, no source size, advanced one pass small out, 38831 github.tar, no source size with dict, advanced one pass small out, 37995 -github.tar, long distance mode, advanced one pass small out, 39757 -github.tar, multithreaded, advanced one pass small out, 38441 -github.tar, multithreaded long distance mode, advanced one pass small out, 39726 +github.tar, long distance mode, advanced one pass small out, 40252 +github.tar, multithreaded, advanced one pass small out, 38831 +github.tar, multithreaded long distance mode, advanced one pass small out, 40232 github.tar, small window log, advanced one pass small out, 198540 github.tar, small hash log, advanced one pass small out, 129870 github.tar, small chain log, advanced one pass small out, 41669 -github.tar, explicit params, advanced one pass small out, 41227 -github.tar, uncompressed literals, advanced one pass small out, 41122 -github.tar, uncompressed literals optimal, advanced one pass small out, 35388 -github.tar, huffman literals, advanced one pass small out, 38777 -github.tar, multithreaded with advanced params, advanced one pass small out, 41122 -silesia, level -5, advanced streaming, 6882505 -silesia, level -3, advanced streaming, 6568376 -silesia, level -1, advanced streaming, 6183403 -silesia, level 0, advanced streaming, 4849552 -silesia, level 1, advanced streaming, 5314162 -silesia, level 3, advanced streaming, 4849552 -silesia, level 4, advanced streaming, 4786970 -silesia, level 5 row 1, advanced streaming, 4710236 -silesia, level 5 row 2, advanced streaming, 4707794 -silesia, level 5, advanced streaming, 4707794 -silesia, level 6, advanced streaming, 4666383 -silesia, level 7 row 1, advanced streaming, 4596296 -silesia, level 7 row 2, advanced streaming, 4603381 -silesia, level 7, advanced streaming, 4603381 -silesia, level 9, advanced streaming, 4546001 -silesia, level 12 row 1, advanced streaming, 4519288 -silesia, level 12 row 2, advanced streaming, 4521397 -silesia, level 13, advanced streaming, 4482135 -silesia, level 16, advanced streaming, 4360251 -silesia, level 19, advanced streaming, 4283237 -silesia, no source size, advanced streaming, 4849516 -silesia, long distance mode, advanced streaming, 4840738 -silesia, multithreaded, advanced streaming, 4849552 -silesia, multithreaded long distance mode, advanced streaming, 4840758 -silesia, small window log, advanced streaming, 7112062 +github.tar, explicit params, advanced one pass small out, 41385 +github.tar, uncompressed literals, advanced one pass small out, 41525 +github.tar, uncompressed literals optimal, advanced one pass small out, 35397 +github.tar, huffman literals, advanced one pass small out, 38853 +github.tar, multithreaded with advanced params, advanced one pass small out, 41525 +silesia, level -5, advanced streaming, 6854744 +silesia, level -3, advanced streaming, 6503319 +silesia, level -1, advanced streaming, 6172207 +silesia, level 0, advanced streaming, 4842075 +silesia, level 1, advanced streaming, 5306388 +silesia, level 3, advanced streaming, 4842075 +silesia, level 4, advanced streaming, 4779186 +silesia, level 5 row 1, advanced streaming, 4666323 +silesia, level 5 row 2, advanced streaming, 4670136 +silesia, level 5, advanced streaming, 4666323 +silesia, level 6, advanced streaming, 4603066 +silesia, level 7 row 1, advanced streaming, 4566984 +silesia, level 7 row 2, advanced streaming, 4564868 +silesia, level 7, advanced streaming, 4566984 +silesia, level 9, advanced streaming, 4543018 +silesia, level 11 row 1, advanced streaming, 4505046 +silesia, level 11 row 2, advanced streaming, 4503116 +silesia, level 12 row 1, advanced streaming, 4505046 +silesia, level 12 row 2, advanced streaming, 4503116 +silesia, level 13, advanced streaming, 4493990 +silesia, level 16, advanced streaming, 4360041 +silesia, level 19, advanced streaming, 4296055 +silesia, no source size, advanced streaming, 4842039 +silesia, long distance mode, advanced streaming, 4833710 +silesia, multithreaded, advanced streaming, 4842075 +silesia, multithreaded long distance mode, advanced streaming, 4833737 +silesia, small window log, advanced streaming, 7111103 silesia, small hash log, advanced streaming, 6526141 silesia, small chain log, advanced streaming, 4912197 -silesia, explicit params, advanced streaming, 4795887 -silesia, uncompressed literals, advanced streaming, 5127982 -silesia, uncompressed literals optimal, advanced streaming, 4317896 -silesia, huffman literals, advanced streaming, 5331168 -silesia, multithreaded with advanced params, advanced streaming, 5127982 -silesia.tar, level -5, advanced streaming, 6982759 -silesia.tar, level -3, advanced streaming, 6641283 -silesia.tar, level -1, advanced streaming, 6190795 -silesia.tar, level 0, advanced streaming, 4861427 -silesia.tar, level 1, advanced streaming, 5336939 -silesia.tar, level 3, advanced streaming, 4861427 -silesia.tar, level 4, advanced streaming, 4799630 -silesia.tar, level 5 row 1, advanced streaming, 4722329 -silesia.tar, level 5 row 2, advanced streaming, 4719261 -silesia.tar, level 5, advanced streaming, 4719261 -silesia.tar, level 6, advanced streaming, 4677729 -silesia.tar, level 7 row 1, advanced streaming, 4606715 -silesia.tar, level 7 row 2, advanced streaming, 4613544 -silesia.tar, level 7, advanced streaming, 4613544 -silesia.tar, level 9, advanced streaming, 4555432 -silesia.tar, level 12 row 1, advanced streaming, 4529459 -silesia.tar, level 12 row 2, advanced streaming, 4530258 -silesia.tar, level 13, advanced streaming, 4491765 -silesia.tar, level 16, advanced streaming, 4356834 -silesia.tar, level 19, advanced streaming, 4264392 -silesia.tar, no source size, advanced streaming, 4861423 -silesia.tar, long distance mode, advanced streaming, 4847754 -silesia.tar, multithreaded, advanced streaming, 4861508 -silesia.tar, multithreaded long distance mode, advanced streaming, 4853222 -silesia.tar, small window log, advanced streaming, 7118769 -silesia.tar, small hash log, advanced streaming, 6529235 +silesia, explicit params, advanced streaming, 4795452 +silesia, uncompressed literals, advanced streaming, 5120566 +silesia, uncompressed literals optimal, advanced streaming, 4319518 +silesia, huffman literals, advanced streaming, 5321370 +silesia, multithreaded with advanced params, advanced streaming, 5120566 +silesia.tar, level -5, advanced streaming, 6856523 +silesia.tar, level -3, advanced streaming, 6505954 +silesia.tar, level -1, advanced streaming, 6179056 +silesia.tar, level 0, advanced streaming, 4859271 +silesia.tar, level 1, advanced streaming, 5327708 +silesia.tar, level 3, advanced streaming, 4859271 +silesia.tar, level 4, advanced streaming, 4797470 +silesia.tar, level 5 row 1, advanced streaming, 4677748 +silesia.tar, level 5 row 2, advanced streaming, 4682169 +silesia.tar, level 5, advanced streaming, 4677748 +silesia.tar, level 6, advanced streaming, 4613246 +silesia.tar, level 7 row 1, advanced streaming, 4576664 +silesia.tar, level 7 row 2, advanced streaming, 4575394 +silesia.tar, level 7, advanced streaming, 4576664 +silesia.tar, level 9, advanced streaming, 4552900 +silesia.tar, level 11 row 1, advanced streaming, 4514433 +silesia.tar, level 11 row 2, advanced streaming, 4513604 +silesia.tar, level 12 row 1, advanced streaming, 4514049 +silesia.tar, level 12 row 2, advanced streaming, 4513797 +silesia.tar, level 13, advanced streaming, 4502956 +silesia.tar, level 16, advanced streaming, 4360546 +silesia.tar, level 19, advanced streaming, 4265911 +silesia.tar, no source size, advanced streaming, 4859267 +silesia.tar, long distance mode, advanced streaming, 4840452 +silesia.tar, multithreaded, advanced streaming, 4854160 +silesia.tar, multithreaded long distance mode, advanced streaming, 4845741 +silesia.tar, small window log, advanced streaming, 7117559 +silesia.tar, small hash log, advanced streaming, 6529209 silesia.tar, small chain log, advanced streaming, 4917021 -silesia.tar, explicit params, advanced streaming, 4807401 -silesia.tar, uncompressed literals, advanced streaming, 5129461 -silesia.tar, uncompressed literals optimal, advanced streaming, 4307400 -silesia.tar, huffman literals, advanced streaming, 5352360 -silesia.tar, multithreaded with advanced params, advanced streaming, 5129555 -github, level -5, advanced streaming, 205285 +silesia.tar, explicit params, advanced streaming, 4806873 +silesia.tar, uncompressed literals, advanced streaming, 5127423 +silesia.tar, uncompressed literals optimal, advanced streaming, 4310141 +silesia.tar, huffman literals, advanced streaming, 5341712 +silesia.tar, multithreaded with advanced params, advanced streaming, 5122567 +github, level -5, advanced streaming, 204407 github, level -5 with dict, advanced streaming, 46718 -github, level -3, advanced streaming, 190643 +github, level -3, advanced streaming, 193253 github, level -3 with dict, advanced streaming, 45395 -github, level -1, advanced streaming, 175568 +github, level -1, advanced streaming, 175468 github, level -1 with dict, advanced streaming, 43170 -github, level 0, advanced streaming, 136335 +github, level 0, advanced streaming, 136332 github, level 0 with dict, advanced streaming, 41148 github, level 0 with dict dms, advanced streaming, 41148 github, level 0 with dict dds, advanced streaming, 41148 github, level 0 with dict copy, advanced streaming, 41124 github, level 0 with dict load, advanced streaming, 42252 -github, level 1, advanced streaming, 142465 +github, level 1, advanced streaming, 142365 github, level 1 with dict, advanced streaming, 41682 github, level 1 with dict dms, advanced streaming, 41682 github, level 1 with dict dds, advanced streaming, 41682 -github, level 1 with dict copy, advanced streaming, 41674 -github, level 1 with dict load, advanced streaming, 43755 -github, level 3, advanced streaming, 136335 +github, level 1 with dict copy, advanced streaming, 41698 +github, level 1 with dict load, advanced streaming, 43814 +github, level 3, advanced streaming, 136332 github, level 3 with dict, advanced streaming, 41148 github, level 3 with dict dms, advanced streaming, 41148 github, level 3 with dict dds, advanced streaming, 41148 @@ -910,16 +962,16 @@ github, level 4 with dict dms, advanced github, level 4 with dict dds, advanced streaming, 41251 github, level 4 with dict copy, advanced streaming, 41216 github, level 4 with dict load, advanced streaming, 41159 -github, level 5 row 1, advanced streaming, 135121 -github, level 5 row 1 with dict dms, advanced streaming, 38938 -github, level 5 row 1 with dict dds, advanced streaming, 38732 -github, level 5 row 1 with dict copy, advanced streaming, 38934 -github, level 5 row 1 with dict load, advanced streaming, 40725 -github, level 5 row 2, advanced streaming, 134584 -github, level 5 row 2 with dict dms, advanced streaming, 38758 -github, level 5 row 2 with dict dds, advanced streaming, 38728 -github, level 5 row 2 with dict copy, advanced streaming, 38759 -github, level 5 row 2 with dict load, advanced streaming, 41518 +github, level 5 row 1, advanced streaming, 134584 +github, level 5 row 1 with dict dms, advanced streaming, 38758 +github, level 5 row 1 with dict dds, advanced streaming, 38728 +github, level 5 row 1 with dict copy, advanced streaming, 38759 +github, level 5 row 1 with dict load, advanced streaming, 41518 +github, level 5 row 2, advanced streaming, 135121 +github, level 5 row 2 with dict dms, advanced streaming, 38938 +github, level 5 row 2 with dict dds, advanced streaming, 38732 +github, level 5 row 2 with dict copy, advanced streaming, 38934 +github, level 5 row 2 with dict load, advanced streaming, 40725 github, level 5, advanced streaming, 135121 github, level 5 with dict, advanced streaming, 38758 github, level 5 with dict dms, advanced streaming, 38758 @@ -929,234 +981,254 @@ github, level 5 with dict load, advanced github, level 6, advanced streaming, 135122 github, level 6 with dict, advanced streaming, 38671 github, level 6 with dict dms, advanced streaming, 38671 -github, level 6 with dict dds, advanced streaming, 38630 +github, level 6 with dict dds, advanced streaming, 38636 github, level 6 with dict copy, advanced streaming, 38669 github, level 6 with dict load, advanced streaming, 40695 -github, level 7 row 1, advanced streaming, 135122 -github, level 7 row 1 with dict dms, advanced streaming, 38771 -github, level 7 row 1 with dict dds, advanced streaming, 38771 -github, level 7 row 1 with dict copy, advanced streaming, 38745 -github, level 7 row 1 with dict load, advanced streaming, 40695 -github, level 7 row 2, advanced streaming, 134584 -github, level 7 row 2 with dict dms, advanced streaming, 38758 -github, level 7 row 2 with dict dds, advanced streaming, 38747 -github, level 7 row 2 with dict copy, advanced streaming, 38755 -github, level 7 row 2 with dict load, advanced streaming, 41030 +github, level 7 row 1, advanced streaming, 134584 +github, level 7 row 1 with dict dms, advanced streaming, 38758 +github, level 7 row 1 with dict dds, advanced streaming, 38745 +github, level 7 row 1 with dict copy, advanced streaming, 38755 +github, level 7 row 1 with dict load, advanced streaming, 43154 +github, level 7 row 2, advanced streaming, 135122 +github, level 7 row 2 with dict dms, advanced streaming, 38860 +github, level 7 row 2 with dict dds, advanced streaming, 38766 +github, level 7 row 2 with dict copy, advanced streaming, 38834 +github, level 7 row 2 with dict load, advanced streaming, 40695 github, level 7, advanced streaming, 135122 github, level 7 with dict, advanced streaming, 38758 github, level 7 with dict dms, advanced streaming, 38758 -github, level 7 with dict dds, advanced streaming, 38747 +github, level 7 with dict dds, advanced streaming, 38745 github, level 7 with dict copy, advanced streaming, 38755 github, level 7 with dict load, advanced streaming, 40695 github, level 9, advanced streaming, 135122 github, level 9 with dict, advanced streaming, 39437 github, level 9 with dict dms, advanced streaming, 39437 -github, level 9 with dict dds, advanced streaming, 39338 +github, level 9 with dict dds, advanced streaming, 39393 github, level 9 with dict copy, advanced streaming, 39398 github, level 9 with dict load, advanced streaming, 41710 -github, level 12 row 1, advanced streaming, 134180 +github, level 11 row 1, advanced streaming, 135367 +github, level 11 row 1 with dict dms, advanced streaming, 39671 +github, level 11 row 1 with dict dds, advanced streaming, 39671 +github, level 11 row 1 with dict copy, advanced streaming, 39651 +github, level 11 row 1 with dict load, advanced streaming, 41360 +github, level 11 row 2, advanced streaming, 135367 +github, level 11 row 2 with dict dms, advanced streaming, 39671 +github, level 11 row 2 with dict dds, advanced streaming, 39671 +github, level 11 row 2 with dict copy, advanced streaming, 39651 +github, level 11 row 2 with dict load, advanced streaming, 41360 +github, level 12 row 1, advanced streaming, 134402 github, level 12 row 1 with dict dms, advanced streaming, 39677 github, level 12 row 1 with dict dds, advanced streaming, 39677 github, level 12 row 1 with dict copy, advanced streaming, 39677 github, level 12 row 1 with dict load, advanced streaming, 41166 -github, level 12 row 2, advanced streaming, 134180 +github, level 12 row 2, advanced streaming, 134402 github, level 12 row 2 with dict dms, advanced streaming, 39677 github, level 12 row 2 with dict dds, advanced streaming, 39677 github, level 12 row 2 with dict copy, advanced streaming, 39677 github, level 12 row 2 with dict load, advanced streaming, 41166 -github, level 13, advanced streaming, 134064 -github, level 13 with dict, advanced streaming, 39743 -github, level 13 with dict dms, advanced streaming, 39743 -github, level 13 with dict dds, advanced streaming, 39743 +github, level 13, advanced streaming, 132878 +github, level 13 with dict, advanced streaming, 39900 +github, level 13 with dict dms, advanced streaming, 39900 +github, level 13 with dict dds, advanced streaming, 39900 github, level 13 with dict copy, advanced streaming, 39948 -github, level 13 with dict load, advanced streaming, 42626 -github, level 16, advanced streaming, 134064 +github, level 13 with dict load, advanced streaming, 42624 +github, level 16, advanced streaming, 133209 github, level 16 with dict, advanced streaming, 37577 github, level 16 with dict dms, advanced streaming, 37577 github, level 16 with dict dds, advanced streaming, 37577 github, level 16 with dict copy, advanced streaming, 37568 -github, level 16 with dict load, advanced streaming, 42340 -github, level 19, advanced streaming, 134064 +github, level 16 with dict load, advanced streaming, 42338 +github, level 19, advanced streaming, 132879 github, level 19 with dict, advanced streaming, 37576 github, level 19 with dict dms, advanced streaming, 37576 github, level 19 with dict dds, advanced streaming, 37576 github, level 19 with dict copy, advanced streaming, 37567 github, level 19 with dict load, advanced streaming, 39613 -github, no source size, advanced streaming, 136335 +github, no source size, advanced streaming, 136332 github, no source size with dict, advanced streaming, 41148 -github, long distance mode, advanced streaming, 136335 -github, multithreaded, advanced streaming, 136335 -github, multithreaded long distance mode, advanced streaming, 136335 -github, small window log, advanced streaming, 136335 +github, long distance mode, advanced streaming, 136332 +github, multithreaded, advanced streaming, 136332 +github, multithreaded long distance mode, advanced streaming, 136332 +github, small window log, advanced streaming, 136332 github, small hash log, advanced streaming, 135590 github, small chain log, advanced streaming, 136341 github, explicit params, advanced streaming, 137727 -github, uncompressed literals, advanced streaming, 165915 -github, uncompressed literals optimal, advanced streaming, 157227 -github, huffman literals, advanced streaming, 142465 -github, multithreaded with advanced params, advanced streaming, 165915 -github.tar, level -5, advanced streaming, 46747 -github.tar, level -5 with dict, advanced streaming, 44440 -github.tar, level -3, advanced streaming, 43537 -github.tar, level -3 with dict, advanced streaming, 41112 -github.tar, level -1, advanced streaming, 42465 -github.tar, level -1 with dict, advanced streaming, 41196 -github.tar, level 0, advanced streaming, 38441 +github, uncompressed literals, advanced streaming, 165911 +github, uncompressed literals optimal, advanced streaming, 152667 +github, huffman literals, advanced streaming, 142365 +github, multithreaded with advanced params, advanced streaming, 165911 +github.tar, level -5, advanced streaming, 52152 +github.tar, level -5 with dict, advanced streaming, 51045 +github.tar, level -3, advanced streaming, 45678 +github.tar, level -3 with dict, advanced streaming, 44656 +github.tar, level -1, advanced streaming, 42560 +github.tar, level -1 with dict, advanced streaming, 41151 +github.tar, level 0, advanced streaming, 38831 github.tar, level 0 with dict, advanced streaming, 37995 github.tar, level 0 with dict dms, advanced streaming, 38003 github.tar, level 0 with dict dds, advanced streaming, 38003 github.tar, level 0 with dict copy, advanced streaming, 37995 github.tar, level 0 with dict load, advanced streaming, 37956 -github.tar, level 1, advanced streaming, 39342 -github.tar, level 1 with dict, advanced streaming, 38293 -github.tar, level 1 with dict dms, advanced streaming, 38303 -github.tar, level 1 with dict dds, advanced streaming, 38303 -github.tar, level 1 with dict copy, advanced streaming, 38293 -github.tar, level 1 with dict load, advanced streaming, 38766 -github.tar, level 3, advanced streaming, 38441 +github.tar, level 1, advanced streaming, 39200 +github.tar, level 1 with dict, advanced streaming, 38089 +github.tar, level 1 with dict dms, advanced streaming, 38294 +github.tar, level 1 with dict dds, advanced streaming, 38294 +github.tar, level 1 with dict copy, advanced streaming, 38089 +github.tar, level 1 with dict load, advanced streaming, 38364 +github.tar, level 3, advanced streaming, 38831 github.tar, level 3 with dict, advanced streaming, 37995 github.tar, level 3 with dict dms, advanced streaming, 38003 github.tar, level 3 with dict dds, advanced streaming, 38003 github.tar, level 3 with dict copy, advanced streaming, 37995 github.tar, level 3 with dict load, advanced streaming, 37956 -github.tar, level 4, advanced streaming, 38467 +github.tar, level 4, advanced streaming, 38893 github.tar, level 4 with dict, advanced streaming, 37948 github.tar, level 4 with dict dms, advanced streaming, 37954 github.tar, level 4 with dict dds, advanced streaming, 37954 github.tar, level 4 with dict copy, advanced streaming, 37948 github.tar, level 4 with dict load, advanced streaming, 37927 -github.tar, level 5 row 1, advanced streaming, 39788 -github.tar, level 5 row 1 with dict dms, advanced streaming, 39365 -github.tar, level 5 row 1 with dict dds, advanced streaming, 39233 -github.tar, level 5 row 1 with dict copy, advanced streaming, 39715 -github.tar, level 5 row 1 with dict load, advanced streaming, 39209 -github.tar, level 5 row 2, advanced streaming, 39693 -github.tar, level 5 row 2 with dict dms, advanced streaming, 39024 -github.tar, level 5 row 2 with dict dds, advanced streaming, 39028 -github.tar, level 5 row 2 with dict copy, advanced streaming, 39040 -github.tar, level 5 row 2 with dict load, advanced streaming, 39037 -github.tar, level 5, advanced streaming, 39693 -github.tar, level 5 with dict, advanced streaming, 39040 -github.tar, level 5 with dict dms, advanced streaming, 39024 -github.tar, level 5 with dict dds, advanced streaming, 39028 -github.tar, level 5 with dict copy, advanced streaming, 39040 -github.tar, level 5 with dict load, advanced streaming, 39037 -github.tar, level 6, advanced streaming, 39621 -github.tar, level 6 with dict, advanced streaming, 38622 -github.tar, level 6 with dict dms, advanced streaming, 38608 -github.tar, level 6 with dict dds, advanced streaming, 38610 -github.tar, level 6 with dict copy, advanced streaming, 38622 -github.tar, level 6 with dict load, advanced streaming, 38962 -github.tar, level 7 row 1, advanced streaming, 39206 -github.tar, level 7 row 1 with dict dms, advanced streaming, 37954 -github.tar, level 7 row 1 with dict dds, advanced streaming, 37954 -github.tar, level 7 row 1 with dict copy, advanced streaming, 38071 -github.tar, level 7 row 1 with dict load, advanced streaming, 38584 -github.tar, level 7 row 2, advanced streaming, 39213 -github.tar, level 7 row 2 with dict dms, advanced streaming, 37848 -github.tar, level 7 row 2 with dict dds, advanced streaming, 37867 -github.tar, level 7 row 2 with dict copy, advanced streaming, 37848 -github.tar, level 7 row 2 with dict load, advanced streaming, 38582 -github.tar, level 7, advanced streaming, 39213 -github.tar, level 7 with dict, advanced streaming, 37848 -github.tar, level 7 with dict dms, advanced streaming, 37848 -github.tar, level 7 with dict dds, advanced streaming, 37867 -github.tar, level 7 with dict copy, advanced streaming, 37848 -github.tar, level 7 with dict load, advanced streaming, 38582 -github.tar, level 9, advanced streaming, 36758 -github.tar, level 9 with dict, advanced streaming, 36457 -github.tar, level 9 with dict dms, advanced streaming, 36549 -github.tar, level 9 with dict dds, advanced streaming, 36637 -github.tar, level 9 with dict copy, advanced streaming, 36457 -github.tar, level 9 with dict load, advanced streaming, 36350 -github.tar, level 12 row 1, advanced streaming, 36435 +github.tar, level 5 row 1, advanced streaming, 39651 +github.tar, level 5 row 1 with dict dms, advanced streaming, 39059 +github.tar, level 5 row 1 with dict dds, advanced streaming, 39067 +github.tar, level 5 row 1 with dict copy, advanced streaming, 39082 +github.tar, level 5 row 1 with dict load, advanced streaming, 38999 +github.tar, level 5 row 2, advanced streaming, 39701 +github.tar, level 5 row 2 with dict dms, advanced streaming, 39365 +github.tar, level 5 row 2 with dict dds, advanced streaming, 39233 +github.tar, level 5 row 2 with dict copy, advanced streaming, 39715 +github.tar, level 5 row 2 with dict load, advanced streaming, 39158 +github.tar, level 5, advanced streaming, 39651 +github.tar, level 5 with dict, advanced streaming, 39082 +github.tar, level 5 with dict dms, advanced streaming, 39059 +github.tar, level 5 with dict dds, advanced streaming, 39067 +github.tar, level 5 with dict copy, advanced streaming, 39082 +github.tar, level 5 with dict load, advanced streaming, 38999 +github.tar, level 6, advanced streaming, 39282 +github.tar, level 6 with dict, advanced streaming, 38656 +github.tar, level 6 with dict dms, advanced streaming, 38636 +github.tar, level 6 with dict dds, advanced streaming, 38634 +github.tar, level 6 with dict copy, advanced streaming, 38656 +github.tar, level 6 with dict load, advanced streaming, 38648 +github.tar, level 7 row 1, advanced streaming, 38110 +github.tar, level 7 row 1 with dict dms, advanced streaming, 37858 +github.tar, level 7 row 1 with dict dds, advanced streaming, 37882 +github.tar, level 7 row 1 with dict copy, advanced streaming, 37865 +github.tar, level 7 row 1 with dict load, advanced streaming, 37436 +github.tar, level 7 row 2, advanced streaming, 38077 +github.tar, level 7 row 2 with dict dms, advanced streaming, 38012 +github.tar, level 7 row 2 with dict dds, advanced streaming, 38014 +github.tar, level 7 row 2 with dict copy, advanced streaming, 38101 +github.tar, level 7 row 2 with dict load, advanced streaming, 37402 +github.tar, level 7, advanced streaming, 38110 +github.tar, level 7 with dict, advanced streaming, 37865 +github.tar, level 7 with dict dms, advanced streaming, 37858 +github.tar, level 7 with dict dds, advanced streaming, 37882 +github.tar, level 7 with dict copy, advanced streaming, 37865 +github.tar, level 7 with dict load, advanced streaming, 37436 +github.tar, level 9, advanced streaming, 36760 +github.tar, level 9 with dict, advanced streaming, 36484 +github.tar, level 9 with dict dms, advanced streaming, 36567 +github.tar, level 9 with dict dds, advanced streaming, 36628 +github.tar, level 9 with dict copy, advanced streaming, 36484 +github.tar, level 9 with dict load, advanced streaming, 36401 +github.tar, level 11 row 1, advanced streaming, 36081 +github.tar, level 11 row 1 with dict dms, advanced streaming, 36963 +github.tar, level 11 row 1 with dict dds, advanced streaming, 36963 +github.tar, level 11 row 1 with dict copy, advanced streaming, 36557 +github.tar, level 11 row 1 with dict load, advanced streaming, 36434 +github.tar, level 11 row 2, advanced streaming, 36110 +github.tar, level 11 row 2 with dict dms, advanced streaming, 36963 +github.tar, level 11 row 2 with dict dds, advanced streaming, 36963 +github.tar, level 11 row 2 with dict copy, advanced streaming, 36557 +github.tar, level 11 row 2 with dict load, advanced streaming, 36459 +github.tar, level 12 row 1, advanced streaming, 36081 github.tar, level 12 row 1 with dict dms, advanced streaming, 36986 github.tar, level 12 row 1 with dict dds, advanced streaming, 36986 github.tar, level 12 row 1 with dict copy, advanced streaming, 36609 -github.tar, level 12 row 1 with dict load, advanced streaming, 36419 -github.tar, level 12 row 2, advanced streaming, 36435 +github.tar, level 12 row 1 with dict load, advanced streaming, 36434 +github.tar, level 12 row 2, advanced streaming, 36110 github.tar, level 12 row 2 with dict dms, advanced streaming, 36986 github.tar, level 12 row 2 with dict dds, advanced streaming, 36986 github.tar, level 12 row 2 with dict copy, advanced streaming, 36609 -github.tar, level 12 row 2 with dict load, advanced streaming, 36424 -github.tar, level 13, advanced streaming, 35621 -github.tar, level 13 with dict, advanced streaming, 38726 -github.tar, level 13 with dict dms, advanced streaming, 38903 -github.tar, level 13 with dict dds, advanced streaming, 38903 -github.tar, level 13 with dict copy, advanced streaming, 38726 -github.tar, level 13 with dict load, advanced streaming, 36372 -github.tar, level 16, advanced streaming, 40255 -github.tar, level 16 with dict, advanced streaming, 33639 -github.tar, level 16 with dict dms, advanced streaming, 33544 -github.tar, level 16 with dict dds, advanced streaming, 33544 -github.tar, level 16 with dict copy, advanced streaming, 33639 -github.tar, level 16 with dict load, advanced streaming, 39353 -github.tar, level 19, advanced streaming, 32837 -github.tar, level 19 with dict, advanced streaming, 32895 -github.tar, level 19 with dict dms, advanced streaming, 32672 -github.tar, level 19 with dict dds, advanced streaming, 32672 -github.tar, level 19 with dict copy, advanced streaming, 32895 -github.tar, level 19 with dict load, advanced streaming, 32676 -github.tar, no source size, advanced streaming, 38438 +github.tar, level 12 row 2 with dict load, advanced streaming, 36459 +github.tar, level 13, advanced streaming, 35501 +github.tar, level 13 with dict, advanced streaming, 37130 +github.tar, level 13 with dict dms, advanced streaming, 37220 +github.tar, level 13 with dict dds, advanced streaming, 37220 +github.tar, level 13 with dict copy, advanced streaming, 37130 +github.tar, level 13 with dict load, advanced streaming, 36010 +github.tar, level 16, advanced streaming, 40466 +github.tar, level 16 with dict, advanced streaming, 33374 +github.tar, level 16 with dict dms, advanced streaming, 33206 +github.tar, level 16 with dict dds, advanced streaming, 33206 +github.tar, level 16 with dict copy, advanced streaming, 33374 +github.tar, level 16 with dict load, advanced streaming, 39081 +github.tar, level 19, advanced streaming, 32276 +github.tar, level 19 with dict, advanced streaming, 32712 +github.tar, level 19 with dict dms, advanced streaming, 32555 +github.tar, level 19 with dict dds, advanced streaming, 32555 +github.tar, level 19 with dict copy, advanced streaming, 32712 +github.tar, level 19 with dict load, advanced streaming, 32479 +github.tar, no source size, advanced streaming, 38828 github.tar, no source size with dict, advanced streaming, 38000 -github.tar, long distance mode, advanced streaming, 39757 -github.tar, multithreaded, advanced streaming, 38441 -github.tar, multithreaded long distance mode, advanced streaming, 39726 +github.tar, long distance mode, advanced streaming, 40252 +github.tar, multithreaded, advanced streaming, 38831 +github.tar, multithreaded long distance mode, advanced streaming, 40232 github.tar, small window log, advanced streaming, 199558 github.tar, small hash log, advanced streaming, 129870 github.tar, small chain log, advanced streaming, 41669 -github.tar, explicit params, advanced streaming, 41227 -github.tar, uncompressed literals, advanced streaming, 41122 -github.tar, uncompressed literals optimal, advanced streaming, 35388 -github.tar, huffman literals, advanced streaming, 38800 -github.tar, multithreaded with advanced params, advanced streaming, 41122 -silesia, level -5, old streaming, 6882505 -silesia, level -3, old streaming, 6568376 -silesia, level -1, old streaming, 6183403 -silesia, level 0, old streaming, 4849552 -silesia, level 1, old streaming, 5314162 -silesia, level 3, old streaming, 4849552 -silesia, level 4, old streaming, 4786970 -silesia, level 5, old streaming, 4707794 -silesia, level 6, old streaming, 4666383 -silesia, level 7, old streaming, 4603381 -silesia, level 9, old streaming, 4546001 -silesia, level 13, old streaming, 4482135 -silesia, level 16, old streaming, 4360251 -silesia, level 19, old streaming, 4283237 -silesia, no source size, old streaming, 4849516 -silesia, uncompressed literals, old streaming, 4849552 -silesia, uncompressed literals optimal, old streaming, 4283237 -silesia, huffman literals, old streaming, 6183403 -silesia.tar, level -5, old streaming, 6982759 -silesia.tar, level -3, old streaming, 6641283 -silesia.tar, level -1, old streaming, 6190795 -silesia.tar, level 0, old streaming, 4861427 -silesia.tar, level 1, old streaming, 5336939 -silesia.tar, level 3, old streaming, 4861427 -silesia.tar, level 4, old streaming, 4799630 -silesia.tar, level 5, old streaming, 4719261 -silesia.tar, level 6, old streaming, 4677729 -silesia.tar, level 7, old streaming, 4613544 -silesia.tar, level 9, old streaming, 4555432 -silesia.tar, level 13, old streaming, 4491765 -silesia.tar, level 16, old streaming, 4356834 -silesia.tar, level 19, old streaming, 4264392 -silesia.tar, no source size, old streaming, 4861423 -silesia.tar, uncompressed literals, old streaming, 4861427 -silesia.tar, uncompressed literals optimal, old streaming, 4264392 -silesia.tar, huffman literals, old streaming, 6190795 -github, level -5, old streaming, 205285 +github.tar, explicit params, advanced streaming, 41385 +github.tar, uncompressed literals, advanced streaming, 41525 +github.tar, uncompressed literals optimal, advanced streaming, 35397 +github.tar, huffman literals, advanced streaming, 38853 +github.tar, multithreaded with advanced params, advanced streaming, 41525 +silesia, level -5, old streaming, 6854744 +silesia, level -3, old streaming, 6503319 +silesia, level -1, old streaming, 6172207 +silesia, level 0, old streaming, 4842075 +silesia, level 1, old streaming, 5306388 +silesia, level 3, old streaming, 4842075 +silesia, level 4, old streaming, 4779186 +silesia, level 5, old streaming, 4666323 +silesia, level 6, old streaming, 4603066 +silesia, level 7, old streaming, 4566984 +silesia, level 9, old streaming, 4543018 +silesia, level 13, old streaming, 4493990 +silesia, level 16, old streaming, 4360041 +silesia, level 19, old streaming, 4296055 +silesia, no source size, old streaming, 4842039 +silesia, uncompressed literals, old streaming, 4842075 +silesia, uncompressed literals optimal, old streaming, 4296055 +silesia, huffman literals, old streaming, 6172207 +silesia.tar, level -5, old streaming, 6856523 +silesia.tar, level -3, old streaming, 6505954 +silesia.tar, level -1, old streaming, 6179056 +silesia.tar, level 0, old streaming, 4859271 +silesia.tar, level 1, old streaming, 5327708 +silesia.tar, level 3, old streaming, 4859271 +silesia.tar, level 4, old streaming, 4797470 +silesia.tar, level 5, old streaming, 4677748 +silesia.tar, level 6, old streaming, 4613246 +silesia.tar, level 7, old streaming, 4576664 +silesia.tar, level 9, old streaming, 4552900 +silesia.tar, level 13, old streaming, 4502956 +silesia.tar, level 16, old streaming, 4360546 +silesia.tar, level 19, old streaming, 4265911 +silesia.tar, no source size, old streaming, 4859267 +silesia.tar, uncompressed literals, old streaming, 4859271 +silesia.tar, uncompressed literals optimal, old streaming, 4265911 +silesia.tar, huffman literals, old streaming, 6179056 +github, level -5, old streaming, 204407 github, level -5 with dict, old streaming, 46718 -github, level -3, old streaming, 190643 +github, level -3, old streaming, 193253 github, level -3 with dict, old streaming, 45395 -github, level -1, old streaming, 175568 +github, level -1, old streaming, 175468 github, level -1 with dict, old streaming, 43170 -github, level 0, old streaming, 136335 +github, level 0, old streaming, 136332 github, level 0 with dict, old streaming, 41148 -github, level 1, old streaming, 142465 +github, level 1, old streaming, 142365 github, level 1 with dict, old streaming, 41682 -github, level 3, old streaming, 136335 +github, level 3, old streaming, 136332 github, level 3 with dict, old streaming, 41148 github, level 4, old streaming, 136199 github, level 4 with dict, old streaming, 41251 @@ -1168,131 +1240,131 @@ github, level 7, old stre github, level 7 with dict, old streaming, 38758 github, level 9, old streaming, 135122 github, level 9 with dict, old streaming, 39437 -github, level 13, old streaming, 134064 -github, level 13 with dict, old streaming, 39743 -github, level 16, old streaming, 134064 +github, level 13, old streaming, 132878 +github, level 13 with dict, old streaming, 39900 +github, level 16, old streaming, 133209 github, level 16 with dict, old streaming, 37577 -github, level 19, old streaming, 134064 +github, level 19, old streaming, 132879 github, level 19 with dict, old streaming, 37576 -github, no source size, old streaming, 140632 +github, no source size, old streaming, 140599 github, no source size with dict, old streaming, 40654 -github, uncompressed literals, old streaming, 136335 -github, uncompressed literals optimal, old streaming, 134064 -github, huffman literals, old streaming, 175568 -github.tar, level -5, old streaming, 46747 -github.tar, level -5 with dict, old streaming, 44440 -github.tar, level -3, old streaming, 43537 -github.tar, level -3 with dict, old streaming, 41112 -github.tar, level -1, old streaming, 42465 -github.tar, level -1 with dict, old streaming, 41196 -github.tar, level 0, old streaming, 38441 +github, uncompressed literals, old streaming, 136332 +github, uncompressed literals optimal, old streaming, 132879 +github, huffman literals, old streaming, 175468 +github.tar, level -5, old streaming, 52152 +github.tar, level -5 with dict, old streaming, 51045 +github.tar, level -3, old streaming, 45678 +github.tar, level -3 with dict, old streaming, 44656 +github.tar, level -1, old streaming, 42560 +github.tar, level -1 with dict, old streaming, 41151 +github.tar, level 0, old streaming, 38831 github.tar, level 0 with dict, old streaming, 37995 -github.tar, level 1, old streaming, 39342 -github.tar, level 1 with dict, old streaming, 38293 -github.tar, level 3, old streaming, 38441 +github.tar, level 1, old streaming, 39200 +github.tar, level 1 with dict, old streaming, 38089 +github.tar, level 3, old streaming, 38831 github.tar, level 3 with dict, old streaming, 37995 -github.tar, level 4, old streaming, 38467 +github.tar, level 4, old streaming, 38893 github.tar, level 4 with dict, old streaming, 37948 -github.tar, level 5, old streaming, 39693 -github.tar, level 5 with dict, old streaming, 39040 -github.tar, level 6, old streaming, 39621 -github.tar, level 6 with dict, old streaming, 38622 -github.tar, level 7, old streaming, 39213 -github.tar, level 7 with dict, old streaming, 37848 -github.tar, level 9, old streaming, 36758 -github.tar, level 9 with dict, old streaming, 36457 -github.tar, level 13, old streaming, 35621 -github.tar, level 13 with dict, old streaming, 38726 -github.tar, level 16, old streaming, 40255 -github.tar, level 16 with dict, old streaming, 33639 -github.tar, level 19, old streaming, 32837 -github.tar, level 19 with dict, old streaming, 32895 -github.tar, no source size, old streaming, 38438 +github.tar, level 5, old streaming, 39651 +github.tar, level 5 with dict, old streaming, 39082 +github.tar, level 6, old streaming, 39282 +github.tar, level 6 with dict, old streaming, 38656 +github.tar, level 7, old streaming, 38110 +github.tar, level 7 with dict, old streaming, 37865 +github.tar, level 9, old streaming, 36760 +github.tar, level 9 with dict, old streaming, 36484 +github.tar, level 13, old streaming, 35501 +github.tar, level 13 with dict, old streaming, 37130 +github.tar, level 16, old streaming, 40466 +github.tar, level 16 with dict, old streaming, 33374 +github.tar, level 19, old streaming, 32276 +github.tar, level 19 with dict, old streaming, 32712 +github.tar, no source size, old streaming, 38828 github.tar, no source size with dict, old streaming, 38000 -github.tar, uncompressed literals, old streaming, 38441 -github.tar, uncompressed literals optimal, old streaming, 32837 -github.tar, huffman literals, old streaming, 42465 -silesia, level -5, old streaming advanced, 6882505 -silesia, level -3, old streaming advanced, 6568376 -silesia, level -1, old streaming advanced, 6183403 -silesia, level 0, old streaming advanced, 4849552 -silesia, level 1, old streaming advanced, 5314162 -silesia, level 3, old streaming advanced, 4849552 -silesia, level 4, old streaming advanced, 4786970 -silesia, level 5, old streaming advanced, 4707794 -silesia, level 6, old streaming advanced, 4666383 -silesia, level 7, old streaming advanced, 4603381 -silesia, level 9, old streaming advanced, 4546001 -silesia, level 13, old streaming advanced, 4482135 -silesia, level 16, old streaming advanced, 4360251 -silesia, level 19, old streaming advanced, 4283237 -silesia, no source size, old streaming advanced, 4849516 -silesia, long distance mode, old streaming advanced, 4849552 -silesia, multithreaded, old streaming advanced, 4849552 -silesia, multithreaded long distance mode, old streaming advanced, 4849552 -silesia, small window log, old streaming advanced, 7112062 +github.tar, uncompressed literals, old streaming, 38831 +github.tar, uncompressed literals optimal, old streaming, 32276 +github.tar, huffman literals, old streaming, 42560 +silesia, level -5, old streaming advanced, 6854744 +silesia, level -3, old streaming advanced, 6503319 +silesia, level -1, old streaming advanced, 6172207 +silesia, level 0, old streaming advanced, 4842075 +silesia, level 1, old streaming advanced, 5306388 +silesia, level 3, old streaming advanced, 4842075 +silesia, level 4, old streaming advanced, 4779186 +silesia, level 5, old streaming advanced, 4666323 +silesia, level 6, old streaming advanced, 4603066 +silesia, level 7, old streaming advanced, 4566984 +silesia, level 9, old streaming advanced, 4543018 +silesia, level 13, old streaming advanced, 4493990 +silesia, level 16, old streaming advanced, 4360041 +silesia, level 19, old streaming advanced, 4296055 +silesia, no source size, old streaming advanced, 4842039 +silesia, long distance mode, old streaming advanced, 4842075 +silesia, multithreaded, old streaming advanced, 4842075 +silesia, multithreaded long distance mode, old streaming advanced, 4842075 +silesia, small window log, old streaming advanced, 7111103 silesia, small hash log, old streaming advanced, 6526141 silesia, small chain log, old streaming advanced, 4912197 -silesia, explicit params, old streaming advanced, 4795887 -silesia, uncompressed literals, old streaming advanced, 4849552 -silesia, uncompressed literals optimal, old streaming advanced, 4283237 -silesia, huffman literals, old streaming advanced, 6183403 -silesia, multithreaded with advanced params, old streaming advanced, 4849552 -silesia.tar, level -5, old streaming advanced, 6982759 -silesia.tar, level -3, old streaming advanced, 6641283 -silesia.tar, level -1, old streaming advanced, 6190795 -silesia.tar, level 0, old streaming advanced, 4861427 -silesia.tar, level 1, old streaming advanced, 5336939 -silesia.tar, level 3, old streaming advanced, 4861427 -silesia.tar, level 4, old streaming advanced, 4799630 -silesia.tar, level 5, old streaming advanced, 4719261 -silesia.tar, level 6, old streaming advanced, 4677729 -silesia.tar, level 7, old streaming advanced, 4613544 -silesia.tar, level 9, old streaming advanced, 4555432 -silesia.tar, level 13, old streaming advanced, 4491765 -silesia.tar, level 16, old streaming advanced, 4356834 -silesia.tar, level 19, old streaming advanced, 4264392 -silesia.tar, no source size, old streaming advanced, 4861423 -silesia.tar, long distance mode, old streaming advanced, 4861427 -silesia.tar, multithreaded, old streaming advanced, 4861427 -silesia.tar, multithreaded long distance mode, old streaming advanced, 4861427 -silesia.tar, small window log, old streaming advanced, 7118772 -silesia.tar, small hash log, old streaming advanced, 6529235 +silesia, explicit params, old streaming advanced, 4795452 +silesia, uncompressed literals, old streaming advanced, 4842075 +silesia, uncompressed literals optimal, old streaming advanced, 4296055 +silesia, huffman literals, old streaming advanced, 6172207 +silesia, multithreaded with advanced params, old streaming advanced, 4842075 +silesia.tar, level -5, old streaming advanced, 6856523 +silesia.tar, level -3, old streaming advanced, 6505954 +silesia.tar, level -1, old streaming advanced, 6179056 +silesia.tar, level 0, old streaming advanced, 4859271 +silesia.tar, level 1, old streaming advanced, 5327708 +silesia.tar, level 3, old streaming advanced, 4859271 +silesia.tar, level 4, old streaming advanced, 4797470 +silesia.tar, level 5, old streaming advanced, 4677748 +silesia.tar, level 6, old streaming advanced, 4613246 +silesia.tar, level 7, old streaming advanced, 4576664 +silesia.tar, level 9, old streaming advanced, 4552900 +silesia.tar, level 13, old streaming advanced, 4502956 +silesia.tar, level 16, old streaming advanced, 4360546 +silesia.tar, level 19, old streaming advanced, 4265911 +silesia.tar, no source size, old streaming advanced, 4859267 +silesia.tar, long distance mode, old streaming advanced, 4859271 +silesia.tar, multithreaded, old streaming advanced, 4859271 +silesia.tar, multithreaded long distance mode, old streaming advanced, 4859271 +silesia.tar, small window log, old streaming advanced, 7117562 +silesia.tar, small hash log, old streaming advanced, 6529209 silesia.tar, small chain log, old streaming advanced, 4917021 -silesia.tar, explicit params, old streaming advanced, 4807401 -silesia.tar, uncompressed literals, old streaming advanced, 4861427 -silesia.tar, uncompressed literals optimal, old streaming advanced, 4264392 -silesia.tar, huffman literals, old streaming advanced, 6190795 -silesia.tar, multithreaded with advanced params, old streaming advanced, 4861427 -github, level -5, old streaming advanced, 216734 +silesia.tar, explicit params, old streaming advanced, 4806873 +silesia.tar, uncompressed literals, old streaming advanced, 4859271 +silesia.tar, uncompressed literals optimal, old streaming advanced, 4265911 +silesia.tar, huffman literals, old streaming advanced, 6179056 +silesia.tar, multithreaded with advanced params, old streaming advanced, 4859271 +github, level -5, old streaming advanced, 213265 github, level -5 with dict, old streaming advanced, 49562 -github, level -3, old streaming advanced, 192160 +github, level -3, old streaming advanced, 196126 github, level -3 with dict, old streaming advanced, 44956 -github, level -1, old streaming advanced, 181108 +github, level -1, old streaming advanced, 181107 github, level -1 with dict, old streaming advanced, 42383 github, level 0, old streaming advanced, 141104 github, level 0 with dict, old streaming advanced, 41113 -github, level 1, old streaming advanced, 143692 +github, level 1, old streaming advanced, 143693 github, level 1 with dict, old streaming advanced, 42430 github, level 3, old streaming advanced, 141104 github, level 3 with dict, old streaming advanced, 41113 github, level 4, old streaming advanced, 141104 github, level 4 with dict, old streaming advanced, 41084 -github, level 5, old streaming advanced, 139399 -github, level 5 with dict, old streaming advanced, 38633 -github, level 6, old streaming advanced, 139402 -github, level 6 with dict, old streaming advanced, 38723 +github, level 5, old streaming advanced, 139402 +github, level 5 with dict, old streaming advanced, 38723 +github, level 6, old streaming advanced, 138676 +github, level 6 with dict, old streaming advanced, 38744 github, level 7, old streaming advanced, 138676 -github, level 7 with dict, old streaming advanced, 38744 +github, level 7 with dict, old streaming advanced, 38924 github, level 9, old streaming advanced, 138676 github, level 9 with dict, old streaming advanced, 38981 github, level 13, old streaming advanced, 138676 -github, level 13 with dict, old streaming advanced, 39731 -github, level 16, old streaming advanced, 138676 +github, level 13 with dict, old streaming advanced, 39725 +github, level 16, old streaming advanced, 138575 github, level 16 with dict, old streaming advanced, 40789 -github, level 19, old streaming advanced, 134064 +github, level 19, old streaming advanced, 132879 github, level 19 with dict, old streaming advanced, 37576 -github, no source size, old streaming advanced, 140632 +github, no source size, old streaming advanced, 140599 github, no source size with dict, old streaming advanced, 40608 github, long distance mode, old streaming advanced, 141104 github, multithreaded, old streaming advanced, 141104 @@ -1302,50 +1374,50 @@ github, small hash log, old stre github, small chain log, old streaming advanced, 139275 github, explicit params, old streaming advanced, 140937 github, uncompressed literals, old streaming advanced, 141104 -github, uncompressed literals optimal, old streaming advanced, 134064 -github, huffman literals, old streaming advanced, 181108 +github, uncompressed literals optimal, old streaming advanced, 132879 +github, huffman literals, old streaming advanced, 181107 github, multithreaded with advanced params, old streaming advanced, 141104 -github.tar, level -5, old streaming advanced, 46747 -github.tar, level -5 with dict, old streaming advanced, 44824 -github.tar, level -3, old streaming advanced, 43537 -github.tar, level -3 with dict, old streaming advanced, 41800 -github.tar, level -1, old streaming advanced, 42465 -github.tar, level -1 with dict, old streaming advanced, 41471 -github.tar, level 0, old streaming advanced, 38441 +github.tar, level -5, old streaming advanced, 52152 +github.tar, level -5 with dict, old streaming advanced, 50988 +github.tar, level -3, old streaming advanced, 45678 +github.tar, level -3 with dict, old streaming advanced, 44729 +github.tar, level -1, old streaming advanced, 42560 +github.tar, level -1 with dict, old streaming advanced, 41589 +github.tar, level 0, old streaming advanced, 38831 github.tar, level 0 with dict, old streaming advanced, 38013 -github.tar, level 1, old streaming advanced, 39342 -github.tar, level 1 with dict, old streaming advanced, 38940 -github.tar, level 3, old streaming advanced, 38441 +github.tar, level 1, old streaming advanced, 39200 +github.tar, level 1 with dict, old streaming advanced, 38359 +github.tar, level 3, old streaming advanced, 38831 github.tar, level 3 with dict, old streaming advanced, 38013 -github.tar, level 4, old streaming advanced, 38467 +github.tar, level 4, old streaming advanced, 38893 github.tar, level 4 with dict, old streaming advanced, 38063 -github.tar, level 5, old streaming advanced, 39693 -github.tar, level 5 with dict, old streaming advanced, 39049 -github.tar, level 6, old streaming advanced, 39621 -github.tar, level 6 with dict, old streaming advanced, 38959 -github.tar, level 7, old streaming advanced, 39213 -github.tar, level 7 with dict, old streaming advanced, 38573 -github.tar, level 9, old streaming advanced, 36758 -github.tar, level 9 with dict, old streaming advanced, 36233 -github.tar, level 13, old streaming advanced, 35621 -github.tar, level 13 with dict, old streaming advanced, 36035 -github.tar, level 16, old streaming advanced, 40255 -github.tar, level 16 with dict, old streaming advanced, 38736 -github.tar, level 19, old streaming advanced, 32837 -github.tar, level 19 with dict, old streaming advanced, 32876 -github.tar, no source size, old streaming advanced, 38438 +github.tar, level 5, old streaming advanced, 39651 +github.tar, level 5 with dict, old streaming advanced, 38997 +github.tar, level 6, old streaming advanced, 39282 +github.tar, level 6 with dict, old streaming advanced, 38640 +github.tar, level 7, old streaming advanced, 38110 +github.tar, level 7 with dict, old streaming advanced, 37387 +github.tar, level 9, old streaming advanced, 36760 +github.tar, level 9 with dict, old streaming advanced, 36312 +github.tar, level 13, old streaming advanced, 35501 +github.tar, level 13 with dict, old streaming advanced, 35807 +github.tar, level 16, old streaming advanced, 40466 +github.tar, level 16 with dict, old streaming advanced, 38578 +github.tar, level 19, old streaming advanced, 32276 +github.tar, level 19 with dict, old streaming advanced, 32704 +github.tar, no source size, old streaming advanced, 38828 github.tar, no source size with dict, old streaming advanced, 38015 -github.tar, long distance mode, old streaming advanced, 38441 -github.tar, multithreaded, old streaming advanced, 38441 -github.tar, multithreaded long distance mode, old streaming advanced, 38441 +github.tar, long distance mode, old streaming advanced, 38831 +github.tar, multithreaded, old streaming advanced, 38831 +github.tar, multithreaded long distance mode, old streaming advanced, 38831 github.tar, small window log, old streaming advanced, 199561 github.tar, small hash log, old streaming advanced, 129870 github.tar, small chain log, old streaming advanced, 41669 -github.tar, explicit params, old streaming advanced, 41227 -github.tar, uncompressed literals, old streaming advanced, 38441 -github.tar, uncompressed literals optimal, old streaming advanced, 32837 -github.tar, huffman literals, old streaming advanced, 42465 -github.tar, multithreaded with advanced params, old streaming advanced, 38441 +github.tar, explicit params, old streaming advanced, 41385 +github.tar, uncompressed literals, old streaming advanced, 38831 +github.tar, uncompressed literals optimal, old streaming advanced, 32276 +github.tar, huffman literals, old streaming advanced, 42560 +github.tar, multithreaded with advanced params, old streaming advanced, 38831 github, level -5 with dict, old streaming cdict, 46718 github, level -3 with dict, old streaming cdict, 45395 github, level -1 with dict, old streaming cdict, 43170 @@ -1357,24 +1429,24 @@ github, level 5 with dict, old stre github, level 6 with dict, old streaming cdict, 38671 github, level 7 with dict, old streaming cdict, 38758 github, level 9 with dict, old streaming cdict, 39437 -github, level 13 with dict, old streaming cdict, 39743 +github, level 13 with dict, old streaming cdict, 39900 github, level 16 with dict, old streaming cdict, 37577 github, level 19 with dict, old streaming cdict, 37576 github, no source size with dict, old streaming cdict, 40654 -github.tar, level -5 with dict, old streaming cdict, 45018 -github.tar, level -3 with dict, old streaming cdict, 41886 -github.tar, level -1 with dict, old streaming cdict, 41636 +github.tar, level -5 with dict, old streaming cdict, 51191 +github.tar, level -3 with dict, old streaming cdict, 44821 +github.tar, level -1 with dict, old streaming cdict, 41775 github.tar, level 0 with dict, old streaming cdict, 37956 -github.tar, level 1 with dict, old streaming cdict, 38766 +github.tar, level 1 with dict, old streaming cdict, 38364 github.tar, level 3 with dict, old streaming cdict, 37956 github.tar, level 4 with dict, old streaming cdict, 37927 -github.tar, level 5 with dict, old streaming cdict, 39037 -github.tar, level 6 with dict, old streaming cdict, 38962 -github.tar, level 7 with dict, old streaming cdict, 38582 -github.tar, level 9 with dict, old streaming cdict, 36350 -github.tar, level 13 with dict, old streaming cdict, 36372 -github.tar, level 16 with dict, old streaming cdict, 39353 -github.tar, level 19 with dict, old streaming cdict, 32676 +github.tar, level 5 with dict, old streaming cdict, 38999 +github.tar, level 6 with dict, old streaming cdict, 38648 +github.tar, level 7 with dict, old streaming cdict, 37436 +github.tar, level 9 with dict, old streaming cdict, 36401 +github.tar, level 13 with dict, old streaming cdict, 36010 +github.tar, level 16 with dict, old streaming cdict, 39081 +github.tar, level 19 with dict, old streaming cdict, 32479 github.tar, no source size with dict, old streaming cdict, 38000 github, level -5 with dict, old streaming advanced cdict, 49562 github, level -3 with dict, old streaming advanced cdict, 44956 @@ -1383,26 +1455,26 @@ github, level 0 with dict, old stre github, level 1 with dict, old streaming advanced cdict, 42430 github, level 3 with dict, old streaming advanced cdict, 41113 github, level 4 with dict, old streaming advanced cdict, 41084 -github, level 5 with dict, old streaming advanced cdict, 38633 -github, level 6 with dict, old streaming advanced cdict, 38723 -github, level 7 with dict, old streaming advanced cdict, 38744 +github, level 5 with dict, old streaming advanced cdict, 38723 +github, level 6 with dict, old streaming advanced cdict, 38744 +github, level 7 with dict, old streaming advanced cdict, 38924 github, level 9 with dict, old streaming advanced cdict, 38981 -github, level 13 with dict, old streaming advanced cdict, 39731 +github, level 13 with dict, old streaming advanced cdict, 39725 github, level 16 with dict, old streaming advanced cdict, 40789 github, level 19 with dict, old streaming advanced cdict, 37576 github, no source size with dict, old streaming advanced cdict, 40608 -github.tar, level -5 with dict, old streaming advanced cdict, 44307 -github.tar, level -3 with dict, old streaming advanced cdict, 41359 -github.tar, level -1 with dict, old streaming advanced cdict, 41322 +github.tar, level -5 with dict, old streaming advanced cdict, 50854 +github.tar, level -3 with dict, old streaming advanced cdict, 44571 +github.tar, level -1 with dict, old streaming advanced cdict, 41477 github.tar, level 0 with dict, old streaming advanced cdict, 38013 -github.tar, level 1 with dict, old streaming advanced cdict, 39002 +github.tar, level 1 with dict, old streaming advanced cdict, 38168 github.tar, level 3 with dict, old streaming advanced cdict, 38013 github.tar, level 4 with dict, old streaming advanced cdict, 38063 -github.tar, level 5 with dict, old streaming advanced cdict, 39049 -github.tar, level 6 with dict, old streaming advanced cdict, 38959 -github.tar, level 7 with dict, old streaming advanced cdict, 38573 -github.tar, level 9 with dict, old streaming advanced cdict, 36233 -github.tar, level 13 with dict, old streaming advanced cdict, 36035 -github.tar, level 16 with dict, old streaming advanced cdict, 38736 -github.tar, level 19 with dict, old streaming advanced cdict, 32876 +github.tar, level 5 with dict, old streaming advanced cdict, 38997 +github.tar, level 6 with dict, old streaming advanced cdict, 38640 +github.tar, level 7 with dict, old streaming advanced cdict, 37387 +github.tar, level 9 with dict, old streaming advanced cdict, 36312 +github.tar, level 13 with dict, old streaming advanced cdict, 35807 +github.tar, level 16 with dict, old streaming advanced cdict, 38578 +github.tar, level 19 with dict, old streaming advanced cdict, 32704 github.tar, no source size with dict, old streaming advanced cdict, 38015 diff --git a/src/dependencies/zstd-1.5.0/tests/regression/test.c b/src/dependencies/zstd-1.5.4/tests/regression/test.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/regression/test.c rename to src/dependencies/zstd-1.5.4/tests/regression/test.c index 1de6be8..07600be 100644 --- a/src/dependencies/zstd-1.5.0/tests/regression/test.c +++ b/src/dependencies/zstd-1.5.4/tests/regression/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/roundTripCrash.c b/src/dependencies/zstd-1.5.4/tests/roundTripCrash.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/roundTripCrash.c rename to src/dependencies/zstd-1.5.4/tests/roundTripCrash.c index 9aa208c..77411cd 100644 --- a/src/dependencies/zstd-1.5.0/tests/roundTripCrash.c +++ b/src/dependencies/zstd-1.5.4/tests/roundTripCrash.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/seqgen.c b/src/dependencies/zstd-1.5.4/tests/seqgen.c similarity index 99% rename from src/dependencies/zstd-1.5.0/tests/seqgen.c rename to src/dependencies/zstd-1.5.4/tests/seqgen.c index 1e340c8..0d8a766 100644 --- a/src/dependencies/zstd-1.5.0/tests/seqgen.c +++ b/src/dependencies/zstd-1.5.4/tests/seqgen.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/seqgen.h b/src/dependencies/zstd-1.5.4/tests/seqgen.h similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/seqgen.h rename to src/dependencies/zstd-1.5.4/tests/seqgen.h index cea3f55..df17398 100644 --- a/src/dependencies/zstd-1.5.0/tests/seqgen.h +++ b/src/dependencies/zstd-1.5.4/tests/seqgen.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/src/dependencies/zstd-1.5.0/tests/test-license.py b/src/dependencies/zstd-1.5.4/tests/test-license.py similarity index 96% rename from src/dependencies/zstd-1.5.0/tests/test-license.py rename to src/dependencies/zstd-1.5.4/tests/test-license.py index 2247765..d54c164 100755 --- a/src/dependencies/zstd-1.5.0/tests/test-license.py +++ b/src/dependencies/zstd-1.5.4/tests/test-license.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # ################################################################ -# Copyright (c) Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -43,6 +43,7 @@ SUFFIXES = [ "Makefile", ".mk", ".py", + ".S", ] # License should certainly be in the first 10 KB. @@ -82,8 +83,8 @@ def valid_copyright(lines): continue if "present" in line: return (False, f"Copyright line '{line}' contains 'present'!") - if "Facebook, Inc" not in line: - return (False, f"Copyright line '{line}' does not contain 'Facebook, Inc'") + if "Meta Platforms, Inc" not in line: + return (False, f"Copyright line '{line}' does not contain 'Meta Platforms, Inc'") year = YEAR_REGEX.search(line) if year is not None: return (False, f"Copyright line '{line}' contains {year.group(0)}; it should be yearless") diff --git a/src/dependencies/zstd-1.5.4/tests/test-variants.sh b/src/dependencies/zstd-1.5.4/tests/test-variants.sh new file mode 100755 index 0000000..f3a9e06 --- /dev/null +++ b/src/dependencies/zstd-1.5.4/tests/test-variants.sh @@ -0,0 +1,115 @@ +#!/bin/sh +set -e +set -u +set -x + + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +PROG_DIR="$SCRIPT_DIR/../programs" + +ZSTD="$PROG_DIR/zstd" +ZSTD_COMPRESS="$PROG_DIR/zstd-compress" +ZSTD_DECOMPRESS="$PROG_DIR/zstd-decompress" +ZSTD_NOLEGACY="$PROG_DIR/zstd-nolegacy" +ZSTD_DICTBUILDER="$PROG_DIR/zstd-dictBuilder" +ZSTD_FRUGAL="$PROG_DIR/zstd-frugal" +ZSTD_NOMT="$PROG_DIR/zstd-nomt" + +println() { + printf '%b\n' "${*}" +} + +die() { + println "$@" 1>&2 + exit 1 +} + +symbol_present() { + (nm $1 || echo "symbol_present $@ failed") | grep $2 +} + +symbol_not_present() { + symbol_present $@ && die "Binary '$1' mistakenly contains symbol '$2'" ||: +} + +compress_not_present() { + symbol_not_present "$1" ZSTD_compress +} + +decompress_not_present() { + symbol_not_present "$1" ZSTD_decompress +} + +dict_not_present() { + symbol_not_present "$1" ZDICT_ + symbol_not_present "$1" COVER_ +} + +cliextra_not_present() { + symbol_not_present "$1" TRACE_ + symbol_not_present "$1" BMK_ +} + +legacy_not_present() { + symbol_not_present "$1" ZSTDv0 +} + +test_help() { + "$1" --help | grep -- "$2" +} + +test_no_help() { + test_help $@ && die "'$1' supports '$2' when it shouldn't" ||: +} + +extras_not_present() { + dict_not_present $@ + legacy_not_present $@ + cliextra_not_present $@ + test_no_help $@ "--train" + test_no_help $@ "-b#" +} + +test_compress() { + echo "hello" | "$1" | "$ZSTD" -t +} + +test_decompress() { + echo "hello" | "$ZSTD" | "$1" -t +} + +test_zstd() { + test_compress $@ + test_decompress $@ +} + +extras_not_present "$ZSTD_FRUGAL" +extras_not_present "$ZSTD_COMPRESS" +extras_not_present "$ZSTD_DECOMPRESS" + +compress_not_present "$ZSTD_DECOMPRESS" + +decompress_not_present "$ZSTD_COMPRESS" +decompress_not_present "$ZSTD_DICTBUILDER" + +cliextra_not_present "$ZSTD_DICTBUILDER" + +legacy_not_present "$ZSTD_DICTBUILDER" +legacy_not_present "$ZSTD_NOLEGACY" + +symbol_not_present "$ZSTD" ZSTDv01 +symbol_not_present "$ZSTD" ZSTDv02 +symbol_not_present "$ZSTD" ZSTDv03 +symbol_not_present "$ZSTD" ZSTDv04 + +test_compress "$ZSTD_COMPRESS" +test_decompress "$ZSTD_DECOMPRESS" + +test_zstd "$ZSTD_FRUGAL" +test_zstd "$ZSTD_NOLEGACY" + +test_help "$ZSTD" '-b#' +test_help "$ZSTD" --train +test_help "$ZSTD_DICTBUILDER" --train + +println "Success!" diff --git a/src/dependencies/zstd-1.5.0/tests/test-zstd-versions.py b/src/dependencies/zstd-1.5.4/tests/test-zstd-versions.py similarity index 56% rename from src/dependencies/zstd-1.5.0/tests/test-zstd-versions.py rename to src/dependencies/zstd-1.5.4/tests/test-zstd-versions.py index c86af7d..1bcf39e 100755 --- a/src/dependencies/zstd-1.5.0/tests/test-zstd-versions.py +++ b/src/dependencies/zstd-1.5.4/tests/test-zstd-versions.py @@ -2,7 +2,7 @@ """Test zstd interoperability between versions""" # ################################################################ -# Copyright (c) Yann Collet, Facebook, Inc. +# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under both the BSD-style license (found in the @@ -23,13 +23,25 @@ from subprocess import Popen, PIPE repo_url = 'https://github.com/facebook/zstd.git' tmp_dir_name = 'tests/versionsTest' make_cmd = 'make' +make_args = ['-j','CFLAGS=-O0'] git_cmd = 'git' test_dat_src = 'README.md' test_dat = 'test_dat' head = 'vdevel' dict_source = 'dict_source' -dict_files = './zstd/programs/*.c ./zstd/lib/common/*.c ./zstd/lib/compress/*.c ./zstd/lib/decompress/*.c ./zstd/lib/dictBuilder/*.c ./zstd/lib/legacy/*.c ' -dict_files += './zstd/programs/*.h ./zstd/lib/common/*.h ./zstd/lib/compress/*.h ./zstd/lib/dictBuilder/*.h ./zstd/lib/legacy/*.h' +dict_globs = [ + 'programs/*.c', + 'lib/common/*.c', + 'lib/compress/*.c', + 'lib/decompress/*.c', + 'lib/dictBuilder/*.c', + 'lib/legacy/*.c', + 'programs/*.h', + 'lib/common/*.h', + 'lib/compress/*.h', + 'lib/dictBuilder/*.h', + 'lib/legacy/*.h' +] def execute(command, print_output=False, print_error=True, param_shell=False): @@ -56,8 +68,11 @@ def proc(cmd_args, pipe=True, dummy=False): return subproc.communicate() -def make(args, pipe=True): - return proc([make_cmd] + args, pipe) +def make(targets, pipe=True): + cmd = [make_cmd] + make_args + targets + cmd_str = str(cmd) + print('compilation command : ' + cmd_str) + return proc(cmd, pipe) def git(args, pipe=True): @@ -70,59 +85,85 @@ def get_git_tags(): return tags -def create_dict(tag, dict_source_path): +def dict_ok(tag, dict_name, sample): + if not os.path.isfile(dict_name): + return False + try: + cmd = ['./zstd.' + tag, '-D', dict_name] + with open(sample, "rb") as i: + subprocess.check_call(cmd, stdin=i, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + return True + except: + return False + + +def create_dict(tag, dict_source_path, fallback_tag=None): dict_name = 'dict.' + tag if not os.path.isfile(dict_name): cFiles = glob.glob(dict_source_path + "/*.c") hFiles = glob.glob(dict_source_path + "/*.h") + # Ensure the dictionary builder is deterministic + files = sorted(cFiles + hFiles) if tag == 'v0.5.0': - result = execute('./dictBuilder.' + tag + ' ' + ' '.join(cFiles) + ' ' + ' '.join(hFiles) + ' -o ' + dict_name, print_output=False, param_shell=True) + result = execute('./dictBuilder.' + tag + ' ' + ' '.join(files) + ' -o ' + dict_name, print_output=False, param_shell=True) else: - result = execute('./zstd.' + tag + ' -f --train ' + ' '.join(cFiles) + ' ' + ' '.join(hFiles) + ' -o ' + dict_name, print_output=False, param_shell=True) - if result == 0: + result = execute('./zstd.' + tag + ' -f --train ' + ' '.join(files) + ' -o ' + dict_name, print_output=False, param_shell=True) + if result == 0 and dict_ok(tag, dict_name, files[0]): print(dict_name + ' created') + elif fallback_tag is not None: + fallback_dict_name = 'dict.' + fallback_tag + print('creating dictionary ' + dict_name + ' failed, falling back to ' + fallback_dict_name) + shutil.copy(fallback_dict_name, dict_name) else: - print('ERROR: creating of ' + dict_name + ' failed') + raise RuntimeError('ERROR: creating of ' + dict_name + ' failed') else: print(dict_name + ' already exists') +def zstd(tag, args, input_file, output_file): + """ + Zstd compress input_file to output_file. + Need this helper because 0.5.0 is broken when stdout is not a TTY. + Throws an exception if the command returns non-zero. + """ + with open(input_file, "rb") as i: + with open(output_file, "wb") as o: + cmd = ['./zstd.' + tag] + args + print("Running: '{}', input={}, output={}" .format( + ' '.join(cmd), input_file, output_file + )) + result = subprocess.run(cmd, stdin=i, stdout=o, stderr=subprocess.PIPE) + print("Stderr: {}".format(result.stderr.decode("ascii"))) + result.check_returncode() + + def dict_compress_sample(tag, sample): dict_name = 'dict.' + tag - DEVNULL = open(os.devnull, 'wb') - if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_01_64_' + tag + '_dictio.zst') - if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-5f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_05_64_' + tag + '_dictio.zst') - if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-9f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_09_64_' + tag + '_dictio.zst') - if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-15f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_15_64_' + tag + '_dictio.zst') - if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-18f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_18_64_' + tag + '_dictio.zst') + verbose = ['-v', '-v', '-v'] + zstd(tag, ['-D', dict_name, '-1'] + verbose, sample, sample + '_01_64_' + tag + '_dictio.zst') + zstd(tag, ['-D', dict_name, '-3'], sample, sample + '_03_64_' + tag + '_dictio.zst') + zstd(tag, ['-D', dict_name, '-5'], sample, sample + '_05_64_' + tag + '_dictio.zst') + zstd(tag, ['-D', dict_name, '-9'], sample, sample + '_09_64_' + tag + '_dictio.zst') + zstd(tag, ['-D', dict_name, '-15'], sample, sample + '_15_64_' + tag + '_dictio.zst') + zstd(tag, ['-D', dict_name, '-18'], sample, sample + '_18_64_' + tag + '_dictio.zst') # zstdFiles = glob.glob("*.zst*") # print(zstdFiles) print(tag + " : dict compression completed") def compress_sample(tag, sample): - DEVNULL = open(os.devnull, 'wb') - if subprocess.call(['./zstd.' + tag, '-f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_01_64_' + tag + '_nodict.zst') - if subprocess.call(['./zstd.' + tag, '-5f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_05_64_' + tag + '_nodict.zst') - if subprocess.call(['./zstd.' + tag, '-9f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_09_64_' + tag + '_nodict.zst') - if subprocess.call(['./zstd.' + tag, '-15f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_15_64_' + tag + '_nodict.zst') - if subprocess.call(['./zstd.' + tag, '-18f', sample], stderr=DEVNULL) == 0: - os.rename(sample + '.zst', sample + '_18_64_' + tag + '_nodict.zst') + zstd(tag, ['-1'], sample, sample + '_01_64_' + tag + '_nodict.zst') + zstd(tag, ['-3'], sample, sample + '_03_64_' + tag + '_nodict.zst') + zstd(tag, ['-5'], sample, sample + '_05_64_' + tag + '_nodict.zst') + zstd(tag, ['-9'], sample, sample + '_09_64_' + tag + '_nodict.zst') + zstd(tag, ['-15'], sample, sample + '_15_64_' + tag + '_nodict.zst') + zstd(tag, ['-18'], sample, sample + '_18_64_' + tag + '_nodict.zst') # zstdFiles = glob.glob("*.zst*") # print(zstdFiles) print(tag + " : compression completed") -# http://stackoverflow.com/a/19711609/2132223 +# https://stackoverflow.com/a/19711609/2132223 def sha1_of_file(filepath): with open(filepath, 'rb') as f: return hashlib.sha1(f.read()).hexdigest() @@ -146,23 +187,13 @@ def decompress_zst(tag): dec_error = 0 list_zst = sorted(glob.glob('*_nodict.zst')) for file_zst in list_zst: - print(file_zst, end=' ') - print(tag, end=' ') + print(file_zst + ' ' + tag) file_dec = file_zst + '_d64_' + tag + '.dec' - if tag <= 'v0.5.0': - params = ['./zstd.' + tag, '-df', file_zst, file_dec] + zstd(tag, ['-d'], file_zst, file_dec) + if not filecmp.cmp(file_dec, test_dat): + raise RuntimeError('Decompression failed: tag={} file={}'.format(tag, file_zst)) else: - params = ['./zstd.' + tag, '-df', file_zst, '-o', file_dec] - if execute(params) == 0: - if not filecmp.cmp(file_dec, test_dat): - print('ERR !! ') - dec_error = 1 - else: - print('OK ') - else: - print('command does not work') - dec_error = 1 - return dec_error + print('OK ') def decompress_dict(tag): @@ -177,22 +208,13 @@ def decompress_dict(tag): if tag == 'v0.6.0' and dict_tag < 'v0.6.0': continue dict_name = 'dict.' + dict_tag - print(file_zst + ' ' + tag + ' dict=' + dict_tag, end=' ') + print(file_zst + ' ' + tag + ' dict=' + dict_tag) file_dec = file_zst + '_d64_' + tag + '.dec' - if tag <= 'v0.5.0': - params = ['./zstd.' + tag, '-D', dict_name, '-df', file_zst, file_dec] + zstd(tag, ['-D', dict_name, '-d'], file_zst, file_dec) + if not filecmp.cmp(file_dec, test_dat): + raise RuntimeError('Decompression failed: tag={} file={}'.format(tag, file_zst)) else: - params = ['./zstd.' + tag, '-D', dict_name, '-df', file_zst, '-o', file_dec] - if execute(params) == 0: - if not filecmp.cmp(file_dec, test_dat): - print('ERR !! ') - dec_error = 1 - else: - print('OK ') - else: - print('command does not work') - dec_error = 1 - return dec_error + print('OK ') if __name__ == '__main__': @@ -223,20 +245,28 @@ if __name__ == '__main__': dst_zstd = '{}/zstd.{}'.format(tmp_dir, tag) # /path/to/zstd/tests/versionsTest/zstd. if not os.path.isfile(dst_zstd) or tag == head: if tag != head: + print('-----------------------------------------------') + print('compiling ' + tag) + print('-----------------------------------------------') r_dir = '{}/{}'.format(tmp_dir, tag) # /path/to/zstd/tests/versionsTest/ os.makedirs(r_dir, exist_ok=True) os.chdir(clone_dir) git(['--work-tree=' + r_dir, 'checkout', tag, '--', '.'], False) if tag == 'v0.5.0': os.chdir(r_dir + '/dictBuilder') # /path/to/zstd/tests/versionsTest/v0.5.0/dictBuilder - make(['clean', 'dictBuilder'], False) + make(['clean'], False) # separate 'clean' target to allow parallel build + make(['dictBuilder'], False) shutil.copy2('dictBuilder', '{}/dictBuilder.{}'.format(tmp_dir, tag)) os.chdir(r_dir + '/programs') # /path/to/zstd/tests/versionsTest//programs - make(['clean', 'zstd'], False) + make(['clean'], False) # separate 'clean' target to allow parallel build + make(['zstd'], False) else: os.chdir(programs_dir) + print('-----------------------------------------------') + print('compiling head') + print('-----------------------------------------------') make(['zstd'], False) - shutil.copy2('zstd', dst_zstd) + shutil.copy2('zstd', dst_zstd) # remove any remaining *.zst and *.dec from previous test os.chdir(tmp_dir) @@ -248,30 +278,31 @@ if __name__ == '__main__': # copy *.c and *.h to a temporary directory ("dict_source") if not os.path.isdir(dict_source_path): os.mkdir(dict_source_path) - print('cp ' + dict_files + ' ' + dict_source_path) - execute('cp ' + dict_files + ' ' + dict_source_path, param_shell=True) + for dict_glob in dict_globs: + files = glob.glob(dict_glob, root_dir=base_dir) + for file in files: + file = os.path.join(base_dir, file) + print("copying " + file + " to " + dict_source_path) + shutil.copy(file, dict_source_path) + print('-----------------------------------------------') print('Compress test.dat by all released zstd') + print('-----------------------------------------------') - error_code = 0 + create_dict(head, dict_source_path) for tag in tags: print(tag) if tag >= 'v0.5.0': - create_dict(tag, dict_source_path) + create_dict(tag, dict_source_path, head) dict_compress_sample(tag, test_dat) remove_duplicates() - error_code += decompress_dict(tag) + decompress_dict(tag) compress_sample(tag, test_dat) remove_duplicates() - error_code += decompress_zst(tag) + decompress_zst(tag) print('') print('Enumerate different compressed files') zstds = sorted(glob.glob('*.zst')) for zstd in zstds: print(zstd + ' : ' + repr(os.path.getsize(zstd)) + ', ' + sha1_of_file(zstd)) - - if error_code != 0: - print('====== ERROR !!! =======') - - sys.exit(error_code) diff --git a/src/dependencies/zstd-1.5.0/tests/zstreamtest.c b/src/dependencies/zstd-1.5.4/tests/zstreamtest.c similarity index 78% rename from src/dependencies/zstd-1.5.0/tests/zstreamtest.c rename to src/dependencies/zstd-1.5.4/tests/zstreamtest.c index bbef903..14c4af8 100644 --- a/src/dependencies/zstd-1.5.0/tests/zstreamtest.c +++ b/src/dependencies/zstd-1.5.4/tests/zstreamtest.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,6 +25,7 @@ #include /* free */ #include /* fgets, sscanf */ #include /* strcmp */ +#include /* time_t, time(), to randomize seed */ #include /* assert */ #include "timefn.h" /* UTIL_time_t, UTIL_getTime */ #include "mem.h" @@ -39,7 +40,7 @@ #include "seqgen.h" #include "util.h" #include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */ - +#include "external_matchfinder.h" /* zstreamSequenceProducer, EMF_testCase */ /*-************************************ * Constants @@ -259,7 +260,7 @@ static U32 badParameters(ZSTD_CCtx* zc, ZSTD_parameters const savedParams) return 0; } -static int basicUnitTests(U32 seed, double compressibility) +static int basicUnitTests(U32 seed, double compressibility, int bigTests) { size_t const CNBufferSize = COMPRESSIBLE_NOISE_LENGTH; void* CNBuffer = malloc(CNBufferSize); @@ -424,6 +425,15 @@ static int basicUnitTests(U32 seed, double compressibility) } } DISPLAYLEVEL(3, "OK \n"); + /* check decompression fails early if first bytes are wrong */ + DISPLAYLEVEL(3, "test%3i : early decompression error if first bytes are incorrect : ", testNb++); + { const char buf[3] = { 0 }; /* too short, not enough to start decoding header */ + ZSTD_inBuffer inb = { buf, sizeof(buf), 0 }; + size_t const remaining = ZSTD_decompressStream(zd, &outBuff, &inb); + if (!ZSTD_isError(remaining)) goto _output_error; /* should have errored out immediately (note: this does not test the exact error code) */ + } + DISPLAYLEVEL(3, "OK \n"); + /* context size functions */ DISPLAYLEVEL(3, "test%3i : estimate DStream size : ", testNb++); { ZSTD_frameHeader fhi; @@ -513,7 +523,7 @@ static int basicUnitTests(U32 seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : NULL buffers : ", testNb++); + DISPLAYLEVEL(3, "test%3i : NULL output and NULL input : ", testNb++); inBuff.src = NULL; inBuff.size = 0; inBuff.pos = 0; @@ -539,6 +549,36 @@ static int basicUnitTests(U32 seed, double compressibility) { size_t const ret = ZSTD_decompressStream(zd, &outBuff, &inBuff); if (ret != 0) goto _output_error; } + DISPLAYLEVEL(3, "OK\n"); + + DISPLAYLEVEL(3, "test%3i : NULL output buffer with non-NULL input : ", testNb++); + { + const char* test = "aa"; + inBuff.src = test; + inBuff.size = 2; + inBuff.pos = 0; + outBuff.dst = NULL; + outBuff.size = 0; + outBuff.pos = 0; + CHECK_Z( ZSTD_compressStream(zc, &outBuff, &inBuff) ); + CHECK(inBuff.pos != inBuff.size, "Entire input should be consumed"); + CHECK_Z( ZSTD_endStream(zc, &outBuff) ); + outBuff.dst = (char*)(compressedBuffer); + outBuff.size = compressedBufferSize; + outBuff.pos = 0; + { size_t const r = ZSTD_endStream(zc, &outBuff); + CHECK(r != 0, "Error or some data not flushed (ret=%zu)", r); + } + inBuff.src = outBuff.dst; + inBuff.size = outBuff.pos; + inBuff.pos = 0; + outBuff.dst = NULL; + outBuff.size = 0; + outBuff.pos = 0; + CHECK_Z( ZSTD_initDStream(zd) ); + CHECK_Z(ZSTD_decompressStream(zd, &outBuff, &inBuff)); + } + DISPLAYLEVEL(3, "OK\n"); /* _srcSize compression test */ DISPLAYLEVEL(3, "test%3i : compress_srcSize %u bytes : ", testNb++, COMPRESSIBLE_NOISE_LENGTH); @@ -613,7 +653,7 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(3, "OK (error detected : %s) \n", ZSTD_getErrorName(r)); } } - /* Complex context re-use scenario */ + /* Compression state re-use scenario */ DISPLAYLEVEL(3, "test%3i : context re-use : ", testNb++); ZSTD_freeCStream(zc); zc = ZSTD_createCStream(); @@ -634,8 +674,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_compressStream(zc, &outBuff, &inBuff) ); if (inBuff.pos != inBuff.size) goto _output_error; /* entire input should be consumed */ DISPLAYLEVEL(5, "end1 "); - { size_t const r = ZSTD_endStream(zc, &outBuff); - if (r != 0) goto _output_error; } /* error, or some data not flushed */ + if (ZSTD_endStream(zc, &outBuff) != 0) goto _output_error; /* error, or some data not flushed */ } /* use 2 */ { size_t const inSize = 1025; /* will not continue, because tables auto-adjust and are therefore different size */ @@ -653,8 +692,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_compressStream(zc, &outBuff, &inBuff) ); if (inBuff.pos != inBuff.size) goto _output_error; /* entire input should be consumed */ DISPLAYLEVEL(5, "end2 "); - { size_t const r = ZSTD_endStream(zc, &outBuff); - if (r != 0) goto _output_error; } /* error, or some data not flushed */ + if (ZSTD_endStream(zc, &outBuff) != 0) goto _output_error; /* error, or some data not flushed */ } DISPLAYLEVEL(3, "OK \n"); @@ -771,11 +809,12 @@ static int basicUnitTests(U32 seed, double compressibility) } /* Compression with ZSTD_c_stable{In,Out}Buffer */ - { ZSTD_CCtx* cctx = ZSTD_createCCtx(); + { ZSTD_CCtx* const cctx = ZSTD_createCCtx(); ZSTD_inBuffer in; ZSTD_outBuffer out; size_t cctxSize1; size_t cctxSize2; + assert(cctx != NULL); in.src = CNBuffer; in.size = CNBufferSize; out.dst = compressedBuffer; @@ -786,30 +825,33 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK(!(cSize < ZSTD_compressBound(CNBufferSize)), "cSize too large for test"); CHECK_Z(cSize = ZSTD_compress2(cctx, compressedBuffer, cSize + 4, CNBuffer, CNBufferSize)); CHECK_Z(cctxSize1 = ZSTD_sizeof_CCtx(cctx)); - { ZSTD_CCtx* cctx2 = ZSTD_createCCtx(); + /* @cctxSize2 : sizeof_CCtx when doing full streaming (no stable in/out) */ + { ZSTD_CCtx* const cctx2 = ZSTD_createCCtx(); + assert(cctx2 != NULL); in.pos = out.pos = 0; CHECK_Z(ZSTD_compressStream2(cctx2, &out, &in, ZSTD_e_continue)); CHECK(!(ZSTD_compressStream2(cctx2, &out, &in, ZSTD_e_end) == 0), "Not finished"); CHECK_Z(cctxSize2 = ZSTD_sizeof_CCtx(cctx2)); ZSTD_freeCCtx(cctx2); } - { ZSTD_CCtx* cctx3 = ZSTD_createCCtx(); + /* @cctxSize1 : sizeof_CCtx when doing single-shot compression (no streaming) */ + { ZSTD_CCtx* const cctx1 = ZSTD_createCCtx(); ZSTD_parameters params = ZSTD_getParams(0, CNBufferSize, 0); size_t cSize3; + assert(cctx1 != NULL); params.fParams.checksumFlag = 1; - cSize3 = ZSTD_compress_advanced(cctx3, compressedBuffer, compressedBufferSize, CNBuffer, CNBufferSize, NULL, 0, params); + cSize3 = ZSTD_compress_advanced(cctx1, compressedBuffer, compressedBufferSize, CNBuffer, CNBufferSize, NULL, 0, params); CHECK_Z(cSize3); CHECK(!(cSize == cSize3), "Must be same compressed size"); - CHECK(!(cctxSize1 == ZSTD_sizeof_CCtx(cctx3)), "Must be same CCtx size"); - ZSTD_freeCCtx(cctx3); + CHECK(!(cctxSize1 == ZSTD_sizeof_CCtx(cctx1)), "Must be same CCtx size"); + ZSTD_freeCCtx(cctx1); } CHECK(!(cctxSize1 < cctxSize2), "Stable buffers means less allocated size"); CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, cSize)); DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : ZSTD_compress2() doesn't modify user parameters : ", testNb++); - { - int stableInBuffer; + { int stableInBuffer; int stableOutBuffer; CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_c_stableInBuffer, &stableInBuffer)); CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_c_stableOutBuffer, &stableOutBuffer)); @@ -866,30 +908,73 @@ static int basicUnitTests(U32 seed, double compressibility) in.pos = 0; { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end); CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); + CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_stabilityCondition_notRespected), "Must be this error"); } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableInBuffer with continue and flush : ", testNb++); - in.src = CNBuffer; - in.size = CNBufferSize; - in.pos = 0; - out.pos = 0; - out.size = compressedBufferSize; - CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only)); - { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_continue); - CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); - } - CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only)); - { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush); - CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); - } + /* stableSrc + streaming */ + DISPLAYLEVEL(3, "test%3i : ZSTD_c_stableInBuffer compatibility with compressStream, flushStream and endStream : ", testNb++); + CHECK_Z( ZSTD_initCStream(cctx, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); + { ZSTD_inBuffer inBuf; + ZSTD_outBuffer outBuf; + const size_t nonZeroStartPos = 18; + const size_t inputSize = 500; + inBuf.src = CNBuffer; + inBuf.size = 100; + inBuf.pos = nonZeroStartPos; + outBuf.dst = (char*)(compressedBuffer)+cSize; + outBuf.size = ZSTD_compressBound(inputSize); + outBuf.pos = 0; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); + inBuf.size = 200; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); + CHECK_Z( ZSTD_flushStream(cctx, &outBuf) ); + inBuf.size = nonZeroStartPos + inputSize; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); + CHECK(ZSTD_endStream(cctx, &outBuf) != 0, "compression should be successful and fully flushed"); + { const void* const realSrcStart = (const char*)inBuf.src + nonZeroStartPos; + void* const verifBuf = (char*)outBuf.dst + outBuf.pos; + const size_t decSize = ZSTD_decompress(verifBuf, inputSize, outBuf.dst, outBuf.pos); + CHECK_Z(decSize); + CHECK(decSize != inputSize, "regenerated %zu bytes, instead of %zu", decSize, inputSize); + CHECK(memcmp(realSrcStart, verifBuf, inputSize) != 0, "regenerated data different from original"); + } } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableInBuffer allocated size : ", testNb++); + /* stableSrc + streaming */ + DISPLAYLEVEL(3, "test%3i : ZSTD_c_stableInBuffer compatibility with compressStream2, using different end directives : ", testNb++); + CHECK_Z( ZSTD_initCStream(cctx, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); + { ZSTD_inBuffer inBuf; + ZSTD_outBuffer outBuf; + const size_t nonZeroStartPos = 18; + const size_t inputSize = 500; + inBuf.src = CNBuffer; + inBuf.size = 100; + inBuf.pos = nonZeroStartPos; + outBuf.dst = (char*)(compressedBuffer)+cSize; + outBuf.size = ZSTD_compressBound(inputSize); + outBuf.pos = 0; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + inBuf.size = 200; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_flush) ); + inBuf.size = nonZeroStartPos + inputSize; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + CHECK( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_end) != 0, "compression should be successful and fully flushed"); + { const void* const realSrcStart = (const char*)inBuf.src + nonZeroStartPos; + void* const verifBuf = (char*)outBuf.dst + outBuf.pos; + const size_t decSize = ZSTD_decompress(verifBuf, inputSize, outBuf.dst, outBuf.pos); + CHECK_Z(decSize); + CHECK(decSize != inputSize, "regenerated %zu bytes, instead of %zu", decSize, inputSize); + CHECK(memcmp(realSrcStart, verifBuf, inputSize) != 0, "regenerated data different from original"); + } } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableInBuffer: context size : ", testNb++); { size_t const cctxSize = ZSTD_sizeof_CCtx(cctx); + DISPLAYLEVEL(4, "cctxSize1=%zu; cctxSize=%zu; cctxSize2=%zu : ", cctxSize1, cctxSize, cctxSize2); CHECK(!(cctxSize1 < cctxSize), "Must be bigger than single-pass"); CHECK(!(cctxSize < cctxSize2), "Must be smaller than streaming"); cctxSize1 = cctxSize; @@ -900,13 +985,15 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableOutBuffer, 1)); + in.src = CNBuffer; in.pos = out.pos = 0; in.size = MIN(CNBufferSize, 10); + out.size = compressedBufferSize; CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush)); in.pos = 0; in.size = CNBufferSize - in.size; CHECK(!(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end) == 0), "Not finished"); - CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, cSize)); + CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, out.pos)); DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableOutBuffer modify buffer : ", testNb++); @@ -916,12 +1003,13 @@ static int basicUnitTests(U32 seed, double compressibility) in.pos = out.pos = 0; { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_continue); CHECK(!ZSTD_isError(ret), "Must have errored"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_dstBuffer_wrong), "Must be this error"); + CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_stabilityCondition_notRespected), "Must be this error"); } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableOutBuffer allocated size : ", testNb++); + DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableOutBuffer: context size : ", testNb++); { size_t const cctxSize = ZSTD_sizeof_CCtx(cctx); + DISPLAYLEVEL(4, "cctxSize1=%zu; cctxSize=%zu; cctxSize2=%zu : ", cctxSize1, cctxSize, cctxSize2); CHECK(!(cctxSize1 < cctxSize), "Must be bigger than single-pass and stableInBuffer"); CHECK(!(cctxSize < cctxSize2), "Must be smaller than streaming"); } @@ -1063,7 +1151,7 @@ static int basicUnitTests(U32 seed, double compressibility) if (ZSTD_decompressStream(dctx, &out, &in) != 0) goto _output_error; if (in.pos != in.size) goto _output_error; } - /* The dictionary should presist across calls. */ + /* The dictionary should persist across calls. */ { ZSTD_outBuffer out = {decodedBuffer, decodedBufferSize, 0}; ZSTD_inBuffer in = {compressedBuffer, cSize, 0}; if (ZSTD_decompressStream(dctx, &out, &in) != 0) goto _output_error; @@ -1128,7 +1216,7 @@ static int basicUnitTests(U32 seed, double compressibility) if (ZSTD_decompressStream(dctx, &out, &in) != 0) goto _output_error; if (in.pos != in.size) goto _output_error; } - /* The ddict should presist across calls. */ + /* The ddict should persist across calls. */ { ZSTD_outBuffer out = {decodedBuffer, decodedBufferSize, 0}; ZSTD_inBuffer in = {compressedBuffer, cSize, 0}; if (ZSTD_decompressStream(dctx, &out, &in) != 0) goto _output_error; @@ -1175,12 +1263,12 @@ static int basicUnitTests(U32 seed, double compressibility) /* We should succeed to decompress with the dictionary. */ CHECK_Z( ZSTD_initDStream_usingDict(dctx, dictionary.start, dictionary.filled) ); CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, decodedBufferSize, compressedBuffer, cSize) ); - /* The dictionary should presist across calls. */ + /* The dictionary should persist across calls. */ CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, decodedBufferSize, compressedBuffer, cSize) ); /* We should succeed to decompress with the ddict. */ CHECK_Z( ZSTD_initDStream_usingDDict(dctx, ddict) ); CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, decodedBufferSize, compressedBuffer, cSize) ); - /* The ddict should presist across calls. */ + /* The ddict should persist across calls. */ CHECK_Z( ZSTD_decompressDCtx(dctx, decodedBuffer, decodedBufferSize, compressedBuffer, cSize) ); /* When we reset the context the ddict is cleared. */ CHECK_Z( ZSTD_initDStream(dctx) ); @@ -1478,6 +1566,84 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK(!ZSTD_isError(ZSTD_CCtx_setParameter(zc, ZSTD_c_srcSizeHint, -1)), "Out of range doesn't error"); DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : ZSTD_lazy compress with hashLog = 29 and searchLog = 4 : ", testNb++); + if (MEM_64bits()) { + ZSTD_outBuffer out = { compressedBuffer, compressedBufferSize, 0 }; + ZSTD_inBuffer in = { CNBuffer, CNBufferSize, 0 }; + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_strategy, ZSTD_lazy)); + /* Force enable the row based match finder */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_useRowMatchFinder, ZSTD_ps_enable)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_searchLog, 4)); + /* Set windowLog to 29 so the hashLog doesn't get sized down */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_windowLog, 29)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_hashLog, 29)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_checksumFlag, 1)); + /* Compress with continue first so the hashLog doesn't get sized down */ + CHECK_Z(ZSTD_compressStream2(zc, &out, &in, ZSTD_e_continue)); + CHECK_Z(ZSTD_compressStream2(zc, &out, &in, ZSTD_e_end)); + cSize = out.pos; + CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, cSize)); + } + DISPLAYLEVEL(3, "OK \n"); + + DISPLAYLEVEL(3, "test%3i : Test offset == windowSize : ", testNb++); + { + int windowLog; + int const kMaxWindowLog = bigTests ? 29 : 26; + size_t const kNbSequences = 10000; + size_t const kMaxSrcSize = (1u << kMaxWindowLog) + 10 * kNbSequences; + char* src = calloc(kMaxSrcSize, 1); + ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences); + for (windowLog = ZSTD_WINDOWLOG_MIN; windowLog <= kMaxWindowLog; ++windowLog) { + size_t const srcSize = ((size_t)1 << windowLog) + 10 * (kNbSequences - 1); + + sequences[0].offset = 32; + sequences[0].litLength = 32; + sequences[0].matchLength = (1u << windowLog) - 32; + sequences[0].rep = 0; + { + size_t i; + for (i = 1; i < kNbSequences; ++i) { + sequences[i].offset = (1u << windowLog) - (FUZ_rand(&seed) % 8); + sequences[i].litLength = FUZ_rand(&seed) & 7; + sequences[i].matchLength = 10 - sequences[i].litLength; + sequences[i].rep = 0; + } + } + + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_checksumFlag, 1)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_minMatch, 3)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, 1)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_windowLog, windowLog)); + assert(srcSize <= kMaxSrcSize); + cSize = ZSTD_compressSequences(zc, compressedBuffer, compressedBufferSize, sequences, kNbSequences, src, srcSize); + CHECK_Z(cSize); + CHECK_Z(ZSTD_DCtx_reset(zd, ZSTD_reset_session_and_parameters)); + CHECK_Z(ZSTD_DCtx_setParameter(zd, ZSTD_d_windowLogMax, windowLog)) + { + ZSTD_inBuffer in = {compressedBuffer, cSize, 0}; + size_t decompressedBytes = 0; + for (;;) { + ZSTD_outBuffer out = {decodedBuffer, decodedBufferSize, 0}; + size_t const ret = ZSTD_decompressStream(zd, &out, &in); + CHECK_Z(ret); + CHECK(decompressedBytes + out.pos > srcSize, "Output too large"); + CHECK(memcmp(out.dst, src + decompressedBytes, out.pos), "Corrupted"); + decompressedBytes += out.pos; + if (ret == 0) { + break; + } + } + CHECK(decompressedBytes != srcSize, "Output wrong size"); + } + } + free(sequences); + free(src); + } + DISPLAYLEVEL(3, "OK \n"); + /* Overlen overwriting window data bug */ DISPLAYLEVEL(3, "test%3i : wildcopy doesn't overwrite potential match data : ", testNb++); { /* This test has a window size of 1024 bytes and consists of 3 blocks: @@ -1690,6 +1856,445 @@ static int basicUnitTests(U32 seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : Block-Level External Sequence Producer API: ", testNb++); + { + size_t const dstBufSize = ZSTD_compressBound(CNBufferSize); + BYTE* const dstBuf = (BYTE*)malloc(ZSTD_compressBound(dstBufSize)); + size_t const checkBufSize = CNBufferSize; + BYTE* const checkBuf = (BYTE*)malloc(checkBufSize); + int enableFallback; + EMF_testCase sequenceProducerState; + + CHECK(dstBuf == NULL || checkBuf == NULL, "allocation failed"); + + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + + /* Reference external matchfinder outside the test loop to + * check that the reference is preserved across compressions */ + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + + for (enableFallback = 0; enableFallback <= 1; enableFallback++) { + size_t testCaseId; + size_t const numTestCases = 9; + + EMF_testCase const testCases[] = { + EMF_ONE_BIG_SEQ, + EMF_LOTS_OF_SEQS, + EMF_ZERO_SEQS, + EMF_BIG_ERROR, + EMF_SMALL_ERROR, + EMF_INVALID_OFFSET, + EMF_INVALID_MATCHLEN, + EMF_INVALID_LITLEN, + EMF_INVALID_LAST_LITS + }; + + ZSTD_ErrorCode const errorCodes[] = { + ZSTD_error_no_error, + ZSTD_error_no_error, + ZSTD_error_sequenceProducer_failed, + ZSTD_error_sequenceProducer_failed, + ZSTD_error_sequenceProducer_failed, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid + }; + + for (testCaseId = 0; testCaseId < numTestCases; testCaseId++) { + size_t res; + + int const compressionShouldSucceed = ( + (errorCodes[testCaseId] == ZSTD_error_no_error) || + (enableFallback && errorCodes[testCaseId] == ZSTD_error_sequenceProducer_failed) + ); + + int const testWithSequenceValidation = ( + testCases[testCaseId] == EMF_INVALID_OFFSET + ); + + sequenceProducerState = testCases[testCaseId]; + + ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, testWithSequenceValidation)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, enableFallback)); + res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); + + if (compressionShouldSucceed) { + CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res)); + CHECK_Z(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res)); + CHECK(memcmp(CNBuffer, checkBuf, CNBufferSize) != 0, "EMF: Corruption!"); + } else { + CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); + CHECK( + ZSTD_getErrorCode(res) != errorCodes[testCaseId], + "EMF: Wrong error code: %s", ZSTD_getErrorName(res) + ); + } + } + + /* Test compression with external matchfinder + empty src buffer */ + { + size_t res; + sequenceProducerState = EMF_ZERO_SEQS; + ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, enableFallback)); + res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, 0); + CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res)); + CHECK(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res) != 0, "EMF: Empty src round trip failed!"); + } + } + + /* Test that reset clears the external matchfinder */ + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); + CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize)); + + /* Test that registering mFinder == NULL clears the external matchfinder */ + ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); + ZSTD_registerSequenceProducer(zc, NULL, NULL); /* clear the external matchfinder */ + CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize)); + + /* Test that external matchfinder doesn't interact with older APIs */ + ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder is used */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); + CHECK_Z(ZSTD_compressCCtx(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize, 3)); + + /* Test that compression returns the correct error with LDM */ + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + { + size_t res; + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable)); + res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); + CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); + CHECK( + ZSTD_getErrorCode(res) != ZSTD_error_parameter_combination_unsupported, + "EMF: Wrong error code: %s", ZSTD_getErrorName(res) + ); + } + +#ifdef ZSTD_MULTITHREAD + /* Test that compression returns the correct error with nbWorkers > 0 */ + CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); + { + size_t res; + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_nbWorkers, 1)); + res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); + CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); + CHECK( + ZSTD_getErrorCode(res) != ZSTD_error_parameter_combination_unsupported, + "EMF: Wrong error code: %s", ZSTD_getErrorName(res) + ); + } +#endif + + free(dstBuf); + free(checkBuf); + } + DISPLAYLEVEL(3, "OK \n"); + + + /* Test maxBlockSize cctx param functionality */ + DISPLAYLEVEL(3, "test%3i : Testing maxBlockSize PR#3418: ", testNb++); + { + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + + /* Quick test to make sure maxBlockSize bounds are enforced */ + assert(ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN - 1))); + assert(ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX + 1))); + + /* Test maxBlockSize < windowSize and windowSize < maxBlockSize*/ + { + size_t srcSize = 2 << 10; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst1 = compressedBuffer; + void* const dst2 = (BYTE*)compressedBuffer + dstSize; + size_t size1, size2; + void* const checkBuf = malloc(srcSize); + memset(src, 'x', srcSize); + + /* maxBlockSize = 1KB */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 1u << 10)); + size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize); + + if (ZSTD_isError(size1)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + /* maxBlockSize = 3KB */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 3u << 10)); + size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize); + + if (ZSTD_isError(size2)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + assert(size1 - size2 == 4); /* We add another RLE block with header + character */ + assert(memcmp(dst1, dst2, size2) != 0); /* Compressed output should not be equal */ + + /* maxBlockSize = 1KB, windowLog = 10 */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 1u << 10)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 10)); + size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize); + + if (ZSTD_isError(size1)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + /* maxBlockSize = 3KB, windowLog = 10 */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 3u << 10)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 10)); + size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize); + + if (ZSTD_isError(size2)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + assert(size1 == size2); + assert(memcmp(dst1, dst2, size1) == 0); /* Compressed output should be equal */ + + free(checkBuf); + } + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + + /* Test maxBlockSize = 0 is valid */ + { size_t srcSize = 256 << 10; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst1 = compressedBuffer; + void* const dst2 = (BYTE*)compressedBuffer + dstSize; + size_t size1, size2; + void* const checkBuf = malloc(srcSize); + + /* maxBlockSize = 0 */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 0)); + size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize); + + if (ZSTD_isError(size1)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + /* maxBlockSize = ZSTD_BLOCKSIZE_MAX */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX)); + size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize); + + if (ZSTD_isError(size2)) goto _output_error; + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + assert(size1 == size2); + assert(memcmp(dst1, dst2, size1) == 0); /* Compressed output should be equal */ + free(checkBuf); + } + ZSTD_freeCCtx(cctx); + } + DISPLAYLEVEL(3, "OK \n"); + + /* Test Sequence Validation */ + DISPLAYLEVEL(3, "test%3i : Testing sequence validation: ", testNb++); + { + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + + /* Test minMatch >= 4, matchLength < 4 */ + { + size_t srcSize = 11; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst = compressedBuffer; + size_t const kNbSequences = 4; + ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences); + + memset(src, 'x', srcSize); + + sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0}; + sequences[1] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[2] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[3] = (ZSTD_Sequence) {0, 1, 0, 0}; + + /* Test with sequence validation */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1)); + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */ + CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */ + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + + /* Test without sequence validation */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 0)); + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */ + CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */ + + free(sequences); + } + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + + + /* Test with no block delim */ + { + size_t srcSize = 4; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst = compressedBuffer; + size_t const kNbSequences = 1; + ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences); + void* const checkBuf = malloc(srcSize); + + memset(src, 'x', srcSize); + + sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0}; + + /* Test with sequence validation */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 3)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1)); + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(ZSTD_isError(cSize), "Should not throw an error"); + CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst, cSize)); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + + free(sequences); + free(checkBuf); + } + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + + { /* Test case with two additional sequences */ + size_t srcSize = 19; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst = compressedBuffer; + size_t const kNbSequences = 7; + ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences); + + memset(src, 'x', srcSize); + + sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0}; + sequences[1] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[2] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[3] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[4] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[5] = (ZSTD_Sequence) {1, 0, 3, 0}; + sequences[6] = (ZSTD_Sequence) {0, 0, 0, 0}; + + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1)); + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */ + CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */ + + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + + /* Test without sequence validation */ + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters)); + CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 0)); + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */ + CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */ + + free(sequences); + } + ZSTD_freeCCtx(cctx); + } + DISPLAYLEVEL(3, "OK \n"); + + + DISPLAYLEVEL(3, "test%3i : Testing large offset with small window size: ", testNb++); + { + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + + /* Test large offset, small window size*/ + { + size_t srcSize = 21; + void* const src = CNBuffer; + size_t dstSize = ZSTD_compressBound(srcSize); + void* const dst = compressedBuffer; + size_t const kNbSequences = 4; + ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences); + void* const checkBuf = malloc(srcSize); + const size_t largeDictSize = 1 << 25; + ZSTD_CDict* cdict = NULL; + ZSTD_DDict* ddict = NULL; + + /* Generate large dictionary */ + void* dictBuffer = calloc(largeDictSize, 1); + ZSTD_compressionParameters cParams = ZSTD_getCParams(1, srcSize, largeDictSize); + cParams.minMatch = ZSTD_MINMATCH_MIN; + cParams.hashLog = ZSTD_HASHLOG_MIN; + cParams.chainLog = ZSTD_CHAINLOG_MIN; + + cdict = ZSTD_createCDict_advanced(dictBuffer, largeDictSize, ZSTD_dlm_byRef, ZSTD_dct_rawContent, cParams, ZSTD_defaultCMem); + ddict = ZSTD_createDDict_advanced(dictBuffer, largeDictSize, ZSTD_dlm_byRef, ZSTD_dct_rawContent, ZSTD_defaultCMem); + + ZSTD_CCtx_refCDict(cctx, cdict); + ZSTD_DCtx_refDDict(dctx, ddict); + + sequences[0] = (ZSTD_Sequence) {3, 3, 3, 0}; + sequences[1] = (ZSTD_Sequence) {1 << 25, 0, 3, 0}; + sequences[2] = (ZSTD_Sequence) {1 << 25, 0, 9, 0}; + sequences[3] = (ZSTD_Sequence) {3, 0, 3, 0}; + + cSize = ZSTD_compressSequences(cctx, dst, dstSize, + sequences, kNbSequences, + src, srcSize); + + CHECK(ZSTD_isError(cSize), "Should not throw an error"); + + { + size_t dSize = ZSTD_decompressDCtx(dctx, checkBuf, srcSize, dst, cSize); + CHECK(ZSTD_isError(dSize), "Should not throw an error"); + CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!"); + } + + free(sequences); + free(checkBuf); + free(dictBuffer); + ZSTD_freeCDict(cdict); + ZSTD_freeDDict(ddict); + } + ZSTD_freeCCtx(cctx); + ZSTD_freeDCtx(dctx); + } + DISPLAYLEVEL(3, "OK \n"); + _end: FUZ_freeDictionary(dictionary); ZSTD_freeCStream(zc); @@ -1855,7 +2460,7 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, double co && oldTestLog /* at least one test happened */ && resetAllowed) { maxTestSize = FUZ_randomLength(&lseed, oldTestLog+2); maxTestSize = MIN(maxTestSize, srcBufferSize-16); - { U64 const pledgedSrcSize = (FUZ_rand(&lseed) & 3) ? ZSTD_CONTENTSIZE_UNKNOWN : maxTestSize; + { U64 const pledgedSrcSize = (FUZ_rand(&lseed) & 3) ? ZSTD_CONTENTSIZE_UNKNOWN : maxTestSize; CHECK_Z( ZSTD_CCtx_reset(zc, ZSTD_reset_session_only) ); CHECK_Z( ZSTD_CCtx_setPledgedSrcSize(zc, pledgedSrcSize) ); } @@ -1887,8 +2492,9 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, double co /* multi-segments compression test */ XXH64_reset(&xxhState, 0); { ZSTD_outBuffer outBuff = { cBuffer, cBufferSize, 0 } ; - U32 n; - for (n=0, cSize=0, totalTestSize=0 ; totalTestSize < maxTestSize ; n++) { + cSize=0; + totalTestSize=0; + while(totalTestSize < maxTestSize) { /* compress random chunks into randomly sized dst buffers */ { size_t const randomSrcSize = FUZ_randomLength(&lseed, maxSampleLog); size_t const srcSize = MIN(maxTestSize-totalTestSize, randomSrcSize); @@ -2193,7 +2799,7 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest, /* mess with long distance matching parameters */ if (bigTests) { - if (FUZ_rand(&lseed) & 1) CHECK_Z( setCCtxParameter(zc, cctxParams, ZSTD_c_enableLongDistanceMatching, FUZ_rand(&lseed) & 63, opaqueAPI) ); + if (FUZ_rand(&lseed) & 1) CHECK_Z( setCCtxParameter(zc, cctxParams, ZSTD_c_enableLongDistanceMatching, FUZ_randomClampedLength(&lseed, ZSTD_ps_auto, ZSTD_ps_disable), opaqueAPI) ); if (FUZ_rand(&lseed) & 3) CHECK_Z( setCCtxParameter(zc, cctxParams, ZSTD_c_ldmHashLog, FUZ_randomClampedLength(&lseed, ZSTD_HASHLOG_MIN, 23), opaqueAPI) ); if (FUZ_rand(&lseed) & 3) CHECK_Z( setCCtxParameter(zc, cctxParams, ZSTD_c_ldmMinMatch, FUZ_randomClampedLength(&lseed, ZSTD_LDM_MINMATCH_MIN, ZSTD_LDM_MINMATCH_MAX), opaqueAPI) ); if (FUZ_rand(&lseed) & 3) CHECK_Z( setCCtxParameter(zc, cctxParams, ZSTD_c_ldmBucketSizeLog, FUZ_randomClampedLength(&lseed, ZSTD_LDM_BUCKETSIZELOG_MIN, ZSTD_LDM_BUCKETSIZELOG_MAX), opaqueAPI) ); @@ -2277,7 +2883,7 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest, CHECK_Z( ZSTD_CCtx_refPrefix(zc, dict, dictSize) ); } - /* Adjust number of workers occassionally - result must be deterministic independent of nbWorkers */ + /* Adjust number of workers occasionally - result must be deterministic independent of nbWorkers */ CHECK_Z(ZSTD_CCtx_getParameter(zc, ZSTD_c_nbWorkers, &nbWorkers)); if (nbWorkers > 0 && (FUZ_rand(&lseed) & 7) == 0) { DISPLAYLEVEL(6, "t%u: Modify nbWorkers: %d -> %d \n", testNb, nbWorkers, nbWorkers + iter); @@ -2356,14 +2962,20 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest, CHECK(badParameters(zc, savedParams), "CCtx params are wrong"); /* multi - fragments decompression test */ + if (FUZ_rand(&lseed) & 1) { + CHECK_Z(ZSTD_DCtx_reset(zd, ZSTD_reset_session_and_parameters)); + } if (!dictSize /* don't reset if dictionary : could be different */ && (FUZ_rand(&lseed) & 1)) { - DISPLAYLEVEL(5, "resetting DCtx (dict:%p) \n", dict); + DISPLAYLEVEL(5, "resetting DCtx (dict:%p) \n", (void const*)dict); CHECK_Z( ZSTD_resetDStream(zd) ); } else { if (dictSize) DISPLAYLEVEL(5, "using dictionary of size %zu \n", dictSize); CHECK_Z( ZSTD_initDStream_usingDict(zd, dict, dictSize) ); } + if (FUZ_rand(&lseed) & 1) { + CHECK_Z(ZSTD_DCtx_setParameter(zd, ZSTD_d_disableHuffmanAssembly, FUZ_rand(&lseed) & 1)); + } { size_t decompressionResult = 1; ZSTD_inBuffer inBuff = { cBuffer, cSize, 0 }; ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 }; @@ -2405,7 +3017,14 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest, } } /* try decompression on noisy data */ - CHECK_Z( ZSTD_initDStream(zd_noise) ); /* note : no dictionary */ + if (FUZ_rand(&lseed) & 1) { + CHECK_Z(ZSTD_DCtx_reset(zd_noise, ZSTD_reset_session_and_parameters)); + } else { + CHECK_Z(ZSTD_DCtx_reset(zd_noise, ZSTD_reset_session_only)); + } + if (FUZ_rand(&lseed) & 1) { + CHECK_Z(ZSTD_DCtx_setParameter(zd_noise, ZSTD_d_disableHuffmanAssembly, FUZ_rand(&lseed) & 1)); + } { ZSTD_inBuffer inBuff = { cBuffer, cSize, 0 }; ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 }; while (outBuff.pos < dstBufferSize) { @@ -2488,6 +3107,7 @@ int main(int argc, const char** argv) if (!strcmp(argument, "--newapi")) { selected_api=advanced_api; testNb += !testNb; continue; } if (!strcmp(argument, "--no-big-tests")) { bigTests=0; continue; } + if (!strcmp(argument, "--big-tests")) { bigTests=1; continue; } argument++; while (*argument!=0) { @@ -2589,7 +3209,7 @@ int main(int argc, const char** argv) if (nbTests<=0) nbTests=1; if (testNb==0) { - result = basicUnitTests(0, ((double)proba) / 100); /* constant seed for predictability */ + result = basicUnitTests(0, ((double)proba) / 100, bigTests); /* constant seed for predictability */ } if (!result) { diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/.gitignore b/src/dependencies/zstd-1.5.4/zlibWrapper/.gitignore similarity index 100% rename from src/dependencies/zstd-1.5.0/zlibWrapper/.gitignore rename to src/dependencies/zstd-1.5.4/zlibWrapper/.gitignore diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/BUCK b/src/dependencies/zstd-1.5.4/zlibWrapper/BUCK similarity index 100% rename from src/dependencies/zstd-1.5.0/zlibWrapper/BUCK rename to src/dependencies/zstd-1.5.4/zlibWrapper/BUCK diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/Makefile b/src/dependencies/zstd-1.5.4/zlibWrapper/Makefile similarity index 93% rename from src/dependencies/zstd-1.5.0/zlibWrapper/Makefile rename to src/dependencies/zstd-1.5.4/zlibWrapper/Makefile index 6fd5ac3..830b294 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/Makefile +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/Makefile @@ -66,9 +66,10 @@ test: example fitblk example_zstd fitblk_zstd zwrapbench minigzip minigzip_zstd ./zwrapbench -qi1b3B1K $(TEST_FILE) ./zwrapbench -rqi1b1e3 ../lib -#valgrindTest: ZSTDLIBRARY = $(ZSTDLIBDIR)/libzstd.so -valgrindTest: VALGRIND = LD_LIBRARY_PATH=$(ZSTDLIBDIR) valgrind --track-origins=yes --leak-check=full --error-exitcode=1 -valgrindTest: clean example fitblk example_zstd fitblk_zstd zwrapbench +.PHONY: test-valgrind +#test-valgrind: ZSTDLIBRARY = $(ZSTDLIBDIR)/libzstd.so +test-valgrind: VALGRIND = LD_LIBRARY_PATH=$(ZSTDLIBDIR) valgrind --track-origins=yes --leak-check=full --error-exitcode=1 +test-valgrind: clean example fitblk example_zstd fitblk_zstd zwrapbench @echo "\n ---- valgrind tests ----" $(VALGRIND) ./example $(VALGRIND) ./example_zstd diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/README.md b/src/dependencies/zstd-1.5.4/zlibWrapper/README.md similarity index 95% rename from src/dependencies/zstd-1.5.0/zlibWrapper/README.md rename to src/dependencies/zstd-1.5.4/zlibWrapper/README.md index e61767c..311e1db 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/README.md +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/README.md @@ -1,7 +1,7 @@ Zstandard wrapper for zlib ================================ -The main objective of creating a zstd wrapper for [zlib](http://zlib.net/) is to allow a quick and smooth transition to zstd for projects already using zlib. +The main objective of creating a zstd wrapper for [zlib](https://zlib.net/) is to allow a quick and smooth transition to zstd for projects already using zlib. #### Required files @@ -43,7 +43,7 @@ This behavior can be changed using `ZWRAP_setDecompressionType(ZWRAP_FORCE_ZLIB) #### Example -We have take the file `test/example.c` from [the zlib library distribution](http://zlib.net/) and copied it to [zlibWrapper/examples/example.c](examples/example.c). +We have taken the file `test/example.c` from [the zlib library distribution](https://zlib.net/) and copied it to [zlibWrapper/examples/example.c](examples/example.c). After compilation and execution it shows the following results: ``` zlib version 1.2.8 = 0x1280, compile flags = 0x65 diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/example.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/example.c similarity index 95% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/example.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/example.c index 9000f7a..d7590e3 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/example.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/example.c @@ -56,26 +56,26 @@ z_const char hello[] = "hello, hello! I said hello, hello!"; const char dictionary[] = "hello, hello!"; uLong dictId; /* Adler32 value of the dictionary */ -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, +void test_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, +void test_large_deflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, +void test_large_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, +void test_flush _Z_OF((Byte *compr, uLong *comprLen)); +void test_sync _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, +void test_dict_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_dict_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); +int main _Z_OF((int argc, char *argv[])); #ifdef Z_SOLO -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -102,9 +102,9 @@ static free_func zfree = myfree; static alloc_func zalloc = (alloc_func)0; static free_func zfree = (free_func)0; -void test_compress OF((Byte *compr, uLong comprLen, +void test_compress _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, +void test_gzio _Z_OF((const char *fname, Byte *uncompr, uLong uncomprLen)); /* =========================================================================== diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/example_original.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/example_original.c similarity index 95% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/example_original.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/example_original.c index 649882b..5b4e4d1 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/example_original.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/example_original.c @@ -51,26 +51,26 @@ z_const char hello[] = "hello, hello!"; const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, +void test_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, +void test_large_deflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, +void test_large_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, +void test_flush _Z_OF((Byte *compr, uLong *comprLen)); +void test_sync _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, +void test_dict_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_dict_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); +int main _Z_OF((int argc, char *argv[])); #ifdef Z_SOLO -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -94,9 +94,9 @@ static free_func zfree = myfree; static alloc_func zalloc = (alloc_func)0; static free_func zfree = (free_func)0; -void test_compress OF((Byte *compr, uLong comprLen, +void test_compress _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, +void test_gzio _Z_OF((const char *fname, Byte *uncompr, uLong uncomprLen)); /* =========================================================================== diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk.c similarity index 99% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk.c index 669b176..8dc7071 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk.c @@ -119,7 +119,7 @@ local int recompress(z_streamp inf, z_streamp def) if (ret == Z_MEM_ERROR) return ret; - /* compress what was decompresed until done or no room */ + /* compress what was decompressed until done or no room */ def->avail_in = RAWLEN - inf->avail_out; def->next_in = raw; if (inf->avail_out != 0) diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk_original.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk_original.c similarity index 99% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk_original.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk_original.c index 20f351b..723dc00 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/fitblk_original.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/fitblk_original.c @@ -109,7 +109,7 @@ local int recompress(z_streamp inf, z_streamp def) if (ret == Z_MEM_ERROR) return ret; - /* compress what was decompresed until done or no room */ + /* compress what was decompressed until done or no room */ def->avail_in = RAWLEN - inf->avail_out; def->next_in = raw; if (inf->avail_out != 0) diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/minigzip.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/minigzip.c similarity index 94% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/minigzip.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/minigzip.c index f67be09..717a94d 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/minigzip.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/minigzip.c @@ -3,7 +3,7 @@ /* minigzip.c -- simulate gzip using the zlib compression library * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly. - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ /* @@ -64,7 +64,7 @@ #if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink OF((const char *)); + extern int unlink _Z_OF((const char *)); #endif #endif @@ -154,8 +154,8 @@ static void pwinerror (s) # include /* for unlink() */ #endif -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -180,9 +180,9 @@ typedef struct gzFile_s { z_stream strm; } *gzFile; -gzFile gzopen OF((const char *, const char *)); -gzFile gzdopen OF((int, const char *)); -gzFile gz_open OF((const char *, int, const char *)); +gzFile gzopen _Z_OF((const char *, const char *)); +gzFile gzdopen _Z_OF((int, const char *)); +gzFile gz_open _Z_OF((const char *, int, const char *)); gzFile gzopen(path, mode) const char *path; @@ -236,7 +236,7 @@ gzFile gz_open(path, fd, mode) return gz; } -int gzwrite OF((gzFile, const void *, unsigned)); +int gzwrite _Z_OF((gzFile, const void *, unsigned)); int gzwrite(gz, buf, len) gzFile gz; @@ -260,7 +260,7 @@ int gzwrite(gz, buf, len) return len; } -int gzread OF((gzFile, void *, unsigned)); +int gzread _Z_OF((gzFile, void *, unsigned)); int gzread(gz, buf, len) gzFile gz; @@ -297,7 +297,7 @@ int gzread(gz, buf, len) return len - strm->avail_out; } -int gzclose OF((gzFile)); +int gzclose _Z_OF((gzFile)); int gzclose(gz) gzFile gz; @@ -326,7 +326,7 @@ int gzclose(gz) return Z_OK; } -const char *gzerror OF((gzFile, int *)); +const char *gzerror _Z_OF((gzFile, int *)); const char *gzerror(gz, err) gzFile gz; @@ -340,15 +340,15 @@ const char *gzerror(gz, err) char *prog; -void error OF((const char *msg)); -void gz_compress OF((FILE *in, gzFile out)); +void error _Z_OF((const char *msg)); +void gz_compress _Z_OF((FILE *in, gzFile out)); #ifdef USE_MMAP -int gz_compress_mmap OF((FILE *in, gzFile out)); +int gz_compress_mmap _Z_OF((FILE *in, gzFile out)); #endif -void gz_uncompress OF((gzFile in, FILE *out)); -void file_compress OF((char *file, char *mode)); -void file_uncompress OF((char *file)); -int main OF((int argc, char *argv[])); +void gz_uncompress _Z_OF((gzFile in, FILE *out)); +void file_compress _Z_OF((char *file, char *mode)); +void file_uncompress _Z_OF((char *file)); +int main _Z_OF((int argc, char *argv[])); /* =========================================================================== * Display error message and exit diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/zwrapbench.c b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/zwrapbench.c similarity index 98% rename from src/dependencies/zstd-1.5.0/zlibWrapper/examples/zwrapbench.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/examples/zwrapbench.c index 5993e51..3bc9a1a 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/examples/zwrapbench.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/examples/zwrapbench.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-present, Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -388,7 +388,7 @@ static int BMK_benchMem(z_const void* srcBuffer, size_t srcSize, markNb = (markNb+1) % NB_MARKS; DISPLAYLEVEL(2, "%2s-%-17.17s :%10u ->%10u (%5.3f),%6.1f MB/s\r", marks[markNb], displayName, (unsigned)srcSize, (unsigned)cSize, ratio, - (double)srcSize / fastestC ); + (double)srcSize / (double)fastestC ); (void)fastestD; (void)crcOrig; /* unused when decompression disabled */ #if 1 @@ -428,8 +428,10 @@ static int BMK_benchMem(z_const void* srcBuffer, size_t srcSize, ZSTD_DStream* zbd = ZSTD_createDStream(); size_t rSize; if (zbd == NULL) EXM_THROW(1, "ZSTD_createDStream() allocation failure"); - rSize = ZSTD_initDStream_usingDict(zbd, dictBuffer, dictBufferSize); - if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_initDStream() failed : %s", ZSTD_getErrorName(rSize)); + rSize = ZSTD_DCtx_reset(zbd, ZSTD_reset_session_only); + if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_DCtx_reset() failed : %s", ZSTD_getErrorName(rSize)); + rSize = ZSTD_DCtx_loadDictionary(zbd, dictBuffer, dictBufferSize); + if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_DCtx_loadDictionary() failed : %s", ZSTD_getErrorName(rSize)); do { U32 blockNb; for (blockNb=0; blockNb%10u (%5.3f),%6.1f MB/s ,%6.1f MB/s\r", marks[markNb], displayName, (unsigned)srcSize, (unsigned)cSize, ratio, - (double)srcSize / fastestC, - (double)srcSize / fastestD ); + (double)srcSize / (double)fastestC, + (double)srcSize / (double)fastestD ); /* CRC Checking */ { U64 const crcCheck = XXH64(resultBuffer, srcSize, 0); @@ -558,8 +560,8 @@ static int BMK_benchMem(z_const void* srcBuffer, size_t srcSize, } /* for (testNb = 1; testNb <= (g_nbIterations + !g_nbIterations); testNb++) */ if (g_displayLevel == 1) { - double cSpeed = (double)srcSize / fastestC; - double dSpeed = (double)srcSize / fastestD; + double cSpeed = (double)srcSize / (double)fastestC; + double dSpeed = (double)srcSize / (double)fastestD; if (g_additionalParam) DISPLAY("-%-3i%11i (%5.3f) %6.2f MB/s %6.1f MB/s %s (param=%d)\n", cLevel, (int)cSize, ratio, cSpeed, dSpeed, displayName, g_additionalParam); else @@ -836,7 +838,7 @@ static int usage(const char* programName) DISPLAY( " -b# : benchmark file(s), using # compression level (default : %d) \n", ZSTDCLI_CLEVEL_DEFAULT); DISPLAY( " -e# : test all compression levels from -bX to # (default: %d)\n", ZSTDCLI_CLEVEL_DEFAULT); DISPLAY( " -i# : minimum evaluation time in seconds (default : 3s)\n"); - DISPLAY( " -B# : cut file into independent blocks of size # (default: no block)\n"); + DISPLAY( " -B# : cut file into independent chunks of size # (default: no chunking)\n"); return 0; } diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzclose.c b/src/dependencies/zstd-1.5.4/zlibWrapper/gzclose.c similarity index 89% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzclose.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzclose.c index 25d3789..ba43b8c 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzclose.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzclose.c @@ -3,7 +3,7 @@ /* gzclose.c -- zlib gzclose() function * Copyright (C) 2004, 2010 Mark Adler - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ #include "gzguts.h" diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzcompatibility.h b/src/dependencies/zstd-1.5.4/zlibWrapper/gzcompatibility.h similarity index 73% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzcompatibility.h rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzcompatibility.h index c1aa2b8..9d11b98 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzcompatibility.h +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzcompatibility.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -11,10 +11,10 @@ #if ZLIB_VERNUM <= 0x1240 -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzbuffer _Z_OF((gzFile file, unsigned size)); +ZEXTERN z_off_t ZEXPORT gzoffset _Z_OF((gzFile file)); #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t @@ -40,7 +40,7 @@ struct gzFile_s { #if ZLIB_VERNUM <= 0x1270 #if defined(_WIN32) && !defined(Z_SOLO) # include /* for wchar_t */ -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, +ZEXTERN gzFile ZEXPORT gzopen_w _Z_OF((const wchar_t *path, const char *mode)); #endif #endif @@ -61,8 +61,8 @@ ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, # endif # undef z_longlong #endif -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, +ZEXTERN z_size_t ZEXPORT gzfread _Z_OF((voidp buf, z_size_t size, z_size_t nitems, gzFile file)); -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, +ZEXTERN z_size_t ZEXPORT gzfwrite _Z_OF((voidpc buf, z_size_t size, z_size_t nitems, gzFile file)); #endif diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzguts.h b/src/dependencies/zstd-1.5.4/zlibWrapper/gzguts.h similarity index 91% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzguts.h rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzguts.h index b639b4b..70a609d 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzguts.h +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzguts.h @@ -4,7 +4,7 @@ /* gzguts.h -- zlib internal header definitions for gz* operations * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ #ifdef _LARGEFILE64_SOURCE @@ -126,8 +126,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc _Z_OF((uInt size)); + extern void free _Z_OF((voidpf ptr)); #endif /* get errno and strerror definition */ @@ -145,10 +145,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64 _Z_OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 _Z_OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 _Z_OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 _Z_OF((gzFile)); #endif /* default memLevel */ @@ -213,9 +213,9 @@ typedef union { } gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error _Z_OF((gz_statep, int, const char *)); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror _Z_OF((DWORD error)); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t @@ -224,6 +224,6 @@ char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); +unsigned ZLIB_INTERNAL gz_intmax _Z_OF((void)); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzlib.c b/src/dependencies/zstd-1.5.4/zlibWrapper/gzlib.c similarity index 98% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzlib.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzlib.c index b1fb985..eea480a 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzlib.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzlib.c @@ -3,7 +3,7 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files * Copyright (C) 2004-2017 Mark Adler - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ #include "gzguts.h" @@ -19,8 +19,8 @@ #endif /* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); +local void gz_reset _Z_OF((gz_statep)); +local gzFile gz_open _Z_OF((const void *, int, const char *)); #if defined UNDER_CE diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzread.c b/src/dependencies/zstd-1.5.4/zlibWrapper/gzread.c similarity index 97% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzread.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzread.c index 359d178..584fad1 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzread.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzread.c @@ -3,7 +3,7 @@ /* gzread.c -- zlib functions for reading gzip files * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ #include "gzguts.h" @@ -17,13 +17,13 @@ /* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); -local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); +local int gz_load _Z_OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail _Z_OF((gz_statep)); +local int gz_look _Z_OF((gz_statep)); +local int gz_decomp _Z_OF((gz_statep)); +local int gz_fetch _Z_OF((gz_statep)); +local int gz_skip _Z_OF((gz_statep, z_off64_t)); +local z_size_t gz_read _Z_OF((gz_statep, voidp, z_size_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state.state->fd, and update state.state->eof, state.state->err, and state.state->msg as appropriate. @@ -464,8 +464,8 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) #endif #if ZLIB_VERNUM <= 0x1250 -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc_ _Z_OF((gzFile file)); #endif int ZEXPORT gzgetc(file) diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/gzwrite.c b/src/dependencies/zstd-1.5.4/zlibWrapper/gzwrite.c similarity index 98% rename from src/dependencies/zstd-1.5.0/zlibWrapper/gzwrite.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/gzwrite.c index 422ff17..ccd4f71 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/gzwrite.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/gzwrite.c @@ -3,7 +3,7 @@ /* gzwrite.c -- zlib functions for writing gzip files * Copyright (C) 2004-2017 Mark Adler - * For conditions of distribution and use, see http://www.zlib.net/zlib_license.html + * For conditions of distribution and use, see https://www.zlib.net/zlib_license.html */ #include @@ -11,10 +11,10 @@ #include "gzguts.h" /* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); -local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); +local int gz_init _Z_OF((gz_statep)); +local int gz_comp _Z_OF((gz_statep, int)); +local int gz_zero _Z_OF((gz_statep, z_off64_t)); +local z_size_t gz_write _Z_OF((gz_statep, voidpc, z_size_t)); /* Initialize state for writing a gzip file. Mark initialization by setting state.state->size to non-zero. Return -1 on a memory allocation failure, or 0 on diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.c b/src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.c similarity index 92% rename from src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.c rename to src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.c index ceb2393..479ddd4 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.c +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -101,7 +101,7 @@ ZWRAP_decompress_type ZWRAP_getDecompressionType(void) { return g_ZWRAPdecompres const char * zstdVersion(void) { return ZSTD_VERSION_STRING; } -ZEXTERN const char * ZEXPORT z_zlibVersion OF((void)) { return zlibVersion(); } +ZEXTERN const char * ZEXPORT z_zlibVersion _Z_OF((void)) { return zlibVersion(); } static void* ZWRAP_allocFunction(void* opaque, size_t size) { @@ -260,7 +260,7 @@ static struct internal_state* convert_into_sis(void* ptr) return (struct internal_state*) ptr; } -ZEXTERN int ZEXPORT z_deflateInit_ OF((z_streamp strm, int level, +ZEXTERN int ZEXPORT z_deflateInit_ _Z_OF((z_streamp strm, int level, const char *version, int stream_size)) { ZWRAP_CCtx* zwc; @@ -287,7 +287,7 @@ ZEXTERN int ZEXPORT z_deflateInit_ OF((z_streamp strm, int level, } -ZEXTERN int ZEXPORT z_deflateInit2_ OF((z_streamp strm, int level, int method, +ZEXTERN int ZEXPORT z_deflateInit2_ _Z_OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)) @@ -319,7 +319,7 @@ int ZWRAP_deflateReset_keepDict(z_streamp strm) } -ZEXTERN int ZEXPORT z_deflateReset OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_deflateReset _Z_OF((z_streamp strm)) { LOG_WRAPPERC("- deflateReset\n"); if (!g_ZWRAP_useZSTDcompression) @@ -334,7 +334,7 @@ ZEXTERN int ZEXPORT z_deflateReset OF((z_streamp strm)) } -ZEXTERN int ZEXPORT z_deflateSetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateSetDictionary _Z_OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)) { @@ -359,7 +359,7 @@ ZEXTERN int ZEXPORT z_deflateSetDictionary OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush)) +ZEXTERN int ZEXPORT z_deflate _Z_OF((z_streamp strm, int flush)) { ZWRAP_CCtx* zwc; @@ -465,7 +465,7 @@ ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush)) } -ZEXTERN int ZEXPORT z_deflateEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_deflateEnd _Z_OF((z_streamp strm)) { if (!g_ZWRAP_useZSTDcompression) { LOG_WRAPPERC("- deflateEnd\n"); @@ -483,7 +483,7 @@ ZEXTERN int ZEXPORT z_deflateEnd OF((z_streamp strm)) } -ZEXTERN uLong ZEXPORT z_deflateBound OF((z_streamp strm, +ZEXTERN uLong ZEXPORT z_deflateBound _Z_OF((z_streamp strm, uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) @@ -493,7 +493,7 @@ ZEXTERN uLong ZEXPORT z_deflateBound OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflateParams OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateParams _Z_OF((z_streamp strm, int level, int strategy)) { @@ -594,7 +594,7 @@ static int ZWRAPD_finishWithErrorMsg(z_streamp strm, char* message) } -ZEXTERN int ZEXPORT z_inflateInit_ OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateInit_ _Z_OF((z_streamp strm, const char* version, int stream_size)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) { @@ -623,7 +623,7 @@ ZEXTERN int ZEXPORT z_inflateInit_ OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateInit2_ OF((z_streamp strm, int windowBits, +ZEXTERN int ZEXPORT z_inflateInit2_ _Z_OF((z_streamp strm, int windowBits, const char *version, int stream_size)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) { @@ -660,7 +660,7 @@ int ZWRAP_inflateReset_keepDict(z_streamp strm) } -ZEXTERN int ZEXPORT z_inflateReset OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateReset _Z_OF((z_streamp strm)) { LOG_WRAPPERD("- inflateReset\n"); if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -678,7 +678,7 @@ ZEXTERN int ZEXPORT z_inflateReset OF((z_streamp strm)) #if ZLIB_VERNUM >= 0x1240 -ZEXTERN int ZEXPORT z_inflateReset2 OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateReset2 _Z_OF((z_streamp strm, int windowBits)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -696,7 +696,7 @@ ZEXTERN int ZEXPORT z_inflateReset2 OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateSetDictionary _Z_OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)) { @@ -706,8 +706,10 @@ ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm, { ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state; if (zwd == NULL || zwd->zbd == NULL) return Z_STREAM_ERROR; - { size_t const initErr = ZSTD_initDStream_usingDict(zwd->zbd, dictionary, dictLength); - if (ZSTD_isError(initErr)) return ZWRAPD_finishWithError(zwd, strm, 0); } + { size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only); + if (ZSTD_isError(resetErr)) return ZWRAPD_finishWithError(zwd, strm, 0); } + { size_t const loadErr = ZSTD_DCtx_loadDictionary(zwd->zbd, dictionary, dictLength); + if (ZSTD_isError(loadErr)) return ZWRAPD_finishWithError(zwd, strm, 0); } zwd->decompState = ZWRAP_useReset; if (zwd->totalInBytes == ZSTD_HEADERSIZE) { @@ -730,7 +732,7 @@ ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush)) +ZEXTERN int ZEXPORT z_inflate _Z_OF((z_streamp strm, int flush)) { ZWRAP_DCtx* zwd; @@ -926,7 +928,7 @@ error: } -ZEXTERN int ZEXPORT z_inflateEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateEnd _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateEnd(strm); @@ -943,7 +945,7 @@ ZEXTERN int ZEXPORT z_inflateEnd OF((z_streamp strm)) } -ZEXTERN int ZEXPORT z_inflateSync OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateSync _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) { return inflateSync(strm); @@ -955,7 +957,7 @@ ZEXTERN int ZEXPORT z_inflateSync OF((z_streamp strm)) /* Advanced compression functions */ -ZEXTERN int ZEXPORT z_deflateCopy OF((z_streamp dest, +ZEXTERN int ZEXPORT z_deflateCopy _Z_OF((z_streamp dest, z_streamp source)) { if (!g_ZWRAP_useZSTDcompression) @@ -964,7 +966,7 @@ ZEXTERN int ZEXPORT z_deflateCopy OF((z_streamp dest, } -ZEXTERN int ZEXPORT z_deflateTune OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateTune _Z_OF((z_streamp strm, int good_length, int max_lazy, int nice_length, @@ -977,7 +979,7 @@ ZEXTERN int ZEXPORT z_deflateTune OF((z_streamp strm, #if ZLIB_VERNUM >= 0x1260 -ZEXTERN int ZEXPORT z_deflatePending OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflatePending _Z_OF((z_streamp strm, unsigned *pending, int *bits)) { @@ -988,7 +990,7 @@ ZEXTERN int ZEXPORT z_deflatePending OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_deflatePrime OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflatePrime _Z_OF((z_streamp strm, int bits, int value)) { @@ -998,7 +1000,7 @@ ZEXTERN int ZEXPORT z_deflatePrime OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflateSetHeader OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateSetHeader _Z_OF((z_streamp strm, gz_headerp head)) { if (!g_ZWRAP_useZSTDcompression) @@ -1011,7 +1013,7 @@ ZEXTERN int ZEXPORT z_deflateSetHeader OF((z_streamp strm, /* Advanced decompression functions */ #if ZLIB_VERNUM >= 0x1280 -ZEXTERN int ZEXPORT z_inflateGetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateGetDictionary _Z_OF((z_streamp strm, Bytef *dictionary, uInt *dictLength)) { @@ -1022,7 +1024,7 @@ ZEXTERN int ZEXPORT z_inflateGetDictionary OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_inflateCopy OF((z_streamp dest, +ZEXTERN int ZEXPORT z_inflateCopy _Z_OF((z_streamp dest, z_streamp source)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !source->reserved) @@ -1032,7 +1034,7 @@ ZEXTERN int ZEXPORT z_inflateCopy OF((z_streamp dest, #if ZLIB_VERNUM >= 0x1240 -ZEXTERN long ZEXPORT z_inflateMark OF((z_streamp strm)) +ZEXTERN long ZEXPORT z_inflateMark _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateMark(strm); @@ -1041,7 +1043,7 @@ ZEXTERN long ZEXPORT z_inflateMark OF((z_streamp strm)) #endif -ZEXTERN int ZEXPORT z_inflatePrime OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflatePrime _Z_OF((z_streamp strm, int bits, int value)) { @@ -1051,7 +1053,7 @@ ZEXTERN int ZEXPORT z_inflatePrime OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateGetHeader OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateGetHeader _Z_OF((z_streamp strm, gz_headerp head)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -1060,7 +1062,7 @@ ZEXTERN int ZEXPORT z_inflateGetHeader OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateBackInit_ OF((z_streamp strm, int windowBits, +ZEXTERN int ZEXPORT z_inflateBackInit_ _Z_OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)) @@ -1071,7 +1073,7 @@ ZEXTERN int ZEXPORT z_inflateBackInit_ OF((z_streamp strm, int windowBits, } -ZEXTERN int ZEXPORT z_inflateBack OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateBack _Z_OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)) { @@ -1081,7 +1083,7 @@ ZEXTERN int ZEXPORT z_inflateBack OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateBackEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateBackEnd _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateBackEnd(strm); @@ -1089,14 +1091,14 @@ ZEXTERN int ZEXPORT z_inflateBackEnd OF((z_streamp strm)) } -ZEXTERN uLong ZEXPORT z_zlibCompileFlags OF((void)) { return zlibCompileFlags(); } +ZEXTERN uLong ZEXPORT z_zlibCompileFlags _Z_OF((void)) { return zlibCompileFlags(); } /* === utility functions === */ #ifndef Z_SOLO -ZEXTERN int ZEXPORT z_compress OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_compress _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) @@ -1115,7 +1117,7 @@ ZEXTERN int ZEXPORT z_compress OF((Bytef *dest, uLongf *destLen, } -ZEXTERN int ZEXPORT z_compress2 OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_compress2 _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)) { @@ -1131,7 +1133,7 @@ ZEXTERN int ZEXPORT z_compress2 OF((Bytef *dest, uLongf *destLen, } -ZEXTERN uLong ZEXPORT z_compressBound OF((uLong sourceLen)) +ZEXTERN uLong ZEXPORT z_compressBound _Z_OF((uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) return compressBound(sourceLen); @@ -1140,7 +1142,7 @@ ZEXTERN uLong ZEXPORT z_compressBound OF((uLong sourceLen)) } -ZEXTERN int ZEXPORT z_uncompress OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_uncompress _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)) { if (!ZSTD_isFrame(source, sourceLen)) @@ -1159,24 +1161,24 @@ ZEXTERN int ZEXPORT z_uncompress OF((Bytef *dest, uLongf *destLen, /* checksum functions */ -ZEXTERN uLong ZEXPORT z_adler32 OF((uLong adler, const Bytef *buf, uInt len)) +ZEXTERN uLong ZEXPORT z_adler32 _Z_OF((uLong adler, const Bytef *buf, uInt len)) { return adler32(adler, buf, len); } -ZEXTERN uLong ZEXPORT z_crc32 OF((uLong crc, const Bytef *buf, uInt len)) +ZEXTERN uLong ZEXPORT z_crc32 _Z_OF((uLong crc, const Bytef *buf, uInt len)) { return crc32(crc, buf, len); } #if ZLIB_VERNUM >= 0x12B0 -ZEXTERN uLong ZEXPORT z_adler32_z OF((uLong adler, const Bytef *buf, z_size_t len)) +ZEXTERN uLong ZEXPORT z_adler32_z _Z_OF((uLong adler, const Bytef *buf, z_size_t len)) { return adler32_z(adler, buf, len); } -ZEXTERN uLong ZEXPORT z_crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)) +ZEXTERN uLong ZEXPORT z_crc32_z _Z_OF((uLong crc, const Bytef *buf, z_size_t len)) { return crc32_z(crc, buf, len); } @@ -1184,8 +1186,15 @@ ZEXTERN uLong ZEXPORT z_crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)) #if ZLIB_VERNUM >= 0x1270 -ZEXTERN const z_crc_t FAR * ZEXPORT z_get_crc_table OF((void)) +ZEXTERN const z_crc_t FAR * ZEXPORT z_get_crc_table _Z_OF((void)) { return get_crc_table(); } #endif + + /* Error function */ +ZEXTERN const char * ZEXPORT z_zError _Z_OF((int err)) +{ + /* Just use zlib Error function */ + return zError(err); +} diff --git a/src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.h b/src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.h similarity index 97% rename from src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.h rename to src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.h index 042ab9f..230bf84 100644 --- a/src/dependencies/zstd-1.5.0/zlibWrapper/zstd_zlibwrapper.h +++ b/src/dependencies/zstd-1.5.4/zlibWrapper/zstd_zlibwrapper.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021, Przemyslaw Skibinski, Yann Collet, Facebook, Inc. + * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -25,6 +25,9 @@ extern "C" { #define z_const #endif +#if !defined(_Z_OF) + #define _Z_OF OF +#endif /* returns a string with version of zstd library */ const char * zstdVersion(void);

    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℞AMkzQ=&V-bWaym-?9j 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%0ARD|WAUa-^)bZn# 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

    ha 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�rRb`0y|*v1_Y0K2x& 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

    8<9fSZB$dF& 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 XH`Sg(-EAUyB+#J1+lRD_w3+`8x&Lfu literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_free.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_free.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c6afd4f824add999e028614ed538e0a77837226 GIT binary patch literal 22491 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_new.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_new.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..687ed5bf2d9b8f0cf8c6e64295d58fbe303f5cb0 GIT binary patch literal 19906 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_open.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_read_open.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93d8a1787d864e42b98f57d5b23f247451574988 GIT binary patch literal 29739 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%0D9str-# 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 T?~@22E{TByXNf6loM-qygI-I_ literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_util.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_util.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..662117f3c089a17ae4dcf2c81ce7b9af259ccaae GIT binary patch literal 28536 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%0DUq}rMuABWI08f>}3^2_6v;O6PVYp_;}Jc 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 A(EtDd literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_blocksize.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_blocksize.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cb7266db55327c493ccb9983239aa7cf68284c0c GIT binary patch literal 25554 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_data.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_data.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79e358f892cf3796858dfe6a76ea41b6d5c5ef33 GIT binary patch literal 22838 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 u@5HLrJROdC-Wd|ECV*Kq+SBy(zsGxL_fL}>a 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 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_finish_entry.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_finish_entry.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..afc3a48b7f6544a1ca6beef064933f604f19b0e6 GIT binary patch literal 23534 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 z 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 Kz}`+Qrruw0g3Yu5 literal 0 HcmV?d00001 diff --git a/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_format.3.pdf b/src/dependencies/libarchive-3.6.2/doc/pdf/archive_write_format.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..18fa0dcb65f59d042427b07f866418aa7a2d5871 GIT binary patch literal 26916 zcmcG$1zeTe)-NpG-5@Dli|+33E~!O#cOxZT(j7`jcZYzK(kR_Xhct2*=-%6X_Br>S z@4ess>GFAIk2&U;WB%tDv1OoD-#kqw?=U_Uk=o`OQ!&duJ$$i>p$j)%m-$i)I+ z?o7g<#6ZGeswylYt^#_B+S`H(ER8K~EL}Y1fNnq=eozM_4359*DJUultE-BGYKjP} ziAs?$IE#sENQ;W|JD8feJ6XB_K{?JYruMEb{DPoYMOPOGR~HFO8{lK|zZwaiorH_HAmISzr~p8{xB#6<01`GvEfbE7}ldg;JaSO(XMLjGHodGY>99)wwwN zsgK0;j$ysr?pp?9n;1f<5afRSot-MEO{xMkS_V-4Ii29!F-{!SeNg6k8&S+vuvNIB z91vqN$^(fx{>?WBJ@>v&n|e*DM^v2a@n@+)d6wy2Cs=Z*Y>0jZteR@u8d$>Q5V*#s zReT~g;Vy(+yy8WTFB}AXU(BSzehK+?tZszk(KNfTzrMQGP;ajg z&6H?C84^}?&pi91bawYGZIr>i(=+Ei-WpQ zzNEJ--#J%Xj*!#pGK#yL&5fouECnGHIpN*>2;by#)YJjyzb`ycnsT;kzto$NcSU2I zB*88r@vxYpCKbJ&>00!xvf%5o;0KaT!TI9=cZH`LX5M@*u(3$E=e>hps`xzAw2&Y;D5{Q96SgwI=fJ2jPSdc{$M0Zn8UZ z_%ZE^&WZAeC<@lriu=wwP}#iW8W|n!Wq{B0+$x&3+tVy9X?7LwpY0Dj4ZQH39P-+~ z>dk||ZCMYMC-teQ)Ai0TT{{~$wy#IDPz{L^+JxrDJznpU?cG5hG{>Sumeo2uisWq& zhUzD&*4~6o%=F*9pcaq&N)Ww6HbS^FeQnBz=co)zAa_r_xS7o;o;*ckkGv#(%DxZeRYX~ z&|?Dd_C9LaB@q|BMum4RlS|{dzdF1R+nuhP*S<)*VSIfD1GRv)a=B#aDyieVd))$6%uhOws&t~!L(UVc$b;;Kv z8!Wyw+jWqj@bU(y@n06KuO1xw-npdp&av4Kd4HB?e2awCNx;9{)ZX!>7Myr*gP0HI z)k~X*EBF&D5jGj8iD8Q7!<~e@`;8-UtC>74)gFJwTn%#8uq`TQ{8^&Eo5wXPIbTsDFF?kOrpZK z-5S2NZ69tJ8Gg++Yr2c-vghMm+8&iITO+oecV@PqL9jaVmP&Plb%QPjBDAMyy@Rmx z*7f|F<;Iy09#BvgyN+THv#J?pOhW;W5yle4k3xi45<{@mWEM9E7D;oW#@_=j7b3L! z!SQSDk-Wf^?HePaZ}5;?$>fwdAl@dZXJZpy*S5aOd_f}?{TNCveEse5je%d#7RV+)hdp(r8 zGFgc1Dzjr7VjL<&tK2+G;tv?P^8kxNpgjc3!2@t*o(sUkV#SuA!>KzQ-A(_$kg zcXH9-XQ_82;# z(P7loo(z!A(1%e|#=x^B<%*sU_lD7G$eZj{ducV^P|!`R3H}V*JIXP`l^dgBK16pWFFYIHFgtv-y2S zEHl>gD(&|gYDQ^4ImL^}fKj@C!{UUHh1`U9o?v17NRLhgiR!Fop6;5NYN^8T?M-i$ zT8iJHNj>ngeBUDMwqw>!Y}9neA{$%d+l-babhPP90;-_hkJo-HVOQ@8XT$uJq75|> z)hd+|_U7E}8e5^HXg8gNLJ0HZoJKK`6sgtsLL^N33+l-vd4+XK!HbBWds+ zuKpNTQ_CckpeBCC^dWqhUOF}J3{K$TnZVXV$UjuklaBeRi#VD8&_yh4|IkG&kFe^G<~n3@rPQO6AWY6c0n9^!ZZ>iV;HR-6)e zk?=Qotim|~fsV_CjP)O4kg8()=Jx~uFUZA9zYB|N%nJWCC>{i_5)&XXqeZ!ShYxY+!|P7Sg5xzWANGA1K`+eK%BY|wNxW{Ao*u&)=OEnyB6d_CBQGE{(^Bd4;%G%N0r znkEh@IMnuuGP5J(rnyw;8#POVK&NSO2CwM}Xn^U^Qi@&$V1N-6nk!UZ!Yv@}{kPruw$lA=t<0*)5Cjx(d`(TYc! zX%*AZfxGF0+z^y(2A`&}dhiNm5&Y~Ix&|{<)J{I8`wujS44SPnUxKL*S1PEwzIIP) z&iI|*=@41dm1P<$_E-wUMF$PqY$wp3bm(CAXWrIlE{R7A(O#E_?lr@x4f+N(UulI0 zWD4Sc4!Zby>J2d}M)i?nQW7$s)hLQUA+c`s%22w;f^$Vpu)jiuJWT8BXS>09`XBz( zfSlqSWS^YMnfe)J`y^L%sHyg&mJQf?*O~r&CY?sS#9-fa7cr!D&!lZ>U0j%DaJO^O zbKv=c@jj7U)>kA}HXeW+x+sdh@)k_}0>ucW7f%pNn{mq^ng1Nx*OGJiD1tGKsLhhp zbJ}H9VwkB9(j`KC@74`@CD-62V!|B;+W3#+_)C{7P2FGS@mASe2O1XL)w_Qdw{)Mu zrv9khG39tFJMQ35lH4PZJf?2OmcC0Sv*mdZ`woh!omp@ahfT4VVqgLhQKk{>M^G?< z9jvlklBQ0EWb|4zg8GczR3*-px^q6J{DA?TgXJ`VO;>Y|TC==TfSjwF#J66A^3s>Q zU(zQFh|0MeMZ}l9Y{OF_0Ugu_>^c&c$=`ViZ!>1W1{?@*nUo1j*ygGn_~1LDJM)j+ zT1*Ww2^9I;?l{tI?BN$H)2o3OK`>dpmIR6RF4ZiSvX}zBJum7$7!W+{bvAH1Xs?5j z8eP-IxMt_%j?{f3-*Lkz!#^;_MFcd0?JaN}csM}Elp_yBv*O3zIv5@E3uo<}nA#$! zt4@E9pt$gDoLKREOK+VMJ%kupn^x)LseEnuj{3?n0|hr+zNS1MBapg4$Ff`vA7h1^ zK=&S({q&Ui``yirNuvg^E76lJOSDhEK`1(gLt}D4Px;F`OOiCRqrMN=8Nd$bP%ItwCHz z5AEcF+)GZM9}rNEC7J)wp-;N;Nr$qqv;Uz(e^a4qo(@2Ol94$OAP+RPG!n7*Akk$4 zsZ(}tb`mZ&7JYbtioFZyQc1!Ds^tWYKX;6D-k|%BbnDqy`z%xH` zQ3d{qcolek5)i*#A6M(Qi823uUZ5&QE=D%?=6`hfYh~quE=H!H5)#&*J^!{+e_Reg zoKazBhiCqI@TxGg!ZSZL2IVrtGe3@_0#Myp?XP~Gmf;tNRaltdSso=0 z)Z+i9%il@+z03cKp2zWj(IaBy415$_fTV_)ny>^Nh>cE`K&K~h76Uq)I9WQl*gKK1 z{G8;Id^}bM$-AYKvx}&OkrN3UJ3!9p*E=&aH$cFLJ=|2W?N=Fk6S zIcOYE4}XmI`1~vN``cgdzv{yOz3$&qpdBr42Qn;K+L?nUWG8IrZ24ze)z#SLQI9-w zgZZyzeiDy=Wvi;Et+Bn$&yDqyaes6}!uqs30so=5r_$fIQ-QV$3jnk*KqpIQYg>?wPyaVs|Jr3w{XL0*nuM^3xXd3Sz@TVsW9jG${8v$6 ze%dC#&*(2vU}gDD6j+%45QSfi{(mO||0fXxE$uH6`G*kvO<4X>`Xrja#O0qN_CFDl z-?Y-7drw14UPD~%PsWSb+nD}?>pz9%-)_LabDiZMT>mN9|K$Et{%>pZv)&)G{mF|z zHq)=v-?;b}xBmUxQ|_M}{MExxmGCd>05s;Wp8pvAKRy4T=eP2IvyFc%{e9K`2kZ5y z)Bkl(D=UfV$Vk$uS=s`f8UF2JJyNOif8HWoe=19O7WRLx&);&M`1rS+zw;1O&Ivkb zI5;?;o`1amY{AO)I1kVYfJ(X9*nZaF}`$g{#CvoO>X}M$C%mvQY!ys87nI*$>Z;l_{Y-6_orI$?4VQO-~E2( zKGo;sB4Gjj9^XNKeq-k!EPZ6wBb$CQ`j2rQbGe?_3u4#PB0biBV&|XCePsEset$hd zw1Dcef$|@z`u+LX?;n&t(({w1$A39Nzh5O!^Z7Zy$EAHN{iDs(V*Z-#W50in`$XHH zsbBfbOi#xph}_>+8pJnHvC4lunSMJvp7hb5htYq3GBLAq0f4rqM$Q)Sk4tK1`Pdu$31kOpBzOA}!`a~sfQ03M*~0<_g2;RY25yO}>B zoJYk150E$V_&sIm>C!t@qPK z_Pd7+G>6}Di|8LNHPCE11O)zco@J?fE2(PYcLr{3R2oj}1*6z7E^5#QAw;?9?_yh^ zMV9kv2ou>I2#JYhheB=?k)kFU5F3hwOEU!kl=O%hw2Io5s{0#SWs)k?Q@al`F1naPdN1Mr?jC{+ z9)38ornZ6BCn(sjxreG?WP6@CXF9EaUi(_0W216>6)xC&nq@m50$@P=0C_#Tq zPMao^x0Fj(I<1EJowEK_WS;R`u5a8{*jNhE(oxi;>XJzC`B40J_RYTgjINqZim*{3 z1^I@b9qS;I^Dq1N`r)fJ?mBGuxxeBL^il)xAeEhnac{Pm-B(?|%2>jxXv`+1?oC(F zpQ*z%e2iBqs-(83TxKG!|K@6zD5Kf)Q8*ZM)_;t@D2 zNE{4l*3K4#r;$i@f2eSU{-7!9>nqxUe|s@jF+dL&VB+Bs7$)q80ATI~R~dYvG6%$fU(PAycboVYpt-25@>MrR9z%0%9DG~;smqnd{4;vN|1KMBJO}; z@?G?E+nHV6d23@cT(x1+kqLRJ3q4E&fhmonj1fYQP{J6bBZl#f+Rk;lDYvIM&^M4`Uf zH#=(q9YvaMTe(ABc)P*0zUqsW?(A0cWwEwfZAX=R?-PYrYS(`wW#@#YhlsktBAH>5J6*5a}M3xpQ(1k3!TIqSVm{ zz{4IfiL~i9Sf8vhrkxZDd!>1KYyM$>E}OdSU0KDd+l0DTa-Pw0_C56cW{TZ`bWFp= zmaVZ#|H+4Z-wZB%?}~5~Gd$NFVotv2EmJcOc-{M|MshwiWRV30lZxkl#=b{G*Gnzw zjBYHk%92Er>C)uso+50$g>sf5(svH|*`<`WR=_*iKE2lmgoB-jNVP<ny4}5G;AXt!vh`~a#&2#<8$C#~J3a8SBesJLnX61z zK6}q7aE?}b$w$j&xEUszD zpFJ0wi-agq4Ju(2ha@v=TXK`fj}X@|=Wp;*8DUl#vQ>dIh$z+pJH+@dh&DhoUeZ>G z7DB^E-zazy&mLTO_AY7?B|bhm_D$;rS6>jyd>Cqk2@7xL4**oIc*!mAS4GG3h;?pV zZJ&b}4;i29m>j|b{pX9We1MGp*`siM=s6=7ithzYuiH+eowQG`GiO|4%nm;`-$gFS z@e1b#eySkCFH{W%_CV3p%Kg%)rrj9){nk446ld_|&Sy`r3k!a8m8pkkMWk{cAI*4wcOgGri2obB^1r!X z|At#YHbf2%?%#0>Gb=O5J^f!|7iNzCfL%aP@Bc6GVgfMz1z!F_EstQu*}=#J_y}44 z4q80^23nqw{$G{|mfxK1{~tgLHxt{xf);b^PSWPtDBz+DK6&s`#)M^~#(vQHH!I0* z7#&M-Hj)M%-FS1T9+3c{a8HcE0ag?uQd|QKYtQLfEm;6qV|mm8xErB+S@~GQ;^98m z%z@o@>)1BeEd^Mw8_(^4!l~re#@(2^-}c=YH@FC<2rOh!Nh6I+)LBiW=F!mL_^rHU z%6LP1Ec)@V=oMCvjF{kSZ(Na6Ib3BN%4bF*sFXa_e03DhW9UQ2azqy=L!?Nw9&R!! zaV9T{-s{!Vnq}md=5qn4G--4(2pTm~lu0vgB^&t5$N?ov7vMjXQR{i9$TEJfm4yjL{Y7Ne~dF)#;P*q&1&l z)GY6Wg1)7}U>oHYEg6`@xb4b)DMA{Oq*Hlm;y`AF>^A`CcYGSvCgKN`LoG~)7ECUM zeGdf3?80pV7l6pQH=0BuH%5XX_s@#6k0V|46#H<1m(!2j2Z8$$8g|qHPp@eX;mAnD z0xZe>CE z!G$YJUtVsJ%<-Z6$MClyYTOgUn>~Tiw>8KbpOe3)FJ!Jf%N?n#vE~Vg5_p(j8O>v* zJb?RP^i2&+)>gRi?evO6BUdXv-mDt`1r(CXiIdHwm5Wz>8ro%!TH9nccBq*3MIYVQ zNPhf=_iOx<#PSBtInBE3GxhHR(iN8P+-%zJ&cl#gEH9_*v{62-8!bd7k2idW@Iv7v zh@djQ66K3-=9^f6qH}b;&Ukp3Y%ICj#{v~+?^o%L*rWScJLId?0c@{Ff%`q=rd$zZ z0?fuUfM&Pg(UMHvw(!1tpZqc!S|l(PzP8J0^8U)w*ZGO&1ba4I$J-8>J_2(WvDLc1 z(KGLQxr2HddhFCoTE@8`D+7m?tY36cf-e_Cp7wN_aH#v}^$9{iY={!(f5;;o4}@To_3ymwX(?By zm1k51a_k1C%c4xtXFB;Tmufu4R1+eq{?&AwTP}a+E>m3oHfnrT0@iFh zkJtI(x!C0nju!lZCdGU5;pDH++K(2q&vF*=0`sG`%aDQ44hBLY_mB)g!!wEl@=Yu-ED?Kh*|^qsG35eOs6|wq9>8MsW3+C`ie_yhK!}GWTA{$_=*b_F~boLgJykR!VR} z$X(x9sEFl}ycw^?Y3t;5CCr2||E_OUQr!rPqNq^VJiX$=o0To`;Vk;)aI}geJ+hNt z#bm1Xn`?!|)fH8}EB?%ZqA=O(BXY3sr3YJ#7c8#0n;UW+j$Qq`0SE)q(}?URIRbn_<6)4e6oKC#qhvzy?#p0lOC`vFG2J+q*L%(xAC zDS6$W8P^FtNzt%+vt$J@H5BPbOB!7mFwM-I^a0bvBmt`1rr-R?S$CfXS#;1iLGLaiF`&G}j zA!k*(GTKCT`ip#wI+BR=WW@O1-G7!&Lr~fhq?yj~ffULR<@t2m;f$LJku^=Fc2!k+ zVpOdaU0)1wRb_ftSI9zxj8Bm1I@V>R-FaDYdX8z5{k%ZFjh4fRZ<^P=FL4}KsiCc2^7!wVI|VZIM5)ykwJ zeQ7p#CvO?Fo+0avG`Dji+Y-kjeMfv|nIoxfQLUj{HlJmY-X{LN&V*_mqvRy;P?*FP zVl3TEwQQ!ife5BvBWk)0!WYexu1XqWET_k=%{$ZM^0gVt(fFVSp+KLSKK(Z@7}Fs4 zY3+Fdv{gX9V@GXxic2Hcf?Za7lJ7apJ2`VD%?8|-If`${KQsxM^1rJQ^fO!txPB(W zmOy;~)1-)6{5KHj(K`L#K%oC*>Hdj-*f>DO7j6*#0ljdrv;Jwf`3?JkqV#^V+pvRd zn1H|RHr)Ra`>=!R{Z9=ypr(HsZiE4%0C9i>KnfrYkOjyA6agTkB|zhsLFXqbG6T8L z0OkO5P&6{g_X4u;Jc1+}ptJLneaFty4hXPwwKWDAbu7*QVefGU1zOtyoGm^66PR)b zcmO;BUH~tkll|Xt)sy$}H(d3b<@&$JRc!3cAdl8x#vmYimU)0!W zf`p<-q$FKT(UQcKH4qr;LJw_Q3cWKbMrSDak&5Qi%`8c5cO~-Z#dSEq&?I1t)Eq*t zC141FN#eab5t%U@oKeVNk%J2x1+AkB< zxO%G-%RC*e)lYS5ByGHtks1{nXl|A)*1=_NCubVTG{K90E#c+pX6CoScBiQARhdfy z;O{hbbu*B$bll(#@)6$nf)xK6DlkW)@%DjG2(@pY;yP#+Aq9&8z^JW#W2WtS`Ytl5 zG4ySI-8nm6n)Y7p^626loHLb;JI!KxEjI7H=RqDRTB79?#prwCmVMC1JSU83vSMfi z5f;W6Xp;04*;H#0vk}^TW@|{s2-UB(6h=rjQ0XE#BRu{|Sf+&07u)9gK z$%4YoVTqUnJ)%8=JitU_1kYFpJMcHY=_Fsd3DQOqnqB4Nh1 zb7Uwi7-Y$Pr#YprCi_tc4|T6^ZqTa2OOrno(#j1jZkFy1f#Gd?Fs-USZ-+1{_ng^Y zE%m6%i`eStImNFK249Hsr@RQ@nN`m26ZJPONmbi0tv90U?4PXgUTiqokf)Wmgn+`S z?uOZfpwYi;*w})sLOZ6zP^GcS?}OXRD!-2l*v4ZWZ(1r;W;2$|i=alVG4I;F8t6dk zHKaCP7FP9SSKYN2oNuzZ{y6vMO>zmN{>{eJEMJ>^(WE%9w!TLcqn3QZE)yGi$Hg^; z?xpvF??J^um#`~#{iZCP^}BaXq2kX5%MgloKavaOIlj+o?dBctIGZnVzqv_DSX@wu z5T4O`C(kPD6@aDXB9S+eKwEM{^y=p~#^7wrvU5xp;<(`zWT)8o5%14M9FrX%qi zZ$pVzqG=)4e{8LKsu#LXtz#=1(qv2%dejybLcBRdfNs_(rg^4D50~T2P~6FrdZker z2cX`@g1e4Xivz#9A=3?PH%8ehX7u5@LSe+9P>^~+?9D9qHx3@g4dxVuyPxGj$K<3= z$ApfMx9gSCa)nMDEBzd}h)F)zWw5Mft~CEqM<&fe`6FF2OZ{_971yY$+K&x2!VwZ2 zEptc($_3`wio`MII4eRfl5KOT3=+>zu2dvk6kokBR~okFD^PRGaERMO@1jPpdy6#f z)f^g_!>#%u^X)SzH8LwhZ$>h=8iBA~lU0LRGW-)M($Z4ZX^(`7T4faUK9*)3z@A z04x>meKB3_PU%j4^9>@@Y$c{^)E~X`*1=E^(zb1UvNetoe#spzc{R!tg`dC~rk$qv zTr6Tm=DO=QIq1Gh)_xAKKVoj47z#4M%{^Pi!e=~tK?G3D1I|i4)P4UDy?}I5*4!a< zKF)};`#qQZbaR}eTT;Q-a^Cf|_a`$JBjg=g#|=&OGAyix3ZSlOh7dHhMFRWmzS5pB z-KNn3BIkM!rcE*(e53^?WiMXkv7q=u{xMeA$&16|f*Ehqmj$EHErGYKmuGAfu~dAm zR~|j#^DIybYzYTlpK|ScdZ!N zCz{4vEJDUtz6|WEhobuGyLBzv9Pm1d?(G-EQrFOn7ko{0apw|d1bes>qES*+OW8h5 zo$ozztxz+;+l%vp)wF~^+Fk_rD=rmIC9!)X9udX7@}k7|bETN%Waj0tJ};=1{47*5 z)YWFhw>FxQv18!UMICC5KbA3xvL(;9d%=Z}{fdnr>qA5H=U4~gaQ_jt<}vw!aM2%( zLj=-I&-CG5LBhQZ)eO?D!uXB^9gAU`t#9g)D)K7M&p%ZnhoNMJ?wsOW=2-re&ZFpk z^)z$~nNMp|MYenjEAvaLb5$^j13F5BW`otC?Z+v8hymw6yQ~LD@Uu1D-W!9tdqnC4P?@BR)YQp8hcBtLOI9V=et5C}w zsH}>dD+vu;UU_|2_RxB+ci19YfVw3YFs>#&j0eH5GO&XtlDH@`D5~z)S_aRycDj7VS`{hplv`O#Af(mA2AnG5buk=bL5Qh`OwS>(GORW+a2n%Pdi9 z<60W9hH2JB1EP>%j#oWLZV=S46pp9}l;5rQD{?dPVwHj1oJ=QB97gt|rE!8|YVD$0 zyoizRW+@+&uxRaCY-@k$zaB3iwCK}qWj$2FKl132+-&Ru9#@~l-M44OAk&BNM14J_ z-K>}4=1k5h@W2{3f4}U%X}_(o#MP!rW4Fy-mY(#rpI4?)b5G5ysHkNVj6L9XBh9DMtl8#mx_j+1wtm7c*t>X>ww6Yi{wg zH6J`5(bd{5z){u$6SLs_~iS{bkg&?mOyR5YWPb--hrBXI{bpEwiwLWveSx)0q$raiZnbRb=zvHEJX z%%m1402jU;u@@C)ED+EY5eKooIM{r80kbe?V((V|Y-%c(xUyePysziYP8vex!|74k ztpCRKg6lOSf}PW)?`xloAE?(H?P2@hEVvhWm2?-!+2104*Aa3(baH8osJP}KdU+Y+ zMv%?!ck+t6ZNbznP;oBGhudvV@d(BODfW(sNNJj1Qh|)$()~N5TC2BAQ&hw^3!K=o zoduhiUe)Y0{AlJZ4^DUi-#aPU%V&Uythh9SVR8D0rL_)BBr+q^t8Z5K!TiU z9cK{6NibLVf)uP34Ek2Ej6ONqDNZ!c(`vzi8r*n!|5D~y$W^mLSKDuMk!_qh08xQVNlMvi4_r=yA>&NhrK8#+!gcd7H z%t%;VnV6}p`?w~gh#XwbhaiM;#WP3FA8`UoFg!F(W*$^Jy%*76F&ny0-rE&;mq8GS zR~wkBT&aa#2?K9q22eFO7SV)#!$Dp~v_(J0^ zuAI&MVT<_paTBGN{7KcUG9R5!HeY!xUkwo~^UgxMX~wF@UM>}>VxE0^tGnOTSjBRg zxnxj_T(I?tHpR0s2%Zl(u9}b+;w+nB&8dtxbZon#0n>|1Gp-J@0~7OSs@UZlwmSMvkZq7D z^VmlU3lCd4S1;E^oEB#MbKiG<$K?|3W@cU{GnQ?k2GVJU5tZ;l#~$E4n~D$}BA7Kb zE%)TLK1x-g+&q5SzQ{i5hpt&SREdu-PaN|$Wu-wMO?l2>Vj9TtJ)_AXn@-^B;+U7& z=3##aO2c~H0GehOz;w>o0kNkE{g%^^Q$IlK3|kQbUTKzOnb9i2dL!T?9qo`Tug=vx z%7gRq7xAT`Gs4tv!7hqb9H?MR9E~GSxbkNwSa_E6X;>#K`tZ^1Kgh^q4jYl%2Go1t zT#P2n{NQsriV)lU{gykNi7$Z+Osp5Zu-iyBHo1uaVkw%jMo9zbp{%#L^&)?7C{F%dTsV0_85E#35-qP zC0Q9b7Mf6zG6yZe)bp%CQfnBqPc@5E8#*wxT)lgSR=`A;R!A|-K=d>fwf9?7w9_)V zkYtI41rvl=T&_RJi%`y84vxkT6xQK}&NJIyzs_!hIK2EyfDviuH`n zxqXhFbxkC!+Lf?}dbMZXlpWVL7i$g^JE9ssHP)vQF_A|fA*;M>sZlKzX{orI^ICIV z(e!Z9SQlm{kfCR!{Ho~=%8-aX70I~8fS;%nuvdCaj~ymydwW47xa5kYSMuq5#(Bl1 zK#R+6dt*V9>ilQvGL3Snn=8u8YMI2nlu(zL;JyN!8&MHP#E{oi;SW&xg=jnf#tiou z-u2&@;r@LDCprS3Up#7;o$x=a*6{KAogfM`xQL(7zXuQ@YG}SHzVAC@;|bI zdXWD;KnfI^_czm;2*|i51~RWngA8l(00oe7O$lUPQw15=)IlaT?VlF0-)&y3kMmXe z%jWfz{x$#q-sZ*3#l`fy%}d={4HN*?o*L(^2osr7u2#yC7lTsH^5yLdmoK;@AU!Fo!h8B*z}1zzm2t*&eBahvDc9A0iK(x(F^{gT`;vC_ zA(7ZQXe|AjfA2@rk-h)zSMQu&mJR{L;Tk{Pv&b5m-h8&uw56}&Yc?90>n}QJx?8r5 z4x?3+SH}(g;Vv!@GJ==jL%L^k{h*UZOntODeAZ_gK5g_JL}3FAY7A7%XSX&t4w0@8 zYTQ%8Om{>LI^ZJ4Xh(;Y!{~EyHnl_3*YfGVFNL(_zpj~x6O&hN;pvOI??m~b`|W{l zj7iSWbSiAGz(gQCN^!1@g4xpgv;p;1+VEX^gy9zRSsK*HS2^4>0yCQ0*PdaXsoGd1jSTEMYo4YQil5H82On8lHl0&)W>~LutapS#fF0WG z2fdkGgT~p5LEE6!+mw1WEA@5`r*JiVhBX^Y!*W3#qZ}%^%ifN0uM47S&+uVYkXtf1 z_cejvdsdv(RTfqG%I0q48e9e`gi8-a47H&L=x9Z$0=BMp%pBAlViX_fVI#b|Y-+)Zh1;$L&A}fR);-5?sS^0X*nAF07CEyS@87hQkZ9H|q{_ELf92Tt ze6n=_t?I%LPUk}*I5yi#8E%>xCruP+>H}EnOptBtY&7X;Fo`Iv5e{ODeE`s;7k@+58 zs9`ev1`LCs4bi9OQ<9Vg6fy+QvzB+?)LoPIOafoJR<$hhg_6XCkvDDa?;YSaz^JM% zLS52{?u&=VH*NQ#U#DCJO=R)70{z;d{R7q|rZBz@e|Ue40qI>Ch;sFCQZ8UE=g3$l z=);i3zig_tF>5=R*yruP3RDbnm~7s7 z6=HR6N|LI+TZQM;uyC59nIF2HHLR0fc2$5w;;XunGouo=ct(`s0Nn%JLj4fg)s^$j zDkI=H%9C762{vx6xfd$D8$gk$!WNIQ5kHEBJPaiN=CQZgyO_v99#^9CLt`@U;k-)J zKHMtTi*K`p*Hu=3A7Ic7ktb5Qb*ia}xrJ?NO0}zLlC*LlMZaNt`CR|9J=t&Obe4u- z&xK;x%|zXW0m#}9!x!uK`2)bbzo1I(lus`1y={TTlByd=B^NNzCb&q8a+^#JFJ66c^5CwNwM_j9`Ixxcv5NL0EJjwy&$Rl&+t1@n~3@ z1C9bg8k>Deq$W-$G|hyrqA59Q3Q5lZ1OhE}8$7ImGIY35 zSYJ$4?AtRk!>o{oJE0Yg#_5K%BNC|d$ynKZ~d+v%!)u~^`dDH3WxT0N!)OFo6J!DSvAqx)~YB3Z-Hl`Byj{iOe`&C<@ve=&BPQy5@h~6I&GL+%|py zJL;Kw({~@1TDH~xN_3OU>Wf95G(q?>-*gF+Bp6C@?|C$*97_G&=nZmWwBLEaKos)9 zot`V{W%>_}j$nI20e7dnsV@CHj3DWyo3w&kD}r>6c5lW-zhdUox`hgf78ab9d->$s ziSXAx1Y+*5VOq|j3Fq)$-)0h)*tjhKU3F;YUe@0gwKV7$(bakWAQBTT!g!eQ@Bhs1 z$ix+3XV+rD+>W89V7H^0drVMsdmEg;_@MsknllZs4fjv5@>|@`pI^27yD0Df@a@1) zk0B=ruCRcjyr1IOIk>p~a2bLefq#G%u1EjfUyD{HNpa zw~%nFKZC;UL0&^pVEE%VsWw0}m!EG=kHPD|M~gcHZ7qKe^UII;DKC(*#hw;oS?|XlC|&N{nF9>l6@^~Dh*^*f4UzN2Q!Orv!c^lJo)y6Ju8CN zNDs{j-991puKP(7RT!EaRhJ9Ln?se>xYTbS>9de-&AQ7|;c&2reH8<)~w5gC8~Ze{jy4&a!D{?D;m<+cn#nZ(ofvk6LCp+m5|Bl(6H_ z?7ufYWG>C&CW6{$atQF89>c$EbQJyWq&lKsXd3^JTts{9NFxiUh-J=#qAZ#D%!-1LSZcS}keuHV z_b}S53~A>|n3v z?!Pmd4lkOSQj%@GpU^UQeV&7&uklhu7pgQdq+2CET*H1cx>K#l;wmpY}kE zS>Lt<<{`98RbiVb?5%!o_{2XI zCiH%x3CZe{oO;uRX7#=z+dR}-RM zXb;>#5uVJLehnMjQ6`g1a%WI^NWfhxJ#FP5$zi1GwllbL!4UC~%g?y4&># z#4iu8q4^+|Df!R&AG%AzH-+9m!=K)ci^T+n0wx|h)LPWVMTxhd8yD5w?f{&p#)@!6 zH%R3W;m<5|LT+D)21+kY)CUOA_77za3F*Digf{d9?3FNcoI%`SaHb)8va=z9{7$Na zv*-8>I|ZZxbfwDm;#McQdwE>JNp^8ki_>g6V3Sg|y3*1JxvSvMOTI9^)e+@P=s#v3 z6O%>ulmw2=+PX^=FJ%Mf4aByY_^0HqAZJItc=vu#e`UgMcL1KLyvu>^< zGpv3JAE<7lq5W*pu)=P4q-KCfdTfD+{4QH%*N3%$qN5piNk)&{Oo%gOI}|QHTLp$X z*?=XpC-%oc{Dct^PMF*fM+7+$*9Ju*>E3q+9el<+L6Ie4%caEOhEfLx*Ds|EUeZNd z$ViDR=-*`Jll$7h?E6w@r4L40yk=`>a|bFsxvF!zG8V|L;3XyA!K?R!tTRqoBXP