The branch stable/15 has been updated by mm:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ca5d4e7f63d0c30ea829dd68930431693e8253cd

commit ca5d4e7f63d0c30ea829dd68930431693e8253cd
Author:     Martin Matuska <[email protected]>
AuthorDate: 2025-11-19 13:33:40 +0000
Commit:     Martin Matuska <[email protected]>
CommitDate: 2026-01-15 20:03:15 +0000

    libarchive: merge from vendor branch
    
    libarchive 3.8.3
    
    Important bugfixes:
     #2753 lib: Create temporary files in the target directory
     #2768 lha: Fix for an out-of-bounds buffer overrun when using
           p[H_LEVEL_OFFSET]
     #2769 7-zip: Fix a buffer overrun when reading truncated 7zip headers
     #2771 lz4 and zstd: Support both lz4 and zstd data with leading
           skippable frames
    
    Obtained from:  libarchive
    Vendor commit:  1368b08875351df8aa268237b882c8f4ceb0882d
    MFC after:      1 week
    
    (cherry picked from commit 007679a138089676aadc9a712277f4004403b905)
---
 contrib/libarchive/NEWS                            |    2 +
 contrib/libarchive/libarchive/archive.h            |    4 +-
 contrib/libarchive/libarchive/archive_entry.h      |    2 +-
 contrib/libarchive/libarchive/archive_entry_stat.3 |    2 +-
 .../libarchive/archive_read_disk_entry_from_file.c |   10 +-
 .../libarchive/archive_read_disk_posix.c           |   10 +-
 .../libarchive/archive_read_support_filter_lz4.c   |   82 +-
 .../libarchive/archive_read_support_filter_zstd.c  |   67 +-
 .../libarchive/archive_read_support_format_7zip.c  |    8 +-
 .../libarchive/archive_read_support_format_lha.c   |    2 +-
 .../libarchive/archive_read_support_format_tar.c   |    1 +
 .../libarchive/archive_read_support_format_zip.c   |   28 +-
 contrib/libarchive/libarchive/archive_string.c     |   20 +
 contrib/libarchive/libarchive/archive_string.h     |    4 +
 .../libarchive/archive_write_disk_posix.c          |   20 +-
 .../libarchive/archive_write_open_filename.c       |    2 +
 contrib/libarchive/libarchive/module.modulemap     |   34 +
 .../libarchive/test/test_archive_string.c          |   38 +
 .../libarchive/libarchive/test/test_compat_lz4.c   |    2 +
 .../test_compat_lz4_skippable_frames_B4.tar.lz4.uu | 6739 ++++++++++++++++++++
 .../test/test_read_format_7zip_issue2765.7z.uu     |    5 +
 .../test/test_read_format_7zip_issue2765.c         |   51 +
 .../libarchive/tar/test/test_option_safe_writes.c  |    1 +
 contrib/libarchive/tar/util.c                      |    5 +-
 contrib/libarchive/test_utils/test_main.c          |   27 +-
 lib/libarchive/tests/Makefile                      |    3 +
 26 files changed, 7109 insertions(+), 60 deletions(-)

diff --git a/contrib/libarchive/NEWS b/contrib/libarchive/NEWS
index f2dd4102fa04..971ae8e441e1 100644
--- a/contrib/libarchive/NEWS
+++ b/contrib/libarchive/NEWS
@@ -1,3 +1,5 @@
+Nov 17, 2026: libarchive 3.8.3 released
+
 Oct 15, 2026: libarchive 3.8.2 released
 
 Jun 01, 2026: libarchive 3.8.1 released
diff --git a/contrib/libarchive/libarchive/archive.h 
b/contrib/libarchive/libarchive/archive.h
index 98d7674e18f1..9794dced6ca9 100644
--- a/contrib/libarchive/libarchive/archive.h
+++ b/contrib/libarchive/libarchive/archive.h
@@ -34,7 +34,7 @@
  * assert that ARCHIVE_VERSION_NUMBER >= 2012108.
  */
 /* Note: Compiler will complain if this does not match archive_entry.h! */
-#define        ARCHIVE_VERSION_NUMBER 3008002
+#define        ARCHIVE_VERSION_NUMBER 3008003
 
 #include <sys/stat.h>
 #include <stddef.h>  /* for wchar_t */
@@ -177,7 +177,7 @@ __LA_DECL int               archive_version_number(void);
 /*
  * Textual name/version of the library, useful for version displays.
  */
-#define        ARCHIVE_VERSION_ONLY_STRING "3.8.2"
+#define        ARCHIVE_VERSION_ONLY_STRING "3.8.3"
 #define        ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
 __LA_DECL const char * archive_version_string(void);
 
diff --git a/contrib/libarchive/libarchive/archive_entry.h 
b/contrib/libarchive/libarchive/archive_entry.h
index 344f33bffac2..924b67a301cf 100644
--- a/contrib/libarchive/libarchive/archive_entry.h
+++ b/contrib/libarchive/libarchive/archive_entry.h
@@ -28,7 +28,7 @@
 #define        ARCHIVE_ENTRY_H_INCLUDED
 
 /* Note: Compiler will complain if this does not match archive.h! */
-#define        ARCHIVE_VERSION_NUMBER 3008002
+#define        ARCHIVE_VERSION_NUMBER 3008003
 
 /*
  * Note: archive_entry.h is for use outside of libarchive; the
diff --git a/contrib/libarchive/libarchive/archive_entry_stat.3 
b/contrib/libarchive/libarchive/archive_entry_stat.3
index 29a53f75607f..2f4a1920eb64 100644
--- a/contrib/libarchive/libarchive/archive_entry_stat.3
+++ b/contrib/libarchive/libarchive/archive_entry_stat.3
@@ -207,7 +207,7 @@ for setting is recommended.
 The function
 .Fn archive_entry_size
 returns the file size, if it has been set, and 0 otherwise.
-.Fn archive_entry_size
+.Fn archive_entry_size_is_set
 can be used to query that status.
 .Fn archive_entry_set_size
 and
diff --git a/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c 
b/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
index 42af4034b07e..121af19872e9 100644
--- a/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
+++ b/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
@@ -358,12 +358,10 @@ setup_mac_metadata(struct archive_read_disk *a,
                return (ARCHIVE_OK);
 
        archive_string_init(&tempfile);
-       if (__archive_get_tempdir(&tempfile) != ARCHIVE_OK) {
-               ret = ARCHIVE_WARN;
-               goto cleanup;
-       }
-       archive_strcat(&tempfile, "tar.md.XXXXXX");
-       tempfd = mkstemp(tempfile.s);
+       archive_strcpy(&tempfile, name);
+       archive_string_dirname(&tempfile);
+       archive_strcat(&tempfile, "/tar.XXXXXXXX");
+       tempfd = __archive_mkstemp(tempfile.s);
        if (tempfd < 0) {
                archive_set_error(&a->archive, errno,
                    "Could not open extended attribute file");
diff --git a/contrib/libarchive/libarchive/archive_read_disk_posix.c 
b/contrib/libarchive/libarchive/archive_read_disk_posix.c
index 54a8e66188f8..7cd292f259ff 100644
--- a/contrib/libarchive/libarchive/archive_read_disk_posix.c
+++ b/contrib/libarchive/libarchive/archive_read_disk_posix.c
@@ -107,6 +107,8 @@
 #define O_CLOEXEC      0
 #endif
 
+#define MAX_FILESYSTEM_ID 1000000
+
 #if defined(__hpux) && !defined(HAVE_DIRFD)
 #define dirfd(x) ((x)->__dd_fd)
 #define HAVE_DIRFD
@@ -1412,8 +1414,12 @@ update_current_filesystem(struct archive_read_disk *a, 
int64_t dev)
         * This is the new filesystem which we have to generate a new ID for.
         */
        fid = t->max_filesystem_id++;
+       if (fid > MAX_FILESYSTEM_ID) {
+               archive_set_error(&a->archive, ENOMEM, "Too many filesystems");
+               return (ARCHIVE_FATAL);
+       }
        if (t->max_filesystem_id > t->allocated_filesystem) {
-               size_t s;
+               int s;
                void *p;
 
                s = t->max_filesystem_id * 2;
@@ -1693,8 +1699,6 @@ setup_current_filesystem(struct archive_read_disk *a)
 #endif
                t->current_filesystem->noatime = 0;
 
-       /* Set maximum filename length. */
-       t->current_filesystem->name_max = svfs.f_namemax;
        return (ARCHIVE_OK);
 }
 
diff --git a/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c 
b/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c
index 760e6d938d2a..144572ef2362 100644
--- a/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c
+++ b/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c
@@ -49,9 +49,12 @@
 #include "archive_xxhash.h"
 
 #define LZ4_MAGICNUMBER                0x184d2204
-#define LZ4_SKIPPABLED         0x184d2a50
 #define LZ4_LEGACY             0x184c2102
 
+// Note: LZ4 and zstd share the same skippable frame format with the same 
magic numbers.
+#define LZ4_SKIPPABLE_START 0x184D2A50
+#define LZ4_SKIPPABLE_MASK 0xFFFFFFF0
+
 #if defined(HAVE_LIBLZ4)
 struct private_data {
        enum {  SELECT_STREAM,
@@ -141,19 +144,67 @@ lz4_reader_bid(struct archive_read_filter_bidder *self,
 {
        const unsigned char *buffer;
        ssize_t avail;
-       int bits_checked;
-       uint32_t number;
+       int bits_checked = 0;
+       ssize_t min_lz4_archive_size = 11;
+
+       // LZ4 skippable frames contain a 4 byte magic number followed by
+       // a 4 byte frame data size, then that number of bytes of data. Regular
+       // frames contain a 4 byte magic number followed by a 2-14 byte frame
+       // header, some data, and a 3 byte end marker.
+       ssize_t min_lz4_frame_size = 8;
+
+       ssize_t offset_in_buffer = 0;
+       ssize_t max_lookahead = 64 * 1024;
 
-       (void)self; /* UNUSED */
+       (void)self; // UNUSED
 
-       /* Minimal lz4 archive is 11 bytes. */
-       buffer = __archive_read_filter_ahead(filter, 11, &avail);
+       // Zstd and LZ4 skippable frame magic numbers are identical. To
+       // differentiate these two, we need to look for a non-skippable
+       // frame.
+
+       // Minimal lz4 archive is 11 bytes.
+       buffer = __archive_read_filter_ahead(filter, min_lz4_archive_size, 
&avail);
        if (buffer == NULL)
                return (0);
 
-       /* First four bytes must be LZ4 magic numbers. */
-       bits_checked = 0;
-       if ((number = archive_le32dec(buffer)) == LZ4_MAGICNUMBER) {
+       uint32_t magic_number = archive_le32dec(buffer);
+
+       while ((magic_number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) {
+
+               offset_in_buffer += 4; // Skip over the magic number
+
+               // Ensure that we can read another 4 bytes.
+               if (offset_in_buffer + 4 > avail) {
+                       buffer = __archive_read_filter_ahead(filter, 
offset_in_buffer + 4, &avail);
+                       if (buffer == NULL)
+                               return (0);
+               }
+
+               uint32_t frame_data_size = archive_le32dec(buffer + 
offset_in_buffer);
+
+               // Skip over the 4 frame data size bytes, plus the value stored 
there.
+               offset_in_buffer += 4 + frame_data_size;
+
+               // There should be at least one more frame if this is LZ4 data.
+               if (offset_in_buffer + min_lz4_frame_size > avail) { // TODO: 
should this be >= ?
+                       if (offset_in_buffer + min_lz4_frame_size > 
max_lookahead)
+                               return (0); 
+
+                       buffer = __archive_read_filter_ahead(filter, 
offset_in_buffer + min_lz4_frame_size, &avail);
+                       if (buffer == NULL)
+                               return (0); 
+               }
+
+               magic_number = archive_le32dec(buffer + offset_in_buffer);
+       }
+
+       // We have skipped over any skippable frames. Either a regular LZ4 frame
+       // follows, or this isn't LZ4 data.
+
+       bits_checked = offset_in_buffer;
+       buffer = buffer + offset_in_buffer;
+
+       if (magic_number == LZ4_MAGICNUMBER) {
                unsigned char flag, BD;
 
                bits_checked += 32;
@@ -175,11 +226,16 @@ lz4_reader_bid(struct archive_read_filter_bidder *self,
                if (BD & ~0x70)
                        return (0);
                bits_checked += 8;
-       } else if (number == LZ4_LEGACY) {
+
+               return (bits_checked);
+       }
+
+       if (magic_number == LZ4_LEGACY) {
                bits_checked += 32;
+               return (bits_checked);
        }
-       
-       return (bits_checked);
+
+       return (0);
 }
 
 #if !defined(HAVE_LIBLZ4)
@@ -342,7 +398,7 @@ lz4_filter_read(struct archive_read_filter *self, const 
void **p)
                        return lz4_filter_read_default_stream(self, p);
                else if (number == LZ4_LEGACY)
                        return lz4_filter_read_legacy_stream(self, p);
-               else if ((number & ~0xF) == LZ4_SKIPPABLED) {
+               else if ((number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) {
                        read_buf = __archive_read_filter_ahead(
                                self->upstream, 4, NULL);
                        if (read_buf == NULL) {
diff --git a/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c 
b/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c
index 9a1dd71abdf6..da7c540dbcd9 100644
--- a/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c
+++ b/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c
@@ -110,24 +110,67 @@ zstd_bidder_bid(struct archive_read_filter_bidder *self,
 {
        const unsigned char *buffer;
        ssize_t avail;
-       unsigned prefix;
 
-       /* Zstd frame magic values */
-       unsigned zstd_magic = 0xFD2FB528U;
-       unsigned zstd_magic_skippable_start = 0x184D2A50U;
-       unsigned zstd_magic_skippable_mask = 0xFFFFFFF0;
+       // Zstandard skippable frames contain a 4 byte magic number followed by
+       // a 4 byte frame data size, then that number of bytes of data. Regular
+       // frames contain a 4 byte magic number followed by a 2-14 byte frame
+       // header, some data, and a 3 byte end marker.
+       ssize_t min_zstd_frame_size = 8;
 
-       (void) self; /* UNUSED */
+       ssize_t offset_in_buffer = 0;
+       ssize_t max_lookahead = 64 * 1024;
 
-       buffer = __archive_read_filter_ahead(filter, 4, &avail);
+       // Zstd regular frame magic number.
+       uint32_t zstd_magic = 0xFD2FB528U;
+
+       // Note: Zstd and LZ4 skippable frame magic numbers are identical.
+       // To differentiate these two, we need to look for a non-skippable
+       // frame.
+       uint32_t zstd_magic_skippable_start = 0x184D2A50;
+       uint32_t zstd_magic_skippable_mask  = 0xFFFFFFF0;
+
+       (void) self; // UNUSED
+
+       buffer = __archive_read_filter_ahead(filter, min_zstd_frame_size, 
&avail);
        if (buffer == NULL)
                return (0);
 
-       prefix = archive_le32dec(buffer);
-       if (prefix == zstd_magic)
-               return (32);
-       if ((prefix & zstd_magic_skippable_mask) == zstd_magic_skippable_start)
-               return (32);
+       uint32_t magic_number = archive_le32dec(buffer);
+
+       while ((magic_number & zstd_magic_skippable_mask) == 
zstd_magic_skippable_start) {
+
+               offset_in_buffer += 4; // Skip over the magic number
+
+               // Ensure that we can read another 4 bytes.
+               if (offset_in_buffer + 4 > avail) {
+                       buffer = __archive_read_filter_ahead(filter, 
offset_in_buffer + 4, &avail);
+                       if (buffer == NULL)
+                               return (0);
+               }
+
+               uint32_t frame_data_size = archive_le32dec(buffer + 
offset_in_buffer);
+
+               // Skip over the 4 frame data size bytes, plus the value stored 
there.
+               offset_in_buffer += 4 + frame_data_size;
+
+               // There should be at least one more frame if this is zstd data.
+               if (offset_in_buffer + min_zstd_frame_size > avail) {
+                       if (offset_in_buffer + min_zstd_frame_size > 
max_lookahead)
+                               return (0);
+
+                       buffer = __archive_read_filter_ahead(filter, 
offset_in_buffer + min_zstd_frame_size, &avail);
+                       if (buffer == NULL)
+                               return (0);
+               }
+
+               magic_number = archive_le32dec(buffer + offset_in_buffer);
+       }
+
+       // We have skipped over any skippable frames. Either a regular zstd 
frame
+       // follows, or this isn't zstd data.
+
+       if (magic_number == zstd_magic)
+               return (offset_in_buffer + 4);
 
        return (0);
 }
diff --git a/contrib/libarchive/libarchive/archive_read_support_format_7zip.c 
b/contrib/libarchive/libarchive/archive_read_support_format_7zip.c
index 595462733104..330d5515dd50 100644
--- a/contrib/libarchive/libarchive/archive_read_support_format_7zip.c
+++ b/contrib/libarchive/libarchive/archive_read_support_format_7zip.c
@@ -744,6 +744,7 @@ find_elf_data_sec(struct archive_read *a)
        const char *h;
        char big_endian, format_64;
        ssize_t bytes, min_addr = SFX_MIN_ADDR;
+       ssize_t request;
        uint64_t e_shoff, strtab_offset, strtab_size;
        uint16_t e_shentsize, e_shnum, e_shstrndx;
        uint16_t (*dec16)(const void *);
@@ -796,7 +797,12 @@ find_elf_data_sec(struct archive_read *a)
                if (__archive_read_seek(a, e_shoff, SEEK_SET) < 0) {
                        break;
                }
-               h = __archive_read_ahead(a, (size_t)e_shnum * 
(size_t)e_shentsize, NULL);
+               if (format_64) {
+                 request = (size_t)e_shnum * (size_t)e_shentsize + 0x28;
+               } else {
+                 request = (size_t)e_shnum * (size_t)e_shentsize + 0x18;
+               }
+               h = __archive_read_ahead(a, request, &bytes);
                if (h == NULL) {
                        break;
                }
diff --git a/contrib/libarchive/libarchive/archive_read_support_format_lha.c 
b/contrib/libarchive/libarchive/archive_read_support_format_lha.c
index 2a84ad9dd307..abf8b8799636 100644
--- a/contrib/libarchive/libarchive/archive_read_support_format_lha.c
+++ b/contrib/libarchive/libarchive/archive_read_support_format_lha.c
@@ -689,7 +689,7 @@ archive_read_format_lha_read_header(struct archive_read *a,
         * a pathname and a symlink has '\' character, a directory
         * separator in DOS/Windows. So we should convert it to '/'.
         */
-       if (p[H_LEVEL_OFFSET] == 0)
+       if (lha->level == 0)
                lha_replace_path_separator(lha, entry);
 
        archive_entry_set_mode(entry, lha->mode);
diff --git a/contrib/libarchive/libarchive/archive_read_support_format_tar.c 
b/contrib/libarchive/libarchive/archive_read_support_format_tar.c
index eeb2c725f6eb..98f7d699570a 100644
--- a/contrib/libarchive/libarchive/archive_read_support_format_tar.c
+++ b/contrib/libarchive/libarchive/archive_read_support_format_tar.c
@@ -2311,6 +2311,7 @@ pax_attribute_read_number(struct archive_read *a, size_t 
value_length, int64_t *
        archive_string_init(&as);
        r = read_bytes_to_string(a, &as, value_length, &unconsumed);
        if (tar_flush_unconsumed(a, &unconsumed) != ARCHIVE_OK) {
+               *result = 0;
                return (ARCHIVE_FATAL);
        }
        if (r < ARCHIVE_OK) {
diff --git a/contrib/libarchive/libarchive/archive_read_support_format_zip.c 
b/contrib/libarchive/libarchive/archive_read_support_format_zip.c
index 9abd55709e3f..0c86ce935e26 100644
--- a/contrib/libarchive/libarchive/archive_read_support_format_zip.c
+++ b/contrib/libarchive/libarchive/archive_read_support_format_zip.c
@@ -78,6 +78,12 @@
 #include "archive_crc32.h"
 #endif
 
+/* length of local file header, not including filename and extra */
+#define ZIP_LOCHDR_LEN         30U
+
+/* maximum length of Mac metadata in MiB */
+#define ZIP_MAX_METADATA       10U
+
 struct zip_entry {
        struct archive_rb_node  node;
        struct zip_entry        *next;
@@ -933,7 +939,7 @@ zip_read_local_file_header(struct archive_read *a, struct 
archive_entry *entry,
                zip->init_default_conversion = 1;
        }
 
-       if ((p = __archive_read_ahead(a, 30, NULL)) == NULL) {
+       if ((p = __archive_read_ahead(a, ZIP_LOCHDR_LEN, NULL)) == NULL) {
                archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                    "Truncated ZIP file header");
                return (ARCHIVE_FATAL);
@@ -969,7 +975,7 @@ zip_read_local_file_header(struct archive_read *a, struct 
archive_entry *entry,
        filename_length = archive_le16dec(p + 26);
        extra_length = archive_le16dec(p + 28);
 
-       __archive_read_consume(a, 30);
+       __archive_read_consume(a, ZIP_LOCHDR_LEN);
 
        /* Read the filename. */
        if ((h = __archive_read_ahead(a, filename_length, NULL)) == NULL) {
@@ -3637,7 +3643,7 @@ read_eocd(struct zip *zip, const char *p, int64_t 
current_offset)
 {
        uint16_t disk_num;
        uint32_t cd_size, cd_offset;
-       
+
        disk_num = archive_le16dec(p + 4);
        cd_size = archive_le32dec(p + 12);
        cd_offset = archive_le32dec(p + 16);
@@ -4097,7 +4103,7 @@ zip_get_local_file_header_size(struct archive_read *a, 
size_t extra)
        const char *p;
        ssize_t filename_length, extra_length;
 
-       if ((p = __archive_read_ahead(a, extra + 30, NULL)) == NULL) {
+       if ((p = __archive_read_ahead(a, extra + ZIP_LOCHDR_LEN, NULL)) == 
NULL) {
                archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                    "Truncated ZIP file header");
                return (ARCHIVE_WARN);
@@ -4111,7 +4117,7 @@ zip_get_local_file_header_size(struct archive_read *a, 
size_t extra)
        filename_length = archive_le16dec(p + 26);
        extra_length = archive_le16dec(p + 28);
 
-       return (30 + filename_length + extra_length);
+       return (ZIP_LOCHDR_LEN + filename_length + extra_length);
 }
 
 static int
@@ -4148,16 +4154,16 @@ zip_read_mac_metadata(struct archive_read *a, struct 
archive_entry *entry,
                return (ARCHIVE_WARN);
        }
 
-       if (rsrc->uncompressed_size > (4 * 1024 * 1024)) {
+       if (rsrc->uncompressed_size > ZIP_MAX_METADATA * 1048576U) {
                archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
-                   "Mac metadata is too large: %jd > 4M bytes",
-                   (intmax_t)rsrc->uncompressed_size);
+                   "Mac metadata is too large: %jd > %u MiB",
+                   (intmax_t)rsrc->uncompressed_size, ZIP_MAX_METADATA);
                return (ARCHIVE_WARN);
        }
-       if (rsrc->compressed_size > (4 * 1024 * 1024)) {
+       if (rsrc->compressed_size > ZIP_MAX_METADATA * 1048576U) {
                archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
-                   "Mac metadata is too large: %jd > 4M bytes",
-                   (intmax_t)rsrc->compressed_size);
+                   "Mac metadata is too large: %jd > %u MiB",
+                   (intmax_t)rsrc->compressed_size, ZIP_MAX_METADATA);
                return (ARCHIVE_WARN);
        }
 
diff --git a/contrib/libarchive/libarchive/archive_string.c 
b/contrib/libarchive/libarchive/archive_string.c
index 3bb978335eb8..740308b6e4e3 100644
--- a/contrib/libarchive/libarchive/archive_string.c
+++ b/contrib/libarchive/libarchive/archive_string.c
@@ -2054,6 +2054,26 @@ archive_strncat_l(struct archive_string *as, const void 
*_p, size_t n,
        return (r);
 }
 
+struct archive_string *
+archive_string_dirname(struct archive_string *as)
+{
+       /* strip trailing separators */
+       while (as->length > 1 && as->s[as->length - 1] == '/')
+               as->length--;
+       /* strip final component */
+       while (as->length > 0 && as->s[as->length - 1] != '/')
+               as->length--;
+       /* empty path -> cwd */
+       if (as->length == 0)
+               return (archive_strcat(as, "."));
+       /* strip separator(s) */
+       while (as->length > 1 && as->s[as->length - 1] == '/')
+               as->length--;
+       /* terminate */
+       as->s[as->length] = '\0';
+       return (as);
+}
+
 #if HAVE_ICONV
 
 /*
diff --git a/contrib/libarchive/libarchive/archive_string.h 
b/contrib/libarchive/libarchive/archive_string.h
index e8987867d3ce..d5f5c03aca30 100644
--- a/contrib/libarchive/libarchive/archive_string.h
+++ b/contrib/libarchive/libarchive/archive_string.h
@@ -192,6 +192,10 @@ void       archive_string_vsprintf(struct archive_string 
*, const char *,
 void   archive_string_sprintf(struct archive_string *, const char *, ...)
            __LA_PRINTF(2, 3);
 
+/* Equivalent to dirname(3) */
+struct archive_string *
+archive_string_dirname(struct archive_string *);
+
 /* Translates from MBS to Unicode. */
 /* Returns non-zero if conversion failed in any way. */
 int archive_wstring_append_from_mbs(struct archive_wstring *dest,
diff --git a/contrib/libarchive/libarchive/archive_write_disk_posix.c 
b/contrib/libarchive/libarchive/archive_write_disk_posix.c
index aeb27e1270ad..d69f041dde7e 100644
--- a/contrib/libarchive/libarchive/archive_write_disk_posix.c
+++ b/contrib/libarchive/libarchive/archive_write_disk_posix.c
@@ -412,12 +412,14 @@ static ssize_t    _archive_write_disk_data_block(struct 
archive *, const void *,
 static int
 la_mktemp(struct archive_write_disk *a)
 {
+       struct archive_string *tmp = &a->_tmpname_data;
        int oerrno, fd;
        mode_t mode;
 
-       archive_string_empty(&a->_tmpname_data);
-       archive_string_sprintf(&a->_tmpname_data, "%s.XXXXXX", a->name);
-       a->tmpname = a->_tmpname_data.s;
+       archive_strcpy(tmp, a->name);
+       archive_string_dirname(tmp);
+       archive_strcat(tmp, "/tar.XXXXXXXX");
+       a->tmpname = tmp->s;
 
        fd = __archive_mkstemp(a->tmpname);
        if (fd == -1)
@@ -4287,8 +4289,10 @@ create_tempdatafork(struct archive_write_disk *a, const 
char *pathname)
        int tmpfd;
 
        archive_string_init(&tmpdatafork);
-       archive_strcpy(&tmpdatafork, "tar.md.XXXXXX");
-       tmpfd = mkstemp(tmpdatafork.s);
+       archive_strcpy(&tmpdatafork, pathname);
+       archive_string_dirname(&tmpdatafork);
+       archive_strcat(&tmpdatafork, "/tar.XXXXXXXX");
+       tmpfd = __archive_mkstemp(tmpdatafork.s);
        if (tmpfd < 0) {
                archive_set_error(&a->archive, errno,
                    "Failed to mkstemp");
@@ -4367,8 +4371,10 @@ set_mac_metadata(struct archive_write_disk *a, const 
char *pathname,
         * silly dance of writing the data to disk just so that
         * copyfile() can read it back in again. */
        archive_string_init(&tmp);
-       archive_strcpy(&tmp, "tar.mmd.XXXXXX");
-       fd = mkstemp(tmp.s);
+       archive_strcpy(&tmp, pathname);
+       archive_string_dirname(&tmp);
+       archive_strcat(&tmp, "/tar.XXXXXXXX");
+       fd = __archive_mkstemp(tmp.s);
 
        if (fd < 0) {
                archive_set_error(&a->archive, errno,
diff --git a/contrib/libarchive/libarchive/archive_write_open_filename.c 
b/contrib/libarchive/libarchive/archive_write_open_filename.c
index 7d0f9bde1dbb..430de21fde14 100644
--- a/contrib/libarchive/libarchive/archive_write_open_filename.c
+++ b/contrib/libarchive/libarchive/archive_write_open_filename.c
@@ -191,6 +191,8 @@ file_open(struct archive *a, void *client_data)
                        archive_set_error(a, errno, "Couldn't stat '%s'", mbs);
                else
                        archive_set_error(a, errno, "Couldn't stat '%ls'", wcs);
+               close(mine->fd);
+               mine->fd = -1;
                return (ARCHIVE_FATAL);
        }
 
diff --git a/contrib/libarchive/libarchive/module.modulemap 
b/contrib/libarchive/libarchive/module.modulemap
new file mode 100644
index 000000000000..70f70fc3a1a2
--- /dev/null
+++ b/contrib/libarchive/libarchive/module.modulemap
@@ -0,0 +1,34 @@
+/*
+ * Clang Module Map for libarchive
+ *
+ * What this is:
+ * This file tells the Clang compiler how to treat libarchive as a "module" -
+ * a self-contained unit of code that can be imported all at once instead of
+ * including individual header files. Think of it like a package definition.
+ *
+ * How it works:
+ * - When you write `@import CArchive` (Objective-C) or `import CArchive` 
(Swift),
+ *   the compiler uses this file to know which headers belong to libarchive
+ * - Instead of processing each #include separately, the compiler can load a
+ *   pre-compiled version of the entire library, making builds faster
+ * - This also provides better dependency tracking and can catch issues like
+ *   conflicting macro definitions between libraries
+ *
+ * When to update:
+ * Update this file whenever:
+ * - New public header files are added to libarchive's libarchive/ directory
+ * - Public headers are removed or renamed
+ * - The library's API structure changes significantly
+ *
+ * You typically don't need to update this for:
+ * - Internal implementation changes
+ * - Private/internal header modifications
+ * - Documentation updates
+ *
+ * NOTE: This only affects projects using Clang with modules enabled. 
Traditional
+ * #include-based builds will continue to work normally with or without this 
file.
+ */
+module CArchive {
+  header "archive.h"
+  header "archive_entry.h"
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_string.c 
b/contrib/libarchive/libarchive/test/test_archive_string.c
index 30f7a800eae8..bf822c0d5e82 100644
--- a/contrib/libarchive/libarchive/test/test_archive_string.c
+++ b/contrib/libarchive/libarchive/test/test_archive_string.c
@@ -353,6 +353,43 @@ test_archive_string_sprintf(void)
        archive_string_free(&s);
 }
 
+static void
+test_archive_string_dirname(void)
+{
+       static struct pair { const char *str, *exp; } pairs[] = {
+               { "",           "." },
+               { "/",          "/" },
+               { "//",         "/" },
+               { "///",        "/" },
+               { "./",         "." },
+               { ".",          "." },
+               { "..",         "." },
+               { "foo",        "." },
+               { "foo/",       "." },
+               { "foo//",      "." },
+               { "foo/bar",    "foo" },
+               { "foo/bar/",   "foo" },
+               { "foo/bar//",  "foo" },
+               { "foo//bar",   "foo" },
+               { "foo//bar/",  "foo" },
+               { "foo//bar//", "foo" },
+               { "/foo",       "/" },
+               { "//foo",      "/" },
+               { "//foo/",     "/" },
+               { "//foo//",    "/" },
+               { 0 },
+       };
+       struct pair *pair;
+       struct archive_string s;
+
+       archive_string_init(&s);
+       for (pair = pairs; pair->str; pair++) {
+               archive_strcpy(&s, pair->str);
+               archive_string_dirname(&s);
+               assertEqualString(pair->exp, s.s);
+       }
+}
+
 DEFINE_TEST(test_archive_string)
 {
        test_archive_string_ensure();
@@ -364,6 +401,7 @@ DEFINE_TEST(test_archive_string)
        test_archive_string_concat();
        test_archive_string_copy();
        test_archive_string_sprintf();
+       test_archive_string_dirname();
 }
 
 static const char *strings[] =
diff --git a/contrib/libarchive/libarchive/test/test_compat_lz4.c 
b/contrib/libarchive/libarchive/test/test_compat_lz4.c
index 9e309a9fbd20..8ab9208b0918 100644
--- a/contrib/libarchive/libarchive/test/test_compat_lz4.c
+++ b/contrib/libarchive/libarchive/test/test_compat_lz4.c
@@ -98,6 +98,8 @@ DEFINE_TEST(test_compat_lz4)
        verify("test_compat_lz4_3.tar.lz4.uu", n);
        /* This sample has been compressed with -B4 option. */
        verify("test_compat_lz4_B4.tar.lz4.uu", n2);
+       /* This sample has been compresed with -B4, and has two skippable 
frames at the start. */
+       verify("test_compat_lz4_skippable_frames_B4.tar.lz4.uu", n2);
        /* This sample has been compressed with -B5 option. */
        verify("test_compat_lz4_B5.tar.lz4.uu", n2);
        /* This sample has been compressed with -B6 option. */
diff --git 
a/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu
 
b/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu
new file mode 100644
index 000000000000..f45b1ac8f8dd
--- /dev/null
+++ 
b/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu
@@ -0,0 +1,6739 @@
+begin 664 test_compat_lz4_skippable_frames_B4.tar.lz4.uu
+M4"I-&`````!1*DT8"@`````!`@,$!08'"`D$(DT89$"GE1$``&]X9FEL90`!
+M`$OA,#`P-C0T(``P,#`W-C4(`"(P,A``(C(P`0#_!R`Q,C,U,S4U,S4Q,B`P
+M,3(P,C,`(#"7`$L"`@"O=7-T87(`,#!C=0<!"U)S=&%F9C,`#P(``@/(``#E
+M`$\P,#`@)``"#P(`@/8T4D5!1$U%(&9O<B!L:6)A<F-H:79E(&)U;F1L92X*
+M"E%U97-T:6]N<S\@($ES<W5E<S\*("`@*B!H='1P.B\O=W=W+C@`\0$N;W)G
+M(&ES('1H92!H;VUE5P!P;VYG;VEN9S<`&"!D`/`,9&5V96QO<&UE;G0L(&EN
+M8VQU9&EN9R!D;V-U%``087<`5"P@86YD.@!A;FMS('1O70`'JP!`;6%I;#@`
+M8&QI<W1S+BP`\`$J(%1O(')E<&]R="!A;B!IMP!1+"!U<V4[``$/`+`@=')A
+M8VME<B!A=#(`%"#/`/8#8V]D92YG;V]G;&4N8V]M+W`O:@`1+SH`(',O:0``
+M-0`!9P!1<W5B;6EG`'!E;FAA;F-ENP``I@`&.`"#+"!P;&5A<V4L```[`,`@
+M(&$@<'5L;"!R97%A`;$@=FEA($=I=$AU8L(``I``H7,Z+R]G:71H=6*,``92
+M``B5``!'`/`!<PH*5&AI<R!D:7-T<FEB=3H!`\,!`UD!$F64`6!F;VQL;W<N
+M`;!C;VUP;VYE;G1S.I$`%RJ9`3`Z(&$.`$%R87)YP`$Q<F5AF0&`86YD('=R
+M:70_`&!S=')E86T*``,R`A)S1@!!=&%R.OX!\`$G8G-D=&%R)R!P<F]G<F%M
+M%@+P`F$@9G5L;"UF96%T=7)E9"`G(0``.``#`@!3<F5P;&%"`8!B=6EL="!O
+M;HH``V,``"H`9BH@8W!I;V,```X`"V0`\`=D:69F97)E;G0@:6YT97)F86-E
+M('1O/0`#`@"Q97-S96YT:6%L;'FK`"!S8:D",'5N8S<!4&%L:71Y+0!7*B!C
+M871I`"MA=&@`8'-I;7!L96@"!;4`0'1O;VPS`0!```,"`')Z8V%T+"!B!P`2
+M>`<``$D!0'-U8V@G`%`J(&5X84D`0',Z(%,R`U1S;6%L;!4`!#X!`+X!\`!A
+M="!Y;W4@;6%Y(&9I;F30`C%F=6PO`@9%`%$O;6EN:84!$6'C`5%A8W0@<V``
+MH2!D96UO;G-T<F'!`0`.`R=O9EX!`TD`,&-O;D,"\`(Z("!687)I;W5S(&ET
+M96US(#,!`-<"0&UE(&(W`<!I<F0@<&%R=&EE<SO(``,"``/J`@!&``![```*
+M`O$"875T:&]R<R!W:71H(&%N>2#R`@!3!%`N"@I4:)T!,'`M;`P$HB!D:7)E
+M8W1O<GE!`"!I;O@`"+8"86EN9F]R;1H$$""X!@2]`O`)3D574R`M(&AI9VAL
+M:6=H=',@;V8@<F5C!@)48VAA;F>@`K1#3U!924Y'("T@=U$!8F-A;B!D;Y\`
+M,W1H:2D`\@))3E-404Q,("T@:6YS=&%L;'4```T`(7)U*@(#*0`#0`41+3P`
+M`94```\!`4D!@&9I9W5R92`MS@`!#``"1`"U<V-R:7!T+"!S965G``!_!61D
+M971A:6S#!&%#36%K94S4!#%T>'2(`#!P=71>`H$@(F-M86ME(B0#:60@=&]O
+M;$T``E8!!NL#`2D!,2!I;DP!#VT!`3!A<F5.`A)DV@$T90HGL``C92>M``,D
+M!`"3``!.`/4!+F%M+"!A8VQO8V%L+FTT+.$`0&4N86/_```"`!(M5``D=&^H
+M``RB!+(L(&]N;'D@;F5E9'P`,6UA:?8!(V5R7`$%<``D:6YD`/(#+F@N:6X*
+M"2T@=&5M<&QA=&5S9P`18C0"`68!$V6U`&`*"D=U:63S`"@@1%0&!-(!`G4`
+M`;<!LG-Y<W1E;3H*("H@N`1U+C$@97AP;(,"`R\#`$(!`B$`!)H#`S,``(@$
+M#S0`"P`B``PU`"]A=#0`#"AA=#,`!@$&@"XS(&=I=F5SWP:`;W9E<G9I97?S
+M`@"@``2[!1!A<04P=VAOD0(C*B#9!X5?<F5A9"XS+!```-$%'641`%%?9&ES
+M:Q8``GX'"#X``QP``)D`$'9?`0*W`F%E9"!C86R)!Q!SU`9!;F-E<ZT"`),`
+M`'4``!<"`/D$`7$`6"!!4$ESEP!S96YT<GDN,TT``O<#$B)K`P6K``$D`%`B
+M('5T::0%62!C;&%S1``![P5&;F%L<YT`,',@<U0%86EN<VEG:!$&")D'$2=G
+M`@0W`!(@;P``0`(`J``P;W!E*P4P;VXNJ``&>P$2+8($-7,N-:H(`J\``!D#
+M`/(`@&UA=',@<W5P?P@$8P(%E@$`3```"@*0+C4L(&UT<F5E"0``;P!>=&%R
+M+C54`0CQ!$%A8F]U4P4@<V5-`71P;W!U;&%R'P$$>P`(2PF!:&%R9"UT;RTP
+M!@1;`0%'``!!`&%M;V1E<FZ/``#H`;`@=&%R('9A<FEA;D@)`)H%L6UA;G5A
+M;"!P86=E.``A=F4L!`/Z`0">``%4!%<G9&]C)[T%L&EN"F$@;G5M8F5RE0(&
+MD0<$.P'P`0H*66]U('-H;W5L9"!A;'.N"2%A9$P`,6-O<'8&0&-O;6V>"`"X
+M!!,BO0(R+F@BJ0"`:&4*<V]U<F,O`!!DZP0"9P(#Z08#<@@"?P(T;6]RHP)2
+M<RX@(%"*";)L970@=7,*:VYO=Q`!`9D&\`!E<G)O<G,@;W(@;VUI<W.C!@%S
+M!P`_`6`N"@I#=7)7"#!L>2R"```[!P$C"4!A=71ODP8`_P(0><$",&5C=)D#
+M$635``,<`@5X"1!F+``!MP91*B!'3E5U`0(U`B8@*`0+`!H`06QO;F=0!F)N
+M86UE<RP0```%"Q,@$0``8P!2<W!A<G-\`B%S*54`\`!3;VQA<FES(#D@97AT
+M96ZG`0#9`0YD`#-!0TPS`&%/;&0@5C>+``-J`0`9`X$J(%!/4TE8("`-`5L`
+M`A``,G!A>%H)`ED'`W@"!R$`P&]C=&5T+6]R:65N=!<$('!I?@G&*B!35E(T
+M($%30TE)%``"4P`/,@`%84)I;F%R>2X`P"`H8FEG+65N9&EA;J(!8VQI='1L
+M91$``OH`\0))4T\Y-C8P($-$+5)/32!I;;<"$2AX""!O<,L#P&%L(%)O8VMR
+M:61G944`8DIO;&EE="D!`>\!`DD`-%I)4%8#!$``('5N3@DP<F5S)P<`@P<P
+M9&5F?@81(F8)`Q@``*$$(VEE50$`PP$`H@&%0E-$("=A<B=2``$J`1$G_0,8
+M)ST!6C<M6FEP)@#836EC<F]S;V9T($-!0BP`,4Q(00H#.DQ:2#(`.E)!4A$`
+M&%@1``%O"04@!@!X`PBO`F!H86YD;&6[`A!YMP,`M@0&10@P8F5F2@-2979A
+M;'5""@`@``.9`P`?"#`J('7V!1!O<0(`"P4"0P(!"@`"7`FQ4E!-('=R87!P
+M97(#`45G>FEP/@$Q:6]N%0!=8GII<#(6``1\`4TO3%I7'0"B;'IM82P@;'II
+M<!,#+WAZ(P``&304``D(`0``"E5C<F5A=,\``74$#P8!`@*J`P._`P*\`@\?
+M`Q@P(G)EH`U18W1E9")'`P)/`,0L('=H:6-H('=I;&R*``%6``7*`6$@97AC
+M97!`!0"Y!01I`E$@=&AA=$,.,6ER95$``?,#`<H"("`H%@4!-`0`A`$#,P0`
+M]`-@+"!E=&,I[PL"^@,`J0(&(@0!A@$"V@`/E@,%`<@#82)N97=C(IL#`3,`
+M)W-HL``!$@`/1@-C!`4$`EL!`8D`#UD#``H6`S-7:&4#`@C1#@+F!6%R97-U
+M;'0E`A%B:`4@=&6[#@%5!`\C`@$*"P,!@``/Z0)4,`I.;PX+`L\&`)T#!>D#
+M`*4#(71EVPAA.@H*("H@+1`0:2`*<&AE879I;'G\"#9E86VU!0(1"W`N("!4
+M:&5R-!$S(&YOX@<`@@(#WP@`DP1!(&EN+;</@B!M;V1I9FECY0SP`&]R(')A
+M;F1O;2!A8V-E<_0'`7D`!I<``+`04V5S:6=N)0P298@%`$`$`5X!.&YE=[4#
+M`/`$`'L``W,$`'L``8<)`:,``DH,`$T1(FER@A$0:7D'$F$)`0(,`B$@8C<)
+M`)4',6%B;``&`(P*`0P``2P+`M00`&@``CL`0F5A8V@]`2%V97,#$WE#`%!I
+M;F1E<*H`)6YT(@$`&`D`#P\08T(%$F]L#08U"E0@5VEK:5(,`PP3,&AO=U$/
+M`;,#$&1."`/:``(J`2%/;C\(`/<,`F`&`P,!`_@``8@)8V%L=V%Y<W,(*F5D
+MB@@"1P!P22=V92!A="T-`(P','1O("$0LFUI>F4@<W1A=&EC4@A!<&]L;#82
+M42X@($EF]0A!9&]N)QP3D&5X<&QI8VET;-D)0'9O:V6\$@'K``%_"@/.$2`@
+M*-(0)2!A^PH`J0`@(&&R`0$G$`(M``C-`!1OE0AP*2P@:70@=W``02!G9709
+M$P%="@"D!#<@26YN`#<L(&F>``%1`0.;`")E;LD!!RT``'P`"W$`*&1E$0`#
+MQ@(1+/```H```(T.`)8!`!8!`$``,&%G8?,/`?$)D6-O<G)E<W!O;@X3"$D`
+M#5H``GL#(FEES0\!;P,#YPH@9'49#0"?`Q!SA0$C;V:(`0".$A`M=@``,PP`
+M]P@1:;0/`(0`<F5N=FER;VX/"Q%WD`,!H`(0;=@!$W):`P4P`@!;``)_`!%Y
+M>P,1<#4`T6%T979E<B!B;&]C:W/P``#N!S$@:71D`3)9;W7G$P'$#4!B86-K
+MKQ,Q9G)E/0\R<&%SL@`%5P`P(&)Y+@=Q="!A('1I;5<#<6]R(&UM87`I`0!>
+M$P$/`P),%@`&"1!G5180:2(3`2(`!4H``.,3(6-EA0`A3VZ0`QMEPP`"Y`(R
+M<')O.@$!A0%18W1L>2W,`))E9"!O=71P=73O`@!@!/$#;V)J96-T+7-T>6QE
+M(&%P<')OR`,`^10"^@#0=&\@:&%V92!M=6QT:<,3!*D``@$$`+D(52!O<&5N
+MG@`3(!40`&H0``H!$6DA"&-I=',@(D`\`!(BO001<S`.`F,%!E@`8&ET<V5L
+M9E,!4')E860OY@!@=&5N('5S;P8`-PP!<@$$@A0"-`(`(0TB8V$%!#4@86Z(
+M!`(C$U!L>2!F<EP%`)(20"UM96TT$R!B=?D4$B`D"`!E``!Z``#-`G!A('-O
+M8VME9A<"/@-)=VES:+H$`28/`UD/`',"!8P``#\``^\-4"!E87-Y3@X`#!$1
+M(B$!`%H(("PB4`B@+"!C87!A8FEL:1(4!@,!!?$``O,/`;<$"/8%`9<!@"!I
+M;F1I=FED;`X#VP@`A0``.A("0@``K`L`T0``-@$A=&^L#3!D8737```%#A8Z
+M+@$"R`D`/0`28>P"`,D*`2L`,VEN("<!`(\",&%D9'0$`$P`"/<,`:D*`QX/
+M469I<G-TD@(`I@$187`2$6_Q#0#V`!8N=``#V0,"IP$`OP`"G`$!A0`&N`$`
+M=@``PP``O`,299,``NX4`(46!J,!!H`%,7=A;G\%$G0=#P$V`@%;`P$:!!!T
+MC@<A<VLL`P%K`P"?!)EN=F5N:65N8V7``0")```P%`*!$U)E<W!E8_P6`-`!
+M`JH!`#H(,#H@(I,*`0X1"=H-$R*Y`@#>#B)A;N@"`*4'!C0*$"QC`$!D97-P
+MH@``;`0!Y`,`<PIS('-A>7,N"B05$6:X#0]D&O______________________
+M____________________________________________________________
+M____________________________________________________________
+M____________________________________________________________
+M____________________________________________________________
+M_________________________________________UM09"!O<B!,$0``\2PB
+M9&5F;&%T92(@8V]M<')E<W-E9"!E;G1R:65S*0H@("H@1TY5(&%N9"!"4T0@
+M)V%R)R!A<F-H:79E<QX`X2=M=')E92<@9F]R;6%T$P!X25-/.38V,!,`6C<M
+M6FEP.0`V6$%2$0#E"E=H96X@8W)E871I;F<8`/$9+"!T:&4@<F5S=6QT(&-A
+M;B!B92!F:6QT97)E9"!W:71H(&%N>2!O9B<`H69O;&QO=VEN9SJ&`(%U=65N
+M8V]D90T`16=Z:7#A`#%I;VX5`%UB>FEP,A8`!`<!32],6E<=`+%L>FUA+"!L
+M>FEP+!0!*7AZ(P#!"DYO=&5S(&%B;W5TE`!R;&EB<F%R>=$`\"YT96-T=7)E
+M.@H*("H@5&AI<R!I<R!A(&AE879I;'D@<W1R96%M+6]R:65N=&5D('-Y<W1E
+M;2X@(%1H97)E+`"`;F\@9&ER96-G`8`@<W5P<&]R=&8!\QD@:6XM<&QA8V4@
+M;6]D:69I8V%T:6]N(&]R(')A;F1O;2!A8V-E<W,N>0`&EP#@:7,@9&5S:6=N
+M960@=&]>`61E>'1E;F1>`3AN97?@``#S`#(*("#.`!!V<@$`]`$2<Z,`\`(@
+M;VYL>2!R97%U:7)E;65N=+(`,G1H80D!`BL`("!BCP&0(')E861A8FQEH@!!
+M=W)I=`P`$&$,`0($`0!H``([`$5E86-H;P``E@(3>4,`4&EN9&5PJ@`B;G1_
+M`$%R92!A!`"4=&EC;&5S(&]N@0$#KP+P`2!7:6MI(&5X<&QA:6YI;F?)`#!H
+M;W?X``+U``<L``(J`2%/;JH`'"P#`0!S`3)M871P`$!L=V%Y1@$`W0'R`65D
+M(&%U=&]M871I8V%L;'E'`+!))W9E(&%T=&5M<-<!X'1O(&UI;FEM:7IE('-T
+M*P"P(&QI;FL@<&]L;'6X`>$N("!)9B!Y;W4@9&]N)^P!`+8`\0)I8VET;'D@
+M:6YV;VME(&$@<.L`@'5L87(@9F5A60)`("AS=2\!&7,<`A!AZ0`'+0`$YP,#
+M(@("F0%P*2P@:70@=W``\``@9V5T('!U;&QE9"!I;BX^`"=);FX`-RP@:9X`
+M`5$!`YL`(F5NR0$'+0``/@`+<0`H9&41``/&`A$L\``"@``B;F6.`@`6`0!`
+M`&)A9V%I;G-'`J!C;W)R97-P;VYD)P0(20`-6@`">P,Q:65SPP`!;P.P86QS
+M;R!R961U8V6;`C!E('.%`2-O9H@!`+,!$"UV`&%E9"!B:6X]`"`@:2P$@"!E
+M;G9I<F]NUP(Q<R!W;@(!H`(0;=@!$W):`P4P`@!;``)_`!%Y>P,1<#4`T6%T
+M979E<B!B;&]C:W/P`!!H5P4A:72A`$%9;W5R;P(0(#L"0&)A8VM``T!F<F5E
+MH@(R<&%SL@`%5P!`(&)Y=%<"82!A('1I;5<#<6]R(&UM87#X`D%E;G1I#P,!
+MJP4!40-`9VEV9>8!(71O(@`%2@!A="!O;F-EA0`A3VZ0`QMEPP`"Y`(R<')O
+M.@$!A0%18W1L>2W,`))E9"!O=71P=73O`@!@!/$#;V)J96-T+7-T>6QE(&%P
+M<')OR`,`H`4"^@#@=&\@:&%V92!M=6QT:7`E``.E`P(!!`!;!E4@;W!E;IX`
+ML2`@8G-D=&%R('5SO`$`/06#;B!I=',@(D#E`!(BR`-&<VEO;HH``QP``"H`
+M,&5L9E,!`'T$$"_F`&%T96X@=7-(`@1R`4!F=6YC@P,"-`(Q66]U=08`,@`U
+M(&%NI``"A`50;'D@9G)<!1!N?P7P`6UE;6]R>2!B=69F97(@;W*Y`@!E``1R
+M`85A('-O8VME=#X#27=I<VBZ!,!S;VUE('5T:6QI='D^``6,``$``O$%<F]V
+M:61E(&5A<WDM=&\M=7-E("(A`?`"9FEL92PB(&5T8RP@8V%P86)!``'V`@)F
+M!A%E50(!\0!A92!!4$ESMP0(]@4!EP&T(&EN9&EV:61U86S^!P"%``(5!@$!
+M`0.L!0`V`2%T;W@',&1A=-<`5G5R8V4Z+@$!Q0<!D`(28>P"`*`'`2L`,VEN
+M("<!`/@"(&%D_`(`W0`@82#9`02J`0#7!R%O=?<$469I<G-TD@(`I@$@82!#
+M!1%O4`<`]@`6+G0``]D#`J<!`B<&`)P!`,(`![@!`'8``I0!`*$#`9,``D\'
+M(FQYAP`"HP$&@`4Q=V%NB``0=#8$!44!`&``$&F%`@".!R%S:RP#`6L#`)\$
+MF6YV96YI96YC9<`!`(D`,&UA:WD`D&ES(&5S<&5C:6X$`=`!`JH!`#H(\P,Z
+M(")P87@@:6YT97)C:&%N9V5K!A,BN0(@;&P\`0+H`@"E!P`X`0+!!1`L8P!`
+M9&5S<.<!`&P$`>0#\`)N86UE('-A>7,N"E)%041-15``!^@&X2!B=6YD;&4N
+M"@I1=65S^@*@/R`@27-S=65S/U(`URH@:'1T<#HO+W=W=RX@!S!O<F>3``!(
+M`1!HN`*#9F]R(&]N9V]8!Q@@9`!P9&5V96QO<#P%<2P@:6YC;'6]!4!D;V-U
+M%``!K`@!3@D`<0``.@`A;FM=`0!=``9S`%`@;6%I;`<"0FQI<W2@`S`J(%29
+M`0$&"4!A;B!IMP`0+"$$`?P``0\`D2!T<F%C:V5R()L*)"`@SP``&0KF+F=O
+M;V=L92YC;VTO<"]J`!$O.@`@<R]I``"3``%G`%%S=6)M:6<`8F5N:&%N8^((
+M`:8&$V*Z`H,L('!L96%S92P``#L```0#`$L'`1<)X65S="!V:6$@1VET2'5B
+M<`4"D`"A<SHO+V=I=&AU8HP`!E(`")4``$<`,7,*"L@&<61I<W1R:6(N"`/#
+M`0-9`0"7`A!HCP$`U`,`+@$`(P=@;VYE;G1S%@LG("J9`3`Z(&$.``)0`Q)O
+M?08`,P`$)P,`#``"CP4`"@`#Y0`!F@40*K$#$3IJ`!(GEP40)Z($0&=R86T6
+M`G-A(&9U;&PME@AR9"`G=&%R)P\!`0(`(7)EK0H`_0%0(&)U:6R!!@"*``-C
+M```J`&8J(&-P:6]C```.``MD`"!D:6L%`6@*`#`#0V9A8V5J`P,"``#+#")N
+M=&@#`$P"$',-`P26`Q1A9P57*B!C871I`"MA=&@`,'-I;:$&"+4`0'1O;VPS
+M`0"J``,"`')Z8V%T+"!B!P`2>`<``$D!`)()`"<`4"H@97AA20!`<SH@4S(#
+M5'-M86QL%0`$/@$`4@,A870<""!M8>8$(&YDT`(Q9G5L+P(&10`0+T,*`84!
+M$6&>"E%A8W0@<V``DB!D96UO;G-T<DH-`"D&)V]F7@$#20`P8V]N0P+P`CH@
+M(%9A<FEO=7,@:71E;7,@,P$`?0-`;64@8C<!,FER9,\),&5S.\@``P(``^H"
+M`$8``'L``%\!=F%U=&AO<G.7#0'R`@)-!Q`*B`90=&]P+6P,!`/%#``P!P%!
+M`!!IY`8)M@(B:6[6!`"D"@#K!02]`O`"3D574R`M(&AI9VAL:6=H='-<!C!R
+M96,&`@(Q!0.@`I)#3U!924Y'("T,!0!-"V)C86X@9&^?``"'!0#.`,`J($E.
+M4U1!3$P@+2!D"C)A;&QU```-`")R=0P(`BD``T`%$2T\``"%#@'C!@%)`85F
+M:6=U<F4@+0P``D0`M7-C<FEP="P@<V5E9P``*`5D9&5T86ELPP1A0TUA:V5,
+MU`0Q='ATB``B<'76#2`B8S0&$2(D`P`X#"EO;$T``E8!!NL#`2D!`!8)`(X!
+M#VT!`0"B!A!UWP\!V@$T90HGL``C92>M``,D!`"3``!.`/``+F%M+"!A8VQO
+M8V%L+FTT"0T#[0`P+F%C%P$``@`0+:("`)\`!*@``-D."*($$BP:#@#7"P!9
+M"Q!YR@4!]@$C97*N`05P`"1I;F0`@2YH+FEN"@DM]`<`H!`2<V<`$6(T`@*%
+M``.U`&`*"D=U:63S`"@@1%0&!-(!`G4``;<!`E,/$#H:"0*X!"$N,<$,`&$,
+M`3<!`R\#``L``B$`!)H#`S,``(@$#S0`"P`B``PU`"]A=#0`#"AA=#,`!@$&
+M(2XSM@L0<V4*@&]V97)V:65W\P(`H``%P`L`<050=VAO;&6D``-$!81?<F5A
+M9"XS++0*$5_X"`T1`%%?9&ES:Q8``GX'"#X``QP``)D``7L*`K<"$F6@#``2
+M!D!S97%UZ@@0<PL%`3X!`'4``!<"`/D$`7$``7$*")<``#P),WDN,TT``.\$
+M,F4@(FL#!:L``20`%"(+"UD@8VQA<T0``1\)1FYA;'.=`!)S/@MA:6YS:6=H
+M$08(F0<1)V<"!#<``&@1,'5C=+(#`*@`,&]P92L%`#0,"1X'$BV"!#5S+C6J
+M"`*O```9`P#R`#5M871I#P1C`@66`0"P```*`D$N-2P@(1,`"0``;P!>=&%R
+M+C54`0CQ!`4^$A%S8P0Q<&]PY0\#G`$$>P`(2PE`:&%R9!8,`3`&!%L!`4<`
+M`(X!86UO9&5R;H\``.@!`+P'<"!V87)I86Y("0":!3!M86[X"T%P86=E.```
+M,0XD<F6F``">``'?`5<G9&]C)[T%D&EN"F$@;G5M8O(,%V:1!P0[`<<*"EEO
+M=2!S:&]U;&2D"P`H`3%C;W!V!D!C;VUMG@@`N`03(@4.,BYH(JD`,FAE"E\,
+M$""P"0#Z```4``3I!@-R"`)_`C1M;W*C`E)S+B`@4(H)LVQE="!U<PIK;F]W
+ME1,`,!1@97)R;W)S?1)`;VUI<S`.`I4.`#\!P2X*"D-U<G)E;G1L>=H+`#L'
+M`2,)"=H1`,$",&5C=)D#$61A#0,<`@2#%"`@9@82`;<&`D$5!JH+)B`H!`L`
+M6Q4@;&\O`#!I;&6M"R)S+!````4+$R`1``!C`%)S<&%R<WP"`Y85GU-O;&%R
+M:7,@.0X,`0AD`#-!0TPS`&%/;&0@5C<``@-J`0`9`[$J(%!/4TE8('5S=+`1
+M!!``#XH,`P$Y%0(Q`%9O8W1E=*\4`&`"`1X`H5-64C0@05-#24ET`@$4``\R
+M``L00FT1$7DN`+$@*&)I9RUE;F1I8=018VQI='1L91$``I`6!%\6D4-$+5)/
+M32!I;;<"$"@X#C`@;W#+`\!A;"!2;V-K<FED9V7G`6)*;VQI970I`0'O`0))
+M`#1:25!U!`1``"!U;C$+`P87/V]R(!X70`\+%P#036EC<F]S;V9T($-!0N<"
+M!$H7,4Q(00H#-4Q:2*H``5`!&%(]%P"T`0I.%P#5`P4@!@#U$@BO`@!V$@`B
+M%0`+`P-,!@9%"#!B969*`U)E=F%L=4(*`*X#`R\"`!\(!ED7$62V`@)_```5
+M!0/[";%24$T@=W)A<'!E<JL`#WL75`":`#%L>C0."P#``0#E%P$A"00(`0``
+M"@*<$`5+`0!U!`\&`0("@P$#OP,"O`(/'P,8,")R9:`-`!`6$2)'`P)/`,(L
+M('=H:6-H('=I;&SK&`!P"``9!`-?`4!S(&5X+10``@(`N04$B1$""Q<#6A<!
+M40`%Z1(P<R`H4PH!-`0`A`$#,P0`]`-@+"!E=&,I[PL"^@,`;`0`;0`"C0`!
+MFP$"V@`/R`,*82)N97=C(IL#`3,`)W-HL``!$@`/1@-C!`4$!\X`#UD#``H6
+M`P]D&O______________________________________________________
+M____________________________________________________________
+M____________________________________________________________
+M____________________________________________________________
+M____________________________________________________________
+M___________B4&5T86EL6A$``/4><R!T:&4@(G-T<G5C="!A<F-H:79E7V5N
+M=')Y(B!U=&EL:71Y(&-L87-S"B`J(`#S&VEN=&5R;F%L<RXS('!R;W9I9&5S
+M('-O;64@:6YS:6=H="!I;G1O(&QI8E(`4"=S"B`@%0`!-P`2(&\`\`-U<F4@
+M86YD(&]P97)A=&EO;BYD``8U`/($+69O<FUA=',N-2!D;V-U;65N=*\`4V9I
+M;&4@'0#1('-U<'!O<G1E9"!B><T`<&QI8G)A<GE,`-!C<&EO+C4L(&UT<F5E
+M"0``;P!4=&%R+C6W`,(@9&5T86EL960@:6Y2`)!I;VX@86)O=71-`"!S9;@`
+M='!O<'5L87+_``1[`/,)+"!I;F-L=61I;F<@:&%R9"UT;RUF:6YD5``2<T<`
+M`$$`86UO9&5R;H\``?(`\0YT87(@=F%R:6%N=',N"E1H92!M86YU86P@<&%G
+M93@`9'9E(&%R9:8``)X``(\`]!H@)V1O8R<@9&ER96-T;W)Y(&EN"F$@;G5M
+M8F5R(&]F(&1I9F9E<F5N=*,`\0@N"@I9;W4@<VAO=6QD(&%L<V\@<F5A9$P`
+MLF-O<&EO=7,@8V]M6P%#:6X@(@(",BYH(JD`@&AE"G-O=7)C+P`19'4!`!0`
+M82!S86UP;)\`4&=R86US;P!4(&UO<F7[`/(&+B`@4&QE87-E(&QE="!U<PIK
+M;F]W$`'P#B!A;GD@97)R;W)S(&]R(&]M:7-S:6]N<R!Y;W4@/P%@+@H*0W5R
+MQ@`Q;'DL;@`#T@'@(&%U=&]M871I8V%L;'EK`$%E8W1SJ```U0`#'`)0;VQL
+M;W>3`1!F+`"A<SH*("`J($=.574!`E(")B`HN0$`&@!!;&]N9U4"8FYA;65S
+M+!``4VQI;FL@$0``-P)2<W!A<G-\`B%S*54`\`!3;VQA<FES(#D@97AT96ZG
+M`0]D``,S04-,,P!A3VQD(%8WBP`#:@$`&0/1*B!03U-)6"!U<W1A<EL``A``
+M,G!A>#0#46-H86YG?@$W;6%T(0"P;V-T970M;W)I96X!`P!@`@$>`*%35E(T
+M($%30TE)=`(!%``"4P`/,@`%84)I;F%R>2X`P"`H8FEG+65N9&EA;J(!8VQI
+M='1L91$``OH`\0))4T\Y-C8P($-$+5)/32!I;;<"@"AW:71H(&]PRP/`86P@
+M4F]C:W)I9&=E10!B2F]L:65T*0$![P$"20`T6DE05@,$0`#`=6YC;VUP<F5S
+M<V5D.@"0(F1E9FQA=&4BJ0($&```H00C:655`0##`0"B`85"4T0@)V%R)U(`
+M`?@`$2?]`Q`GHP($/0%:-RU::7`F`-A-:6-R;W-O9G0@0T%"+``Q3$A!8@(Z
+M3%I(,@`Z4D%2$0`86!$``=4#!;@"`'@#"*\"8&AA;F1L9;L"$'FW`P"#!0:X
+M`C!B969*`W!E=F%L=6%TR@(`(``#F0,"SP)`=75E;I`#$62V`@)#`@#``B%S
+M((,!HE)032!W<F%P<&5.`D5G>FEP/@$Q:6]N&`%=8GII<#(6``1\`4TO3%I7
+M'0"B;'IM82P@;'II<!,#+WAZ(P``&304``D(`95C86X@8W)E873/``%U!`\&
+M`0("KP$#OP,"O`(/'P,8P2)R97-T<FEC=&5D(D<#`D\`Q"P@=VAI8V@@=VEL
+M;(H``58`!<H!82!E>&-E<$`%`+D%!&D"L"!T:&%T(')E<75IE@4G87C*`E(@
+M*&9O<C0$`(0!`S,$`/0#<2P@971C*2YO`0#Z`P"I`@8B!`$7``+:``^6`P4!
+MR`-A(FYE=V,BFP,!,P`G<VBP``$2``]&`V,$!00"6P$!B0`/60,`"A8#,U=H
+M90,"`-@"`]0"$G/F!6%R97-U;'0E`A%B:`52=&5R9632`@\C`@$*"P,!@``/
+MZ0)40@I.;W2G!P(F"`#I"`!S"`)&`B%T9=L(\`@Z"@H@*B!4:&ES(&ES(&$@
+M:&5A=FEL>?P(-F5A;;4%X'-Y<W1E;2X@(%1H97)E+``C;F_B!P""`@/?"`"3
+M!/("(&EN+7!L86-E(&UO9&EF:6.M"/,";W(@<F%N9&]M(&%C8V5S<RYY``:`
+M!/(":7,@9&5S:6=N960@=&\@8F6^`@!`!`$P!#AN97>U`P#P!`![``-S!`![
+M``&'"0&C`%0@;VYL>0H#`#@(`+(``1X#`*8$`@P"(2!B-PEQ<F5A9&%B;``&
+M07=R:70,`!!A#`$"!`$`:``".P!"96%C:#T!(79E<P,3>4,`4&EN9&5PJ@`E
+M;G0B`0`8"5!A<G1I8_`$)&]N(@@$K@#P`%=I:VD@97AP;&%I;FEN9\D`,&AO
+M=_@``J8'`*T!`RP``BH!(4]N%`D<+`,!`_@``8@)4&%L=V%Y1@$`W0$J962*
+M"`)'`+!))W9E(&%T=&5M<(P'X'1O(&UI;FEM:7IE('-TM0@"4@A0<&]L;'4B
+M!U$N("!)9O4(0&1O;B?6!P&V`%!I8VET;-D)@79O:V4@82!PZP`!?PHQ9F5A
+M-`LP*'-U+P$%^PH`J0`@(&'I``<M``0M!P#/"A1O^0AP*2P@:70@=W``@B!G
+M970@<'5L^PH`I`0W($EN;@`W+"!IG@`(FP`B96[)`0<M``!\``MQ`"AD91$`
+M`\8"$2SP``*``")N98X"`!8!`$``8F%G86EN<T<"D6-O<G)E<W!O;EP+"$D`
+M#5H``F0',6EE<\,``6\#`^<*,61U8[D%,&4@<X4!(V]FB`$`/0H0+78``#,,
+M`/<($6F'!@"$`'!E;G9I<F]NUP(Q<R!WD`,!H`(0;=@!$W):`P4P`@!;``)_
+M`!%Y>P,1<#4`T6%T979E<B!B;&]C:W/P``#N!S$@:72A`$%9;W5R;P(0(,4*
+M0&)A8VM``T!F<F5EH@(P<&%S30,'5P`P(&)Y+@=Q="!A('1I;5<#`&L+,6UA
+M</@",&5N=)$&`]`"`5$#0&=I=F7F`2%T;R(`!:$`870@;VYC984`(4]ND`,;
+M9<,``N0",G!R;SH!`84!46-T;'DMS```C@E2=71P=73O`@!@!/$#;V)J96-T
*** 6665 LINES SKIPPED ***

Reply via email to