From ab210104fb58ab7300d3646f33829d07aebb3741 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 17 Jan 2018 16:10:03 +0100 Subject: [PATCH] - Auto-sync with upstream branch release/2.25/master Upstream commit: edcf13e25c1559558a6f12ff5a71d4136a39235e - PTHREAD_STACK_MIN is too small on x86-64 (#1527887) - CVE-2018-1000001: Make getcwd fail if it cannot obtain an absolute path (#1533837) - CVE-2017-16997: Check for empty tokens before dynamic string token expansion in the dynamic linker (#1526866) - CVE-2017-15804: glob: Fix overflow in GLOB_TILDE unescaping (swbz#22332) - CVE-2017-15670: glob: Fix one-byte overflow (#1504807) - CVE-2017-15671: glob: Fix memory leak (#1504807) - nss_files: Avoid large buffers with many host addresses (swbz#22078) - nss_files: Use struct scratch_buffer for gethostbyname (swbz#18023) - posix: Fix improper assert in Linux posix_spawn (BZ#22273) - Don't use IFUNC resolver for longjmp or system in libpthread (swbz#21041) - x86-64: Use fxsave/xsave/xsavec in _dl_runtime_resolve (swbz#21265) --- glibc-alloc_buffer-1.patch | 1306 ---------- glibc-dynarray-1.patch | 37 - glibc-dynarray-2.patch | 2219 ----------------- glibc-dynarray-3.patch | 119 - glibc-dynarray-4.patch | 114 - glibc-dynarray-5.patch | 22 - glibc-libc-pointer-arith.patch | 17 - glibc-rh1315108-glob.patch | 271 ++ glibc-rh1315108.patch | 500 +--- glibc-rh168253-ai_canonname-tests.patch | 141 -- ...168253-getaddrinfo-errno-nss-failure.patch | 36 - glibc-rh168253-getaddrinfo-errno.patch | 99 - ...ddrinfo-gaih_inet-unreachable-return.patch | 29 - ...-getaddrinfo-gethosts-error-handling.patch | 330 --- ...getaddrinfo-gethosts-res-ctx-release.patch | 21 - ...68253-getaddrinfo-h_errno-no-success.patch | 27 - glibc-rh168253-getaddrinfo-h_errno.patch | 151 -- ...h168253-getaddrinfo-inet_pton_length.patch | 62 - ...8253-getaddrinfo-malloc-address-list.patch | 85 - ...etaddrinfo-malloc-canonname-strdup-1.patch | 39 - ...etaddrinfo-malloc-canonname-strdup-2.patch | 19 - ...h168253-getaddrinfo-malloc-canonname.patch | 170 -- ...etaddrinfo-merge-ipv6-ipv4-addresses.patch | 31 - glibc-rh168253-getaddrinfo-no_data.patch | 27 - ...-rh168253-getaddrinfo-tests-bug21295.patch | 8 +- glibc-rh168253-inet_pton-gnu-style.patch | 354 --- glibc-rh168253-inet_pton_length.patch | 839 +------ glibc-rh168253-ns_name-tests.patch | 891 ------- glibc-rh168253-ns_name_pack-buffer-size.patch | 386 --- ...168253-resolv-tests-nondeterministic.patch | 89 +- glibc-rh168253-struct-resolv_context.patch | 46 +- glibc.spec | 73 +- sources | 2 +- 33 files changed, 410 insertions(+), 8150 deletions(-) delete mode 100644 glibc-alloc_buffer-1.patch delete mode 100644 glibc-dynarray-1.patch delete mode 100644 glibc-dynarray-2.patch delete mode 100644 glibc-dynarray-3.patch delete mode 100644 glibc-dynarray-4.patch delete mode 100644 glibc-dynarray-5.patch delete mode 100644 glibc-libc-pointer-arith.patch create mode 100644 glibc-rh1315108-glob.patch delete mode 100644 glibc-rh168253-ai_canonname-tests.patch delete mode 100644 glibc-rh168253-getaddrinfo-errno-nss-failure.patch delete mode 100644 glibc-rh168253-getaddrinfo-errno.patch delete mode 100644 glibc-rh168253-getaddrinfo-gaih_inet-unreachable-return.patch delete mode 100644 glibc-rh168253-getaddrinfo-gethosts-error-handling.patch delete mode 100644 glibc-rh168253-getaddrinfo-gethosts-res-ctx-release.patch delete mode 100644 glibc-rh168253-getaddrinfo-h_errno-no-success.patch delete mode 100644 glibc-rh168253-getaddrinfo-h_errno.patch delete mode 100644 glibc-rh168253-getaddrinfo-inet_pton_length.patch delete mode 100644 glibc-rh168253-getaddrinfo-malloc-address-list.patch delete mode 100644 glibc-rh168253-getaddrinfo-malloc-canonname-strdup-1.patch delete mode 100644 glibc-rh168253-getaddrinfo-malloc-canonname-strdup-2.patch delete mode 100644 glibc-rh168253-getaddrinfo-malloc-canonname.patch delete mode 100644 glibc-rh168253-getaddrinfo-merge-ipv6-ipv4-addresses.patch delete mode 100644 glibc-rh168253-getaddrinfo-no_data.patch delete mode 100644 glibc-rh168253-inet_pton-gnu-style.patch delete mode 100644 glibc-rh168253-ns_name-tests.patch delete mode 100644 glibc-rh168253-ns_name_pack-buffer-size.patch diff --git a/glibc-alloc_buffer-1.patch b/glibc-alloc_buffer-1.patch deleted file mode 100644 index 3bfa71f..0000000 --- a/glibc-alloc_buffer-1.patch +++ /dev/null @@ -1,1306 +0,0 @@ -commit 4dd8e7c0ce5ecc7f65e33e60ad2f717b31de32ec -Author: Florian Weimer -Date: Wed Jun 21 22:43:57 2017 +0200 - - Implement allocation buffers for internal use - - This commit adds fixed-size allocation buffers. The primary use - case is in NSS modules, where dynamically sized data is stored - in a fixed-size buffer provided by the caller. - - Other uses include a replacement of mempcpy cascades (which is - safer due to the size checking inherent to allocation buffers). - -diff --git a/include/alloc_buffer.h b/include/alloc_buffer.h -new file mode 100644 -index 0000000000000000..d668a60d66c5b076 ---- /dev/null -+++ b/include/alloc_buffer.h -@@ -0,0 +1,367 @@ -+/* Allocation from a fixed-size buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Allocation buffers are used to carve out sub-allocations from a -+ larger allocation. Their primary application is in writing NSS -+ modules, which receive a caller-allocated buffer in which they are -+ expected to store variable-length results: -+ -+ void *buffer = ...; -+ size_t buffer_size = ...; -+ -+ struct alloc_buffer buf = alloc_buffer_create (buffer, buffer_size); -+ result->gr_name = alloc_buffer_copy_string (&buf, name); -+ -+ // Allocate a list of group_count groups and copy strings into it. -+ char **group_list = alloc_buffer_alloc_array -+ (&buf, char *, group_count + 1); -+ if (group_list == NULL) -+ return ...; // Request a larger buffer. -+ for (int i = 0; i < group_count; ++i) -+ group_list[i] = alloc_buffer_copy_string (&buf, group_list_src[i]); -+ group_list[group_count] = NULL; -+ ... -+ -+ if (alloc_buffer_has_failed (&buf)) -+ return ...; // Request a larger buffer. -+ result->gr_mem = group_list; -+ ... -+ -+ Note that it is not necessary to check the results of individual -+ allocation operations if the returned pointer is not dereferenced. -+ Allocation failure is sticky, so one check using -+ alloc_buffer_has_failed at the end covers all previous failures. -+ -+ A different use case involves combining multiple heap allocations -+ into a single, large one. In the following example, an array of -+ doubles and an array of ints is allocated: -+ -+ size_t double_array_size = ...; -+ size_t int_array_size = ...; -+ -+ void *heap_ptr; -+ struct alloc_buffer buf = alloc_buffer_allocate -+ (double_array_size * sizeof (double) + int_array_size * sizeof (int), -+ &heap_ptr); -+ _Static_assert (__alignof__ (double) >= __alignof__ (int), -+ "no padding after double array"); -+ double *double_array = alloc_buffer_alloc_array -+ (&buf, double, double_array_size); -+ int *int_array = alloc_buffer_alloc_array (&buf, int, int_array_size); -+ if (alloc_buffer_has_failed (&buf)) -+ return ...; // Report error. -+ ... -+ free (heap_ptr); -+ -+ The advantage over manual coding is that the computation of the -+ allocation size does not need an overflow check. In case of an -+ overflow, one of the subsequent allocations from the buffer will -+ fail. The initial size computation is checked for consistency at -+ run time, too. */ -+ -+#ifndef _ALLOC_BUFFER_H -+#define _ALLOC_BUFFER_H -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* struct alloc_buffer objects refer to a region of bytes in memory of a -+ fixed size. The functions below can be used to allocate single -+ objects and arrays from this memory region, or write to its end. -+ On allocation failure (or if an attempt to write beyond the end of -+ the buffer with one of the copy functions), the buffer enters a -+ failed state. -+ -+ struct alloc_buffer objects can be copied. The backing buffer will -+ be shared, but the current write position will be independent. -+ -+ Conceptually, the memory region consists of a current write pointer -+ and a limit, beyond which the write pointer cannot move. */ -+struct alloc_buffer -+{ -+ /* uintptr_t is used here to simplify the alignment code, and to -+ avoid issues undefined subtractions if the buffer covers more -+ than half of the address space (which would result in differences -+ which could not be represented as a ptrdiff_t value). */ -+ uintptr_t __alloc_buffer_current; -+ uintptr_t __alloc_buffer_end; -+}; -+ -+enum -+ { -+ /* The value for the __alloc_buffer_current member which marks the -+ buffer as invalid (together with a zero-length buffer). */ -+ __ALLOC_BUFFER_INVALID_POINTER = 0, -+ }; -+ -+/* Internal function. Terminate the process using __libc_fatal. */ -+void __libc_alloc_buffer_create_failure (void *start, size_t size); -+ -+/* Create a new allocation buffer. The byte range from START to START -+ + SIZE - 1 must be valid, and the allocation buffer allocates -+ objects from that range. If START is NULL (so that SIZE must be -+ 0), the buffer is marked as failed immediately. */ -+static inline struct alloc_buffer -+alloc_buffer_create (void *start, size_t size) -+{ -+ uintptr_t current = (uintptr_t) start; -+ uintptr_t end = (uintptr_t) start + size; -+ if (end < current) -+ __libc_alloc_buffer_create_failure (start, size); -+ return (struct alloc_buffer) { current, end }; -+} -+ -+/* Internal function. See alloc_buffer_allocate below. */ -+struct alloc_buffer __libc_alloc_buffer_allocate (size_t size, void **pptr) -+ __attribute__ ((nonnull (2))); -+ -+/* Allocate a buffer of SIZE bytes using malloc. The returned buffer -+ is in a failed state if malloc fails. *PPTR points to the start of -+ the buffer and can be used to free it later, after the returned -+ buffer has been freed. */ -+static __always_inline __attribute__ ((nonnull (2))) -+struct alloc_buffer alloc_buffer_allocate (size_t size, void **pptr) -+{ -+ return __libc_alloc_buffer_allocate (size, pptr); -+} -+ -+/* Mark the buffer as failed. */ -+static inline void __attribute__ ((nonnull (1))) -+alloc_buffer_mark_failed (struct alloc_buffer *buf) -+{ -+ buf->__alloc_buffer_current = __ALLOC_BUFFER_INVALID_POINTER; -+ buf->__alloc_buffer_end = __ALLOC_BUFFER_INVALID_POINTER; -+} -+ -+/* Return the remaining number of bytes in the buffer. */ -+static __always_inline __attribute__ ((nonnull (1))) size_t -+alloc_buffer_size (const struct alloc_buffer *buf) -+{ -+ return buf->__alloc_buffer_end - buf->__alloc_buffer_current; -+} -+ -+/* Return true if the buffer has been marked as failed. */ -+static inline bool __attribute__ ((nonnull (1))) -+alloc_buffer_has_failed (const struct alloc_buffer *buf) -+{ -+ return buf->__alloc_buffer_current == __ALLOC_BUFFER_INVALID_POINTER; -+} -+ -+/* Add a single byte to the buffer (consuming the space for this -+ byte). Mark the buffer as failed if there is not enough room. */ -+static inline void __attribute__ ((nonnull (1))) -+alloc_buffer_add_byte (struct alloc_buffer *buf, unsigned char b) -+{ -+ if (__glibc_likely (buf->__alloc_buffer_current < buf->__alloc_buffer_end)) -+ { -+ *(unsigned char *) buf->__alloc_buffer_current = b; -+ ++buf->__alloc_buffer_current; -+ } -+ else -+ alloc_buffer_mark_failed (buf); -+} -+ -+/* Obtain a pointer to LENGTH bytes in BUF, and consume these bytes. -+ NULL is returned if there is not enough room, and the buffer is -+ marked as failed, or if the buffer has already failed. -+ (Zero-length allocations from an empty buffer which has not yet -+ failed succeed.) */ -+static inline __attribute__ ((nonnull (1))) void * -+alloc_buffer_alloc_bytes (struct alloc_buffer *buf, size_t length) -+{ -+ if (length <= alloc_buffer_size (buf)) -+ { -+ void *result = (void *) buf->__alloc_buffer_current; -+ buf->__alloc_buffer_current += length; -+ return result; -+ } -+ else -+ { -+ alloc_buffer_mark_failed (buf); -+ return NULL; -+ } -+} -+ -+/* Internal function. Statically assert that the type size is -+ constant and valid. */ -+static __always_inline size_t -+__alloc_buffer_assert_size (size_t size) -+{ -+ if (!__builtin_constant_p (size)) -+ { -+ __errordecl (error, "type size is not constant"); -+ error (); -+ } -+ else if (size == 0) -+ { -+ __errordecl (error, "type size is zero"); -+ error (); -+ } -+ return size; -+} -+ -+/* Internal function. Statically assert that the type alignment is -+ constant and valid. */ -+static __always_inline size_t -+__alloc_buffer_assert_align (size_t align) -+{ -+ if (!__builtin_constant_p (align)) -+ { -+ __errordecl (error, "type alignment is not constant"); -+ error (); -+ } -+ else if (align == 0) -+ { -+ __errordecl (error, "type alignment is zero"); -+ error (); -+ } -+ else if (!powerof2 (align)) -+ { -+ __errordecl (error, "type alignment is not a power of two"); -+ error (); -+ } -+ return align; -+} -+ -+/* Internal function. Obtain a pointer to an object. */ -+static inline __attribute__ ((nonnull (1))) void * -+__alloc_buffer_alloc (struct alloc_buffer *buf, size_t size, size_t align) -+{ -+ if (size == 1 && align == 1) -+ return alloc_buffer_alloc_bytes (buf, size); -+ -+ size_t current = buf->__alloc_buffer_current; -+ size_t aligned = roundup (current, align); -+ size_t new_current = aligned + size; -+ if (aligned >= current /* No overflow in align step. */ -+ && new_current >= size /* No overflow in size computation. */ -+ && new_current <= buf->__alloc_buffer_end) /* Room in buffer. */ -+ { -+ buf->__alloc_buffer_current = new_current; -+ return (void *) aligned; -+ } -+ else -+ { -+ alloc_buffer_mark_failed (buf); -+ return NULL; -+ } -+} -+ -+/* Obtain a TYPE * pointer to an object in BUF of TYPE. Consume these -+ bytes from the buffer. Return NULL and mark the buffer as failed -+ if if there is not enough room in the buffer, or if the buffer has -+ failed before. */ -+#define alloc_buffer_alloc(buf, type) \ -+ ((type *) __alloc_buffer_alloc \ -+ (buf, __alloc_buffer_assert_size (sizeof (type)), \ -+ __alloc_buffer_assert_align (__alignof__ (type)))) -+ -+/* Internal function. Obtain a pointer to an object which is -+ subsequently added. */ -+static inline const __attribute__ ((nonnull (1))) void * -+__alloc_buffer_next (struct alloc_buffer *buf, size_t align) -+{ -+ if (align == 1) -+ return (const void *) buf->__alloc_buffer_current; -+ -+ size_t current = buf->__alloc_buffer_current; -+ size_t aligned = roundup (current, align); -+ if (aligned >= current /* No overflow in align step. */ -+ && aligned <= buf->__alloc_buffer_end) /* Room in buffer. */ -+ { -+ buf->__alloc_buffer_current = aligned; -+ return (const void *) aligned; -+ } -+ else -+ { -+ alloc_buffer_mark_failed (buf); -+ return NULL; -+ } -+} -+ -+/* Like alloc_buffer_alloc, but do not advance the pointer beyond the -+ object (so a subseqent call to alloc_buffer_next or -+ alloc_buffer_alloc returns the same pointer). Note that the buffer -+ is still aligned according to the requirements of TYPE. The effect -+ of this function is similar to allocating a zero-length array from -+ the buffer. */ -+#define alloc_buffer_next(buf, type) \ -+ ((const type *) __alloc_buffer_next \ -+ (buf, __alloc_buffer_assert_align (__alignof__ (type)))) -+ -+/* Internal function. Allocate an array. */ -+void * __libc_alloc_buffer_alloc_array (struct alloc_buffer *buf, -+ size_t size, size_t align, -+ size_t count) -+ __attribute__ ((nonnull (1))); -+ -+/* Obtain a TYPE * pointer to an array of COUNT objects in BUF of -+ TYPE. Consume these bytes from the buffer. Return NULL and mark -+ the buffer as failed if if there is not enough room in the buffer, -+ or if the buffer has failed before. (Zero-length allocations from -+ an empty buffer which has not yet failed succeed.) */ -+#define alloc_buffer_alloc_array(buf, type, count) \ -+ ((type *) __libc_alloc_buffer_alloc_array \ -+ (buf, __alloc_buffer_assert_size (sizeof (type)), \ -+ __alloc_buffer_assert_align (__alignof__ (type)), \ -+ count)) -+ -+/* Internal function. See alloc_buffer_copy_bytes below. */ -+struct alloc_buffer __libc_alloc_buffer_copy_bytes (struct alloc_buffer, -+ const void *, size_t) -+ __attribute__ ((nonnull (2))); -+ -+/* Copy SIZE bytes starting at SRC into the buffer. If there is not -+ enough room in the buffer, the buffer is marked as failed. No -+ alignment of the buffer is performed. */ -+static inline __attribute__ ((nonnull (1, 2))) void -+alloc_buffer_copy_bytes (struct alloc_buffer *buf, const void *src, size_t size) -+{ -+ *buf = __libc_alloc_buffer_copy_bytes (*buf, src, size); -+} -+ -+/* Internal function. See alloc_buffer_copy_string below. */ -+struct alloc_buffer __libc_alloc_buffer_copy_string (struct alloc_buffer, -+ const char *) -+ __attribute__ ((nonnull (2))); -+ -+/* Copy the string at SRC into the buffer, including its null -+ terminator. If there is not enough room in the buffer, the buffer -+ is marked as failed. Return a pointer to the string. */ -+static inline __attribute__ ((nonnull (1, 2))) char * -+alloc_buffer_copy_string (struct alloc_buffer *buf, const char *src) -+{ -+ char *result = (char *) buf->__alloc_buffer_current; -+ *buf = __libc_alloc_buffer_copy_string (*buf, src); -+ if (alloc_buffer_has_failed (buf)) -+ result = NULL; -+ return result; -+} -+ -+#ifndef _ISOMAC -+libc_hidden_proto (__libc_alloc_buffer_alloc_array) -+libc_hidden_proto (__libc_alloc_buffer_allocate) -+libc_hidden_proto (__libc_alloc_buffer_copy_bytes) -+libc_hidden_proto (__libc_alloc_buffer_copy_string) -+libc_hidden_proto (__libc_alloc_buffer_create_failure) -+#endif -+ -+#endif /* _ALLOC_BUFFER_H */ -diff --git a/malloc/Makefile b/malloc/Makefile -index d38767deeeeca3f8..49038673a3cf91bd 100644 ---- a/malloc/Makefile -+++ b/malloc/Makefile -@@ -33,6 +33,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ - tst-mallocfork2 \ - tst-interpose-nothread \ - tst-interpose-thread \ -+ tst-alloc_buffer \ - - tests-static := \ - tst-interpose-static-nothread \ -@@ -61,6 +62,11 @@ routines = malloc morecore mcheck mtrace obstack \ - dynarray_finalize \ - dynarray_resize \ - dynarray_resize_clear \ -+ alloc_buffer_alloc_array \ -+ alloc_buffer_allocate \ -+ alloc_buffer_copy_bytes \ -+ alloc_buffer_copy_string \ -+ alloc_buffer_create_failure \ - - install-lib := libmcheck.a - non-lib.a := libmcheck.a -diff --git a/malloc/Versions b/malloc/Versions -index 16f9dab418a4e3f6..0b7b690bbbdd1c2c 100644 ---- a/malloc/Versions -+++ b/malloc/Versions -@@ -79,5 +79,12 @@ libc { - __libc_dynarray_finalize; - __libc_dynarray_resize; - __libc_dynarray_resize_clear; -+ -+ # struct alloc_buffer support -+ __libc_alloc_buffer_alloc_array; -+ __libc_alloc_buffer_allocate; -+ __libc_alloc_buffer_copy_bytes; -+ __libc_alloc_buffer_copy_string; -+ __libc_alloc_buffer_create_failure; - } - } -diff --git a/malloc/alloc_buffer_alloc_array.c b/malloc/alloc_buffer_alloc_array.c -new file mode 100644 -index 0000000000000000..68e14da8dd4e545c ---- /dev/null -+++ b/malloc/alloc_buffer_alloc_array.c -@@ -0,0 +1,47 @@ -+/* Array allocation from a fixed-size buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+ -+void * -+__libc_alloc_buffer_alloc_array (struct alloc_buffer *buf, size_t element_size, -+ size_t align, size_t count) -+{ -+ size_t current = buf->__alloc_buffer_current; -+ /* The caller asserts that align is a power of two. */ -+ size_t aligned = ALIGN_UP (current, align); -+ size_t size; -+ bool overflow = check_mul_overflow_size_t (element_size, count, &size); -+ size_t new_current = aligned + size; -+ if (!overflow /* Multiplication did not overflow. */ -+ && aligned >= current /* No overflow in align step. */ -+ && new_current >= size /* No overflow in size computation. */ -+ && new_current <= buf->__alloc_buffer_end) /* Room in buffer. */ -+ { -+ buf->__alloc_buffer_current = new_current; -+ return (void *) aligned; -+ } -+ else -+ { -+ alloc_buffer_mark_failed (buf); -+ return NULL; -+ } -+} -+libc_hidden_def (__libc_alloc_buffer_alloc_array) -diff --git a/malloc/alloc_buffer_allocate.c b/malloc/alloc_buffer_allocate.c -new file mode 100644 -index 0000000000000000..cbde72b842f0b5d1 ---- /dev/null -+++ b/malloc/alloc_buffer_allocate.c -@@ -0,0 +1,36 @@ -+/* Allocate a fixed-size allocation buffer using malloc. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+#include -+ -+struct alloc_buffer -+__libc_alloc_buffer_allocate (size_t size, void **pptr) -+{ -+ *pptr = malloc (size); -+ if (*pptr == NULL) -+ return (struct alloc_buffer) -+ { -+ .__alloc_buffer_current = __ALLOC_BUFFER_INVALID_POINTER, -+ .__alloc_buffer_end = __ALLOC_BUFFER_INVALID_POINTER -+ }; -+ else -+ return alloc_buffer_create (*pptr, size); -+} -+libc_hidden_def (__libc_alloc_buffer_allocate) -diff --git a/malloc/alloc_buffer_copy_bytes.c b/malloc/alloc_buffer_copy_bytes.c -new file mode 100644 -index 0000000000000000..66196f1520c6fc84 ---- /dev/null -+++ b/malloc/alloc_buffer_copy_bytes.c -@@ -0,0 +1,34 @@ -+/* Copy an array of bytes into the buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+#include -+ -+/* This function works on a copy of the buffer object, so that it can -+ remain non-addressable in the caller. */ -+struct alloc_buffer -+__libc_alloc_buffer_copy_bytes (struct alloc_buffer buf, -+ const void *src, size_t len) -+{ -+ void *ptr = alloc_buffer_alloc_bytes (&buf, len); -+ if (ptr != NULL) -+ memcpy (ptr, src, len); -+ return buf; -+} -+libc_hidden_def (__libc_alloc_buffer_copy_bytes) -diff --git a/malloc/alloc_buffer_copy_string.c b/malloc/alloc_buffer_copy_string.c -new file mode 100644 -index 0000000000000000..77c0023d510b43be ---- /dev/null -+++ b/malloc/alloc_buffer_copy_string.c -@@ -0,0 +1,30 @@ -+/* Copy a string into the allocation buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+#include -+ -+/* This function works on a copy of the buffer object, so that it can -+ remain non-addressable in the caller. */ -+struct alloc_buffer -+__libc_alloc_buffer_copy_string (struct alloc_buffer buf, const char *src) -+{ -+ return __libc_alloc_buffer_copy_bytes (buf, src, strlen (src) + 1); -+} -+libc_hidden_def (__libc_alloc_buffer_copy_string) -diff --git a/malloc/alloc_buffer_create_failure.c b/malloc/alloc_buffer_create_failure.c -new file mode 100644 -index 0000000000000000..5ffba22f7b1e0dc5 ---- /dev/null -+++ b/malloc/alloc_buffer_create_failure.c -@@ -0,0 +1,31 @@ -+/* Terminate the process as the result of an invalid allocation buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+ -+void -+__libc_alloc_buffer_create_failure (void *start, size_t size) -+{ -+ char buf[200]; -+ __snprintf (buf, sizeof (buf), "Fatal glibc error: " -+ "invalid allocation buffer of size %zu\n", -+ size); -+ __libc_fatal (buf); -+} -+libc_hidden_def (__libc_alloc_buffer_create_failure) -diff --git a/malloc/tst-alloc_buffer.c b/malloc/tst-alloc_buffer.c -new file mode 100644 -index 0000000000000000..1c143999c70180f7 ---- /dev/null -+++ b/malloc/tst-alloc_buffer.c -@@ -0,0 +1,665 @@ -+/* Tests for struct alloc_buffer. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Return true if PTR is sufficiently aligned for TYPE. */ -+#define IS_ALIGNED(ptr, type) \ -+ ((((uintptr_t) ptr) & (__alloc_buffer_assert_align (__alignof (type)) - 1)) \ -+ == 0) -+ -+/* Structure with non-power-of-two size. */ -+struct twelve -+{ -+ uint32_t buffer[3] __attribute__ ((aligned (4))); -+}; -+_Static_assert (sizeof (struct twelve) == 12, "struct twelve"); -+_Static_assert (__alignof__ (struct twelve) == 4, "struct twelve"); -+ -+/* Check for success obtaining empty arrays. Does not assume the -+ buffer is empty. */ -+static void -+test_empty_array (struct alloc_buffer refbuf) -+{ -+ bool refbuf_failed = alloc_buffer_has_failed (&refbuf); -+ if (test_verbose) -+ printf ("info: %s: current=0x%llx end=0x%llx refbuf_failed=%d\n", -+ __func__, (unsigned long long) refbuf.__alloc_buffer_current, -+ (unsigned long long) refbuf.__alloc_buffer_end, refbuf_failed); -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY ((alloc_buffer_alloc_bytes (&buf, 0) == NULL) -+ == refbuf_failed); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf) == refbuf_failed); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY ((alloc_buffer_alloc_array (&buf, char, 0) == NULL) -+ == refbuf_failed); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf) == refbuf_failed); -+ } -+ /* The following tests can fail due to the need for aligning the -+ returned pointer. */ -+ { -+ struct alloc_buffer buf = refbuf; -+ bool expect_failure = refbuf_failed -+ || !IS_ALIGNED (alloc_buffer_next (&buf, void), double); -+ double *ptr = alloc_buffer_alloc_array (&buf, double, 0); -+ TEST_VERIFY (IS_ALIGNED (ptr, double)); -+ TEST_VERIFY ((ptr == NULL) == expect_failure); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf) == expect_failure); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ bool expect_failure = refbuf_failed -+ || !IS_ALIGNED (alloc_buffer_next (&buf, void), struct twelve); -+ struct twelve *ptr = alloc_buffer_alloc_array (&buf, struct twelve, 0); -+ TEST_VERIFY (IS_ALIGNED (ptr, struct twelve)); -+ TEST_VERIFY ((ptr == NULL) == expect_failure); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf) == expect_failure); -+ } -+} -+ -+/* Test allocation of impossibly large arrays. */ -+static void -+test_impossible_array (struct alloc_buffer refbuf) -+{ -+ if (test_verbose) -+ printf ("info: %s: current=0x%llx end=0x%llx\n", -+ __func__, (unsigned long long) refbuf.__alloc_buffer_current, -+ (unsigned long long) refbuf.__alloc_buffer_end); -+ static const size_t counts[] = -+ { SIZE_MAX, SIZE_MAX - 1, SIZE_MAX - 2, SIZE_MAX - 3, SIZE_MAX - 4, -+ SIZE_MAX / 2, SIZE_MAX / 2 + 1, SIZE_MAX / 2 - 1, 0}; -+ -+ for (int i = 0; counts[i] != 0; ++i) -+ { -+ size_t count = counts[i]; -+ if (test_verbose) -+ printf ("info: %s: count=%zu\n", __func__, count); -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_bytes (&buf, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, short, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, double, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, struct twelve, count) -+ == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ } -+} -+ -+/* Check for failure to obtain anything from a failed buffer. */ -+static void -+test_after_failure (struct alloc_buffer refbuf) -+{ -+ if (test_verbose) -+ printf ("info: %s: current=0x%llx end=0x%llx\n", -+ __func__, (unsigned long long) refbuf.__alloc_buffer_current, -+ (unsigned long long) refbuf.__alloc_buffer_end); -+ TEST_VERIFY (alloc_buffer_has_failed (&refbuf)); -+ { -+ struct alloc_buffer buf = refbuf; -+ alloc_buffer_add_byte (&buf, 17); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, char) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, double) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, struct twelve) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ -+ test_impossible_array (refbuf); -+ for (int count = 0; count <= 4; ++count) -+ { -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_bytes (&buf, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, double, count) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, struct twelve, count) -+ == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ } -+} -+ -+static void -+test_empty (struct alloc_buffer refbuf) -+{ -+ TEST_VERIFY (alloc_buffer_size (&refbuf) == 0); -+ if (alloc_buffer_next (&refbuf, void) != NULL) -+ TEST_VERIFY (!alloc_buffer_has_failed (&refbuf)); -+ test_empty_array (refbuf); -+ test_impossible_array (refbuf); -+ -+ /* Failure to obtain non-empty objects. */ -+ { -+ struct alloc_buffer buf = refbuf; -+ alloc_buffer_add_byte (&buf, 17); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, char) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, double) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, struct twelve) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char, 1) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, double, 1) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, struct twelve, 1) == NULL); -+ test_after_failure (buf); -+ } -+} -+ -+static void -+test_size_1 (struct alloc_buffer refbuf) -+{ -+ TEST_VERIFY (!alloc_buffer_has_failed (&refbuf)); -+ TEST_VERIFY (alloc_buffer_size (&refbuf) == 1); -+ test_empty_array (refbuf); -+ test_impossible_array (refbuf); -+ -+ /* Success adding a single byte. */ -+ { -+ struct alloc_buffer buf = refbuf; -+ alloc_buffer_add_byte (&buf, 17); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "\x11", 1) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ signed char *ptr = alloc_buffer_alloc (&buf, signed char); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = 126; -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "\176", 1) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ char *ptr = alloc_buffer_alloc_array (&buf, char, 1); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = (char) 253; -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "\xfd", 1) == 0); -+ -+ /* Failure with larger objects. */ -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, short) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, double) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, struct twelve) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, short, 1) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, double, 1) == NULL); -+ test_after_failure (buf); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, struct twelve, 1) == NULL); -+ test_after_failure (buf); -+ } -+} -+ -+static void -+test_size_2 (struct alloc_buffer refbuf) -+{ -+ TEST_VERIFY (!alloc_buffer_has_failed (&refbuf)); -+ TEST_VERIFY (alloc_buffer_size (&refbuf) == 2); -+ TEST_VERIFY (IS_ALIGNED (alloc_buffer_next (&refbuf, void), short)); -+ test_empty_array (refbuf); -+ test_impossible_array (refbuf); -+ -+ /* Success adding two bytes. */ -+ { -+ struct alloc_buffer buf = refbuf; -+ alloc_buffer_add_byte (&buf, '@'); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ test_size_1 (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "@\xfd", 2) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ signed char *ptr = alloc_buffer_alloc (&buf, signed char); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = 'A'; -+ test_size_1 (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "A\xfd", 2) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ char *ptr = alloc_buffer_alloc_array (&buf, char, 1); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = 'B'; -+ test_size_1 (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "B\xfd", 2) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ unsigned short *ptr = alloc_buffer_alloc (&buf, unsigned short); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, unsigned short)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = htons (0x12f4); -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "\x12\xf4", 2) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ unsigned short *ptr = alloc_buffer_alloc_array (&buf, unsigned short, 1); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, unsigned short)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ *ptr = htons (0x13f5); -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "\x13\xf5", 2) == 0); -+ { -+ struct alloc_buffer buf = refbuf; -+ char *ptr = alloc_buffer_alloc_array (&buf, char, 2); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ memcpy (ptr, "12", 2); -+ test_empty (buf); -+ } -+ TEST_VERIFY (memcmp (alloc_buffer_next (&refbuf, void), "12", 2) == 0); -+} -+ -+static void -+test_misaligned (char pad) -+{ -+ enum { SIZE = 23 }; -+ char *backing = xmalloc (SIZE + 2); -+ backing[0] = ~pad; -+ backing[SIZE + 1] = pad; -+ struct alloc_buffer refbuf = alloc_buffer_create (backing + 1, SIZE); -+ -+ { -+ struct alloc_buffer buf = refbuf; -+ short *ptr = alloc_buffer_alloc_array (&buf, short, SIZE / sizeof (short)); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, short)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ for (int i = 0; i < SIZE / sizeof (short); ++i) -+ ptr[i] = htons (0xff01 + i); -+ TEST_VERIFY (memcmp (ptr, -+ "\xff\x01\xff\x02\xff\x03\xff\x04" -+ "\xff\x05\xff\x06\xff\x07\xff\x08" -+ "\xff\x09\xff\x0a\xff\x0b", 22) == 0); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ uint32_t *ptr = alloc_buffer_alloc_array -+ (&buf, uint32_t, SIZE / sizeof (uint32_t)); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, uint32_t)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ for (int i = 0; i < SIZE / sizeof (uint32_t); ++i) -+ ptr[i] = htonl (0xf1e2d301 + i); -+ TEST_VERIFY (memcmp (ptr, -+ "\xf1\xe2\xd3\x01\xf1\xe2\xd3\x02" -+ "\xf1\xe2\xd3\x03\xf1\xe2\xd3\x04" -+ "\xf1\xe2\xd3\x05", 20) == 0); -+ } -+ { -+ struct alloc_buffer buf = refbuf; -+ struct twelve *ptr = alloc_buffer_alloc (&buf, struct twelve); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, struct twelve)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ ptr->buffer[0] = htonl (0x11223344); -+ ptr->buffer[1] = htonl (0x55667788); -+ ptr->buffer[2] = htonl (0x99aabbcc); -+ TEST_VERIFY (memcmp (ptr, -+ "\x11\x22\x33\x44" -+ "\x55\x66\x77\x88" -+ "\x99\xaa\xbb\xcc", 12) == 0); -+ } -+ { -+ static const double nums[] = { 1, 2 }; -+ struct alloc_buffer buf = refbuf; -+ double *ptr = alloc_buffer_alloc_array (&buf, double, 2); -+ TEST_VERIFY_EXIT (ptr != NULL); -+ TEST_VERIFY (IS_ALIGNED (ptr, double)); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ ptr[0] = nums[0]; -+ ptr[1] = nums[1]; -+ TEST_VERIFY (memcmp (ptr, nums, sizeof (nums)) == 0); -+ } -+ -+ /* Verify that padding was not overwritten. */ -+ TEST_VERIFY (backing[0] == ~pad); -+ TEST_VERIFY (backing[SIZE + 1] == pad); -+ free (backing); -+} -+ -+/* Check that overflow during alignment is handled properly. */ -+static void -+test_large_misaligned (void) -+{ -+ uintptr_t minus1 = -1; -+ uintptr_t start = minus1 & ~0xfe; -+ struct alloc_buffer refbuf = alloc_buffer_create ((void *) start, 16); -+ TEST_VERIFY (!alloc_buffer_has_failed (&refbuf)); -+ -+ struct __attribute__ ((aligned (256))) align256 -+ { -+ int dymmy; -+ }; -+ -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc (&buf, struct align256) == NULL); -+ test_after_failure (buf); -+ } -+ for (int count = 0; count < 3; ++count) -+ { -+ struct alloc_buffer buf = refbuf; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, struct align256, count) -+ == NULL); -+ test_after_failure (buf); -+ } -+} -+ -+/* Check behavior of large allocations. */ -+static void -+test_large (void) -+{ -+ { -+ /* Allocation which wraps around. */ -+ struct alloc_buffer buf = { 1, SIZE_MAX }; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char, SIZE_MAX) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ -+ { -+ /* Successful very large allocation. */ -+ struct alloc_buffer buf = { 1, SIZE_MAX }; -+ uintptr_t val = (uintptr_t) alloc_buffer_alloc_array -+ (&buf, char, SIZE_MAX - 1); -+ TEST_VERIFY (val == 1); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ test_empty (buf); -+ } -+ -+ { -+ typedef char __attribute__ ((aligned (2))) char2; -+ -+ /* Overflow in array size computation. */ -+ struct alloc_buffer buf = { 1, SIZE_MAX }; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char2, SIZE_MAX - 1) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ -+ /* Successful allocation after alignment. */ -+ buf = (struct alloc_buffer) { 1, SIZE_MAX }; -+ uintptr_t val = (uintptr_t) alloc_buffer_alloc_array -+ (&buf, char2, SIZE_MAX - 2); -+ TEST_VERIFY (val == 2); -+ test_empty (buf); -+ -+ /* Alignment behavior near the top of the address space. */ -+ buf = (struct alloc_buffer) { SIZE_MAX, SIZE_MAX }; -+ TEST_VERIFY (alloc_buffer_next (&buf, char2) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ buf = (struct alloc_buffer) { SIZE_MAX, SIZE_MAX }; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, char2, 0) == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ } -+ -+ { -+ typedef short __attribute__ ((aligned (2))) short2; -+ -+ /* Test overflow in size computation. */ -+ struct alloc_buffer buf = { 1, SIZE_MAX }; -+ TEST_VERIFY (alloc_buffer_alloc_array (&buf, short2, SIZE_MAX / 2) -+ == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ -+ /* A slightly smaller array fits within the allocation. */ -+ buf = (struct alloc_buffer) { 2, SIZE_MAX - 1 }; -+ uintptr_t val = (uintptr_t) alloc_buffer_alloc_array -+ (&buf, short2, SIZE_MAX / 2 - 1); -+ TEST_VERIFY (val == 2); -+ test_empty (buf); -+ } -+} -+ -+static void -+test_copy_bytes (void) -+{ -+ char backing[4]; -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ alloc_buffer_copy_bytes (&buf, "1", 1); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 3); -+ TEST_VERIFY (memcmp (backing, "1@@@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ alloc_buffer_copy_bytes (&buf, "12", 3); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 1); -+ TEST_VERIFY (memcmp (backing, "12\0@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ alloc_buffer_copy_bytes (&buf, "1234", 4); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 0); -+ TEST_VERIFY (memcmp (backing, "1234", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ alloc_buffer_copy_bytes (&buf, "1234", 5); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (memcmp (backing, "@@@@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ alloc_buffer_copy_bytes (&buf, "1234", -1); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (memcmp (backing, "@@@@", 4) == 0); -+ } -+} -+ -+static void -+test_copy_string (void) -+{ -+ char backing[4]; -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ const char *p = alloc_buffer_copy_string (&buf, ""); -+ TEST_VERIFY (p == backing); -+ TEST_VERIFY (strcmp (p, "") == 0); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 3); -+ TEST_VERIFY (memcmp (backing, "\0@@@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ const char *p = alloc_buffer_copy_string (&buf, "1"); -+ TEST_VERIFY (p == backing); -+ TEST_VERIFY (strcmp (p, "1") == 0); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 2); -+ TEST_VERIFY (memcmp (backing, "1\0@@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ const char *p = alloc_buffer_copy_string (&buf, "12"); -+ TEST_VERIFY (p == backing); -+ TEST_VERIFY (strcmp (p, "12") == 0); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 1); -+ TEST_VERIFY (memcmp (backing, "12\0@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ const char *p = alloc_buffer_copy_string (&buf, "123"); -+ TEST_VERIFY (p == backing); -+ TEST_VERIFY (strcmp (p, "123") == 0); -+ TEST_VERIFY (!alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (alloc_buffer_size (&buf) == 0); -+ TEST_VERIFY (memcmp (backing, "123", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ TEST_VERIFY (alloc_buffer_copy_string (&buf, "1234") == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (memcmp (backing, "@@@@", 4) == 0); -+ } -+ { -+ memset (backing, '@', sizeof (backing)); -+ struct alloc_buffer buf = alloc_buffer_create (backing, sizeof (backing)); -+ TEST_VERIFY (alloc_buffer_copy_string (&buf, "12345") == NULL); -+ TEST_VERIFY (alloc_buffer_has_failed (&buf)); -+ TEST_VERIFY (memcmp (backing, "@@@@", 4) == 0); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ test_empty (alloc_buffer_create (NULL, 0)); -+ test_empty (alloc_buffer_create ((char *) "", 0)); -+ test_empty (alloc_buffer_create ((void *) 1, 0)); -+ -+ { -+ void *ptr = (void *) ""; /* Cannot be freed. */ -+ struct alloc_buffer buf = alloc_buffer_allocate (1, &ptr); -+ test_size_1 (buf); -+ free (ptr); /* Should have been overwritten. */ -+ } -+ -+ { -+ void *ptr= (void *) ""; /* Cannot be freed. */ -+ struct alloc_buffer buf = alloc_buffer_allocate (2, &ptr); -+ test_size_2 (buf); -+ free (ptr); /* Should have been overwritten. */ -+ } -+ -+ test_misaligned (0); -+ test_misaligned (0xc7); -+ test_misaligned (0xff); -+ -+ test_large_misaligned (); -+ test_large (); -+ test_copy_bytes (); -+ test_copy_string (); -+ -+ return 0; -+} -+ -+#include diff --git a/glibc-dynarray-1.patch b/glibc-dynarray-1.patch deleted file mode 100644 index c0a097e..0000000 --- a/glibc-dynarray-1.patch +++ /dev/null @@ -1,37 +0,0 @@ -Add the check_mul_overflow_size_t function from this upstream commit: - -commit 2e0bbbfbf95fc9e22692e93658a6fbdd2d4554da -Author: Dennis Wölfing -Date: Tue May 30 18:26:19 2017 -0300 - - Add reallocarray function - -diff --git a/malloc/malloc-internal.h b/malloc/malloc-internal.h -index de6103d7e1e06799..dbd801a58eeceabf 100644 ---- a/malloc/malloc-internal.h -+++ b/malloc/malloc-internal.h -@@ -81,5 +81,24 @@ void __malloc_fork_unlock_parent (void) internal_function attribute_hidden; - /* Called in the child process after a fork. */ - void __malloc_fork_unlock_child (void) internal_function attribute_hidden; - -+/* Set *RESULT to LEFT * RIGHT. Return true if the multiplication -+ overflowed. */ -+static inline bool -+check_mul_overflow_size_t (size_t left, size_t right, size_t *result) -+{ -+#if __GNUC__ >= 5 -+ return __builtin_mul_overflow (left, right, result); -+#else -+ /* size_t is unsigned so the behavior on overflow is defined. */ -+ *result = left * right; -+ size_t half_size_t = ((size_t) 1) << (8 * sizeof (size_t) / 2); -+ if (__glibc_unlikely ((left | right) >= half_size_t)) -+ { -+ if (__glibc_unlikely (right != 0 && *result / right != left)) -+ return true; -+ } -+ return false; -+#endif -+} - - #endif /* _MALLOC_INTERNAL_H */ diff --git a/glibc-dynarray-2.patch b/glibc-dynarray-2.patch deleted file mode 100644 index 1438a3d..0000000 --- a/glibc-dynarray-2.patch +++ /dev/null @@ -1,2219 +0,0 @@ -commit 91b6eb1140eda6bab324821ee3785e5d0ca155b8 -Author: Florian Weimer -Date: Fri Jun 2 11:59:28 2017 +0200 - - Add internal facility for dynamic array handling - - This is intended as a type-safe alternative to obstacks and - hand-written realloc constructs. The implementation avoids - writing function pointers to the heap. - -diff --git a/malloc/Makefile b/malloc/Makefile -index e93b83b57d9cdf30..d38767deeeeca3f8 100644 ---- a/malloc/Makefile -+++ b/malloc/Makefile -@@ -39,17 +39,28 @@ tests-static := \ - tst-interpose-static-thread \ - tst-malloc-usable-static \ - -+# The dynarray framework is only available inside glibc. -+tests += \ -+ tst-dynarray \ -+ tst-dynarray-fail \ -+ tst-dynarray-at-fail \ -+ - ifneq (no,$(have-tunables)) - tests += tst-malloc-usable-tunables - tests-static += tst-malloc-usable-static-tunables - endif - - tests += $(tests-static) --test-srcs = tst-mtrace -+test-srcs = tst-mtrace tst-dynarray tst-dynarray-fail - - routines = malloc morecore mcheck mtrace obstack \ - scratch_buffer_grow scratch_buffer_grow_preserve \ -- scratch_buffer_set_array_size -+ scratch_buffer_set_array_size \ -+ dynarray_at_failure \ -+ dynarray_emplace_enlarge \ -+ dynarray_finalize \ -+ dynarray_resize \ -+ dynarray_resize_clear \ - - install-lib := libmcheck.a - non-lib.a := libmcheck.a -@@ -135,6 +146,8 @@ ifeq ($(run-built-tests),yes) - ifeq (yes,$(build-shared)) - ifneq ($(PERL),no) - tests-special += $(objpfx)tst-mtrace.out -+tests-special += $(objpfx)tst-dynarray-mem.out -+tests-special += $(objpfx)tst-dynarray-fail-mem.out - endif - endif - endif -@@ -206,3 +219,13 @@ $(objpfx)tst-interpose-thread: \ - $(objpfx)tst-interpose-static-nothread: $(objpfx)tst-interpose-aux-nothread.o - $(objpfx)tst-interpose-static-thread: \ - $(objpfx)tst-interpose-aux-thread.o $(static-thread-library) -+ -+tst-dynarray-ENV = MALLOC_TRACE=$(objpfx)tst-dynarray.mtrace -+$(objpfx)tst-dynarray-mem.out: $(objpfx)tst-dynarray.out -+ $(common-objpfx)malloc/mtrace $(objpfx)tst-dynarray.mtrace > $@; \ -+ $(evaluate-test) -+ -+tst-dynarray-fail-ENV = MALLOC_TRACE=$(objpfx)tst-dynarray-fail.mtrace -+$(objpfx)tst-dynarray-fail-mem.out: $(objpfx)tst-dynarray-fail.out -+ $(common-objpfx)malloc/mtrace $(objpfx)tst-dynarray-fail.mtrace > $@; \ -+ $(evaluate-test) -diff --git a/malloc/Versions b/malloc/Versions -index f3c3d8a0934bdcd3..16f9dab418a4e3f6 100644 ---- a/malloc/Versions -+++ b/malloc/Versions -@@ -72,5 +72,12 @@ libc { - __libc_scratch_buffer_grow; - __libc_scratch_buffer_grow_preserve; - __libc_scratch_buffer_set_array_size; -+ -+ # dynarray support -+ __libc_dynarray_at_failure; -+ __libc_dynarray_emplace_enlarge; -+ __libc_dynarray_finalize; -+ __libc_dynarray_resize; -+ __libc_dynarray_resize_clear; - } - } -diff --git a/malloc/dynarray-skeleton.c b/malloc/dynarray-skeleton.c -new file mode 100644 -index 0000000000000000..7a10e083f477dd7a ---- /dev/null -+++ b/malloc/dynarray-skeleton.c -@@ -0,0 +1,499 @@ -+/* Type-safe arrays which grow dynamically. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Pre-processor macros which act as parameters: -+ -+ DYNARRAY_STRUCT -+ The struct tag of dynamic array to be defined. -+ DYNARRAY_ELEMENT -+ The type name of the element type. Elements are copied -+ as if by memcpy, and can change address as the dynamic -+ array grows. -+ DYNARRAY_PREFIX -+ The prefix of the functions which are defined. -+ -+ The following parameters are optional: -+ -+ DYNARRAY_ELEMENT_FREE -+ DYNARRAY_ELEMENT_FREE (E) is evaluated to deallocate the -+ contents of elements. E is of type DYNARRAY_ELEMENT *. -+ DYNARRAY_ELEMENT_INIT -+ DYNARRAY_ELEMENT_INIT (E) is evaluated to initialize a new -+ element. E is of type DYNARRAY_ELEMENT *. -+ If DYNARRAY_ELEMENT_FREE but not DYNARRAY_ELEMENT_INIT is -+ defined, new elements are automatically zero-initialized. -+ Otherwise, new elements have undefined contents. -+ DYNARRAY_INITIAL_SIZE -+ The size of the statically allocated array (default: -+ at least 2, more elements if they fit into 128 bytes). -+ Must be a preprocessor constant. If DYNARRAY_INITIAL_SIZE is 0, -+ there is no statically allocated array at, and all non-empty -+ arrays are heap-allocated. -+ DYNARRAY_FINAL_TYPE -+ The name of the type which holds the final array. If not -+ defined, is PREFIX##finalize not provided. DYNARRAY_FINAL_TYPE -+ must be a struct type, with members of type DYNARRAY_ELEMENT and -+ size_t at the start (in this order). -+ -+ These macros are undefined after this header file has been -+ included. -+ -+ The following types are provided (their members are private to the -+ dynarray implementation): -+ -+ struct DYNARRAY_STRUCT -+ -+ The following functions are provided: -+ -+ void DYNARRAY_PREFIX##init (struct DYNARRAY_STRUCT *); -+ void DYNARRAY_PREFIX##free (struct DYNARRAY_STRUCT *); -+ bool DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *); -+ void DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *); -+ size_t DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *); -+ DYNARRAY_ELEMENT *DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *, size_t); -+ void DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *, DYNARRAY_ELEMENT); -+ DYNARRAY_ELEMENT *DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *); -+ bool DYNARRAY_PREFIX##resize (struct DYNARRAY_STRUCT *, size_t); -+ void DYNARRAY_PREFIX##remove_last (struct DYNARRAY_STRUCT *); -+ void DYNARRAY_PREFIX##clear (struct DYNARRAY_STRUCT *); -+ -+ The following functions are provided are provided if the -+ prerequisites are met: -+ -+ bool DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *, -+ DYNARRAY_FINAL_TYPE *); -+ (if DYNARRAY_FINAL_TYPE is defined) -+ DYNARRAY_ELEMENT *DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *, -+ size_t *); -+ (if DYNARRAY_FINAL_TYPE is not defined) -+*/ -+ -+#include -+ -+#include -+#include -+#include -+ -+#ifndef DYNARRAY_STRUCT -+# error "DYNARRAY_STRUCT must be defined" -+#endif -+ -+#ifndef DYNARRAY_ELEMENT -+# error "DYNARRAY_ELEMENT must be defined" -+#endif -+ -+#ifndef DYNARRAY_PREFIX -+# error "DYNARRAY_PREFIX must be defined" -+#endif -+ -+#ifdef DYNARRAY_INITIAL_SIZE -+# if DYNARRAY_INITIAL_SIZE < 0 -+# error "DYNARRAY_INITIAL_SIZE must be non-negative" -+# endif -+# if DYNARRAY_INITIAL_SIZE > 0 -+# define DYNARRAY_HAVE_SCRATCH 1 -+# else -+# define DYNARRAY_HAVE_SCRATCH 0 -+# endif -+#else -+/* Provide a reasonable default which limits the size of -+ DYNARRAY_STRUCT. */ -+# define DYNARRAY_INITIAL_SIZE \ -+ (sizeof (DYNARRAY_ELEMENT) > 64 ? 2 : 128 / sizeof (DYNARRAY_ELEMENT)) -+# define DYNARRAY_HAVE_SCRATCH 1 -+#endif -+ -+/* Public type definitions. */ -+ -+/* All fields of this struct are private to the implementation. */ -+struct DYNARRAY_STRUCT -+{ -+ union -+ { -+ struct dynarray_header dynarray_abstract; -+ struct -+ { -+ /* These fields must match struct dynarray_header. */ -+ size_t used; -+ size_t allocated; -+ DYNARRAY_ELEMENT *array; -+ } dynarray_header; -+ }; -+ -+#if DYNARRAY_HAVE_SCRATCH -+ /* Initial inline allocation. */ -+ DYNARRAY_ELEMENT scratch[DYNARRAY_INITIAL_SIZE]; -+#endif -+}; -+ -+/* Internal use only: Helper macros. */ -+ -+/* Ensure macro-expansion of DYNARRAY_PREFIX. */ -+#define DYNARRAY_CONCAT0(prefix, name) prefix##name -+#define DYNARRAY_CONCAT1(prefix, name) DYNARRAY_CONCAT0(prefix, name) -+#define DYNARRAY_NAME(name) DYNARRAY_CONCAT1(DYNARRAY_PREFIX, name) -+ -+/* Address of the scratch buffer if any. */ -+#if DYNARRAY_HAVE_SCRATCH -+# define DYNARRAY_SCRATCH(list) (list)->scratch -+#else -+# define DYNARRAY_SCRATCH(list) NULL -+#endif -+ -+/* Internal use only: Helper functions. */ -+ -+/* Internal function. Call DYNARRAY_ELEMENT_FREE with the array -+ elements. Name mangling needed due to the DYNARRAY_ELEMENT_FREE -+ macro expansion. */ -+static inline void -+DYNARRAY_NAME (free__elements__) (DYNARRAY_ELEMENT *__dynarray_array, -+ size_t __dynarray_used) -+{ -+#ifdef DYNARRAY_ELEMENT_FREE -+ for (size_t __dynarray_i = 0; __dynarray_i < __dynarray_used; ++__dynarray_i) -+ DYNARRAY_ELEMENT_FREE (&__dynarray_array[__dynarray_i]); -+#endif /* DYNARRAY_ELEMENT_FREE */ -+} -+ -+/* Internal function. Free the non-scratch array allocation. */ -+static inline void -+DYNARRAY_NAME (free__array__) (struct DYNARRAY_STRUCT *list) -+{ -+#if DYNARRAY_HAVE_SCRATCH -+ if (list->dynarray_header.array != list->scratch) -+ free (list->dynarray_header.array); -+#else -+ free (list->dynarray_header.array); -+#endif -+} -+ -+/* Public functions. */ -+ -+/* Initialize a dynamic array object. This must be called before any -+ use of the object. */ -+__attribute__ ((nonnull (1))) -+static void -+DYNARRAY_NAME (init) (struct DYNARRAY_STRUCT *list) -+{ -+ list->dynarray_header.used = 0; -+ list->dynarray_header.allocated = DYNARRAY_INITIAL_SIZE; -+ list->dynarray_header.array = DYNARRAY_SCRATCH (list); -+} -+ -+/* Deallocate the dynamic array and its elements. */ -+__attribute__ ((unused, nonnull (1))) -+static void -+DYNARRAY_NAME (free) (struct DYNARRAY_STRUCT *list) -+{ -+ DYNARRAY_NAME (free__elements__) -+ (list->dynarray_header.array, list->dynarray_header.used); -+ DYNARRAY_NAME (free__array__) (list); -+ DYNARRAY_NAME (init) (list); -+} -+ -+/* Return true if the dynamic array is in an error state. */ -+__attribute__ ((nonnull (1))) -+static inline bool -+DYNARRAY_NAME (has_failed) (const struct DYNARRAY_STRUCT *list) -+{ -+ return list->dynarray_header.allocated == __dynarray_error_marker (); -+} -+ -+/* Mark the dynamic array as failed. All elements are deallocated as -+ a side effect. */ -+__attribute__ ((nonnull (1))) -+static void -+DYNARRAY_NAME (mark_failed) (struct DYNARRAY_STRUCT *list) -+{ -+ DYNARRAY_NAME (free__elements__) -+ (list->dynarray_header.array, list->dynarray_header.used); -+ DYNARRAY_NAME (free__array__) (list); -+ list->dynarray_header.array = DYNARRAY_SCRATCH (list); -+ list->dynarray_header.used = 0; -+ list->dynarray_header.allocated = __dynarray_error_marker (); -+} -+ -+/* Return the number of elements which have been added to the dynamic -+ array. */ -+__attribute__ ((nonnull (1))) -+static inline size_t -+DYNARRAY_NAME (size) (const struct DYNARRAY_STRUCT *list) -+{ -+ return list->dynarray_header.used; -+} -+ -+/* Return a pointer to the array element at INDEX. Terminate the -+ process if INDEX is out of bounds. */ -+__attribute__ ((nonnull (1))) -+static inline DYNARRAY_ELEMENT * -+DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index) -+{ -+ if (__glibc_unlikely (index >= DYNARRAY_NAME (size) (list))) -+ __libc_dynarray_at_failure (DYNARRAY_NAME (size) (list), index); -+ return list->dynarray_header.array + index; -+} -+ -+/* Internal function. Slow path for the add function below. */ -+static void -+DYNARRAY_NAME (add__) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item) -+{ -+ if (__glibc_unlikely -+ (!__libc_dynarray_emplace_enlarge (&list->dynarray_abstract, -+ DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT)))) -+ { -+ DYNARRAY_NAME (mark_failed) (list); -+ return; -+ } -+ -+ /* Copy the new element and increase the array length. */ -+ list->dynarray_header.array[list->dynarray_header.used++] = item; -+} -+ -+/* Add ITEM at the end of the array, enlarging it by one element. -+ Mark *LIST as failed if the dynamic array allocation size cannot be -+ increased. */ -+__attribute__ ((unused, nonnull (1))) -+static inline void -+DYNARRAY_NAME (add) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item) -+{ -+ /* Do nothing in case of previous error. */ -+ if (DYNARRAY_NAME (has_failed) (list)) -+ return; -+ -+ /* Enlarge the array if necessary. */ -+ if (__glibc_unlikely (list->dynarray_header.used -+ == list->dynarray_header.allocated)) -+ { -+ DYNARRAY_NAME (add__) (list, item); -+ return; -+ } -+ -+ /* Copy the new element and increase the array length. */ -+ list->dynarray_header.array[list->dynarray_header.used++] = item; -+} -+ -+/* Internal function. Building block for the emplace functions below. -+ Assumes space for one more element in *LIST. */ -+static inline DYNARRAY_ELEMENT * -+DYNARRAY_NAME (emplace__tail__) (struct DYNARRAY_STRUCT *list) -+{ -+ DYNARRAY_ELEMENT *result -+ = &list->dynarray_header.array[list->dynarray_header.used]; -+ ++list->dynarray_header.used; -+#if defined (DYNARRAY_ELEMENT_INIT) -+ DYNARRAY_ELEMENT_INIT (result); -+#elif defined (DYNARRAY_ELEMENT_FREE) -+ memset (result, 0, sizeof (*result)); -+#endif -+ return result; -+} -+ -+/* Internal function. Slow path for the emplace function below. */ -+static DYNARRAY_ELEMENT * -+DYNARRAY_NAME (emplace__) (struct DYNARRAY_STRUCT *list) -+{ -+ if (__glibc_unlikely -+ (!__libc_dynarray_emplace_enlarge (&list->dynarray_abstract, -+ DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT)))) -+ { -+ DYNARRAY_NAME (mark_failed) (list); -+ return NULL; -+ } -+ return DYNARRAY_NAME (emplace__tail__) (list); -+} -+ -+/* Allocate a place for a new element in *LIST and return a pointer to -+ it. The pointer can be NULL if the dynamic array cannot be -+ enlarged due to a memory allocation failure. */ -+__attribute__ ((unused, warn_unused_result, nonnull (1))) -+static -+/* Avoid inlining with the larger initialization code. */ -+#if !(defined (DYNARRAY_ELEMENT_INIT) || defined (DYNARRAY_ELEMENT_FREE)) -+inline -+#endif -+DYNARRAY_ELEMENT * -+DYNARRAY_NAME (emplace) (struct DYNARRAY_STRUCT *list) -+{ -+ /* Do nothing in case of previous error. */ -+ if (DYNARRAY_NAME (has_failed) (list)) -+ return NULL; -+ -+ /* Enlarge the array if necessary. */ -+ if (__glibc_unlikely (list->dynarray_header.used -+ == list->dynarray_header.allocated)) -+ return (DYNARRAY_NAME (emplace__) (list)); -+ return DYNARRAY_NAME (emplace__tail__) (list); -+} -+ -+/* Change the size of *LIST to SIZE. If SIZE is larger than the -+ existing size, new elements are added (which can be initialized). -+ Otherwise, the list is truncated, and elements are freed. Return -+ false on memory allocation failure (and mark *LIST as failed). */ -+__attribute__ ((unused, nonnull (1))) -+static bool -+DYNARRAY_NAME (resize) (struct DYNARRAY_STRUCT *list, size_t size) -+{ -+ if (size > list->dynarray_header.used) -+ { -+ bool ok; -+#if defined (DYNARRAY_ELEMENT_INIT) -+ /* The new elements have to be initialized. */ -+ size_t old_size = list->dynarray_header.used; -+ ok = __libc_dynarray_resize (&list->dynarray_abstract, -+ size, DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT)); -+ if (ok) -+ for (size_t i = old_size; i < size; ++i) -+ { -+ DYNARRAY_ELEMENT_INIT (&list->dynarray_header.array[i]); -+ } -+#elif defined (DYNARRAY_ELEMENT_FREE) -+ /* Zero initialization is needed so that the elements can be -+ safely freed. */ -+ ok = __libc_dynarray_resize_clear -+ (&list->dynarray_abstract, size, -+ DYNARRAY_SCRATCH (list), sizeof (DYNARRAY_ELEMENT)); -+#else -+ ok = __libc_dynarray_resize (&list->dynarray_abstract, -+ size, DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT)); -+#endif -+ if (__glibc_unlikely (!ok)) -+ DYNARRAY_NAME (mark_failed) (list); -+ return ok; -+ } -+ else -+ { -+ /* The list has shrunk in size. Free the removed elements. */ -+ DYNARRAY_NAME (free__elements__) -+ (list->dynarray_header.array + size, -+ list->dynarray_header.used - size); -+ list->dynarray_header.used = size; -+ return true; -+ } -+} -+ -+/* Remove the last element of LIST if it is present. */ -+__attribute__ ((unused, nonnull (1))) -+static void -+DYNARRAY_NAME (remove_last) (struct DYNARRAY_STRUCT *list) -+{ -+ /* used > 0 implies that the array is the non-failed state. */ -+ if (list->dynarray_header.used > 0) -+ { -+ size_t new_length = list->dynarray_header.used - 1; -+#ifdef DYNARRAY_ELEMENT_FREE -+ DYNARRAY_ELEMENT_FREE (&list->dynarray_header.array[new_length]); -+#endif -+ list->dynarray_header.used = new_length; -+ } -+} -+ -+/* Remove all elements from the list. The elements are freed, but the -+ list itself is not. */ -+__attribute__ ((unused, nonnull (1))) -+static void -+DYNARRAY_NAME (clear) (struct DYNARRAY_STRUCT *list) -+{ -+ /* free__elements__ does nothing if the list is in the failed -+ state. */ -+ DYNARRAY_NAME (free__elements__) -+ (list->dynarray_header.array, list->dynarray_header.used); -+ list->dynarray_header.used = 0; -+} -+ -+#ifdef DYNARRAY_FINAL_TYPE -+/* Transfer the dynamic array to a permanent location at *RESULT. -+ Returns true on success on false on allocation failure. In either -+ case, *LIST is re-initialized and can be reused. A NULL pointer is -+ stored in *RESULT if LIST refers to an empty list. On success, the -+ pointer in *RESULT is heap-allocated and must be deallocated using -+ free. */ -+__attribute__ ((unused, warn_unused_result, nonnull (1, 2))) -+static bool -+DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, -+ DYNARRAY_FINAL_TYPE *result) -+{ -+ struct dynarray_finalize_result res; -+ if (__libc_dynarray_finalize (&list->dynarray_abstract, -+ DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT), &res)) -+ { -+ /* On success, the result owns all the data. */ -+ DYNARRAY_NAME (init) (list); -+ *result = (DYNARRAY_FINAL_TYPE) { res.array, res.length }; -+ return true; -+ } -+ else -+ { -+ /* On error, we need to free all data. */ -+ DYNARRAY_NAME (free) (list); -+ errno = ENOMEM; -+ return false; -+ } -+} -+#else /* !DYNARRAY_FINAL_TYPE */ -+/* Transfer the dynamic array to a heap-allocated array and return a -+ pointer to it. The pointer is NULL if memory allocation fails, or -+ if the array is empty, so this function should be used only for -+ arrays which are known not be empty (usually because they always -+ have a sentinel at the end). If LENGTHP is not NULL, the array -+ length is written to *LENGTHP. *LIST is re-initialized and can be -+ reused. */ -+__attribute__ ((unused, warn_unused_result, nonnull (1))) -+static DYNARRAY_ELEMENT * -+DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, size_t *lengthp) -+{ -+ struct dynarray_finalize_result res; -+ if (__libc_dynarray_finalize (&list->dynarray_abstract, -+ DYNARRAY_SCRATCH (list), -+ sizeof (DYNARRAY_ELEMENT), &res)) -+ { -+ /* On success, the result owns all the data. */ -+ DYNARRAY_NAME (init) (list); -+ if (lengthp != NULL) -+ *lengthp = res.length; -+ return res.array; -+ } -+ else -+ { -+ /* On error, we need to free all data. */ -+ DYNARRAY_NAME (free) (list); -+ errno = ENOMEM; -+ return NULL; -+ } -+} -+#endif /* !DYNARRAY_FINAL_TYPE */ -+ -+/* Undo macro definitions. */ -+ -+#undef DYNARRAY_CONCAT0 -+#undef DYNARRAY_CONCAT1 -+#undef DYNARRAY_NAME -+#undef DYNARRAY_SCRATCH -+#undef DYNARRAY_HAVE_SCRATCH -+ -+#undef DYNARRAY_STRUCT -+#undef DYNARRAY_ELEMENT -+#undef DYNARRAY_PREFIX -+#undef DYNARRAY_ELEMENT_FREE -+#undef DYNARRAY_ELEMENT_INIT -+#undef DYNARRAY_INITIAL_SIZE -+#undef DYNARRAY_FINAL_TYPE -diff --git a/malloc/dynarray.h b/malloc/dynarray.h -new file mode 100644 -index 0000000000000000..c73e08b6cfddf9e7 ---- /dev/null -+++ b/malloc/dynarray.h -@@ -0,0 +1,176 @@ -+/* Type-safe arrays which grow dynamically. Shared definitions. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* To use the dynarray facility, you need to include -+ and define the parameter macros -+ documented in that file. -+ -+ A minimal example which provides a growing list of integers can be -+ defined like this: -+ -+ struct int_array -+ { -+ // Pointer to result array followed by its length, -+ // as required by DYNARRAY_FINAL_TYPE. -+ int *array; -+ size_t length; -+ }; -+ -+ #define DYNARRAY_STRUCT dynarray_int -+ #define DYNARRAY_ELEMENT int -+ #define DYNARRAY_PREFIX dynarray_int_ -+ #define DYNARRAY_FINAL_TYPE struct int_array -+ #include -+ -+ To create a three-element array with elements 1, 2, 3, use this -+ code: -+ -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ for (int i = 1; i <= 3; ++i) -+ { -+ int *place = dynarray_int_emplace (&dyn); -+ assert (place != NULL); -+ *place = i; -+ } -+ struct int_array result; -+ bool ok = dynarray_int_finalize (&dyn, &result); -+ assert (ok); -+ assert (result.length == 3); -+ assert (result.array[0] == 1); -+ assert (result.array[1] == 2); -+ assert (result.array[2] == 3); -+ free (result.array); -+ -+ If the elements contain resources which must be freed, define -+ DYNARRAY_ELEMENT_FREE appropriately, like this: -+ -+ struct str_array -+ { -+ char **array; -+ size_t length; -+ }; -+ -+ #define DYNARRAY_STRUCT dynarray_str -+ #define DYNARRAY_ELEMENT char * -+ #define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr) -+ #define DYNARRAY_PREFIX dynarray_str_ -+ #define DYNARRAY_FINAL_TYPE struct str_array -+ #include -+ -+ Compared to scratch buffers, dynamic arrays have the following -+ features: -+ -+ - They have an element type, and are not just an untyped buffer of -+ bytes. -+ -+ - When growing, previously stored elements are preserved. (It is -+ expected that scratch_buffer_grow_preserve and -+ scratch_buffer_set_array_size eventually go away because all -+ current users are moved to dynamic arrays.) -+ -+ - Scratch buffers have a more aggressive growth policy because -+ growing them typically means a retry of an operation (across an -+ NSS service module boundary), which is expensive. -+ -+ - For the same reason, scratch buffers have a much larger initial -+ stack allocation. */ -+ -+#ifndef _DYNARRAY_H -+#define _DYNARRAY_H -+ -+#include -+#include -+#include -+ -+struct dynarray_header -+{ -+ size_t used; -+ size_t allocated; -+ void *array; -+}; -+ -+/* Marker used in the allocated member to indicate that an error was -+ encountered. */ -+static inline size_t -+__dynarray_error_marker (void) -+{ -+ return -1; -+} -+ -+/* Internal function. See the has_failed function in -+ dynarray-skeleton.c. */ -+static inline bool -+__dynarray_error (struct dynarray_header *list) -+{ -+ return list->allocated == __dynarray_error_marker (); -+} -+ -+/* Internal function. Enlarge the dynamically allocated area of the -+ array to make room for one more element. SCRATCH is a pointer to -+ the scratch area (which is not heap-allocated and must not be -+ freed). ELEMENT_SIZE is the size, in bytes, of one element. -+ Return false on failure, true on success. */ -+bool __libc_dynarray_emplace_enlarge (struct dynarray_header *, -+ void *scratch, size_t element_size); -+libc_hidden_proto (__libc_dynarray_emplace_enlarge) -+ -+/* Internal function. Enlarge the dynamically allocated area of the -+ array to make room for at least SIZE elements (which must be larger -+ than the existing used part of the dynamic array). SCRATCH is a -+ pointer to the scratch area (which is not heap-allocated and must -+ not be freed). ELEMENT_SIZE is the size, in bytes, of one element. -+ Return false on failure, true on success. */ -+bool __libc_dynarray_resize (struct dynarray_header *, size_t size, -+ void *scratch, size_t element_size); -+libc_hidden_proto (__libc_dynarray_resize) -+ -+/* Internal function. Like __libc_dynarray_resize, but clear the new -+ part of the dynamic array. */ -+bool __libc_dynarray_resize_clear (struct dynarray_header *, size_t size, -+ void *scratch, size_t element_size); -+libc_hidden_proto (__libc_dynarray_resize_clear) -+ -+/* Internal type. */ -+struct dynarray_finalize_result -+{ -+ void *array; -+ size_t length; -+}; -+ -+/* Internal function. Copy the dynamically-allocated area to an -+ explicitly-sized heap allocation. SCRATCH is a pointer to the -+ embedded scratch space. ELEMENT_SIZE is the size, in bytes, of the -+ element type. On success, true is returned, and pointer and length -+ are written to *RESULT. On failure, false is returned. The caller -+ has to take care of some of the memory management; this function is -+ expected to be called from dynarray-skeleton.c. */ -+bool __libc_dynarray_finalize (struct dynarray_header *list, void *scratch, -+ size_t element_size, -+ struct dynarray_finalize_result *result); -+libc_hidden_proto (__libc_dynarray_finalize) -+ -+ -+/* Internal function. Terminate the process after an index error. -+ SIZE is the number of elements of the dynamic array. INDEX is the -+ lookup index which triggered the failure. */ -+void __libc_dynarray_at_failure (size_t size, size_t index) -+ __attribute__ ((noreturn)); -+libc_hidden_proto (__libc_dynarray_at_failure) -+ -+#endif /* _DYNARRAY_H */ -diff --git a/malloc/dynarray_at_failure.c b/malloc/dynarray_at_failure.c -new file mode 100644 -index 0000000000000000..fcc06f030b035165 ---- /dev/null -+++ b/malloc/dynarray_at_failure.c -@@ -0,0 +1,31 @@ -+/* Report an dynamic array index out of bounds condition. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+ -+void -+__libc_dynarray_at_failure (size_t size, size_t index) -+{ -+ char buf[200]; -+ __snprintf (buf, sizeof (buf), "Fatal glibc error: " -+ "array index %zu not less than array length %zu\n", -+ index, size); -+ __libc_fatal (buf); -+} -+libc_hidden_def (__libc_dynarray_at_failure) -diff --git a/malloc/dynarray_emplace_enlarge.c b/malloc/dynarray_emplace_enlarge.c -new file mode 100644 -index 0000000000000000..dfc70017cec23800 ---- /dev/null -+++ b/malloc/dynarray_emplace_enlarge.c -@@ -0,0 +1,69 @@ -+/* Increase the size of a dynamic array in preparation of an emplace operation. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+bool -+__libc_dynarray_emplace_enlarge (struct dynarray_header *list, -+ void *scratch, size_t element_size) -+{ -+ size_t new_allocated; -+ if (list->allocated == 0) -+ { -+ /* No scratch buffer provided. Choose a reasonable default -+ size. */ -+ if (element_size < 4) -+ new_allocated = 16; -+ if (element_size < 8) -+ new_allocated = 8; -+ else -+ new_allocated = 4; -+ } -+ else -+ /* Increase the allocated size, using an exponential growth -+ policy. */ -+ { -+ new_allocated = list->allocated + list->allocated / 2 + 1; -+ if (new_allocated <= list->allocated) -+ /* Overflow. */ -+ return false; -+ } -+ -+ size_t new_size; -+ if (check_mul_overflow_size_t (new_allocated, element_size, &new_size)) -+ return false; -+ void *new_array; -+ if (list->array == scratch) -+ { -+ /* The previous array was not heap-allocated. */ -+ new_array = malloc (new_size); -+ if (new_array != NULL && list->array != NULL) -+ memcpy (new_array, list->array, list->used * element_size); -+ } -+ else -+ new_array = realloc (list->array, new_size); -+ if (new_array == NULL) -+ return false; -+ list->array = new_array; -+ list->allocated = new_allocated; -+ return true; -+} -+libc_hidden_def (__libc_dynarray_emplace_enlarge) -diff --git a/malloc/dynarray_finalize.c b/malloc/dynarray_finalize.c -new file mode 100644 -index 0000000000000000..6dd8705382c73ae8 ---- /dev/null -+++ b/malloc/dynarray_finalize.c -@@ -0,0 +1,62 @@ -+/* Copy the dynamically-allocated area to an explicitly-sized heap allocation. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+ -+bool -+__libc_dynarray_finalize (struct dynarray_header *list, -+ void *scratch, size_t element_size, -+ struct dynarray_finalize_result *result) -+{ -+ if (__dynarray_error (list)) -+ /* The caller will reported the deferred error. */ -+ return false; -+ -+ size_t used = list->used; -+ -+ /* Empty list. */ -+ if (used == 0) -+ { -+ /* An empty list could still be backed by a heap-allocated -+ array. Free it if necessary. */ -+ if (list->array != scratch) -+ free (list->array); -+ *result = (struct dynarray_finalize_result) { NULL, 0 }; -+ return true; -+ } -+ -+ size_t allocation_size = used * element_size; -+ void *heap_array = malloc (allocation_size); -+ if (heap_array != NULL) -+ { -+ /* The new array takes ownership of the strings. */ -+ if (list->array != NULL) -+ memcpy (heap_array, list->array, allocation_size); -+ if (list->array != scratch) -+ free (list->array); -+ *result = (struct dynarray_finalize_result) -+ { .array = heap_array, .length = used }; -+ return true; -+ } -+ else -+ /* The caller will perform the freeing operation. */ -+ return false; -+} -+libc_hidden_def (__libc_dynarray_finalize) -diff --git a/malloc/dynarray_resize.c b/malloc/dynarray_resize.c -new file mode 100644 -index 0000000000000000..e6dc9fbc68587de4 ---- /dev/null -+++ b/malloc/dynarray_resize.c -@@ -0,0 +1,59 @@ -+/* Increase the size of a dynamic array. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+bool -+__libc_dynarray_resize (struct dynarray_header *list, size_t size, -+ void *scratch, size_t element_size) -+{ -+ /* The existing allocation provides sufficient room. */ -+ if (size <= list->allocated) -+ { -+ list->used = size; -+ return true; -+ } -+ -+ /* Otherwise, use size as the new allocation size. The caller is -+ expected to provide the final size of the array, so there is no -+ over-allocation here. */ -+ -+ size_t new_size_bytes; -+ if (check_mul_overflow_size_t (size, element_size, &new_size_bytes)) -+ return false; -+ void *new_array; -+ if (list->array == scratch) -+ { -+ /* The previous array was not heap-allocated. */ -+ new_array = malloc (new_size_bytes); -+ if (new_array != NULL && list->array != NULL) -+ memcpy (new_array, list->array, list->used * element_size); -+ } -+ else -+ new_array = realloc (list->array, new_size_bytes); -+ if (new_array == NULL) -+ return false; -+ list->array = new_array; -+ list->allocated = size; -+ list->used = size; -+ return true; -+} -+libc_hidden_def (__libc_dynarray_resize) -diff --git a/malloc/dynarray_resize_clear.c b/malloc/dynarray_resize_clear.c -new file mode 100644 -index 0000000000000000..0c4ced1d38b77918 ---- /dev/null -+++ b/malloc/dynarray_resize_clear.c -@@ -0,0 +1,35 @@ -+/* Increase the size of a dynamic array and clear the new part. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+ -+bool -+__libc_dynarray_resize_clear (struct dynarray_header *list, size_t size, -+ void *scratch, size_t element_size) -+{ -+ size_t old_size = list->used; -+ if (!__libc_dynarray_resize (list, size, scratch, element_size)) -+ return false; -+ /* __libc_dynarray_resize already checked for overflow. */ -+ memset (list->array + (old_size * element_size), 0, -+ (size - old_size) * element_size); -+ return true; -+} -+libc_hidden_def (__libc_dynarray_resize_clear) -diff --git a/malloc/tst-dynarray-at-fail.c b/malloc/tst-dynarray-at-fail.c -new file mode 100644 -index 0000000000000000..bc1a48c5cbb2e046 ---- /dev/null -+++ b/malloc/tst-dynarray-at-fail.c -@@ -0,0 +1,125 @@ -+/* Test reporting of out-of-bounds access for dynamic arrays. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include "tst-dynarray-shared.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* Run CALLBACK and check that the data on standard error equals -+ EXPECTED. */ -+static void -+check (const char *test, void (*callback) (void *), size_t index, -+ const char *expected) -+{ -+ struct support_capture_subprocess result -+ = support_capture_subprocess (callback, &index); -+ if (strcmp (result.err.buffer, expected) != 0) -+ { -+ support_record_failure (); -+ printf ("error: test %s (%zu) unexpected standard error data\n" -+ " expected: %s\n" -+ " actual: %s\n", -+ test, index, expected, result.err.buffer); -+ } -+ TEST_VERIFY (strlen (result.out.buffer) == 0); -+ TEST_VERIFY (WIFSIGNALED (result.status)); -+ if (WIFSIGNALED (result.status)) -+ TEST_VERIFY (WTERMSIG (result.status) == SIGABRT); -+ support_capture_subprocess_free (&result); -+} -+ -+/* Try indexing an empty array. */ -+static void -+test_empty (void *closure) -+{ -+ size_t *pindex = closure; -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ dynarray_int_at (&dyn, *pindex); -+} -+ -+/* Try indexing a one-element array. */ -+static void -+test_one (void *closure) -+{ -+ size_t *pindex = closure; -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ TEST_VERIFY (dynarray_int_resize (&dyn, 1)); -+ dynarray_int_at (&dyn, *pindex); -+} -+ -+/* Try indexing a longer array. */ -+static void -+test_many (void *closure) -+{ -+ size_t *pindex = closure; -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ TEST_VERIFY (dynarray_int_resize (&dyn, 5371)); -+ dynarray_int_at (&dyn, *pindex); -+} -+ -+/* (size_t) -1 for use in string literals. */ -+#if SIZE_WIDTH == 32 -+# define MINUS_1 "4294967295" -+#elif SIZE_WIDTH == 64 -+# define MINUS_1 "18446744073709551615" -+#else -+# error "unknown value for SIZE_WIDTH" -+#endif -+ -+static int -+do_test (void) -+{ -+ TEST_VERIFY (setenv ("LIBC_FATAL_STDERR_", "1", 1) == 0); -+ -+ check ("test_empty", test_empty, 0, -+ "Fatal glibc error: array index 0 not less than array length 0\n"); -+ check ("test_empty", test_empty, 1, -+ "Fatal glibc error: array index 1 not less than array length 0\n"); -+ check ("test_empty", test_empty, -1, -+ "Fatal glibc error: array index " MINUS_1 -+ " not less than array length 0\n"); -+ -+ check ("test_one", test_one, 1, -+ "Fatal glibc error: array index 1 not less than array length 1\n"); -+ check ("test_one", test_one, 2, -+ "Fatal glibc error: array index 2 not less than array length 1\n"); -+ check ("test_one", test_one, -1, -+ "Fatal glibc error: array index " MINUS_1 -+ " not less than array length 1\n"); -+ -+ check ("test_many", test_many, 5371, -+ "Fatal glibc error: array index 5371" -+ " not less than array length 5371\n"); -+ check ("test_many", test_many, 5372, -+ "Fatal glibc error: array index 5372" -+ " not less than array length 5371\n"); -+ check ("test_many", test_many, -1, -+ "Fatal glibc error: array index " MINUS_1 -+ " not less than array length 5371\n"); -+ -+ return 0; -+} -+ -+#include -diff --git a/malloc/tst-dynarray-fail.c b/malloc/tst-dynarray-fail.c -new file mode 100644 -index 0000000000000000..508dbae93e6bce31 ---- /dev/null -+++ b/malloc/tst-dynarray-fail.c -@@ -0,0 +1,418 @@ -+/* Test allocation failures with dynamic arrays. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This test is separate from tst-dynarray because it cannot run under -+ valgrind. */ -+ -+#include "tst-dynarray-shared.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Data structure to fill up the heap. */ -+struct heap_filler -+{ -+ struct heap_filler *next; -+}; -+ -+/* Allocate objects until the heap is full. */ -+static struct heap_filler * -+fill_heap (void) -+{ -+ size_t pad = 4096; -+ struct heap_filler *head = NULL; -+ while (true) -+ { -+ struct heap_filler *new_head = malloc (sizeof (*new_head) + pad); -+ if (new_head == NULL) -+ { -+ if (pad > 0) -+ { -+ /* Try again with smaller allocations. */ -+ pad = 0; -+ continue; -+ } -+ else -+ break; -+ } -+ new_head->next = head; -+ head = new_head; -+ } -+ return head; -+} -+ -+/* Free the heap-filling allocations, so that we can continue testing -+ and detect memory leaks elsewhere. */ -+static void -+free_fill_heap (struct heap_filler *head) -+{ -+ while (head != NULL) -+ { -+ struct heap_filler *next = head->next; -+ free (head); -+ head = next; -+ } -+} -+ -+/* Check allocation failures for int arrays (without an element free -+ function). */ -+static void -+test_int_fail (void) -+{ -+ /* Exercise failure in add/emplace. -+ -+ do_add: Use emplace (false) or add (true) to add elements. -+ do_finalize: Perform finalization at the end (instead of free). */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ for (int do_finalize = 0; do_finalize < 2; ++do_finalize) -+ { -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ size_t count = 0; -+ while (true) -+ { -+ if (do_add) -+ { -+ dynarray_int_add (&dyn, 0); -+ if (dynarray_int_has_failed (&dyn)) -+ break; -+ } -+ else -+ { -+ int *place = dynarray_int_emplace (&dyn); -+ if (place == NULL) -+ break; -+ TEST_VERIFY_EXIT (!dynarray_int_has_failed (&dyn)); -+ *place = 0; -+ } -+ ++count; -+ } -+ printf ("info: %s: failure after %zu elements\n", __func__, count); -+ TEST_VERIFY_EXIT (dynarray_int_has_failed (&dyn)); -+ if (do_finalize) -+ { -+ struct int_array result = { (int *) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (!dynarray_int_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array == (int *) (uintptr_t) -1); -+ TEST_VERIFY_EXIT (result.length == (size_t) -1); -+ } -+ else -+ dynarray_int_free (&dyn); -+ CHECK_INIT_STATE (int, &dyn); -+ } -+ -+ /* Exercise failure in finalize. */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ { -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ for (unsigned int i = 0; i < 10000; ++i) -+ { -+ if (do_add) -+ { -+ dynarray_int_add (&dyn, i); -+ TEST_VERIFY_EXIT (!dynarray_int_has_failed (&dyn)); -+ } -+ else -+ { -+ int *place = dynarray_int_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ *place = i; -+ } -+ } -+ TEST_VERIFY_EXIT (!dynarray_int_has_failed (&dyn)); -+ struct heap_filler *heap_filler = fill_heap (); -+ struct int_array result = { (int *) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (!dynarray_int_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array == (int *) (uintptr_t) -1); -+ TEST_VERIFY_EXIT (result.length == (size_t) -1); -+ CHECK_INIT_STATE (int, &dyn); -+ free_fill_heap (heap_filler); -+ } -+ -+ /* Exercise failure in resize. */ -+ { -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ struct heap_filler *heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_int_resize (&dyn, 1000)); -+ TEST_VERIFY (dynarray_int_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ -+ dynarray_int_init (&dyn); -+ TEST_VERIFY (dynarray_int_resize (&dyn, 1)); -+ heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_int_resize (&dyn, 1000)); -+ TEST_VERIFY (dynarray_int_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ -+ dynarray_int_init (&dyn); -+ TEST_VERIFY (dynarray_int_resize (&dyn, 1000)); -+ heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_int_resize (&dyn, 2000)); -+ TEST_VERIFY (dynarray_int_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ } -+} -+ -+/* Check allocation failures for char * arrays (which automatically -+ free the pointed-to strings). */ -+static void -+test_str_fail (void) -+{ -+ /* Exercise failure in add/emplace. -+ -+ do_add: Use emplace (false) or add (true) to add elements. -+ do_finalize: Perform finalization at the end (instead of free). */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ for (int do_finalize = 0; do_finalize < 2; ++do_finalize) -+ { -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ size_t count = 0; -+ while (true) -+ { -+ char **place; -+ if (do_add) -+ { -+ dynarray_str_add (&dyn, NULL); -+ if (dynarray_str_has_failed (&dyn)) -+ break; -+ else -+ place = dynarray_str_at (&dyn, dynarray_str_size (&dyn) - 1); -+ } -+ else -+ { -+ place = dynarray_str_emplace (&dyn); -+ if (place == NULL) -+ break; -+ } -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ TEST_VERIFY_EXIT (*place == NULL); -+ *place = strdup ("placeholder"); -+ if (*place == NULL) -+ { -+ /* Second loop to wait for failure of -+ dynarray_str_emplace. */ -+ while (true) -+ { -+ if (do_add) -+ { -+ dynarray_str_add (&dyn, NULL); -+ if (dynarray_str_has_failed (&dyn)) -+ break; -+ } -+ else -+ { -+ char **place = dynarray_str_emplace (&dyn); -+ if (place == NULL) -+ break; -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ *place = NULL; -+ } -+ ++count; -+ } -+ break; -+ } -+ ++count; -+ } -+ printf ("info: %s: failure after %zu elements\n", __func__, count); -+ TEST_VERIFY_EXIT (dynarray_str_has_failed (&dyn)); -+ if (do_finalize) -+ { -+ struct str_array result = { (char **) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (!dynarray_str_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array == (char **) (uintptr_t) -1); -+ TEST_VERIFY_EXIT (result.length == (size_t) -1); -+ } -+ else -+ dynarray_str_free (&dyn); -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.array == dyn.scratch); -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == 0); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.allocated > 0); -+ } -+ -+ /* Exercise failure in finalize. */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ { -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ for (unsigned int i = 0; i < 1000; ++i) -+ { -+ if (do_add) -+ dynarray_str_add (&dyn, xstrdup ("placeholder")); -+ else -+ { -+ char **place = dynarray_str_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ TEST_VERIFY_EXIT (*place == NULL); -+ *place = xstrdup ("placeholder"); -+ } -+ } -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ struct heap_filler *heap_filler = fill_heap (); -+ struct str_array result = { (char **) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (!dynarray_str_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array == (char **) (uintptr_t) -1); -+ TEST_VERIFY_EXIT (result.length == (size_t) -1); -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.array == dyn.scratch); -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == 0); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.allocated > 0); -+ free_fill_heap (heap_filler); -+ } -+ -+ /* Exercise failure in resize. */ -+ { -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ struct heap_filler *heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_str_resize (&dyn, 1000)); -+ TEST_VERIFY (dynarray_str_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ -+ dynarray_str_init (&dyn); -+ TEST_VERIFY (dynarray_str_resize (&dyn, 1)); -+ *dynarray_str_at (&dyn, 0) = xstrdup ("allocated"); -+ heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_str_resize (&dyn, 1000)); -+ TEST_VERIFY (dynarray_str_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ -+ dynarray_str_init (&dyn); -+ TEST_VERIFY (dynarray_str_resize (&dyn, 1000)); -+ *dynarray_str_at (&dyn, 0) = xstrdup ("allocated"); -+ heap_filler = fill_heap (); -+ TEST_VERIFY (!dynarray_str_resize (&dyn, 2000)); -+ TEST_VERIFY (dynarray_str_has_failed (&dyn)); -+ free_fill_heap (heap_filler); -+ } -+} -+ -+/* Test if mmap can allocate a page. This is necessary because -+ setrlimit does not fail even if it reduces the RLIMIT_AS limit -+ below what is currently needed by the process. */ -+static bool -+mmap_works (void) -+{ -+ void *ptr = mmap (NULL, 1, PROT_READ | PROT_WRITE, -+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); -+ if (ptr == MAP_FAILED) -+ return false; -+ xmunmap (ptr, 1); -+ return true; -+} -+ -+/* Set the RLIMIT_AS limit to the value in *LIMIT. */ -+static void -+xsetrlimit_as (const struct rlimit *limit) -+{ -+ if (setrlimit (RLIMIT_AS, limit) != 0) -+ FAIL_EXIT1 ("setrlimit (RLIMIT_AS, %lu): %m", -+ (unsigned long) limit->rlim_cur); -+} -+ -+/* Approximately this many bytes can be allocated after -+ reduce_rlimit_as has run. */ -+enum { as_limit_reserve = 2 * 1024 * 1024 }; -+ -+/* Limit the size of the process, so that memory allocation in -+ allocate_thread will eventually fail, without impacting the entire -+ system. By default, a dynamic limit which leaves room for 2 MiB is -+ activated. The TEST_RLIMIT_AS environment variable overrides -+ it. */ -+static void -+reduce_rlimit_as (void) -+{ -+ struct rlimit limit; -+ if (getrlimit (RLIMIT_AS, &limit) != 0) -+ FAIL_EXIT1 ("getrlimit (RLIMIT_AS) failed: %m"); -+ -+ /* Use the TEST_RLIMIT_AS setting if available. */ -+ { -+ long target = 0; -+ const char *variable = "TEST_RLIMIT_AS"; -+ const char *target_str = getenv (variable); -+ if (target_str != NULL) -+ { -+ target = atoi (target_str); -+ if (target <= 0) -+ FAIL_EXIT1 ("invalid %s value: \"%s\"", variable, target_str); -+ printf ("info: setting RLIMIT_AS to %ld MiB\n", target); -+ target *= 1024 * 1024; /* Convert to megabytes. */ -+ limit.rlim_cur = target; -+ xsetrlimit_as (&limit); -+ return; -+ } -+ } -+ -+ /* Otherwise, try to find the limit with a binary search. */ -+ unsigned long low = 1 << 20; -+ limit.rlim_cur = low; -+ xsetrlimit_as (&limit); -+ -+ /* Find working upper limit. */ -+ unsigned long high = 1 << 30; -+ while (true) -+ { -+ limit.rlim_cur = high; -+ xsetrlimit_as (&limit); -+ if (mmap_works ()) -+ break; -+ if (2 * high < high) -+ FAIL_EXIT1 ("cannot find upper AS limit"); -+ high *= 2; -+ } -+ -+ /* Perform binary search. */ -+ while ((high - low) > 128 * 1024) -+ { -+ unsigned long middle = (low + high) / 2; -+ limit.rlim_cur = middle; -+ xsetrlimit_as (&limit); -+ if (mmap_works ()) -+ high = middle; -+ else -+ low = middle; -+ } -+ -+ unsigned long target = high + as_limit_reserve; -+ limit.rlim_cur = target; -+ xsetrlimit_as (&limit); -+ printf ("info: RLIMIT_AS limit: %lu bytes\n", target); -+} -+ -+static int -+do_test (void) -+{ -+ mtrace (); -+ reduce_rlimit_as (); -+ test_int_fail (); -+ test_str_fail (); -+ return 0; -+} -+ -+#define TIMEOUT 90 -+#include -diff --git a/malloc/tst-dynarray-shared.h b/malloc/tst-dynarray-shared.h -new file mode 100644 -index 0000000000000000..faba66f580733a2d ---- /dev/null -+++ b/malloc/tst-dynarray-shared.h -@@ -0,0 +1,77 @@ -+/* Shared definitions for dynarray tests. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+struct int_array -+{ -+ int *array; -+ size_t length; -+}; -+ -+#define DYNARRAY_STRUCT dynarray_int -+#define DYNARRAY_ELEMENT int -+#define DYNARRAY_PREFIX dynarray_int_ -+#define DYNARRAY_FINAL_TYPE struct int_array -+#include -+ -+struct str_array -+{ -+ char **array; -+ size_t length; -+}; -+ -+#define DYNARRAY_STRUCT dynarray_str -+#define DYNARRAY_ELEMENT char * -+#define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr) -+#define DYNARRAY_PREFIX dynarray_str_ -+#define DYNARRAY_FINAL_TYPE struct str_array -+#include -+ -+/* Check that *DYN is equivalent to its initial state. */ -+#define CHECK_INIT_STATE(type, dyn) \ -+ ({ \ -+ TEST_VERIFY_EXIT (!dynarray_##type##_has_failed (dyn)); \ -+ TEST_VERIFY_EXIT (dynarray_##type##_size (dyn) == 0); \ -+ TEST_VERIFY_EXIT ((dyn)->dynarray_header.array \ -+ == (dyn)->scratch); \ -+ TEST_VERIFY_EXIT ((dyn)->dynarray_header.allocated > 0); \ -+ (void) 0; \ -+ }) -+ -+/* Check that *DYN behaves as if it is in its initial state. */ -+#define CHECK_EMPTY(type, dyn) \ -+ ({ \ -+ CHECK_INIT_STATE (type, (dyn)); \ -+ dynarray_##type##_free (dyn); \ -+ CHECK_INIT_STATE (type, (dyn)); \ -+ dynarray_##type##_clear (dyn); \ -+ CHECK_INIT_STATE (type, (dyn)); \ -+ dynarray_##type##_remove_last (dyn); \ -+ CHECK_INIT_STATE (type, (dyn)); \ -+ dynarray_##type##_mark_failed (dyn); \ -+ TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ -+ dynarray_##type##_clear (dyn); \ -+ TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ -+ dynarray_##type##_remove_last (dyn); \ -+ TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ -+ TEST_VERIFY_EXIT (dynarray_##type##_emplace (dyn) == NULL); \ -+ dynarray_##type##_free (dyn); \ -+ CHECK_INIT_STATE (type, (dyn)); \ -+ (void) 0; \ -+ }) -diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c -new file mode 100644 -index 0000000000000000..7aee85aa39ff2e0b ---- /dev/null -+++ b/malloc/tst-dynarray.c -@@ -0,0 +1,517 @@ -+/* Test for dynamic arrays. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include "tst-dynarray-shared.h" -+ -+#define DYNARRAY_STRUCT dynarray_long -+#define DYNARRAY_ELEMENT long -+#define DYNARRAY_PREFIX dynarray_long_ -+#define DYNARRAY_ELEMENT_INIT(e) (*(e) = 17) -+#include -+ -+struct long_array -+{ -+ long *array; -+ size_t length; -+}; -+ -+#define DYNARRAY_STRUCT dynarray_long_noscratch -+#define DYNARRAY_ELEMENT long -+#define DYNARRAY_PREFIX dynarray_long_noscratch_ -+#define DYNARRAY_ELEMENT_INIT(e) (*(e) = 23) -+#define DYNARRAY_FINAL_TYPE struct long_array -+#define DYNARRAY_INITIAL_SIZE 0 -+#include -+ -+#define DYNARRAY_STRUCT zstr -+#define DYNARRAY_ELEMENT char -+#define DYNARRAY_PREFIX zstr_ -+#define DYNARRAY_INITIAL_SIZE 128 -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+enum { max_count = 20 }; -+ -+/* Test dynamic arrays with int elements (no automatic deallocation -+ for elements). */ -+static void -+test_int (void) -+{ -+ /* Empty array. */ -+ { -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ CHECK_EMPTY (int, &dyn); -+ } -+ -+ /* Empty array with finalization. */ -+ { -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ CHECK_INIT_STATE (int, &dyn); -+ struct int_array result = { (int *) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (dynarray_int_finalize (&dyn, &result)); -+ CHECK_INIT_STATE (int, &dyn); -+ TEST_VERIFY_EXIT (result.array == NULL); -+ TEST_VERIFY_EXIT (result.length == 0); -+ } -+ -+ /* Non-empty array tests. -+ -+ do_add: Switch between emplace (false) and add (true). -+ do_finalize: Perform finalize call at the end. -+ do_clear: Perform clear call at the end. -+ do_remove_last: Perform remove_last call after adding elements. -+ count: Number of elements added to the array. */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ for (int do_finalize = 0; do_finalize < 2; ++do_finalize) -+ for (int do_clear = 0; do_clear < 2; ++do_clear) -+ for (int do_remove_last = 0; do_remove_last < 2; ++do_remove_last) -+ for (unsigned int count = 0; count < max_count; ++count) -+ { -+ if (do_remove_last && count == 0) -+ continue; -+ unsigned int base = count * count; -+ struct dynarray_int dyn; -+ dynarray_int_init (&dyn); -+ for (unsigned int i = 0; i < count; ++i) -+ { -+ if (do_add) -+ dynarray_int_add (&dyn, base + i); -+ else -+ { -+ int *place = dynarray_int_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ *place = base + i; -+ } -+ TEST_VERIFY_EXIT (!dynarray_int_has_failed (&dyn)); -+ TEST_VERIFY_EXIT (dynarray_int_size (&dyn) == i + 1); -+ TEST_VERIFY_EXIT (dynarray_int_size (&dyn) -+ <= dyn.dynarray_header.allocated); -+ } -+ TEST_VERIFY_EXIT (dynarray_int_size (&dyn) == count); -+ TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); -+ unsigned final_count; -+ bool heap_array = dyn.dynarray_header.array != dyn.scratch; -+ if (do_remove_last) -+ { -+ dynarray_int_remove_last (&dyn); -+ if (count == 0) -+ final_count = 0; -+ else -+ final_count = count - 1; -+ } -+ else -+ final_count = count; -+ if (do_clear) -+ { -+ dynarray_int_clear (&dyn); -+ final_count = 0; -+ } -+ TEST_VERIFY_EXIT (!dynarray_int_has_failed (&dyn)); -+ TEST_VERIFY_EXIT ((dyn.dynarray_header.array != dyn.scratch) -+ == heap_array); -+ TEST_VERIFY_EXIT (dynarray_int_size (&dyn) == final_count); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.allocated >= final_count); -+ if (!do_clear) -+ for (unsigned int i = 0; i < final_count; ++i) -+ TEST_VERIFY_EXIT (*dynarray_int_at (&dyn, i) == base + i); -+ if (do_finalize) -+ { -+ struct int_array result = { (int *) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (dynarray_int_finalize (&dyn, &result)); -+ CHECK_INIT_STATE (int, &dyn); -+ TEST_VERIFY_EXIT (result.length == final_count); -+ if (final_count == 0) -+ TEST_VERIFY_EXIT (result.array == NULL); -+ else -+ { -+ TEST_VERIFY_EXIT (result.array != NULL); -+ TEST_VERIFY_EXIT (result.array != (int *) (uintptr_t) -1); -+ TEST_VERIFY_EXIT -+ (malloc_usable_size (result.array) -+ >= final_count * sizeof (result.array[0])); -+ for (unsigned int i = 0; i < final_count; ++i) -+ TEST_VERIFY_EXIT (result.array[i] == base + i); -+ free (result.array); -+ } -+ } -+ else /* !do_finalize */ -+ { -+ dynarray_int_free (&dyn); -+ CHECK_INIT_STATE (int, &dyn); -+ } -+ } -+} -+ -+/* Test dynamic arrays with char * elements (with automatic -+ deallocation of the pointed-to strings). */ -+static void -+test_str (void) -+{ -+ /* Empty array. */ -+ { -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ CHECK_EMPTY (str, &dyn); -+ } -+ -+ /* Empty array with finalization. */ -+ { -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ struct str_array result = { (char **) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (dynarray_str_finalize (&dyn, &result)); -+ CHECK_INIT_STATE (str, &dyn); -+ TEST_VERIFY_EXIT (result.array == NULL); -+ TEST_VERIFY_EXIT (result.length == 0); -+ } -+ -+ /* Non-empty array tests. -+ -+ do_add: Switch between emplace (false) and add (true). -+ do_finalize: Perform finalize call at the end. -+ do_clear: Perform clear call at the end. -+ do_remove_last: Perform remove_last call after adding elements. -+ count: Number of elements added to the array. */ -+ for (int do_add = 0; do_add < 2; ++do_add) -+ for (int do_finalize = 0; do_finalize < 2; ++do_finalize) -+ for (int do_clear = 0; do_clear < 2; ++do_clear) -+ for (int do_remove_last = 0; do_remove_last < 2; ++do_remove_last) -+ for (unsigned int count = 0; count < max_count; ++count) -+ { -+ if (do_remove_last && count == 0) -+ continue; -+ unsigned int base = count * count; -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ for (unsigned int i = 0; i < count; ++i) -+ { -+ char *item = xasprintf ("%d", base + i); -+ if (do_add) -+ dynarray_str_add (&dyn, item); -+ else -+ { -+ char **place = dynarray_str_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ TEST_VERIFY_EXIT (*place == NULL); -+ *place = item; -+ } -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == i + 1); -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) -+ <= dyn.dynarray_header.allocated); -+ } -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == count); -+ TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); -+ unsigned final_count; -+ bool heap_array = dyn.dynarray_header.array != dyn.scratch; -+ if (do_remove_last) -+ { -+ dynarray_str_remove_last (&dyn); -+ if (count == 0) -+ final_count = 0; -+ else -+ final_count = count - 1; -+ } -+ else -+ final_count = count; -+ if (do_clear) -+ { -+ dynarray_str_clear (&dyn); -+ final_count = 0; -+ } -+ TEST_VERIFY_EXIT (!dynarray_str_has_failed (&dyn)); -+ TEST_VERIFY_EXIT ((dyn.dynarray_header.array != dyn.scratch) -+ == heap_array); -+ TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == final_count); -+ TEST_VERIFY_EXIT (dyn.dynarray_header.allocated >= final_count); -+ if (!do_clear) -+ for (unsigned int i = 0; i < count - do_remove_last; ++i) -+ { -+ char *expected = xasprintf ("%d", base + i); -+ const char *actual = *dynarray_str_at (&dyn, i); -+ TEST_VERIFY_EXIT (strcmp (actual, expected) == 0); -+ free (expected); -+ } -+ if (do_finalize) -+ { -+ struct str_array result = { (char **) (uintptr_t) -1, -1 }; -+ TEST_VERIFY_EXIT (dynarray_str_finalize (&dyn, &result)); -+ CHECK_INIT_STATE (str, &dyn); -+ TEST_VERIFY_EXIT (result.length == final_count); -+ if (final_count == 0) -+ TEST_VERIFY_EXIT (result.array == NULL); -+ else -+ { -+ TEST_VERIFY_EXIT (result.array != NULL); -+ TEST_VERIFY_EXIT (result.array -+ != (char **) (uintptr_t) -1); -+ TEST_VERIFY_EXIT (result.length -+ == count - do_remove_last); -+ TEST_VERIFY_EXIT -+ (malloc_usable_size (result.array) -+ >= final_count * sizeof (result.array[0])); -+ for (unsigned int i = 0; i < count - do_remove_last; ++i) -+ { -+ char *expected = xasprintf ("%d", base + i); -+ char *actual = result.array[i]; -+ TEST_VERIFY_EXIT (strcmp (actual, expected) == 0); -+ free (expected); -+ free (actual); -+ } -+ free (result.array); -+ } -+ } -+ else /* !do_finalize */ -+ { -+ dynarray_str_free (&dyn); -+ CHECK_INIT_STATE (str, &dyn); -+ } -+ } -+ -+ /* Test resizing. */ -+ { -+ enum { count = 2131 }; -+ struct dynarray_str dyn; -+ dynarray_str_init (&dyn); -+ -+ /* From length 0 to length 1. */ -+ TEST_VERIFY (dynarray_str_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_str_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_str_at (&dyn, 0) == NULL); -+ *dynarray_str_at (&dyn, 0) = xstrdup ("allocated"); -+ dynarray_str_free (&dyn); -+ -+ /* From length 0 to length 1 and 2. */ -+ TEST_VERIFY (dynarray_str_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_str_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_str_at (&dyn, 0) == NULL); -+ *dynarray_str_at (&dyn, 0) = xstrdup ("allocated0"); -+ TEST_VERIFY (dynarray_str_resize (&dyn, 2)); -+ TEST_VERIFY (dynarray_str_size (&dyn) == 2); -+ TEST_VERIFY (strcmp (*dynarray_str_at (&dyn, 0), "allocated0") == 0); -+ TEST_VERIFY (*dynarray_str_at (&dyn, 1) == NULL); -+ *dynarray_str_at (&dyn, 1) = xstrdup ("allocated1"); -+ TEST_VERIFY (dynarray_str_resize (&dyn, count)); -+ TEST_VERIFY (dynarray_str_size (&dyn) == count); -+ TEST_VERIFY (strcmp (*dynarray_str_at (&dyn, 0), "allocated0") == 0); -+ TEST_VERIFY (strcmp (*dynarray_str_at (&dyn, 1), "allocated1") == 0); -+ for (int i = 2; i < count; ++i) -+ TEST_VERIFY (*dynarray_str_at (&dyn, i) == NULL); -+ *dynarray_str_at (&dyn, count - 1) = xstrdup ("allocated2"); -+ TEST_VERIFY (dynarray_str_resize (&dyn, 3)); -+ TEST_VERIFY (strcmp (*dynarray_str_at (&dyn, 0), "allocated0") == 0); -+ TEST_VERIFY (strcmp (*dynarray_str_at (&dyn, 1), "allocated1") == 0); -+ TEST_VERIFY (*dynarray_str_at (&dyn, 2) == NULL); -+ dynarray_str_free (&dyn); -+ } -+} -+ -+/* Verify that DYNARRAY_ELEMENT_INIT has an effect. */ -+static void -+test_long_init (void) -+{ -+ enum { count = 2131 }; -+ { -+ struct dynarray_long dyn; -+ dynarray_long_init (&dyn); -+ for (int i = 0; i < count; ++i) -+ { -+ long *place = dynarray_long_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ TEST_VERIFY (*place == 17); -+ } -+ TEST_VERIFY (dynarray_long_size (&dyn) == count); -+ for (int i = 0; i < count; ++i) -+ TEST_VERIFY (*dynarray_long_at (&dyn, i) == 17); -+ dynarray_long_free (&dyn); -+ -+ TEST_VERIFY (dynarray_long_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_long_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_long_at (&dyn, 0) == 17); -+ *dynarray_long_at (&dyn, 0) = 18; -+ dynarray_long_free (&dyn); -+ TEST_VERIFY (dynarray_long_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_long_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_long_at (&dyn, 0) == 17); -+ TEST_VERIFY (dynarray_long_resize (&dyn, 2)); -+ TEST_VERIFY (dynarray_long_size (&dyn) == 2); -+ TEST_VERIFY (*dynarray_long_at (&dyn, 0) == 17); -+ TEST_VERIFY (*dynarray_long_at (&dyn, 1) == 17); -+ *dynarray_long_at (&dyn, 0) = 18; -+ TEST_VERIFY (dynarray_long_resize (&dyn, count)); -+ TEST_VERIFY (dynarray_long_size (&dyn) == count); -+ TEST_VERIFY (*dynarray_long_at (&dyn, 0) == 18); -+ for (int i = 1; i < count; ++i) -+ TEST_VERIFY (*dynarray_long_at (&dyn, i) == 17); -+ dynarray_long_free (&dyn); -+ } -+ -+ /* Similar, but without an on-stack scratch region -+ (DYNARRAY_INITIAL_SIZE is 0). */ -+ { -+ struct dynarray_long_noscratch dyn; -+ dynarray_long_noscratch_init (&dyn); -+ struct long_array result; -+ TEST_VERIFY_EXIT (dynarray_long_noscratch_finalize (&dyn, &result)); -+ TEST_VERIFY (result.array == NULL); -+ TEST_VERIFY (result.length == 0); -+ -+ /* Test with one element. */ -+ { -+ long *place = dynarray_long_noscratch_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ TEST_VERIFY (*place == 23); -+ } -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 23); -+ TEST_VERIFY_EXIT (dynarray_long_noscratch_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array != NULL); -+ TEST_VERIFY (result.length == 1); -+ TEST_VERIFY (result.array[0] == 23); -+ free (result.array); -+ -+ for (int i = 0; i < count; ++i) -+ { -+ long *place = dynarray_long_noscratch_emplace (&dyn); -+ TEST_VERIFY_EXIT (place != NULL); -+ TEST_VERIFY (*place == 23); -+ if (i == 0) -+ *place = 29; -+ } -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == count); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 29); -+ for (int i = 1; i < count; ++i) -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, i) == 23); -+ TEST_VERIFY_EXIT (dynarray_long_noscratch_finalize (&dyn, &result)); -+ TEST_VERIFY_EXIT (result.array != NULL); -+ TEST_VERIFY (result.length == count); -+ TEST_VERIFY (result.array[0] == 29); -+ for (int i = 1; i < count; ++i) -+ TEST_VERIFY (result.array[i] == 23); -+ free (result.array); -+ -+ TEST_VERIFY (dynarray_long_noscratch_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 23); -+ *dynarray_long_noscratch_at (&dyn, 0) = 24; -+ dynarray_long_noscratch_free (&dyn); -+ TEST_VERIFY (dynarray_long_noscratch_resize (&dyn, 1)); -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == 1); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 23); -+ TEST_VERIFY (dynarray_long_noscratch_resize (&dyn, 2)); -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == 2); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 23); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 1) == 23); -+ *dynarray_long_noscratch_at (&dyn, 0) = 24; -+ TEST_VERIFY (dynarray_long_noscratch_resize (&dyn, count)); -+ TEST_VERIFY (dynarray_long_noscratch_size (&dyn) == count); -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, 0) == 24); -+ for (int i = 1; i < count; ++i) -+ TEST_VERIFY (*dynarray_long_noscratch_at (&dyn, i) == 23); -+ dynarray_long_noscratch_free (&dyn); -+ } -+} -+ -+/* Test NUL-terminated string construction with the add function and -+ the simple finalize function. */ -+static void -+test_zstr (void) -+{ -+ /* Totally empty string (no NUL termination). */ -+ { -+ struct zstr s; -+ zstr_init (&s); -+ char *result = zstr_finalize (&s, NULL); -+ TEST_VERIFY (result == NULL); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ size_t length = 1; -+ result = zstr_finalize (&s, &length); -+ TEST_VERIFY (result == NULL); -+ TEST_VERIFY (length == 0); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ } -+ -+ /* Empty string. */ -+ { -+ struct zstr s; -+ zstr_init (&s); -+ zstr_add (&s, '\0'); -+ char *result = zstr_finalize (&s, NULL); -+ TEST_VERIFY_EXIT (result != NULL); -+ TEST_VERIFY (*result == '\0'); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ free (result); -+ -+ zstr_add (&s, '\0'); -+ size_t length = 1; -+ result = zstr_finalize (&s, &length); -+ TEST_VERIFY_EXIT (result != NULL); -+ TEST_VERIFY (*result == '\0'); -+ TEST_VERIFY (length == 1); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ free (result); -+ } -+ -+ /* A few characters. */ -+ { -+ struct zstr s; -+ zstr_init (&s); -+ zstr_add (&s, 'A'); -+ zstr_add (&s, 'b'); -+ zstr_add (&s, 'c'); -+ zstr_add (&s, '\0'); -+ char *result = zstr_finalize (&s, NULL); -+ TEST_VERIFY_EXIT (result != NULL); -+ TEST_VERIFY (strcmp (result, "Abc") == 0); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ free (result); -+ -+ zstr_add (&s, 'X'); -+ zstr_add (&s, 'y'); -+ zstr_add (&s, 'z'); -+ zstr_add (&s, '\0'); -+ size_t length = 1; -+ result = zstr_finalize (&s, &length); -+ TEST_VERIFY_EXIT (result != NULL); -+ TEST_VERIFY (strcmp (result, "Xyz") == 0); -+ TEST_VERIFY (length == 4); -+ TEST_VERIFY (zstr_size (&s) == 0); -+ free (result); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ mtrace (); -+ test_int (); -+ test_str (); -+ test_long_init (); -+ test_zstr (); -+ return 0; -+} -+ -+#include diff --git a/glibc-dynarray-3.patch b/glibc-dynarray-3.patch deleted file mode 100644 index 863e7df..0000000 --- a/glibc-dynarray-3.patch +++ /dev/null @@ -1,119 +0,0 @@ -commit f8bf87face3304f216bcd838081fa33bb4976ac6 -Author: Florian Weimer -Date: Tue Jun 13 17:03:56 2017 +0200 - - dynarray: Implement begin/end functions in the spirit of C++ - -diff --git a/malloc/dynarray-skeleton.c b/malloc/dynarray-skeleton.c -index 7a10e083f477dd7a..7ec58788087e80d3 100644 ---- a/malloc/dynarray-skeleton.c -+++ b/malloc/dynarray-skeleton.c -@@ -65,6 +65,8 @@ - bool DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *); - void DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *); - size_t DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *); -+ DYNARRAY_ELEMENT *DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *); -+ DYNARRAY_ELEMENT *DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *); - DYNARRAY_ELEMENT *DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *, size_t); - void DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *, DYNARRAY_ELEMENT); - DYNARRAY_ELEMENT *DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *); -@@ -248,6 +250,26 @@ DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index) - return list->dynarray_header.array + index; - } - -+/* Return a pointer to the first array element, if any. For a -+ zero-length array, the pointer can be NULL even though the dynamic -+ array has not entered the failure state. */ -+__attribute__ ((nonnull (1))) -+static inline DYNARRAY_ELEMENT * -+DYNARRAY_NAME (begin) (struct DYNARRAY_STRUCT *list) -+{ -+ return list->dynarray_header.array; -+} -+ -+/* Return a pointer one element past the last array element. For a -+ zero-length array, the pointer can be NULL even though the dynamic -+ array has not entered the failure state. */ -+__attribute__ ((nonnull (1))) -+static inline DYNARRAY_ELEMENT * -+DYNARRAY_NAME (end) (struct DYNARRAY_STRUCT *list) -+{ -+ return list->dynarray_header.array + list->dynarray_header.used; -+} -+ - /* Internal function. Slow path for the add function below. */ - static void - DYNARRAY_NAME (add__) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item) -diff --git a/malloc/tst-dynarray-shared.h b/malloc/tst-dynarray-shared.h -index faba66f580733a2d..1de9c04be88843d0 100644 ---- a/malloc/tst-dynarray-shared.h -+++ b/malloc/tst-dynarray-shared.h -@@ -73,5 +73,8 @@ struct str_array - TEST_VERIFY_EXIT (dynarray_##type##_emplace (dyn) == NULL); \ - dynarray_##type##_free (dyn); \ - CHECK_INIT_STATE (type, (dyn)); \ -+ /* These functions should not assert. */ \ -+ dynarray_##type##_begin (dyn); \ -+ dynarray_##type##_end (dyn); \ - (void) 0; \ - }) -diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c -index 7aee85aa39ff2e0b..2206d75e318aaa3f 100644 ---- a/malloc/tst-dynarray.c -+++ b/malloc/tst-dynarray.c -@@ -111,6 +111,13 @@ test_int (void) - } - TEST_VERIFY_EXIT (dynarray_int_size (&dyn) == count); - TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); -+ if (count > 0) -+ { -+ TEST_VERIFY (dynarray_int_begin (&dyn) -+ == dynarray_int_at (&dyn, 0)); -+ TEST_VERIFY (dynarray_int_end (&dyn) -+ == dynarray_int_at (&dyn, count - 1) + 1); -+ } - unsigned final_count; - bool heap_array = dyn.dynarray_header.array != dyn.scratch; - if (do_remove_last) -@@ -123,6 +130,13 @@ test_int (void) - } - else - final_count = count; -+ if (final_count > 0) -+ { -+ TEST_VERIFY (dynarray_int_begin (&dyn) -+ == dynarray_int_at (&dyn, 0)); -+ TEST_VERIFY (dynarray_int_end (&dyn) -+ == dynarray_int_at (&dyn, final_count - 1) + 1); -+ } - if (do_clear) - { - dynarray_int_clear (&dyn); -@@ -225,6 +239,13 @@ test_str (void) - } - TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == count); - TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); -+ if (count > 0) -+ { -+ TEST_VERIFY (dynarray_str_begin (&dyn) -+ == dynarray_str_at (&dyn, 0)); -+ TEST_VERIFY (dynarray_str_end (&dyn) -+ == dynarray_str_at (&dyn, count - 1) + 1); -+ } - unsigned final_count; - bool heap_array = dyn.dynarray_header.array != dyn.scratch; - if (do_remove_last) -@@ -237,6 +258,13 @@ test_str (void) - } - else - final_count = count; -+ if (final_count > 0) -+ { -+ TEST_VERIFY (dynarray_str_begin (&dyn) -+ == dynarray_str_at (&dyn, 0)); -+ TEST_VERIFY (dynarray_str_end (&dyn) -+ == dynarray_str_at (&dyn, final_count - 1) + 1); -+ } - if (do_clear) - { - dynarray_str_clear (&dyn); diff --git a/glibc-dynarray-4.patch b/glibc-dynarray-4.patch deleted file mode 100644 index 5059d85..0000000 --- a/glibc-dynarray-4.patch +++ /dev/null @@ -1,114 +0,0 @@ -commit 5898f4548efdcd7c0fd437a74eeb80facc51a117 -Author: Florian Weimer -Date: Wed Aug 30 20:10:56 2017 +0200 - - dynarray: Set errno on overflow-induced allocation failure - - This allows the caller to return directly on such an error, with an - appropriate errno value. - -diff --git a/malloc/dynarray_emplace_enlarge.c b/malloc/dynarray_emplace_enlarge.c -index dfc70017cec23800..0fb032765cc99952 100644 ---- a/malloc/dynarray_emplace_enlarge.c -+++ b/malloc/dynarray_emplace_enlarge.c -@@ -17,6 +17,7 @@ - . */ - - #include -+#include - #include - #include - #include -@@ -43,8 +44,11 @@ __libc_dynarray_emplace_enlarge (struct dynarray_header *list, - { - new_allocated = list->allocated + list->allocated / 2 + 1; - if (new_allocated <= list->allocated) -- /* Overflow. */ -- return false; -+ { -+ /* Overflow. */ -+ __set_errno (ENOMEM); -+ return false; -+ } - } - - size_t new_size; -diff --git a/malloc/dynarray_resize.c b/malloc/dynarray_resize.c -index e6dc9fbc68587de4..63c981bf61f67145 100644 ---- a/malloc/dynarray_resize.c -+++ b/malloc/dynarray_resize.c -@@ -17,6 +17,7 @@ - . */ - - #include -+#include - #include - #include - #include -@@ -38,7 +39,11 @@ __libc_dynarray_resize (struct dynarray_header *list, size_t size, - - size_t new_size_bytes; - if (check_mul_overflow_size_t (size, element_size, &new_size_bytes)) -- return false; -+ { -+ /* Overflow. */ -+ __set_errno (ENOMEM); -+ return false; -+ } - void *new_array; - if (list->array == scratch) - { -diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c -index 2206d75e318aaa3f..d11f7bb8a343a16a 100644 ---- a/malloc/tst-dynarray.c -+++ b/malloc/tst-dynarray.c -@@ -18,6 +18,9 @@ - - #include "tst-dynarray-shared.h" - -+#include -+#include -+ - #define DYNARRAY_STRUCT dynarray_long - #define DYNARRAY_ELEMENT long - #define DYNARRAY_PREFIX dynarray_long_ -@@ -463,6 +466,31 @@ test_long_init (void) - } - } - -+/* Test overflow in resize. */ -+static void -+test_long_overflow (void) -+{ -+ { -+ struct dynarray_long dyn; -+ dynarray_long_init (&dyn); -+ errno = EINVAL; -+ TEST_VERIFY (!dynarray_long_resize -+ (&dyn, (SIZE_MAX / sizeof (long)) + 1)); -+ TEST_VERIFY (errno == ENOMEM); -+ TEST_VERIFY (dynarray_long_has_failed (&dyn)); -+ } -+ -+ { -+ struct dynarray_long_noscratch dyn; -+ dynarray_long_noscratch_init (&dyn); -+ errno = EINVAL; -+ TEST_VERIFY (!dynarray_long_noscratch_resize -+ (&dyn, (SIZE_MAX / sizeof (long)) + 1)); -+ TEST_VERIFY (errno == ENOMEM); -+ TEST_VERIFY (dynarray_long_noscratch_has_failed (&dyn)); -+ } -+} -+ - /* Test NUL-terminated string construction with the add function and - the simple finalize function. */ - static void -@@ -538,6 +566,7 @@ do_test (void) - test_int (); - test_str (); - test_long_init (); -+ test_long_overflow (); - test_zstr (); - return 0; - } diff --git a/glibc-dynarray-5.patch b/glibc-dynarray-5.patch deleted file mode 100644 index d171fcf..0000000 --- a/glibc-dynarray-5.patch +++ /dev/null @@ -1,22 +0,0 @@ -commit ab5ac271e6210fa0af11cf3ca525ce573bc47c48 -Author: Florian Weimer -Date: Wed Sep 6 11:25:14 2017 +0200 - - __libc_dynarray_emplace_enlarge: Add missing else - - Before, arrays of small elements received a starting allocation size of - 8, not 16. - -diff --git a/malloc/dynarray_emplace_enlarge.c b/malloc/dynarray_emplace_enlarge.c -index 0fb032765cc99952..a15245f4cb3d4288 100644 ---- a/malloc/dynarray_emplace_enlarge.c -+++ b/malloc/dynarray_emplace_enlarge.c -@@ -33,7 +33,7 @@ __libc_dynarray_emplace_enlarge (struct dynarray_header *list, - size. */ - if (element_size < 4) - new_allocated = 16; -- if (element_size < 8) -+ else if (element_size < 8) - new_allocated = 8; - else - new_allocated = 4; diff --git a/glibc-libc-pointer-arith.patch b/glibc-libc-pointer-arith.patch deleted file mode 100644 index 9522c3e..0000000 --- a/glibc-libc-pointer-arith.patch +++ /dev/null @@ -1,17 +0,0 @@ -Add to simplify backports. - -Introduced upstream as part of this commit: - -commit 9090848d0607e93fb08a1d68d9f263846ee33f02 -Author: Zack Weinberg -Date: Sun Feb 26 20:17:52 2017 -0500 - - Narrowing the visibility of libc-internal.h even further. - -diff --git a/include/libc-pointer-arith.h b/include/libc-pointer-arith.h -new file mode 100644 -index 0000000000000000..5876a41e8e5fcc15 ---- /dev/null -+++ b/include/libc-pointer-arith.h -@@ -0,0 +1 @@ -+#include diff --git a/glibc-rh1315108-glob.patch b/glibc-rh1315108-glob.patch new file mode 100644 index 0000000..1197baa --- /dev/null +++ b/glibc-rh1315108-glob.patch @@ -0,0 +1,271 @@ +commit 5a79f97554af6f2eb0a654f844b3d1f56937064d +Author: Adhemerval Zanella +Date: Mon Sep 4 17:00:03 2017 -0300 + + posix: Fix getpwnam_r usage (BZ #1062) + + This patch fixes longstanding misuse of errno after getpwnam_r, + which returns an error number rather than setting errno. This is + sync with gnulib commit 5db9301. + + Checked on x86_64-linux-gnu and on a build using build-many-glibcs.py + for all major architectures. + + [BZ #1062] + * posix/glob.c (glob): Port recent patches to platforms + lacking getpwnam_r. + (glob): Fix longstanding misuse of errno after getpwnam_r, which + returns an error number rather than setting errno. + +diff --git a/posix/glob.c b/posix/glob.c +index c761c0861ddb49ea..70434745f57f8ff5 100644 +--- a/posix/glob.c ++++ b/posix/glob.c +@@ -15,10 +15,6 @@ + License along with the GNU C Library; if not, see + . */ + +-#ifndef _LIBC +-# include +-#endif +- + #include + + #include +@@ -39,10 +35,6 @@ + #endif + + #include +-#ifndef __set_errno +-# define __set_errno(val) errno = (val) +-#endif +- + #include + #include + #include +@@ -78,12 +70,8 @@ + + #include + #include ++#include + +-#ifdef _SC_GETPW_R_SIZE_MAX +-# define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX) +-#else +-# define GETPW_R_SIZE_MAX() (-1) +-#endif + #ifdef _SC_LOGIN_NAME_MAX + # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX) + #else +@@ -651,97 +639,36 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), + if (success) + { + struct passwd *p; +- char *malloc_pwtmpbuf = NULL; +- char *pwtmpbuf; ++ struct scratch_buffer pwtmpbuf; ++ scratch_buffer_init (&pwtmpbuf); + # if defined HAVE_GETPWNAM_R || defined _LIBC +- long int pwbuflenmax = GETPW_R_SIZE_MAX (); +- size_t pwbuflen = pwbuflenmax; + struct passwd pwbuf; +- int save = errno; + +-# ifndef _LIBC +- if (! (0 < pwbuflenmax && pwbuflenmax <= SIZE_MAX)) +- /* 'sysconf' does not support _SC_GETPW_R_SIZE_MAX. +- Try a moderate value. */ +- pwbuflen = 1024; +-# endif +- if (glob_use_alloca (alloca_used, pwbuflen)) +- pwtmpbuf = alloca_account (pwbuflen, alloca_used); +- else ++ while (getpwnam_r (name, &pwbuf, ++ pwtmpbuf.data, pwtmpbuf.length, &p) ++ == ERANGE) + { +- pwtmpbuf = malloc (pwbuflen); +- if (pwtmpbuf == NULL) ++ if (!scratch_buffer_grow (&pwtmpbuf)) + { +- if (__glibc_unlikely (malloc_name)) +- free (name); + retval = GLOB_NOSPACE; + goto out; + } +- malloc_pwtmpbuf = pwtmpbuf; +- } +- +- while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) +- != 0) +- { +- size_t newlen; +- bool v; +- if (errno != ERANGE) +- { +- p = NULL; +- break; +- } +- v = size_add_wrapv (pwbuflen, pwbuflen, &newlen); +- if (!v && malloc_pwtmpbuf == NULL +- && glob_use_alloca (alloca_used, newlen)) +- pwtmpbuf = extend_alloca_account (pwtmpbuf, pwbuflen, +- newlen, alloca_used); +- else +- { +- char *newp = (v ? NULL +- : realloc (malloc_pwtmpbuf, newlen)); +- if (newp == NULL) +- { +- free (malloc_pwtmpbuf); +- if (__glibc_unlikely (malloc_name)) +- free (name); +- retval = GLOB_NOSPACE; +- goto out; +- } +- malloc_pwtmpbuf = pwtmpbuf = newp; +- } +- pwbuflen = newlen; +- __set_errno (save); + } + # else + p = getpwnam (name); + # endif +- if (__glibc_unlikely (malloc_name)) +- free (name); + if (p != NULL) + { +- if (malloc_pwtmpbuf == NULL) +- home_dir = p->pw_dir; +- else ++ home_dir = strdup (p->pw_dir); ++ malloc_home_dir = 1; ++ if (home_dir == NULL) + { +- size_t home_dir_len = strlen (p->pw_dir) + 1; +- if (glob_use_alloca (alloca_used, home_dir_len)) +- home_dir = alloca_account (home_dir_len, +- alloca_used); +- else +- { +- home_dir = malloc (home_dir_len); +- if (home_dir == NULL) +- { +- free (pwtmpbuf); +- retval = GLOB_NOSPACE; +- goto out; +- } +- malloc_home_dir = 1; +- } +- memcpy (home_dir, p->pw_dir, home_dir_len); ++ scratch_buffer_free (&pwtmpbuf); ++ retval = GLOB_NOSPACE; ++ goto out; + } + } +- free (malloc_pwtmpbuf); ++ scratch_buffer_free (&pwtmpbuf); + } + else + { +@@ -878,61 +805,21 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), + /* Look up specific user's home directory. */ + { + struct passwd *p; +- char *malloc_pwtmpbuf = NULL; ++ struct scratch_buffer pwtmpbuf; ++ scratch_buffer_init (&pwtmpbuf); ++ + # if defined HAVE_GETPWNAM_R || defined _LIBC +- long int buflenmax = GETPW_R_SIZE_MAX (); +- size_t buflen = buflenmax; +- char *pwtmpbuf; + struct passwd pwbuf; +- int save = errno; +- +-# ifndef _LIBC +- if (! (0 <= buflenmax && buflenmax <= SIZE_MAX)) +- /* Perhaps 'sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a +- moderate value. */ +- buflen = 1024; +-# endif +- if (glob_use_alloca (alloca_used, buflen)) +- pwtmpbuf = alloca_account (buflen, alloca_used); +- else ++ ++ while (getpwnam_r (user_name, &pwbuf, ++ pwtmpbuf.data, pwtmpbuf.length, &p) ++ == ERANGE) + { +- pwtmpbuf = malloc (buflen); +- if (pwtmpbuf == NULL) ++ if (!scratch_buffer_grow (&pwtmpbuf)) + { +- nomem_getpw: +- if (__glibc_unlikely (malloc_user_name)) +- free (user_name); + retval = GLOB_NOSPACE; + goto out; + } +- malloc_pwtmpbuf = pwtmpbuf; +- } +- +- while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) +- { +- size_t newlen; +- bool v; +- if (errno != ERANGE) +- { +- p = NULL; +- break; +- } +- v = size_add_wrapv (buflen, buflen, &newlen); +- if (!v && malloc_pwtmpbuf == NULL +- && glob_use_alloca (alloca_used, newlen)) +- pwtmpbuf = extend_alloca_account (pwtmpbuf, buflen, +- newlen, alloca_used); +- else +- { +- char *newp = v ? NULL : realloc (malloc_pwtmpbuf, newlen); +- if (newp == NULL) +- { +- free (malloc_pwtmpbuf); +- goto nomem_getpw; +- } +- malloc_pwtmpbuf = pwtmpbuf = newp; +- } +- __set_errno (save); + } + # else + p = getpwnam (user_name); +@@ -959,7 +846,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), + dirname = malloc (home_len + rest_len + 1); + if (dirname == NULL) + { +- free (malloc_pwtmpbuf); ++ scratch_buffer_free (&pwtmpbuf); + retval = GLOB_NOSPACE; + goto out; + } +@@ -970,13 +857,9 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), + + dirlen = home_len + rest_len; + dirname_modified = 1; +- +- free (malloc_pwtmpbuf); + } + else + { +- free (malloc_pwtmpbuf); +- + if (flags & GLOB_TILDE_CHECK) + { + /* We have to regard it as an error if we cannot find the +@@ -985,6 +868,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), + goto out; + } + } ++ scratch_buffer_free (&pwtmpbuf); + } + #endif /* !WINDOWS32 */ + } diff --git a/glibc-rh1315108.patch b/glibc-rh1315108.patch index a7b0725..4fa0698 100644 --- a/glibc-rh1315108.patch +++ b/glibc-rh1315108.patch @@ -156,16 +156,6 @@ Date: Sun Mar 1 19:48:31 2015 +0100 * posix/wordexp.c (parse_tilde): Use struct scratch_buffer instead of extend_alloca. -commit 7b4c16db30304b83a5d1e913d1a8f7e90a8c398c -Author: Florian Weimer -Date: Sun Mar 1 19:49:50 2015 +0100 - - glob: Rewrite to use struct scratch_buffer instead of extend_alloca - - [BZ #18023] - * posix/glob.c (glob): Use struct scratch_buffer instead of - extend_alloca. - commit 683543bbb3e2c1b17554c4096d00c2980f39a802 Author: Florian Weimer Date: Sun Mar 1 23:22:45 2015 +0100 @@ -249,8 +239,9 @@ Date: Sun Mar 1 23:22:45 2015 +0100 [BZ #18023] * include/alloca.h (stackinfo_alloca_round, extend_alloca, extend_alloca_account): Remove. -Index: b/elf/dl-deps.c -=================================================================== + +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 1b8bac65932a7713..bc59f0ff7b4d7c61 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -27,6 +27,7 @@ @@ -261,7 +252,7 @@ Index: b/elf/dl-deps.c #include -@@ -184,9 +185,8 @@ _dl_map_object_deps (struct link_map *ma +@@ -184,9 +185,8 @@ _dl_map_object_deps (struct link_map *map, /* Pointer to last unique object. */ tail = &known[nlist - 1]; @@ -273,7 +264,7 @@ Index: b/elf/dl-deps.c /* Process each element of the search list, loading each of its auxiliary objects and immediate dependencies. Auxiliary objects -@@ -217,13 +217,12 @@ _dl_map_object_deps (struct link_map *ma +@@ -217,13 +217,12 @@ _dl_map_object_deps (struct link_map *map, if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL && l != map && l->l_ldnum > 0) { @@ -293,7 +284,7 @@ Index: b/elf/dl-deps.c } if (l->l_info[DT_NEEDED] || l->l_info[AUXTAG] || l->l_info[FILTERTAG]) -@@ -463,8 +462,11 @@ _dl_map_object_deps (struct link_map *ma +@@ -463,8 +462,11 @@ _dl_map_object_deps (struct link_map *map, struct link_map **l_initfini = (struct link_map **) malloc ((2 * nneeded + 1) * sizeof needed[0]); if (l_initfini == NULL) @@ -307,7 +298,7 @@ Index: b/elf/dl-deps.c l_initfini[0] = l; memcpy (&l_initfini[1], needed, nneeded * sizeof needed[0]); memcpy (&l_initfini[nneeded + 1], l_initfini, -@@ -482,6 +484,8 @@ _dl_map_object_deps (struct link_map *ma +@@ -482,6 +484,8 @@ _dl_map_object_deps (struct link_map *map, } out: @@ -316,8 +307,8 @@ Index: b/elf/dl-deps.c if (errno == 0 && errno_saved != 0) __set_errno (errno_saved); -Index: b/include/alloca.h -=================================================================== +diff --git a/include/alloca.h b/include/alloca.h +index fd90664f0a17cd6d..c0b83954436ed4c1 100644 --- a/include/alloca.h +++ b/include/alloca.h @@ -23,57 +23,17 @@ libc_hidden_proto (__libc_alloca_cutoff) @@ -378,11 +369,11 @@ Index: b/include/alloca.h #endif # endif /* !_ISOMAC */ -Index: b/nis/nss_compat/compat-initgroups.c -=================================================================== +diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c +index 1b37e0c295f481df..cc3db7889ba289db 100644 --- a/nis/nss_compat/compat-initgroups.c +++ b/nis/nss_compat/compat-initgroups.c -@@ -310,7 +310,6 @@ getgrent_next_nss (ent_t *ent, char *buf +@@ -310,7 +310,6 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user, overwrite the pointer with one to a bigger buffer. */ char *tmpbuf = buffer; size_t tmplen = buflen; @@ -390,7 +381,7 @@ Index: b/nis/nss_compat/compat-initgroups.c for (int i = 0; i < mystart; i++) { -@@ -319,29 +318,26 @@ getgrent_next_nss (ent_t *ent, char *buf +@@ -319,29 +318,26 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user, == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) { @@ -440,7 +431,7 @@ Index: b/nis/nss_compat/compat-initgroups.c } if (__builtin_expect (status != NSS_STATUS_NOTFOUND, 1)) -@@ -369,7 +365,7 @@ getgrent_next_nss (ent_t *ent, char *buf +@@ -369,7 +365,7 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user, status = NSS_STATUS_NOTFOUND; done: @@ -449,8 +440,8 @@ Index: b/nis/nss_compat/compat-initgroups.c free (tmpbuf); } -Index: b/nis/nss_nis/nis-initgroups.c -=================================================================== +diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c +index 3784c101f7ee31aa..c872b32e15f55e3d 100644 --- a/nis/nss_nis/nis-initgroups.c +++ b/nis/nss_nis/nis-initgroups.c @@ -16,7 +16,6 @@ @@ -469,7 +460,7 @@ Index: b/nis/nss_nis/nis-initgroups.c #include "nss-nis.h" #include -@@ -120,27 +120,30 @@ internal_getgrent_r (struct group *grp, +@@ -120,27 +120,30 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen, static int get_uid (const char *user, uid_t *uidp) { @@ -504,7 +495,7 @@ Index: b/nis/nss_nis/nis-initgroups.c return 1; } -@@ -254,8 +257,6 @@ _nss_nis_initgroups_dyn (const char *use +@@ -254,8 +257,6 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start, } struct group grpbuf, *g; @@ -513,7 +504,7 @@ Index: b/nis/nss_nis/nis-initgroups.c enum nss_status status; intern_t intern = { NULL, NULL, 0 }; gid_t *groups = *groupsp; -@@ -264,15 +265,21 @@ _nss_nis_initgroups_dyn (const char *use +@@ -264,15 +265,21 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start, if (status != NSS_STATUS_SUCCESS) return status; @@ -546,8 +537,8 @@ Index: b/nis/nss_nis/nis-initgroups.c return status; } -Index: b/nscd/aicache.c -=================================================================== +diff --git a/nscd/aicache.c b/nscd/aicache.c +index 7bf4131979451040..ea29b1c3d99bb530 100644 --- a/nscd/aicache.c +++ b/nscd/aicache.c @@ -27,6 +27,7 @@ @@ -558,7 +549,7 @@ Index: b/nscd/aicache.c #include "dbg_log.h" #include "nscd.h" -@@ -113,10 +114,13 @@ addhstaiX (struct database_dyn *db, int +@@ -113,10 +114,13 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, int old_res_options = _res.options; _res.options &= ~DEPRECATED_RES_USE_INET6; @@ -576,7 +567,7 @@ Index: b/nscd/aicache.c int32_t ttl = INT32_MAX; ssize_t total = 0; char *key_copy = NULL; -@@ -129,6 +133,7 @@ addhstaiX (struct database_dyn *db, int +@@ -129,6 +133,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, int status[2] = { NSS_STATUS_UNAVAIL, NSS_STATUS_UNAVAIL }; int naddrs = 0; size_t addrslen = 0; @@ -584,7 +575,7 @@ Index: b/nscd/aicache.c char *canon = NULL; size_t canonlen; -@@ -143,12 +148,17 @@ addhstaiX (struct database_dyn *db, int +@@ -143,12 +148,17 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, at = &atmem; rc6 = 0; herrno = 0; @@ -604,7 +595,7 @@ Index: b/nscd/aicache.c } if (rc6 != 0 && herrno == NETDB_INTERNAL) -@@ -226,41 +236,38 @@ addhstaiX (struct database_dyn *db, int +@@ -226,41 +236,38 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, while (1) { rc6 = 0; @@ -662,7 +653,7 @@ Index: b/nscd/aicache.c } if (rc4 != 0 && herrno == NETDB_INTERNAL) -@@ -286,13 +293,11 @@ addhstaiX (struct database_dyn *db, int +@@ -286,13 +293,11 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, cfct = __nss_lookup_function (nip, "getcanonname_r"); if (cfct != NULL) { @@ -678,7 +669,7 @@ Index: b/nscd/aicache.c == NSS_STATUS_SUCCESS) canon = s; else -@@ -321,18 +326,20 @@ addhstaiX (struct database_dyn *db, int +@@ -321,18 +326,20 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, addrfamily = AF_INET6; } @@ -715,11 +706,11 @@ Index: b/nscd/aicache.c return timeout; } -Index: b/nscd/connections.c -=================================================================== +diff --git a/nscd/connections.c b/nscd/connections.c +index 26d2c0091b8f320d..9615c159285f0044 100644 --- a/nscd/connections.c +++ b/nscd/connections.c -@@ -1353,64 +1353,83 @@ request from '%s' [%ld] not handled due +@@ -1353,64 +1353,83 @@ request from '%s' [%ld] not handled due to missing permission"), } } @@ -739,20 +730,19 @@ Index: b/nscd/connections.c - size_t readlen = 0; int fd = open ("/proc/self/cmdline", O_RDONLY); - if (fd == -1) -- { -- dbg_log (_("\ --cannot open /proc/self/cmdline: %s; disabling paranoia mode"), -- strerror (errno)); -- -- paranoia = 0; -- return; + if (fd < 0) + return NULL; + size_t current = 0; + size_t limit = 1024; + char *buffer = malloc (limit); + if (buffer == NULL) -+ { + { +- dbg_log (_("\ +-cannot open /proc/self/cmdline: %s; disabling paranoia mode"), +- strerror (errno)); +- +- paranoia = 0; +- return; + close (fd); + errno = ENOMEM; + return NULL; @@ -842,7 +832,7 @@ Index: b/nscd/connections.c { argv[argc++] = cp; cp = (char *) rawmemchr (cp, '\0') + 1; -@@ -1427,6 +1446,7 @@ cannot change to old UID: %s; disabling +@@ -1427,6 +1446,7 @@ cannot change to old UID: %s; disabling paranoia mode"), strerror (errno)); paranoia = 0; @@ -850,7 +840,7 @@ Index: b/nscd/connections.c return; } -@@ -1438,6 +1458,7 @@ cannot change to old GID: %s; disabling +@@ -1438,6 +1458,7 @@ cannot change to old GID: %s; disabling paranoia mode"), ignore_value (setuid (server_uid)); paranoia = 0; @@ -858,7 +848,7 @@ Index: b/nscd/connections.c return; } } -@@ -1455,6 +1476,7 @@ cannot change to old working directory: +@@ -1455,6 +1476,7 @@ cannot change to old working directory: %s; disabling paranoia mode"), ignore_value (setgid (server_gid)); } paranoia = 0; @@ -866,7 +856,7 @@ Index: b/nscd/connections.c return; } -@@ -1503,6 +1525,7 @@ cannot change to old working directory: +@@ -1503,6 +1525,7 @@ cannot change to old working directory: %s; disabling paranoia mode"), dbg_log (_("cannot change current working directory to \"/\": %s"), strerror (errno)); paranoia = 0; @@ -874,8 +864,8 @@ Index: b/nscd/connections.c /* Reenable the databases. */ time_t now = time (NULL); -Index: b/nscd/grpcache.c -=================================================================== +diff --git a/nscd/grpcache.c b/nscd/grpcache.c +index d2ad53509db97bdf..a71036512048dd81 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -16,7 +16,6 @@ @@ -894,7 +884,7 @@ Index: b/nscd/grpcache.c #include "nscd.h" #include "dbg_log.h" -@@ -448,12 +448,12 @@ addgrbyX (struct database_dyn *db, int f +@@ -448,12 +448,12 @@ addgrbyX (struct database_dyn *db, int fd, request_header *req, look again in the table whether the dataset is now available. We simply insert it. It does not matter if it is in there twice. The pruning function only will look at the timestamp. */ @@ -910,7 +900,7 @@ Index: b/nscd/grpcache.c if (__glibc_unlikely (debug_level > 0)) { -@@ -463,43 +463,24 @@ addgrbyX (struct database_dyn *db, int f +@@ -463,43 +463,24 @@ addgrbyX (struct database_dyn *db, int fd, request_header *req, dbg_log (_("Reloading \"%s\" in group cache!"), keystr); } @@ -969,8 +959,8 @@ Index: b/nscd/grpcache.c return timeout; } -Index: b/nscd/hstcache.c -=================================================================== +diff --git a/nscd/hstcache.c b/nscd/hstcache.c +index 9f6ce979ac333265..d0af99893dd17b9f 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -34,6 +34,7 @@ @@ -981,7 +971,7 @@ Index: b/nscd/hstcache.c #include "nscd.h" #include "dbg_log.h" -@@ -463,11 +464,8 @@ addhstbyX (struct database_dyn *db, int +@@ -463,11 +464,8 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req, look again in the table whether the dataset is now available. We simply insert it. It does not matter if it is in there twice. The pruning function only will look at the timestamp. */ @@ -993,7 +983,7 @@ Index: b/nscd/hstcache.c int errval = 0; int32_t ttl = INT32_MAX; -@@ -487,46 +485,30 @@ addhstbyX (struct database_dyn *db, int +@@ -487,46 +485,30 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req, dbg_log (_("Reloading \"%s\" in hosts cache!"), (char *) str); } @@ -1059,8 +1049,8 @@ Index: b/nscd/hstcache.c return timeout; } -Index: b/nscd/pwdcache.c -=================================================================== +diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c +index 721f4c617b0bb74a..9349b54df4241ad5 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -16,7 +16,6 @@ @@ -1079,7 +1069,7 @@ Index: b/nscd/pwdcache.c #include "nscd.h" #include "dbg_log.h" -@@ -426,12 +426,11 @@ addpwbyX (struct database_dyn *db, int f +@@ -426,12 +426,11 @@ addpwbyX (struct database_dyn *db, int fd, request_header *req, look again in the table whether the dataset is now available. We simply insert it. It does not matter if it is in there twice. The pruning function only will look at the timestamp. */ @@ -1094,7 +1084,7 @@ Index: b/nscd/pwdcache.c if (__glibc_unlikely (debug_level > 0)) { -@@ -441,45 +440,26 @@ addpwbyX (struct database_dyn *db, int f +@@ -441,45 +440,26 @@ addpwbyX (struct database_dyn *db, int fd, request_header *req, dbg_log (_("Reloading \"%s\" in password cache!"), keystr); } @@ -1155,8 +1145,8 @@ Index: b/nscd/pwdcache.c return timeout; } -Index: b/nscd/servicescache.c -=================================================================== +diff --git a/nscd/servicescache.c b/nscd/servicescache.c +index 131ba6ddcc1a5f7a..549e9a446816d760 100644 --- a/nscd/servicescache.c +++ b/nscd/servicescache.c @@ -16,7 +16,6 @@ @@ -1175,7 +1165,7 @@ Index: b/nscd/servicescache.c #include "nscd.h" #include "dbg_log.h" -@@ -374,12 +374,11 @@ addservbyX (struct database_dyn *db, int +@@ -374,12 +374,11 @@ addservbyX (struct database_dyn *db, int fd, request_header *req, look again in the table whether the dataset is now available. We simply insert it. It does not matter if it is in there twice. The pruning function only will look at the timestamp. */ @@ -1190,7 +1180,7 @@ Index: b/nscd/servicescache.c if (__glibc_unlikely (debug_level > 0)) { -@@ -389,43 +388,24 @@ addservbyX (struct database_dyn *db, int +@@ -389,43 +388,24 @@ addservbyX (struct database_dyn *db, int fd, request_header *req, dbg_log (_("Reloading \"%s\" in services cache!"), key); } @@ -1249,8 +1239,8 @@ Index: b/nscd/servicescache.c return timeout; } -Index: b/nss/getent.c -=================================================================== +diff --git a/nss/getent.c b/nss/getent.c +index 8f8c3fe80a2cfea6..5654c5f67c4f118c 100644 --- a/nss/getent.c +++ b/nss/getent.c @@ -39,6 +39,7 @@ @@ -1303,7 +1293,7 @@ Index: b/nss/getent.c printf ("%-21s", key[i]); for (int j = 0; j < n; ++j) if (grps[j] != -1) -@@ -508,6 +513,8 @@ initgroups_keys (int number, char *key[] +@@ -508,6 +513,8 @@ initgroups_keys (int number, char *key[]) putchar_unlocked ('\n'); } @@ -1312,111 +1302,8 @@ Index: b/nss/getent.c return 0; } -Index: b/nss/nss_files/files-hosts.c -=================================================================== ---- a/nss/nss_files/files-hosts.c -+++ b/nss/nss_files/files-hosts.c -@@ -22,7 +22,7 @@ - #include - #include - #include -- -+#include - - /* Get implementation for some internal functions. */ - #include "../resolv/mapv4v6addr.h" -@@ -145,15 +145,12 @@ _nss_files_gethostbyname3_r (const char - && _res_hconf.flags & HCONF_FLAG_MULTI) - { - /* We have to get all host entries from the file. */ -- size_t tmp_buflen = MIN (buflen, 4096); -- char tmp_buffer_stack[tmp_buflen] -- __attribute__ ((__aligned__ (__alignof__ (struct hostent_data)))); -- char *tmp_buffer = tmp_buffer_stack; - struct hostent tmp_result_buf; - int naddrs = 1; - int naliases = 0; - char *bufferend; -- bool tmp_buffer_malloced = false; -+ struct scratch_buffer tmpbuf; -+ scratch_buffer_init (&tmpbuf); - - while (result->h_aliases[naliases] != NULL) - ++naliases; -@@ -161,9 +158,9 @@ _nss_files_gethostbyname3_r (const char - bufferend = (char *) &result->h_aliases[naliases + 1]; - - again: -- while ((status = internal_getent (stream, &tmp_result_buf, tmp_buffer, -- tmp_buflen, errnop, herrnop, af, -- flags)) -+ while ((status = internal_getent (stream, &tmp_result_buf, -+ tmpbuf.data, tmpbuf.length, -+ errnop, herrnop, af, flags)) - == NSS_STATUS_SUCCESS) - { - int matches = 1; -@@ -287,54 +284,13 @@ _nss_files_gethostbyname3_r (const char - } - } - -- if (status == NSS_STATUS_TRYAGAIN) -- { -- size_t newsize = 2 * tmp_buflen; -- if (tmp_buffer_malloced) -- { -- char *newp = realloc (tmp_buffer, newsize); -- if (newp != NULL) -- { -- assert ((((uintptr_t) newp) -- & (__alignof__ (struct hostent_data) - 1)) -- == 0); -- tmp_buffer = newp; -- tmp_buflen = newsize; -- goto again; -- } -- } -- else if (!__libc_use_alloca (buflen + newsize)) -- { -- tmp_buffer = malloc (newsize); -- if (tmp_buffer != NULL) -- { -- assert ((((uintptr_t) tmp_buffer) -- & (__alignof__ (struct hostent_data) - 1)) -- == 0); -- tmp_buffer_malloced = true; -- tmp_buflen = newsize; -- goto again; -- } -- } -- else -- { -- tmp_buffer -- = extend_alloca (tmp_buffer, tmp_buflen, -- newsize -- + __alignof__ (struct hostent_data)); -- tmp_buffer = (char *) (((uintptr_t) tmp_buffer -- + __alignof__ (struct hostent_data) -- - 1) -- & ~(__alignof__ (struct hostent_data) -- - 1)); -- goto again; -- } -- } -+ if (status == NSS_STATUS_TRYAGAIN -+ && scratch_buffer_grow (&tmpbuf)) -+ goto again; - else - status = NSS_STATUS_SUCCESS; - out: -- if (tmp_buffer_malloced) -- free (tmp_buffer); -+ scratch_buffer_free (&tmpbuf); - } - - internal_endent (&stream); -Index: b/nss/nss_files/files-initgroups.c -=================================================================== +diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c +index 27cd8ece40434f5c..8a88f1b62357d3bd 100644 --- a/nss/nss_files/files-initgroups.c +++ b/nss/nss_files/files-initgroups.c @@ -16,7 +16,6 @@ @@ -1435,7 +1322,7 @@ Index: b/nss/nss_files/files-initgroups.c enum nss_status _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, -@@ -46,9 +46,8 @@ _nss_files_initgroups_dyn (const char *u +@@ -46,9 +46,8 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, enum nss_status status = NSS_STATUS_SUCCESS; bool any = false; @@ -1447,7 +1334,7 @@ Index: b/nss/nss_files/files-initgroups.c gid_t *groups = *groupsp; -@@ -67,26 +66,16 @@ _nss_files_initgroups_dyn (const char *u +@@ -67,26 +66,16 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, } struct group grp; @@ -1480,7 +1367,7 @@ Index: b/nss/nss_files/files-initgroups.c /* Reread current line, the parser has clobbered it. */ fsetpos (stream, &pos); continue; -@@ -132,8 +121,7 @@ _nss_files_initgroups_dyn (const char *u +@@ -132,8 +121,7 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, out: /* Free memory. */ @@ -1490,241 +1377,8 @@ Index: b/nss/nss_files/files-initgroups.c free (line); fclose (stream); -Index: b/posix/glob.c -=================================================================== ---- a/posix/glob.c -+++ b/posix/glob.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - - /* Outcomment the following line for production quality code. */ - /* #define NDEBUG 1 */ -@@ -293,7 +294,7 @@ glob (const char *pattern, int flags, in - glob_t dirs; - int retval = 0; - #ifdef _LIBC -- size_t alloca_used = 0; -+ size_t alloca_used = sizeof (struct scratch_buffer); - #endif - - if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) -@@ -637,33 +638,13 @@ glob (const char *pattern, int flags, in - { - struct passwd *p; - # if defined HAVE_GETPWNAM_R || defined _LIBC -- long int pwbuflen = GETPW_R_SIZE_MAX (); -- char *pwtmpbuf; - struct passwd pwbuf; -- int malloc_pwtmpbuf = 0; - int save = errno; -+ struct scratch_buffer pwtmpbuf; -+ scratch_buffer_init (&pwtmpbuf); - --# ifndef _LIBC -- if (pwbuflen == -1) -- /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. -- Try a moderate value. */ -- pwbuflen = 1024; --# endif -- if (__libc_use_alloca (alloca_used + pwbuflen)) -- pwtmpbuf = alloca_account (pwbuflen, alloca_used); -- else -- { -- pwtmpbuf = malloc (pwbuflen); -- if (pwtmpbuf == NULL) -- { -- retval = GLOB_NOSPACE; -- goto out; -- } -- malloc_pwtmpbuf = 1; -- } -- -- while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) -- != 0) -+ while (getpwnam_r (name, &pwbuf, -+ pwtmpbuf.data, pwtmpbuf.length, &p) != 0) - { - if (errno != ERANGE) - { -@@ -671,67 +652,37 @@ glob (const char *pattern, int flags, in - break; - } - -- if (!malloc_pwtmpbuf -- && __libc_use_alloca (alloca_used -- + 2 * pwbuflen)) -- pwtmpbuf = extend_alloca_account (pwtmpbuf, pwbuflen, -- 2 * pwbuflen, -- alloca_used); -- else -+ if (!scratch_buffer_grow (&pwtmpbuf)) - { -- char *newp = realloc (malloc_pwtmpbuf -- ? pwtmpbuf : NULL, -- 2 * pwbuflen); -- if (newp == NULL) -- { -- if (__glibc_unlikely (malloc_pwtmpbuf)) -- free (pwtmpbuf); -- retval = GLOB_NOSPACE; -- goto out; -- } -- pwtmpbuf = newp; -- pwbuflen = 2 * pwbuflen; -- malloc_pwtmpbuf = 1; -+ retval = GLOB_NOSPACE; -+ goto out; - } - __set_errno (save); - } - # else -- p = getpwnam (name); -+ p = getpwnam (namebuf.data); - # endif - if (p != NULL) - { -- if (!malloc_pwtmpbuf) -- home_dir = p->pw_dir; -- else -+ home_dir = strdup (p->pw_dir); -+ malloc_home_dir = 1; -+ if (home_dir == NULL) - { -- size_t home_dir_len = strlen (p->pw_dir) + 1; -- if (__libc_use_alloca (alloca_used + home_dir_len)) -- home_dir = alloca_account (home_dir_len, -- alloca_used); -- else -- { -- home_dir = malloc (home_dir_len); -- if (home_dir == NULL) -- { -- free (pwtmpbuf); -- retval = GLOB_NOSPACE; -- goto out; -- } -- malloc_home_dir = 1; -- } -- memcpy (home_dir, p->pw_dir, home_dir_len); -- -- free (pwtmpbuf); -+ scratch_buffer_free (&pwtmpbuf); -+ retval = GLOB_NOSPACE; -+ goto out; - } - } -+ scratch_buffer_free (&pwtmpbuf); - } - } - if (home_dir == NULL || home_dir[0] == '\0') - { -+ if (malloc_home_dir) -+ free (home_dir); -+ malloc_home_dir = 0; - if (flags & GLOB_TILDE_CHECK) - { -- if (__glibc_unlikely (malloc_home_dir)) -- free (home_dir); - retval = GLOB_NOMATCH; - goto out; - } -@@ -852,57 +803,24 @@ glob (const char *pattern, int flags, in - { - struct passwd *p; - # if defined HAVE_GETPWNAM_R || defined _LIBC -- long int buflen = GETPW_R_SIZE_MAX (); -- char *pwtmpbuf; -- int malloc_pwtmpbuf = 0; - struct passwd pwbuf; - int save = errno; -+ struct scratch_buffer pwtmpbuf; -+ scratch_buffer_init (&pwtmpbuf); - --# ifndef _LIBC -- if (buflen == -1) -- /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a -- moderate value. */ -- buflen = 1024; --# endif -- if (__libc_use_alloca (alloca_used + buflen)) -- pwtmpbuf = alloca_account (buflen, alloca_used); -- else -- { -- pwtmpbuf = malloc (buflen); -- if (pwtmpbuf == NULL) -- { -- nomem_getpw: -- if (__glibc_unlikely (malloc_user_name)) -- free (user_name); -- retval = GLOB_NOSPACE; -- goto out; -- } -- malloc_pwtmpbuf = 1; -- } -- -- while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) -+ while (getpwnam_r (user_name, &pwbuf, -+ pwtmpbuf.data, pwtmpbuf.length, &p) != 0) - { - if (errno != ERANGE) - { - p = NULL; - break; - } -- if (!malloc_pwtmpbuf -- && __libc_use_alloca (alloca_used + 2 * buflen)) -- pwtmpbuf = extend_alloca_account (pwtmpbuf, buflen, -- 2 * buflen, alloca_used); -- else -+ -+ if (!scratch_buffer_grow (&pwtmpbuf)) - { -- char *newp = realloc (malloc_pwtmpbuf ? pwtmpbuf : NULL, -- 2 * buflen); -- if (newp == NULL) -- { -- if (__glibc_unlikely (malloc_pwtmpbuf)) -- free (pwtmpbuf); -- goto nomem_getpw; -- } -- pwtmpbuf = newp; -- malloc_pwtmpbuf = 1; -+ retval = GLOB_NOSPACE; -+ goto out; - } - __set_errno (save); - } -@@ -931,8 +849,7 @@ glob (const char *pattern, int flags, in - dirname = malloc (home_len + rest_len + 1); - if (dirname == NULL) - { -- if (__glibc_unlikely (malloc_pwtmpbuf)) -- free (pwtmpbuf); -+ scratch_buffer_free (&pwtmpbuf); - retval = GLOB_NOSPACE; - goto out; - } -@@ -944,13 +861,11 @@ glob (const char *pattern, int flags, in - dirlen = home_len + rest_len; - dirname_modified = 1; - -- if (__glibc_unlikely (malloc_pwtmpbuf)) -- free (pwtmpbuf); -+ scratch_buffer_free (&pwtmpbuf); - } - else - { -- if (__glibc_unlikely (malloc_pwtmpbuf)) -- free (pwtmpbuf); -+ scratch_buffer_free (&pwtmpbuf); - - if (flags & GLOB_TILDE_CHECK) - /* We have to regard it as an error if we cannot find the -Index: b/posix/wordexp.c -=================================================================== +diff --git a/posix/wordexp.c b/posix/wordexp.c +index ba3f3ed4b66a6507..c4a6a209f416a9fb 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -17,7 +17,6 @@ @@ -1743,7 +1397,7 @@ Index: b/posix/wordexp.c #include #include <_itoa.h> -@@ -308,12 +308,7 @@ parse_tilde (char **word, size_t *word_l +@@ -308,12 +308,7 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length, if (i == 1 + *offset) { /* Tilde appears on its own */ @@ -1756,7 +1410,7 @@ Index: b/posix/wordexp.c /* POSIX.2 says ~ expands to $HOME and if HOME is unset the results are unspecified. We do a lookup on the uid if -@@ -328,25 +323,38 @@ parse_tilde (char **word, size_t *word_l +@@ -328,25 +323,38 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length, } else { @@ -1802,7 +1456,7 @@ Index: b/posix/wordexp.c } } else -@@ -354,13 +362,15 @@ parse_tilde (char **word, size_t *word_l +@@ -354,13 +362,15 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length, /* Look up user name in database to get home directory */ char *user = strndupa (&words[1 + *offset], i - (1 + *offset)); struct passwd pwd, *tpwd; @@ -1822,7 +1476,7 @@ Index: b/posix/wordexp.c if (result == 0 && tpwd != NULL && pwd.pw_dir) *word = w_addstr (*word, word_length, max_length, pwd.pw_dir); -@@ -372,6 +382,8 @@ parse_tilde (char **word, size_t *word_l +@@ -372,6 +382,8 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length, *word = w_addstr (*word, word_length, max_length, user); } @@ -1831,8 +1485,8 @@ Index: b/posix/wordexp.c *offset = i - 1; } return *word ? 0 : WRDE_NOSPACE; -Index: b/sysdeps/unix/sysv/linux/gethostid.c -=================================================================== +diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c +index cc108aa2d64b616a..3529cf6fe509cfd1 100644 --- a/sysdeps/unix/sysv/linux/gethostid.c +++ b/sysdeps/unix/sysv/linux/gethostid.c @@ -63,13 +63,12 @@ sethostid (long int id) @@ -1885,8 +1539,8 @@ Index: b/sysdeps/unix/sysv/linux/gethostid.c /* For the return value to be not exactly the IP address we do some bit fiddling. */ return (int32_t) (in.s_addr << 16 | in.s_addr >> 16); -Index: b/sysdeps/unix/sysv/linux/getlogin_r.c -=================================================================== +diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c +index 05ac36b49186b29e..37a9255e03657728 100644 --- a/sysdeps/unix/sysv/linux/getlogin_r.c +++ b/sysdeps/unix/sysv/linux/getlogin_r.c @@ -18,6 +18,7 @@ @@ -1897,7 +1551,7 @@ Index: b/sysdeps/unix/sysv/linux/getlogin_r.c #define STATIC static static int getlogin_r_fd0 (char *name, size_t namesize); -@@ -54,28 +55,19 @@ __getlogin_r_loginuid (char *name, size_ +@@ -54,28 +55,19 @@ __getlogin_r_loginuid (char *name, size_t namesize) endp == uidbuf || *endp != '\0')) return -1; @@ -1933,7 +1587,7 @@ Index: b/sysdeps/unix/sysv/linux/getlogin_r.c } if (res != 0 || tpwd == NULL) -@@ -95,9 +87,7 @@ __getlogin_r_loginuid (char *name, size_ +@@ -95,9 +87,7 @@ __getlogin_r_loginuid (char *name, size_t namesize) memcpy (name, pwd.pw_name, needed); out: diff --git a/glibc-rh168253-ai_canonname-tests.patch b/glibc-rh168253-ai_canonname-tests.patch deleted file mode 100644 index 156313c..0000000 --- a/glibc-rh168253-ai_canonname-tests.patch +++ /dev/null @@ -1,141 +0,0 @@ -commit 8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405 -Author: Florian Weimer -Date: Thu May 11 11:32:16 2017 +0200 - - support_format_addrinfo: Fix flags and canonname formatting - - The address family splitting via format_ai_family made unpredictable - the place where the canonname field was printed. This commit adjusts - the implementation so that the ai_flags is checked for consistency - across the list, and ai_canonname must only be present on the first - list element. - - Tests for AI_CANONNAME are added to resolv/tst-resolv-basic. - -diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c -index f2b1fc7490430bce..92f912beed35744f 100644 ---- a/resolv/tst-resolv-basic.c -+++ b/resolv/tst-resolv-basic.c -@@ -182,12 +182,12 @@ check_h (const char *name, int family, const char *expected) - } - - static void --check_ai (const char *name, const char *service, -- int family, const char *expected) -+check_ai_hints (const char *name, const char *service, -+ struct addrinfo hints, const char *expected) - { -- struct addrinfo hints = {.ai_family = family}; - struct addrinfo *ai; -- char *query = xasprintf ("%s:%s [%d]", name, service, family); -+ char *query = xasprintf ("%s:%s [%d]/0x%x", name, service, -+ hints.ai_family, hints.ai_flags); - int ret = getaddrinfo (name, service, &hints, &ai); - check_addrinfo (query, ai, ret, expected); - if (ret == 0) -@@ -195,6 +195,15 @@ check_ai (const char *name, const char *service, - free (query); - } - -+static void -+check_ai (const char *name, const char *service, -+ int family, const char *expected) -+{ -+ return check_ai_hints (name, service, -+ (struct addrinfo) { .ai_family = family, }, -+ expected); -+} -+ - static int - do_test (void) - { -@@ -229,6 +238,17 @@ do_test (void) - "address: STREAM/TCP 2001:db8::1 80\n" - "address: DGRAM/UDP 2001:db8::1 80\n" - "address: RAW/IP 2001:db8::1 80\n"); -+ check_ai_hints ("www.example", "80", -+ (struct addrinfo) { .ai_family = AF_UNSPEC, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 192.0.2.17 80\n" -+ "address: DGRAM/UDP 192.0.2.17 80\n" -+ "address: RAW/IP 192.0.2.17 80\n" -+ "address: STREAM/TCP 2001:db8::1 80\n" -+ "address: DGRAM/UDP 2001:db8::1 80\n" -+ "address: RAW/IP 2001:db8::1 80\n"); - check_ai ("alias.example", "80", AF_UNSPEC, - "address: STREAM/TCP 192.0.2.18 80\n" - "address: DGRAM/UDP 192.0.2.18 80\n" -@@ -236,6 +256,17 @@ do_test (void) - "address: STREAM/TCP 2001:db8::2 80\n" - "address: DGRAM/UDP 2001:db8::2 80\n" - "address: RAW/IP 2001:db8::2 80\n"); -+ check_ai_hints ("alias.example", "80", -+ (struct addrinfo) { .ai_family = AF_UNSPEC, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 192.0.2.18 80\n" -+ "address: DGRAM/UDP 192.0.2.18 80\n" -+ "address: RAW/IP 192.0.2.18 80\n" -+ "address: STREAM/TCP 2001:db8::2 80\n" -+ "address: DGRAM/UDP 2001:db8::2 80\n" -+ "address: RAW/IP 2001:db8::2 80\n"); - check_ai (LONG_NAME, "80", AF_UNSPEC, - "address: STREAM/TCP 192.0.2.20 80\n" - "address: DGRAM/UDP 192.0.2.20 80\n" -@@ -247,10 +278,26 @@ do_test (void) - "address: STREAM/TCP 192.0.2.17 80\n" - "address: DGRAM/UDP 192.0.2.17 80\n" - "address: RAW/IP 192.0.2.17 80\n"); -+ check_ai_hints ("www.example", "80", -+ (struct addrinfo) { .ai_family = AF_INET, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 192.0.2.17 80\n" -+ "address: DGRAM/UDP 192.0.2.17 80\n" -+ "address: RAW/IP 192.0.2.17 80\n"); - check_ai ("alias.example", "80", AF_INET, - "address: STREAM/TCP 192.0.2.18 80\n" - "address: DGRAM/UDP 192.0.2.18 80\n" - "address: RAW/IP 192.0.2.18 80\n"); -+ check_ai_hints ("alias.example", "80", -+ (struct addrinfo) { .ai_family = AF_INET, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 192.0.2.18 80\n" -+ "address: DGRAM/UDP 192.0.2.18 80\n" -+ "address: RAW/IP 192.0.2.18 80\n"); - check_ai (LONG_NAME, "80", AF_INET, - "address: STREAM/TCP 192.0.2.20 80\n" - "address: DGRAM/UDP 192.0.2.20 80\n" -@@ -259,10 +306,26 @@ do_test (void) - "address: STREAM/TCP 2001:db8::1 80\n" - "address: DGRAM/UDP 2001:db8::1 80\n" - "address: RAW/IP 2001:db8::1 80\n"); -+ check_ai_hints ("www.example", "80", -+ (struct addrinfo) { .ai_family = AF_INET6, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 2001:db8::1 80\n" -+ "address: DGRAM/UDP 2001:db8::1 80\n" -+ "address: RAW/IP 2001:db8::1 80\n"); - check_ai ("alias.example", "80", AF_INET6, - "address: STREAM/TCP 2001:db8::2 80\n" - "address: DGRAM/UDP 2001:db8::2 80\n" - "address: RAW/IP 2001:db8::2 80\n"); -+ check_ai_hints ("alias.example", "80", -+ (struct addrinfo) { .ai_family = AF_INET6, -+ .ai_flags = AI_CANONNAME, }, -+ "flags: AI_CANONNAME\n" -+ "canonname: www.example\n" -+ "address: STREAM/TCP 2001:db8::2 80\n" -+ "address: DGRAM/UDP 2001:db8::2 80\n" -+ "address: RAW/IP 2001:db8::2 80\n"); - check_ai (LONG_NAME, "80", AF_INET6, - "address: STREAM/TCP 2001:db8::4 80\n" - "address: DGRAM/UDP 2001:db8::4 80\n" diff --git a/glibc-rh168253-getaddrinfo-errno-nss-failure.patch b/glibc-rh168253-getaddrinfo-errno-nss-failure.patch deleted file mode 100644 index b1906c9..0000000 --- a/glibc-rh168253-getaddrinfo-errno-nss-failure.patch +++ /dev/null @@ -1,36 +0,0 @@ -commit 8f46c6052408a23a77ecf46aa378120c1a4afe37 -Author: Florian Weimer -Date: Fri Sep 1 08:57:28 2017 +0200 - - getaddrinfo: Properly set errno for NSS function lookup failure - - (cherry picked from commit ad816a5e00ce891a2cea8187638fa0e00f83aaf6) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 076e1fa62bd88548..eaf8bafcf4ede5fe 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -923,13 +923,17 @@ gaih_inet (const char *name, const struct gaih_service *service, - } - else - { -+ /* Could not locate any of the lookup functions. -+ The NSS lookup code does not consistently set -+ errno, so we need to supply our own error -+ code here. The root cause could either be a -+ resource allocation failure, or a missing -+ service function in the DSO (so it should not -+ be listed in /etc/nsswitch.conf). Assume the -+ former, and return EBUSY. */ - status = NSS_STATUS_UNAVAIL; -- /* Could not load any of the lookup functions. Indicate -- an internal error if the failure was due to a system -- error other than the file not being found. We use the -- errno from the last failed callback. */ -- if (errno != 0 && errno != ENOENT) -- __set_h_errno (NETDB_INTERNAL); -+ __set_h_errno (NETDB_INTERNAL); -+ __set_errno (EBUSY); - } - } - diff --git a/glibc-rh168253-getaddrinfo-errno.patch b/glibc-rh168253-getaddrinfo-errno.patch deleted file mode 100644 index a26baea..0000000 --- a/glibc-rh168253-getaddrinfo-errno.patch +++ /dev/null @@ -1,99 +0,0 @@ -commit bdd8422cfb1fe04cb20617495156fb232b00d23c -Author: Florian Weimer -Date: Fri Sep 1 08:56:46 2017 +0200 - - getaddrinfo: Use &errno has the errno pointer - - Similar code in nss/getXXbyYY_r.c is already using &errno as the - argument. - - (cherry picked from commit 924b121c5978689001ae28cf1c8497371dad4f71) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 09f85fc472f9e177..1a16820b7e598dbc 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -247,11 +247,10 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - char *localcanon = NULL; \ - no_data = 0; \ - while (1) { \ -- rc = 0; \ - status = DL_CALL_FCT (fct, (name, _family, &th, \ - tmpbuf->data, tmpbuf->length, \ -- &rc, &herrno, NULL, &localcanon)); \ -- if (rc != ERANGE || herrno != NETDB_INTERNAL) \ -+ &errno, &herrno, NULL, &localcanon)); \ -+ if (errno != ERANGE || herrno != NETDB_INTERNAL) \ - break; \ - if (!scratch_buffer_grow (tmpbuf)) \ - { \ -@@ -261,11 +260,11 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - goto free_and_return; \ - } \ - } \ -- if (status == NSS_STATUS_SUCCESS && rc == 0) \ -+ if (status == NSS_STATUS_SUCCESS && errno == 0) \ - h = &th; \ - else \ - h = NULL; \ -- if (rc != 0) \ -+ if (errno != 0) \ - { \ - if (herrno == NETDB_INTERNAL) \ - { \ -@@ -335,9 +334,8 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) - { - char buf[256]; - int herrno; -- int rc; - if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), -- &s, &rc, &herrno)) != NSS_STATUS_SUCCESS) -+ &s, &errno, &herrno)) != NSS_STATUS_SUCCESS) - /* If the canonical name cannot be determined, use the passed - string. */ - s = (char *) name; -@@ -353,7 +351,6 @@ gaih_inet (const char *name, const struct gaih_service *service, - const struct gaih_typeproto *tp = gaih_inet_typeproto; - struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv; - struct gaih_addrtuple *at = NULL; -- int rc; - bool got_ipv6 = false; - const char *canon = NULL; - const char *orig_name = name; -@@ -395,7 +392,8 @@ gaih_inet (const char *name, const struct gaih_service *service, - st = (struct gaih_servtuple *) - alloca_account (sizeof (struct gaih_servtuple), alloca_used); - -- if ((rc = gaih_inet_serv (service->name, tp, req, st, tmpbuf))) -+ int rc = gaih_inet_serv (service->name, tp, req, st, tmpbuf); -+ if (__glibc_unlikely (rc != 0)) - return rc; - } - else -@@ -495,7 +493,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - idn_flags |= IDNA_USE_STD3_ASCII_RULES; - - char *p = NULL; -- rc = __idna_to_ascii_lz (name, &p, idn_flags); -+ int rc = __idna_to_ascii_lz (name, &p, idn_flags); - if (rc != IDNA_SUCCESS) - { - /* No need to jump to free_and_return here. */ -@@ -793,15 +791,14 @@ gaih_inet (const char *name, const struct gaih_service *service, - - while (1) - { -- rc = 0; - status = DL_CALL_FCT (fct4, (name, pat, - tmpbuf->data, tmpbuf->length, -- &rc, &herrno, -+ &errno, &herrno, - NULL)); - if (status == NSS_STATUS_SUCCESS) - break; - if (status != NSS_STATUS_TRYAGAIN -- || rc != ERANGE || herrno != NETDB_INTERNAL) -+ || errno != ERANGE || herrno != NETDB_INTERNAL) - { - if (herrno == TRY_AGAIN) - no_data = EAI_AGAIN; diff --git a/glibc-rh168253-getaddrinfo-gaih_inet-unreachable-return.patch b/glibc-rh168253-getaddrinfo-gaih_inet-unreachable-return.patch deleted file mode 100644 index 7a4087a..0000000 --- a/glibc-rh168253-getaddrinfo-gaih_inet-unreachable-return.patch +++ /dev/null @@ -1,29 +0,0 @@ -commit 4fdd75e4463801b9d8f329769df1a26145560656 -Author: Florian Weimer -Date: Tue Aug 8 18:48:05 2017 +0200 - - getaddrinfo: Remove unreachable return statement from gaih_inet - - (cherry picked from commit 0df595b23a829c9169ec418a19eef9006b4ae801) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 699411cc92fc210c..09f85fc472f9e177 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -420,13 +420,9 @@ gaih_inet (const char *name, const struct gaih_service *service, - alloca_account (sizeof (struct gaih_servtuple), - alloca_used); - -- if ((rc = gaih_inet_serv (service->name, -- tp, req, newp, tmpbuf))) -- { -- if (rc) -- continue; -- return rc; -- } -+ if (gaih_inet_serv (service->name, -+ tp, req, newp, tmpbuf) != 0) -+ continue; - - *pst = newp; - pst = &(newp->next); diff --git a/glibc-rh168253-getaddrinfo-gethosts-error-handling.patch b/glibc-rh168253-getaddrinfo-gethosts-error-handling.patch deleted file mode 100644 index cdf65ae..0000000 --- a/glibc-rh168253-getaddrinfo-gethosts-error-handling.patch +++ /dev/null @@ -1,330 +0,0 @@ -commit a71a3374cd8cf53776c33994f69ec184c26f2129 -Author: Florian Weimer -Date: Mon Sep 4 11:27:24 2017 +0200 - - getaddrinfo: Fix error handling in gethosts [BZ #21915] [BZ #21922] - - The old code uses errno as the primary indicator for success or - failure. This is wrong because errno is only set for specific - combinations of the status return value and the h_errno variable. - - (cherry picked from commit f4a6be2582b8dfe8adfa68da3dd8decf566b3983) - -diff --git a/nss/Makefile b/nss/Makefile -index f0a6e4877fac6bf7..a6e994aa9f6df0bc 100644 ---- a/nss/Makefile -+++ b/nss/Makefile -@@ -54,6 +54,11 @@ tests = test-netdb tst-nss-test1 test-digits-dots \ - $(tests-static) - xtests = bug-erange - -+# Tests which need libdl -+ifeq (yes,$(build-shared)) -+tests += tst-nss-files-hosts-erange -+endif -+ - # If we have a thread library then we can test cancellation against - # some routines like getpwuid_r. - ifeq (yes,$(have-thread-library)) -@@ -139,3 +144,5 @@ $(objpfx)tst-nss-test1.out: $(objpfx)/libnss_test1.so$(libnss_test1.so-version) - ifeq (yes,$(have-thread-library)) - $(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library) - endif -+ -+$(objpfx)tst-nss-files-hosts-erange: $(libdl) -diff --git a/nss/tst-nss-files-hosts-erange.c b/nss/tst-nss-files-hosts-erange.c -new file mode 100644 -index 0000000000000000..beb7aa9fa0b5926f ---- /dev/null -+++ b/nss/tst-nss-files-hosts-erange.c -@@ -0,0 +1,109 @@ -+/* Parse /etc/hosts in multi mode with a trailing long line (bug 21915). -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct support_chroot *chroot_env; -+ -+#define X10 "XXXXXXXXXX" -+#define X100 X10 X10 X10 X10 X10 X10 X10 X10 X10 X10 -+#define X1000 X100 X100 X100 X100 X100 X100 X100 X100 X100 X100 -+ -+static void -+prepare (int argc, char **argv) -+{ -+ chroot_env = support_chroot_create -+ ((struct support_chroot_configuration) -+ { -+ .resolv_conf = "", -+ .hosts = -+ "127.0.0.1 localhost localhost.localdomain\n" -+ "::1 localhost localhost.localdomain\n" -+ "192.0.2.1 example.com\n" -+ "#" X1000 X100 "\n", -+ .host_conf = "multi on\n", -+ }); -+} -+ -+static int -+do_test (void) -+{ -+ support_become_root (); -+ if (!support_can_chroot ()) -+ return EXIT_UNSUPPORTED; -+ -+ __nss_configure_lookup ("hosts", "files"); -+ if (dlopen (LIBNSS_FILES_SO, RTLD_LAZY) == NULL) -+ FAIL_EXIT1 ("could not load " LIBNSS_DNS_SO ": %s", dlerror ()); -+ -+ xchroot (chroot_env->path_chroot); -+ -+ errno = ERANGE; -+ h_errno = NETDB_INTERNAL; -+ check_hostent ("gethostbyname example.com", -+ gethostbyname ("example.com"), -+ "name: example.com\n" -+ "address: 192.0.2.1\n"); -+ errno = ERANGE; -+ h_errno = NETDB_INTERNAL; -+ check_hostent ("gethostbyname2 AF_INET example.com", -+ gethostbyname2 ("example.com", AF_INET), -+ "name: example.com\n" -+ "address: 192.0.2.1\n"); -+ { -+ struct addrinfo hints = -+ { -+ .ai_family = AF_UNSPEC, -+ .ai_socktype = SOCK_STREAM, -+ .ai_protocol = IPPROTO_TCP, -+ }; -+ errno = ERANGE; -+ h_errno = NETDB_INTERNAL; -+ struct addrinfo *ai; -+ int ret = getaddrinfo ("example.com", "80", &hints, &ai); -+ check_addrinfo ("example.com AF_UNSPEC", ai, ret, -+ "address: STREAM/TCP 192.0.2.1 80\n"); -+ if (ret == 0) -+ freeaddrinfo (ai); -+ -+ hints.ai_family = AF_INET; -+ errno = ERANGE; -+ h_errno = NETDB_INTERNAL; -+ ret = getaddrinfo ("example.com", "80", &hints, &ai); -+ check_addrinfo ("example.com AF_INET", ai, ret, -+ "address: STREAM/TCP 192.0.2.1 80\n"); -+ if (ret == 0) -+ freeaddrinfo (ai); -+ } -+ -+ support_chroot_free (chroot_env); -+ return 0; -+} -+ -+#define PREPARE prepare -+#include -diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c -index 64eedbbd81d58d95..66a0e8a1659219b4 100644 ---- a/resolv/tst-resolv-basic.c -+++ b/resolv/tst-resolv-basic.c -@@ -50,7 +50,7 @@ response (const struct resolv_response_context *ctx, - qname_compare = qname + 2; - else - qname_compare = qname; -- enum {www, alias, nxdomain, long_name} requested_qname; -+ enum {www, alias, nxdomain, long_name, nodata} requested_qname; - if (strcmp (qname_compare, "www.example") == 0) - requested_qname = www; - else if (strcmp (qname_compare, "alias.example") == 0) -@@ -59,6 +59,8 @@ response (const struct resolv_response_context *ctx, - requested_qname = nxdomain; - else if (strcmp (qname_compare, LONG_NAME) == 0) - requested_qname = long_name; -+ else if (strcmp (qname_compare, "nodata.example") == 0) -+ requested_qname = nodata; - else - { - support_record_failure (); -@@ -87,6 +89,8 @@ response (const struct resolv_response_context *ctx, - resolv_response_close_record (b); - resolv_response_open_record (b, "www.example", qclass, qtype, 0); - break; -+ case nodata: -+ return; - case nxdomain: - FAIL_EXIT1 ("unreachable"); - } -@@ -267,6 +271,55 @@ test_bug_21295 (void) - } - } - -+/* Run tests which do not expect any data. */ -+static void -+test_nodata_nxdomain (void) -+{ -+ /* Iterate through different address families. */ -+ int families[] = { AF_UNSPEC, AF_INET, AF_INET6, -1 }; -+ for (int i = 0; families[i] >= 0; ++i) -+ /* If do_tcp, prepend "t." to the name to trigger TCP -+ fallback. */ -+ for (int do_tcp = 0; do_tcp < 2; ++do_tcp) -+ /* If do_nxdomain, trigger an NXDOMAIN error (DNS failure), -+ otherwise use a NODATA response (empty but successful -+ answer). */ -+ for (int do_nxdomain = 0; do_nxdomain < 2; ++do_nxdomain) -+ { -+ int family = families[i]; -+ char *name = xasprintf ("%s%s.example", -+ do_tcp ? "t." : "", -+ do_nxdomain ? "nxdomain" : "nodata"); -+ -+ if (family != AF_UNSPEC) -+ { -+ if (do_nxdomain) -+ check_h (name, family, "error: HOST_NOT_FOUND\n"); -+ else -+ check_h (name, family, "error: NO_ADDRESS\n"); -+ } -+ -+ const char *expected; -+ if (do_nxdomain) -+ expected = "error: Name or service not known\n"; -+ else -+ expected = "error: No address associated with hostname\n"; -+ -+ check_ai (name, "80", family, expected); -+ -+ struct addrinfo hints = -+ { -+ .ai_family = family, -+ .ai_flags = AI_V4MAPPED | AI_ALL, -+ }; -+ check_ai_hints (name, "80", hints, expected); -+ hints.ai_flags |= AI_CANONNAME; -+ check_ai_hints (name, "80", hints, expected); -+ -+ free (name); -+ } -+} -+ - static int - do_test (void) - { -@@ -439,29 +492,8 @@ do_test (void) - "address: DGRAM/UDP 2001:db8::4 80\n" - "address: RAW/IP 2001:db8::4 80\n"); - -- check_h ("nxdomain.example", AF_INET, -- "error: HOST_NOT_FOUND\n"); -- check_h ("nxdomain.example", AF_INET6, -- "error: HOST_NOT_FOUND\n"); -- check_ai ("nxdomain.example", "80", AF_UNSPEC, -- "error: Name or service not known\n"); -- check_ai ("nxdomain.example", "80", AF_INET, -- "error: Name or service not known\n"); -- check_ai ("nxdomain.example", "80", AF_INET6, -- "error: Name or service not known\n"); -- -- check_h ("t.nxdomain.example", AF_INET, -- "error: HOST_NOT_FOUND\n"); -- check_h ("t.nxdomain.example", AF_INET6, -- "error: HOST_NOT_FOUND\n"); -- check_ai ("t.nxdomain.example", "80", AF_UNSPEC, -- "error: Name or service not known\n"); -- check_ai ("t.nxdomain.example", "80", AF_INET, -- "error: Name or service not known\n"); -- check_ai ("t.nxdomain.example", "80", AF_INET6, -- "error: Name or service not known\n"); -- - test_bug_21295 (); -+ test_nodata_nxdomain (); - - resolv_test_end (aux); - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 0cf87c224dff5c66..2c4b6d6793a4c3a9 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -242,28 +242,26 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - #define gethosts(_family, _type) \ - { \ - struct hostent th; \ -- struct hostent *h; \ - char *localcanon = NULL; \ - no_data = 0; \ -- while (1) { \ -- status = DL_CALL_FCT (fct, (name, _family, &th, \ -- tmpbuf->data, tmpbuf->length, \ -- &errno, &h_errno, NULL, &localcanon)); \ -- if (errno != ERANGE || h_errno != NETDB_INTERNAL) \ -- break; \ -- if (!scratch_buffer_grow (tmpbuf)) \ -- { \ -- __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ -- __resolv_context_put (res_ctx); \ -- result = -EAI_MEMORY; \ -- goto free_and_return; \ -- } \ -- } \ -- if (status == NSS_STATUS_SUCCESS && errno == 0) \ -- h = &th; \ -- else \ -- h = NULL; \ -- if (errno != 0) \ -+ while (1) \ -+ { \ -+ status = DL_CALL_FCT (fct, (name, _family, &th, \ -+ tmpbuf->data, tmpbuf->length, \ -+ &errno, &h_errno, NULL, &localcanon)); \ -+ if (status != NSS_STATUS_TRYAGAIN || h_errno != NETDB_INTERNAL \ -+ || errno != ERANGE) \ -+ break; \ -+ if (!scratch_buffer_grow (tmpbuf)) \ -+ { \ -+ __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ -+ __resolv_context_put (res_ctx); \ -+ result = -EAI_MEMORY; \ -+ goto free_and_return; \ -+ } \ -+ } \ -+ if (status == NSS_STATUS_NOTFOUND \ -+ || status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) \ - { \ - if (h_errno == NETDB_INTERNAL) \ - { \ -@@ -277,9 +275,9 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - else \ - no_data = h_errno == NO_DATA; \ - } \ -- else if (h != NULL) \ -+ else if (status == NSS_STATUS_SUCCESS) \ - { \ -- if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \ -+ if (!convert_hostent_to_gaih_addrtuple (req, _family, &th, &addrmem)) \ - { \ - __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ - __resolv_context_put (res_ctx); \ diff --git a/glibc-rh168253-getaddrinfo-gethosts-res-ctx-release.patch b/glibc-rh168253-getaddrinfo-gethosts-res-ctx-release.patch deleted file mode 100644 index 8977dc2..0000000 --- a/glibc-rh168253-getaddrinfo-gethosts-res-ctx-release.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit dc258ce62ae0bbb456c6a855dbb6b384ecf7e988 -Author: Florian Weimer -Date: Thu Aug 3 13:59:17 2017 +0200 - - getaddrinfo: Release resolver context on error in gethosts [BZ #21885] - - (cherry picked from commit 964263bb8d650f1681665c55704fb01a8e725621) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index efa7118498990073..699411cc92fc210c 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -255,6 +255,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - break; \ - if (!scratch_buffer_grow (tmpbuf)) \ - { \ -+ __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ -+ __resolv_context_put (res_ctx); \ - result = -EAI_MEMORY; \ - goto free_and_return; \ - } \ diff --git a/glibc-rh168253-getaddrinfo-h_errno-no-success.patch b/glibc-rh168253-getaddrinfo-h_errno-no-success.patch deleted file mode 100644 index 70b4fd6..0000000 --- a/glibc-rh168253-getaddrinfo-h_errno-no-success.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 7ab87bccb657b02cac5a3360b11c67aff901de2e -Author: Florian Weimer -Date: Fri Sep 1 08:57:52 2017 +0200 - - getaddrinfo: In gaih_inet, use h_errno for certain status values only - - h_errno is not set for NSS_STATUS_SUCCESS, so its value might not be - accurate at this point. - - (cherry picked from commit a2881ef01450295782b065f2f850f340d5c12c14) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index eaf8bafcf4ede5fe..9d9e7e2bf2a78cbb 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -949,7 +949,10 @@ gaih_inet (const char *name, const struct gaih_service *service, - __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); - __resolv_context_put (res_ctx); - -- if (h_errno == NETDB_INTERNAL) -+ /* If we have a failure which sets errno, report it using -+ EAI_SYSTEM. */ -+ if ((status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) -+ && h_errno == NETDB_INTERNAL) - { - result = -EAI_SYSTEM; - goto free_and_return; diff --git a/glibc-rh168253-getaddrinfo-h_errno.patch b/glibc-rh168253-getaddrinfo-h_errno.patch deleted file mode 100644 index 6b23d99..0000000 --- a/glibc-rh168253-getaddrinfo-h_errno.patch +++ /dev/null @@ -1,151 +0,0 @@ -commit 701f7873da013fb19d9120317322cd78333e63c2 -Author: Florian Weimer -Date: Fri Sep 1 08:57:07 2017 +0200 - - getaddrinfo: Use &h_errno has the h_errno pointer - - This simplifies the code because it is not necessary to propagate the - temporary h_errno value to the thread-local variable. It also increases - compatibility with NSS modules which update only one of the two places. - - (cherry picked from commit 53250a21b81474ef4e78090a4a9a63d8471e1091) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 1a16820b7e598dbc..076e1fa62bd88548 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -241,7 +241,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - - #define gethosts(_family, _type) \ - { \ -- int herrno; \ - struct hostent th; \ - struct hostent *h; \ - char *localcanon = NULL; \ -@@ -249,8 +248,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - while (1) { \ - status = DL_CALL_FCT (fct, (name, _family, &th, \ - tmpbuf->data, tmpbuf->length, \ -- &errno, &herrno, NULL, &localcanon)); \ -- if (errno != ERANGE || herrno != NETDB_INTERNAL) \ -+ &errno, &h_errno, NULL, &localcanon)); \ -+ if (errno != ERANGE || h_errno != NETDB_INTERNAL) \ - break; \ - if (!scratch_buffer_grow (tmpbuf)) \ - { \ -@@ -266,18 +265,17 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - h = NULL; \ - if (errno != 0) \ - { \ -- if (herrno == NETDB_INTERNAL) \ -+ if (h_errno == NETDB_INTERNAL) \ - { \ -- __set_h_errno (herrno); \ - __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ - __resolv_context_put (res_ctx); \ - result = -EAI_SYSTEM; \ - goto free_and_return; \ - } \ -- if (herrno == TRY_AGAIN) \ -+ if (h_errno == TRY_AGAIN) \ - no_data = EAI_AGAIN; \ - else \ -- no_data = herrno == NO_DATA; \ -+ no_data = h_errno == NO_DATA; \ - } \ - else if (h != NULL) \ - { \ -@@ -333,9 +331,8 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) - if (cfct != NULL) - { - char buf[256]; -- int herrno; - if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), -- &s, &errno, &herrno)) != NSS_STATUS_SUCCESS) -+ &s, &errno, &h_errno)) != NSS_STATUS_SUCCESS) - /* If the canonical name cannot be determined, use the passed - string. */ - s = (char *) name; -@@ -594,14 +591,13 @@ gaih_inet (const char *name, const struct gaih_service *service, - int rc; - struct hostent th; - struct hostent *h; -- int herrno; - - while (1) - { - rc = __gethostbyname2_r (name, AF_INET, &th, - tmpbuf->data, tmpbuf->length, -- &h, &herrno); -- if (rc != ERANGE || herrno != NETDB_INTERNAL) -+ &h, &h_errno); -+ if (rc != ERANGE || h_errno != NETDB_INTERNAL) - break; - if (!scratch_buffer_grow (tmpbuf)) - { -@@ -626,12 +622,9 @@ gaih_inet (const char *name, const struct gaih_service *service, - } - else - { -- if (herrno == NETDB_INTERNAL) -- { -- __set_h_errno (herrno); -- result = -EAI_SYSTEM; -- } -- else if (herrno == TRY_AGAIN) -+ if (h_errno == NETDB_INTERNAL) -+ result = -EAI_SYSTEM; -+ else if (h_errno == TRY_AGAIN) - result = -EAI_AGAIN; - else - /* We made requests but they turned out no data. -@@ -654,8 +647,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - { - /* Try to use nscd. */ - struct nscd_ai_result *air = NULL; -- int herrno; -- int err = __nscd_getai (name, &air, &herrno); -+ int err = __nscd_getai (name, &air, &h_errno); - if (air != NULL) - { - /* Transform into gaih_addrtuple list. */ -@@ -746,9 +738,9 @@ gaih_inet (const char *name, const struct gaih_service *service, - goto free_and_return; - else if (__nss_not_use_nscd_hosts == 0) - { -- if (herrno == NETDB_INTERNAL && errno == ENOMEM) -+ if (h_errno == NETDB_INTERNAL && errno == ENOMEM) - result = -EAI_MEMORY; -- else if (herrno == TRY_AGAIN) -+ else if (h_errno == TRY_AGAIN) - result = -EAI_AGAIN; - else - result = -EAI_SYSTEM; -@@ -787,23 +779,21 @@ gaih_inet (const char *name, const struct gaih_service *service, - - if (fct4 != NULL) - { -- int herrno; -- - while (1) - { - status = DL_CALL_FCT (fct4, (name, pat, - tmpbuf->data, tmpbuf->length, -- &errno, &herrno, -+ &errno, &h_errno, - NULL)); - if (status == NSS_STATUS_SUCCESS) - break; - if (status != NSS_STATUS_TRYAGAIN -- || errno != ERANGE || herrno != NETDB_INTERNAL) -+ || errno != ERANGE || h_errno != NETDB_INTERNAL) - { -- if (herrno == TRY_AGAIN) -+ if (h_errno == TRY_AGAIN) - no_data = EAI_AGAIN; - else -- no_data = herrno == NO_DATA; -+ no_data = h_errno == NO_DATA; - break; - } - diff --git a/glibc-rh168253-getaddrinfo-inet_pton_length.patch b/glibc-rh168253-getaddrinfo-inet_pton_length.patch deleted file mode 100644 index c75258d..0000000 --- a/glibc-rh168253-getaddrinfo-inet_pton_length.patch +++ /dev/null @@ -1,62 +0,0 @@ -commit 76b8266f990a2912f42d1b7050840e8c7f14f2c2 -Author: Florian Weimer -Date: Wed Jun 21 13:35:37 2017 +0200 - - getaddrinfo: Avoid stack copy of IPv6 address - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index b3d0a5ca74d926bb..4ec17961adb194ff 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -539,46 +539,11 @@ gaih_inet (const char *name, const struct gaih_service *service, - { - char *scope_delim = strchr (name, SCOPE_DELIMITER); - int e; -- -- { -- bool malloc_namebuf = false; -- char *namebuf = (char *) name; -- -- if (__glibc_unlikely (scope_delim != NULL)) -- { -- if (malloc_name) -- *scope_delim = '\0'; -- else -- { -- if (__libc_use_alloca (alloca_used -- + scope_delim - name + 1)) -- { -- namebuf = alloca_account (scope_delim - name + 1, -- alloca_used); -- *((char *) __mempcpy (namebuf, name, -- scope_delim - name)) = '\0'; -- } -- else -- { -- namebuf = strndup (name, scope_delim - name); -- if (namebuf == NULL) -- { -- assert (!malloc_name); -- return -EAI_MEMORY; -- } -- malloc_namebuf = true; -- } -- } -- } -- -- e = inet_pton (AF_INET6, namebuf, at->addr); -- -- if (malloc_namebuf) -- free (namebuf); -- else if (scope_delim != NULL && malloc_name) -- /* Undo what we did above. */ -- *scope_delim = SCOPE_DELIMITER; -- } -+ if (scope_delim == NULL) -+ e = inet_pton (AF_INET6, name, at->addr); -+ else -+ e = __inet_pton_length (AF_INET6, name, scope_delim - name, -+ at->addr); - if (e > 0) - { - if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6) diff --git a/glibc-rh168253-getaddrinfo-malloc-address-list.patch b/glibc-rh168253-getaddrinfo-malloc-address-list.patch deleted file mode 100644 index 2c7ad1f..0000000 --- a/glibc-rh168253-getaddrinfo-malloc-address-list.patch +++ /dev/null @@ -1,85 +0,0 @@ -commit 46ce8881ade788db56079622f47f648d4aaa003b -Author: Florian Weimer -Date: Thu May 11 10:01:49 2017 +0200 - - getaddrinfo: Unconditionally use malloc for address list - - getaddrinfo has to call malloc eventually anyway, so the complexity - of avoiding malloc calls is not worth potential savings. - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 1ea2b2218d263b28..987a1c1e17f2d5b1 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -278,9 +278,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - } \ - else if (h != NULL) \ - { \ -- /* Make sure that addrmem can be freed. */ \ -- if (!malloc_addrmem) \ -- addrmem = NULL; \ - if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \ - { \ - _res.options |= old_res_options & DEPRECATED_RES_USE_INET6; \ -@@ -288,8 +285,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - goto free_and_return; \ - } \ - *pat = addrmem; \ -- /* The conversion uses malloc unconditionally. */ \ -- malloc_addrmem = true; \ - \ - if (localcanon != NULL && canon == NULL) \ - canon = strdupa (localcanon); \ -@@ -447,7 +442,6 @@ gaih_inet (const char *name, const struct gaih_service *service, - } - - bool malloc_name = false; -- bool malloc_addrmem = false; - struct gaih_addrtuple *addrmem = NULL; - bool malloc_canonbuf = false; - char *canonbuf = NULL; -@@ -633,8 +627,6 @@ gaih_inet (const char *name, const struct gaih_service *service, - goto free_and_return; - } - *pat = addrmem; -- /* The conversion uses malloc unconditionally. */ -- malloc_addrmem = true; - } - } - else -@@ -675,21 +667,11 @@ gaih_inet (const char *name, const struct gaih_service *service, - bool added_canon = (req->ai_flags & AI_CANONNAME) == 0; - char *addrs = air->addrs; - -- if (__libc_use_alloca (alloca_used -- + air->naddrs * sizeof (struct gaih_addrtuple))) -- addrmem = alloca_account (air->naddrs -- * sizeof (struct gaih_addrtuple), -- alloca_used); -- else -+ addrmem = calloc (air->naddrs, sizeof (*addrmem)); -+ if (addrmem == NULL) - { -- addrmem = malloc (air->naddrs -- * sizeof (struct gaih_addrtuple)); -- if (addrmem == NULL) -- { -- result = -EAI_MEMORY; -- goto free_and_return; -- } -- malloc_addrmem = true; -+ result = -EAI_MEMORY; -+ goto free_and_return; - } - - struct gaih_addrtuple *addrfree = addrmem; -@@ -1232,8 +1214,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - free_and_return: - if (malloc_name) - free ((char *) name); -- if (malloc_addrmem) -- free (addrmem); -+ free (addrmem); - if (malloc_canonbuf) - free (canonbuf); - diff --git a/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-1.patch b/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-1.patch deleted file mode 100644 index 24af6e8..0000000 --- a/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-1.patch +++ /dev/null @@ -1,39 +0,0 @@ -commit 6257fcfd58479f6b7ae0fdde045b9ff144d543da -Author: Florian Weimer -Date: Fri Jun 2 16:35:13 2017 +0200 - - getaddrinfo: Fix localplt failure involving strdup - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index daa742c260e667a7..0e92221853dd73b1 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -286,9 +286,16 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - } \ - *pat = addrmem; \ - \ -- if (localcanon != NULL && canon == NULL) \ -- canon = strdupa (localcanon); \ -- \ -+ if (localcanon != NULL && canon == NULL) \ -+ { \ -+ canonbuf = __strdup (localcanon); \ -+ if (canonbuf == NULL) \ -+ { \ -+ result = -EAI_SYSTEM; \ -+ goto free_and_return; \ -+ } \ -+ canon = canonbuf; \ -+ } \ - if (_family == AF_INET6 && *pat != NULL) \ - got_ipv6 = true; \ - } \ -@@ -330,7 +337,7 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) - string. */ - s = (char *) name; - } -- return strdup (name); -+ return __strdup (name); - } - - static int diff --git a/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-2.patch b/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-2.patch deleted file mode 100644 index 26e23e0..0000000 --- a/glibc-rh168253-getaddrinfo-malloc-canonname-strdup-2.patch +++ /dev/null @@ -1,19 +0,0 @@ -commit 363911ce1313a246b7d33f0983a09e7ab2525b3a -Author: Florian Weimer -Date: Sat Jun 3 08:37:13 2017 +0200 - - getaddrinfo: Eliminate another strdup call - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 0e92221853dd73b1..317413c9ef1559e6 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -732,7 +732,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - (*pat)->name = NULL; - else if (canonbuf == NULL) - { -- canonbuf = strdup (air->canon); -+ canonbuf = __strdup (air->canon); - if (canonbuf == NULL) - { - result = -EAI_MEMORY; diff --git a/glibc-rh168253-getaddrinfo-malloc-canonname.patch b/glibc-rh168253-getaddrinfo-malloc-canonname.patch deleted file mode 100644 index f5f817f..0000000 --- a/glibc-rh168253-getaddrinfo-malloc-canonname.patch +++ /dev/null @@ -1,170 +0,0 @@ -commit 673cb072a4710bd4bf6029a062d2867cca929c43 -Author: Florian Weimer -Date: Fri Jun 2 14:54:56 2017 +0200 - - getaddrinfo: Always allocate canonical name on the heap - - A further simplification could eliminate the canon variable in - gaih_inet and replace it with canonbuf. However, canonbuf is - used as a flag in the nscd code, which makes this somewhat - non-straightforward. - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 987a1c1e17f2d5b1..daa742c260e667a7 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -308,6 +308,30 @@ typedef enum nss_status (*nss_getcanonname_r) - int *errnop, int *h_errnop); - extern service_user *__nss_hosts_database attribute_hidden; - -+/* This function is called if a canonical name is requested, but if -+ the service function did not provide it. It tries to obtain the -+ name using getcanonname_r from the same service NIP. If the name -+ cannot be canonicalized, return a copy of NAME. Return NULL on -+ memory allocation failure. The returned string is allocated on the -+ heap; the caller has to free it. */ -+static char * -+getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) -+{ -+ nss_getcanonname_r cfct = __nss_lookup_function (nip, "getcanonname_r"); -+ char *s = (char *) name; -+ if (cfct != NULL) -+ { -+ char buf[256]; -+ int herrno; -+ int rc; -+ if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), -+ &s, &rc, &herrno)) != NSS_STATUS_SUCCESS) -+ /* If the canonical name cannot be determined, use the passed -+ string. */ -+ s = (char *) name; -+ } -+ return strdup (name); -+} - - static int - gaih_inet (const char *name, const struct gaih_service *service, -@@ -443,7 +467,6 @@ gaih_inet (const char *name, const struct gaih_service *service, - - bool malloc_name = false; - struct gaih_addrtuple *addrmem = NULL; -- bool malloc_canonbuf = false; - char *canonbuf = NULL; - int result = 0; - -@@ -702,22 +725,13 @@ gaih_inet (const char *name, const struct gaih_service *service, - (*pat)->name = NULL; - else if (canonbuf == NULL) - { -- size_t canonlen = strlen (air->canon) + 1; -- if ((req->ai_flags & AI_CANONIDN) != 0 -- && __libc_use_alloca (alloca_used + canonlen)) -- canonbuf = alloca_account (canonlen, alloca_used); -- else -+ canonbuf = strdup (air->canon); -+ if (canonbuf == NULL) - { -- canonbuf = malloc (canonlen); -- if (canonbuf == NULL) -- { -- result = -EAI_MEMORY; -- goto free_and_return; -- } -- malloc_canonbuf = true; -+ result = -EAI_MEMORY; -+ goto free_and_return; - } -- canon = (*pat)->name = memcpy (canonbuf, air->canon, -- canonlen); -+ canon = (*pat)->name = canonbuf; - } - - if (air->family[i] == AF_INET -@@ -924,55 +938,16 @@ gaih_inet (const char *name, const struct gaih_service *service, - if ((req->ai_flags & AI_CANONNAME) != 0 - && canon == NULL) - { -- /* If we need the canonical name, get it -- from the same service as the result. */ -- nss_getcanonname_r cfct; -- int herrno; -- -- cfct = __nss_lookup_function (nip, -- "getcanonname_r"); -- if (cfct != NULL) -+ canonbuf = getcanonname (nip, at, name); -+ if (canonbuf == NULL) - { -- const size_t max_fqdn_len = 256; -- if ((req->ai_flags & AI_CANONIDN) != 0 -- && __libc_use_alloca (alloca_used -- + max_fqdn_len)) -- canonbuf = alloca_account (max_fqdn_len, -- alloca_used); -- else -- { -- canonbuf = malloc (max_fqdn_len); -- if (canonbuf == NULL) -- { -- _res.options -- |= old_res_options -- & DEPRECATED_RES_USE_INET6; -- result = -EAI_MEMORY; -- goto free_and_return; -- } -- malloc_canonbuf = true; -- } -- char *s; -- -- if (DL_CALL_FCT (cfct, (at->name ?: name, -- canonbuf, -- max_fqdn_len, -- &s, &rc, &herrno)) -- == NSS_STATUS_SUCCESS) -- canon = s; -- else -- { -- /* If the canonical name cannot be -- determined, use the passed in -- string. */ -- if (malloc_canonbuf) -- { -- free (canonbuf); -- malloc_canonbuf = false; -- } -- canon = name; -- } -+ _res.options -+ |= old_res_options -+ & DEPRECATED_RES_USE_INET6; -+ result = -EAI_MEMORY; -+ goto free_and_return; - } -+ canon = canonbuf; - } - status = NSS_STATUS_SUCCESS; - } -@@ -1118,9 +1093,10 @@ gaih_inet (const char *name, const struct gaih_service *service, - #ifdef HAVE_LIBIDN - make_copy: - #endif -- if (malloc_canonbuf) -- /* We already allocated the string using malloc. */ -- malloc_canonbuf = false; -+ if (canonbuf != NULL) -+ /* We already allocated the string using malloc, but -+ the buffer is now owned by canon. */ -+ canonbuf = NULL; - else - { - canon = strdup (canon); -@@ -1215,8 +1191,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - if (malloc_name) - free ((char *) name); - free (addrmem); -- if (malloc_canonbuf) -- free (canonbuf); -+ free (canonbuf); - - return result; - } diff --git a/glibc-rh168253-getaddrinfo-merge-ipv6-ipv4-addresses.patch b/glibc-rh168253-getaddrinfo-merge-ipv6-ipv4-addresses.patch deleted file mode 100644 index 2bbb209..0000000 --- a/glibc-rh168253-getaddrinfo-merge-ipv6-ipv4-addresses.patch +++ /dev/null @@ -1,31 +0,0 @@ -commit 5cf88a83f27b0cd2d5a83511930e40d716c939eb -Author: Dmitry Bilunov -Date: Sat Jun 24 16:49:34 2017 +0200 - - getaddrinfo: Merge IPv6 addresses and IPv4 addresses [BZ #21295] - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 4ec17961adb194ff..91e0a76c5cfa027f 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -190,16 +190,16 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, - - /* Convert struct hostent to a list of struct gaih_addrtuple objects. - h_name is not copied, and the struct hostent object must not be -- deallocated prematurely. *RESULT must be NULL or a pointer to an -- object allocated using malloc, which is freed. */ -+ deallocated prematurely. *RESULT must be NULL or a pointer to a -+ linked-list. The new addresses are appended at the end. */ - static bool - convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - int family, - struct hostent *h, - struct gaih_addrtuple **result) - { -- free (*result); -- *result = NULL; -+ while (*result) -+ result = &(*result)->next; - - /* Count the number of addresses in h->h_addr_list. */ - size_t count = 0; diff --git a/glibc-rh168253-getaddrinfo-no_data.patch b/glibc-rh168253-getaddrinfo-no_data.patch deleted file mode 100644 index 113e0f6..0000000 --- a/glibc-rh168253-getaddrinfo-no_data.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 7966331555df43bb7e2a55ce5a17a330e57f487f -Author: Florian Weimer -Date: Mon Sep 4 11:25:34 2017 +0200 - - getaddrinfo: Return EAI_NODATA if gethostbyname2_r reports NO_DATA [BZ #21922] - - (cherry picked from commit 5f8340f583fe3d4f5734bd2371c5a45ecff2db0d) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 9d9e7e2bf2a78cbb..0cf87c224dff5c66 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -619,6 +619,14 @@ gaih_inet (const char *name, const struct gaih_service *service, - } - *pat = addrmem; - } -+ else -+ { -+ if (h_errno == NO_DATA) -+ result = -EAI_NODATA; -+ else -+ result = -EAI_NONAME; -+ goto free_and_return; -+ } - } - else - { diff --git a/glibc-rh168253-getaddrinfo-tests-bug21295.patch b/glibc-rh168253-getaddrinfo-tests-bug21295.patch index cf00e67..ffd059a 100644 --- a/glibc-rh168253-getaddrinfo-tests-bug21295.patch +++ b/glibc-rh168253-getaddrinfo-tests-bug21295.patch @@ -5,12 +5,12 @@ Date: Sat Jun 24 16:51:31 2017 +0200 resolv/tst-resolv-basic: Add test cases for bug 21295 diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c -index 92f912beed35744f..3dfa1657f50ab588 100644 +index 66a0e8a1659219b4..95aea1bcfb266017 100644 --- a/resolv/tst-resolv-basic.c +++ b/resolv/tst-resolv-basic.c -@@ -398,6 +398,22 @@ do_test (void) - check_ai ("t.nxdomain.example", "80", AF_INET6, - "error: Name or service not known\n"); +@@ -495,6 +495,22 @@ do_test (void) + test_bug_21295 (); + test_nodata_nxdomain (); + /* Test for bug 21295. */ + check_ai_hints ("www.example", "80", diff --git a/glibc-rh168253-inet_pton-gnu-style.patch b/glibc-rh168253-inet_pton-gnu-style.patch deleted file mode 100644 index a8ca4f2..0000000 --- a/glibc-rh168253-inet_pton-gnu-style.patch +++ /dev/null @@ -1,354 +0,0 @@ -commit d53b8652880ba42913f66e7eee0567ce4cfe7791 -Author: Florian Weimer -Date: Thu May 11 14:48:51 2017 +0200 - - inet_pton: Reformat in GNU style - - Generated machine code is identical on x86-64. - -diff --git a/resolv/inet_pton.c b/resolv/inet_pton.c -index c0a7d54c303af82b..68f0fa54020e9351 100644 ---- a/resolv/inet_pton.c -+++ b/resolv/inet_pton.c -@@ -25,188 +25,192 @@ - #include - #include - --/* -- * WARNING: Don't even consider trying to compile this on a system where -- * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. -- */ -- --static int inet_pton4 (const char *src, u_char *dst) internal_function; --static int inet_pton6 (const char *src, u_char *dst) internal_function; -+static int inet_pton4 (const char *src, unsigned char *dst); -+static int inet_pton6 (const char *src, unsigned char *dst); - --/* int -- * inet_pton(af, src, dst) -- * convert from presentation format (which usually means ASCII printable) -- * to network format (which is usually some kind of binary format). -+/* Convert from presentation format (which usually means ASCII printable) -+ * to network format (which is usually some kind of binary format). -+ * - * return: -- * 1 if the address was valid for the specified address family -- * 0 if the address wasn't valid (`dst' is untouched in this case) -- * -1 if some other error occurred (`dst' is untouched in this case, too) -+ * 1 if the address was valid for the specified address family -+ * 0 if the address wasn't valid (`dst' is untouched in this case) -+ * -1 if some other error occurred (`dst' is untouched in this case, too) - * author: -- * Paul Vixie, 1996. -+ * Paul Vixie, 1996. - */ - int - __inet_pton (int af, const char *src, void *dst) - { -- switch (af) { -- case AF_INET: -- return (inet_pton4(src, dst)); -- case AF_INET6: -- return (inet_pton6(src, dst)); -- default: -- __set_errno (EAFNOSUPPORT); -- return (-1); -- } -- /* NOTREACHED */ -+ switch (af) -+ { -+ case AF_INET: -+ return inet_pton4 (src, dst); -+ case AF_INET6: -+ return inet_pton6 (src, dst); -+ default: -+ __set_errno (EAFNOSUPPORT); -+ return -1; -+ } - } - libc_hidden_def (__inet_pton) - weak_alias (__inet_pton, inet_pton) - libc_hidden_weak (inet_pton) - --/* int -- * inet_pton4(src, dst) -- * like inet_aton() but without all the hexadecimal, octal (with the -- * exception of 0) and shorthand. -+/* Like inet_atonbut without all the hexadecimal, octal and shorthand. -+ * - * return: -- * 1 if `src' is a valid dotted quad, else 0. -+ * 1 if `src' is a valid dotted quad, else 0. - * notice: -- * does not touch `dst' unless it's returning 1. -+ * does not touch `dst' unless it's returning 1. - * author: -- * Paul Vixie, 1996. -+ * Paul Vixie, 1996. - */ - static int --internal_function --inet_pton4 (const char *src, u_char *dst) -+inet_pton4 (const char *src, unsigned char *dst) - { -- int saw_digit, octets, ch; -- u_char tmp[NS_INADDRSZ], *tp; -- -- saw_digit = 0; -- octets = 0; -- *(tp = tmp) = 0; -- while ((ch = *src++) != '\0') { -+ int saw_digit, octets, ch; -+ unsigned char tmp[NS_INADDRSZ], *tp; - -- if (ch >= '0' && ch <= '9') { -- u_int new = *tp * 10 + (ch - '0'); -+ saw_digit = 0; -+ octets = 0; -+ *(tp = tmp) = 0; -+ while ((ch = *src++) != '\0') -+ { -+ if (ch >= '0' && ch <= '9') -+ { -+ unsigned int new = *tp * 10 + (ch - '0'); - -- if (saw_digit && *tp == 0) -- return (0); -- if (new > 255) -- return (0); -- *tp = new; -- if (! saw_digit) { -- if (++octets > 4) -- return (0); -- saw_digit = 1; -- } -- } else if (ch == '.' && saw_digit) { -- if (octets == 4) -- return (0); -- *++tp = 0; -- saw_digit = 0; -- } else -- return (0); -- } -- if (octets < 4) -- return (0); -- memcpy(dst, tmp, NS_INADDRSZ); -- return (1); -+ if (saw_digit && *tp == 0) -+ return 0; -+ if (new > 255) -+ return 0; -+ *tp = new; -+ if (! saw_digit) -+ { -+ if (++octets > 4) -+ return 0; -+ saw_digit = 1; -+ } -+ } -+ else if (ch == '.' && saw_digit) -+ { -+ if (octets == 4) -+ return 0; -+ *++tp = 0; -+ saw_digit = 0; -+ } -+ else -+ return 0; -+ } -+ if (octets < 4) -+ return 0; -+ memcpy (dst, tmp, NS_INADDRSZ); -+ return 1; - } - --/* int -- * inet_pton6(src, dst) -- * convert presentation level address to network order binary form. -+/* Cconvert presentation level address to network order binary form. -+ * - * return: -- * 1 if `src' is a valid [RFC1884 2.2] address, else 0. -+ * 1 if `src' is a valid [RFC1884 2.2] address, else 0. - * notice: -- * (1) does not touch `dst' unless it's returning 1. -- * (2) :: in a full address is silently ignored. -+ * (1) does not touch `dst' unless it's returning 1. -+ * (2) :: in a full address is silently ignored. - * credit: -- * inspired by Mark Andrews. -+ * inspired by Mark Andrews. - * author: -- * Paul Vixie, 1996. -+ * Paul Vixie, 1996. - */ - static int --internal_function --inet_pton6 (const char *src, u_char *dst) -+inet_pton6 (const char *src, unsigned char *dst) - { -- static const char xdigits[] = "0123456789abcdef"; -- u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; -- const char *curtok; -- int ch, saw_xdigit; -- u_int val; -+ static const char xdigits[] = "0123456789abcdef"; -+ unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; -+ const char *curtok; -+ int ch, saw_xdigit; -+ unsigned int val; - -- tp = memset(tmp, '\0', NS_IN6ADDRSZ); -- endp = tp + NS_IN6ADDRSZ; -- colonp = NULL; -- /* Leading :: requires some special handling. */ -- if (*src == ':') -- if (*++src != ':') -- return (0); -- curtok = src; -- saw_xdigit = 0; -- val = 0; -- while ((ch = tolower (*src++)) != '\0') { -- const char *pch; -+ tp = memset (tmp, '\0', NS_IN6ADDRSZ); -+ endp = tp + NS_IN6ADDRSZ; -+ colonp = NULL; -+ /* Leading :: requires some special handling. */ -+ if (*src == ':') -+ if (*++src != ':') -+ return 0; -+ curtok = src; -+ saw_xdigit = 0; -+ val = 0; -+ while ((ch = tolower (*src++)) != '\0') -+ { -+ const char *pch; - -- pch = strchr(xdigits, ch); -- if (pch != NULL) { -- val <<= 4; -- val |= (pch - xdigits); -- if (val > 0xffff) -- return (0); -- saw_xdigit = 1; -- continue; -- } -- if (ch == ':') { -- curtok = src; -- if (!saw_xdigit) { -- if (colonp) -- return (0); -- colonp = tp; -- continue; -- } else if (*src == '\0') { -- return (0); -- } -- if (tp + NS_INT16SZ > endp) -- return (0); -- *tp++ = (u_char) (val >> 8) & 0xff; -- *tp++ = (u_char) val & 0xff; -- saw_xdigit = 0; -- val = 0; -- continue; -- } -- if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && -- inet_pton4(curtok, tp) > 0) { -- tp += NS_INADDRSZ; -- saw_xdigit = 0; -- break; /* '\0' was seen by inet_pton4(). */ -- } -- return (0); -+ pch = strchr (xdigits, ch); -+ if (pch != NULL) -+ { -+ val <<= 4; -+ val |= (pch - xdigits); -+ if (val > 0xffff) -+ return 0; -+ saw_xdigit = 1; -+ continue; -+ } -+ if (ch == ':') -+ { -+ curtok = src; -+ if (!saw_xdigit) -+ { -+ if (colonp) -+ return 0; -+ colonp = tp; -+ continue; -+ } -+ else if (*src == '\0') -+ { -+ return 0; -+ } -+ if (tp + NS_INT16SZ > endp) -+ return 0; -+ *tp++ = (unsigned char) (val >> 8) & 0xff; -+ *tp++ = (unsigned char) val & 0xff; -+ saw_xdigit = 0; -+ val = 0; -+ continue; - } -- if (saw_xdigit) { -- if (tp + NS_INT16SZ > endp) -- return (0); -- *tp++ = (u_char) (val >> 8) & 0xff; -- *tp++ = (u_char) val & 0xff; -+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && -+ inet_pton4 (curtok, tp) > 0) -+ { -+ tp += NS_INADDRSZ; -+ saw_xdigit = 0; -+ break; /* '\0' was seen by inet_pton4. */ - } -- if (colonp != NULL) { -- /* -- * Since some memmove()'s erroneously fail to handle -- * overlapping regions, we'll do the shift by hand. -- */ -- const int n = tp - colonp; -- int i; -+ return 0; -+ } -+ if (saw_xdigit) -+ { -+ if (tp + NS_INT16SZ > endp) -+ return 0; -+ *tp++ = (unsigned char) (val >> 8) & 0xff; -+ *tp++ = (unsigned char) val & 0xff; -+ } -+ if (colonp != NULL) -+ { -+ /* -+ * Since some memmove's erroneously fail to handle -+ * overlapping regions, we'll do the shift by hand. -+ */ -+ const int n = tp - colonp; -+ int i; - -- if (tp == endp) -- return (0); -- for (i = 1; i <= n; i++) { -- endp[- i] = colonp[n - i]; -- colonp[n - i] = 0; -- } -- tp = endp; -+ if (tp == endp) -+ return 0; -+ for (i = 1; i <= n; i++) -+ { -+ endp[- i] = colonp[n - i]; -+ colonp[n - i] = 0; - } -- if (tp != endp) -- return (0); -- memcpy(dst, tmp, NS_IN6ADDRSZ); -- return (1); -+ tp = endp; -+ } -+ if (tp != endp) -+ return 0; -+ memcpy (dst, tmp, NS_IN6ADDRSZ); -+ return 1; - } diff --git a/glibc-rh168253-inet_pton_length.patch b/glibc-rh168253-inet_pton_length.patch index f074c71..9341a67 100644 --- a/glibc-rh168253-inet_pton_length.patch +++ b/glibc-rh168253-inet_pton_length.patch @@ -5,10 +5,10 @@ Date: Wed Jun 21 13:09:08 2017 +0200 __inet_pton_length: Implement new internal helper function diff --git a/resolv/Makefile b/resolv/Makefile -index f9d8bceb9b4bc8b0..88766729087d54cf 100644 +index 3854ff4ad4156c15..692b2322cf7a3cab 100644 --- a/resolv/Makefile +++ b/resolv/Makefile -@@ -64,6 +64,9 @@ tests += \ +@@ -65,6 +65,9 @@ tests += \ endif @@ -18,838 +18,3 @@ index f9d8bceb9b4bc8b0..88766729087d54cf 100644 # This test sends millions of packets and is rather slow. xtests += tst-resolv-qtypes endif -diff --git a/resolv/Versions b/resolv/Versions -index e561bce1a47ca3da..f528ed51e898a61d 100644 ---- a/resolv/Versions -+++ b/resolv/Versions -@@ -27,6 +27,7 @@ libc { - __h_errno; __resp; - - __res_maybe_init; __res_iclose; -+ __inet_pton_length; - } - } - -diff --git a/resolv/inet_pton.c b/resolv/inet_pton.c -index 68f0fa54020e9351..b95da47c17ef8afc 100644 ---- a/resolv/inet_pton.c -+++ b/resolv/inet_pton.c -@@ -1,3 +1,20 @@ -+/* Copyright (C) 1996-2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ - /* - * Copyright (c) 1996,1999 by Internet Software Consortium. - * -@@ -15,58 +32,53 @@ - * SOFTWARE. - */ - --#include --#include --#include --#include - #include - #include - #include --#include - #include -+#include -+#include -+#include -+#include -+#include - --static int inet_pton4 (const char *src, unsigned char *dst); --static int inet_pton6 (const char *src, unsigned char *dst); -+static int inet_pton4 (const char *src, const char *src_end, u_char *dst); -+static int inet_pton6 (const char *src, const char *src_end, u_char *dst); - --/* Convert from presentation format (which usually means ASCII printable) -- * to network format (which is usually some kind of binary format). -- * -- * return: -- * 1 if the address was valid for the specified address family -- * 0 if the address wasn't valid (`dst' is untouched in this case) -- * -1 if some other error occurred (`dst' is untouched in this case, too) -- * author: -- * Paul Vixie, 1996. -- */ - int --__inet_pton (int af, const char *src, void *dst) -+__inet_pton_length (int af, const char *src, size_t srclen, void *dst) - { - switch (af) - { - case AF_INET: -- return inet_pton4 (src, dst); -+ return inet_pton4 (src, src + srclen, dst); - case AF_INET6: -- return inet_pton6 (src, dst); -+ return inet_pton6 (src, src + srclen, dst); - default: - __set_errno (EAFNOSUPPORT); - return -1; - } - } -+libc_hidden_def (__inet_pton_length) -+ -+/* Like __inet_pton_length, but use strlen (SRC) as the length of -+ SRC. */ -+int -+__inet_pton (int af, const char *src, void *dst) -+{ -+ return __inet_pton_length (af, src, strlen (src), dst); -+} - libc_hidden_def (__inet_pton) - weak_alias (__inet_pton, inet_pton) - libc_hidden_weak (inet_pton) - --/* Like inet_atonbut without all the hexadecimal, octal and shorthand. -- * -- * return: -- * 1 if `src' is a valid dotted quad, else 0. -- * notice: -- * does not touch `dst' unless it's returning 1. -- * author: -- * Paul Vixie, 1996. -- */ -+/* Like inet_aton but without all the hexadecimal, octal and shorthand -+ (and trailing garbage is not ignored). Return 1 if SRC is a valid -+ dotted quad, else 0. This function does not touch DST unless it's -+ returning 1. -+ Author: Paul Vixie, 1996. */ - static int --inet_pton4 (const char *src, unsigned char *dst) -+inet_pton4 (const char *src, const char *end, unsigned char *dst) - { - int saw_digit, octets, ch; - unsigned char tmp[NS_INADDRSZ], *tp; -@@ -74,8 +86,9 @@ inet_pton4 (const char *src, unsigned char *dst) - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; -- while ((ch = *src++) != '\0') -+ while (src < end) - { -+ ch = *src++; - if (ch >= '0' && ch <= '9') - { - unsigned int new = *tp * 10 + (ch - '0'); -@@ -108,22 +121,27 @@ inet_pton4 (const char *src, unsigned char *dst) - return 1; - } - --/* Cconvert presentation level address to network order binary form. -- * -- * return: -- * 1 if `src' is a valid [RFC1884 2.2] address, else 0. -- * notice: -- * (1) does not touch `dst' unless it's returning 1. -- * (2) :: in a full address is silently ignored. -- * credit: -- * inspired by Mark Andrews. -- * author: -- * Paul Vixie, 1996. -- */ -+/* Return the value of CH as a hexademical digit, or -1 if it is a -+ different type of character. */ -+static int -+hex_digit_value (char ch) -+{ -+ if ('0' <= ch && ch <= '9') -+ return ch - '0'; -+ if ('a' <= ch && ch <= 'f') -+ return ch - 'a' + 10; -+ if ('A' <= ch && ch <= 'F') -+ return ch - 'A' + 10; -+ return -1; -+} -+ -+/* Convert presentation-level IPv6 address to network order binary -+ form. Return 1 if SRC is a valid [RFC1884 2.2] address, else 0. -+ This function does not touch DST unless it's returning 1. -+ Author: Paul Vixie, 1996. Inspired by Mark Andrews. */ - static int --inet_pton6 (const char *src, unsigned char *dst) -+inet_pton6 (const char *src, const char *src_endp, unsigned char *dst) - { -- static const char xdigits[] = "0123456789abcdef"; - unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *curtok; - int ch, saw_xdigit; -@@ -132,22 +150,28 @@ inet_pton6 (const char *src, unsigned char *dst) - tp = memset (tmp, '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; - colonp = NULL; -+ - /* Leading :: requires some special handling. */ -+ if (src == src_endp) -+ return 0; - if (*src == ':') -- if (*++src != ':') -- return 0; -+ { -+ ++src; -+ if (src == src_endp || *src != ':') -+ return 0; -+ } -+ - curtok = src; - saw_xdigit = 0; - val = 0; -- while ((ch = tolower (*src++)) != '\0') -+ while (src < src_endp) - { -- const char *pch; -- -- pch = strchr (xdigits, ch); -- if (pch != NULL) -+ ch = *src++; -+ int digit = hex_digit_value (ch); -+ if (digit >= 0) - { - val <<= 4; -- val |= (pch - xdigits); -+ val |= digit; - if (val > 0xffff) - return 0; - saw_xdigit = 1; -@@ -163,10 +187,8 @@ inet_pton6 (const char *src, unsigned char *dst) - colonp = tp; - continue; - } -- else if (*src == '\0') -- { -- return 0; -- } -+ else if (src == src_endp) -+ return 0; - if (tp + NS_INT16SZ > endp) - return 0; - *tp++ = (unsigned char) (val >> 8) & 0xff; -@@ -175,8 +197,8 @@ inet_pton6 (const char *src, unsigned char *dst) - val = 0; - continue; - } -- if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && -- inet_pton4 (curtok, tp) > 0) -+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) -+ && inet_pton4 (curtok, src_endp, tp) > 0) - { - tp += NS_INADDRSZ; - saw_xdigit = 0; -@@ -193,20 +215,13 @@ inet_pton6 (const char *src, unsigned char *dst) - } - if (colonp != NULL) - { -- /* -- * Since some memmove's erroneously fail to handle -- * overlapping regions, we'll do the shift by hand. -- */ -- const int n = tp - colonp; -- int i; -- -+ /* Replace :: with zeros. */ - if (tp == endp) -- return 0; -- for (i = 1; i <= n; i++) -- { -- endp[- i] = colonp[n - i]; -- colonp[n - i] = 0; -- } -+ /* :: would expand to a zero-width field. */ -+ return 0; -+ size_t n = tp - colonp; -+ memmove (endp - n, colonp, n); -+ memset (colonp, 0, endp - n - colonp); - tp = endp; - } - if (tp != endp) -diff --git a/resolv/resolv-internal.h b/resolv/resolv-internal.h -index 0d69ce10d33afcc5..9afaa07d8b03d31f 100644 ---- a/resolv/resolv-internal.h -+++ b/resolv/resolv-internal.h -@@ -56,4 +56,13 @@ enum - int __res_nopt (res_state, int n0, unsigned char *buf, int buflen, - int anslen) attribute_hidden; - -+/* Convert from presentation format (which usually means ASCII -+ printable) to network format (which is usually some kind of binary -+ format). The input is in the range [SRC, SRC + SRCLEN). The -+ output is written to DST (which has to be 4 or 16 bytes long, -+ depending on AF). Return 0 for invalid input, 1 for success, -1 -+ for an invalid address family. */ -+int __inet_pton_length (int af, const char *src, size_t srclen, void *); -+libc_hidden_proto (__inet_pton_length) -+ - #endif /* _RESOLV_INTERNAL_H */ -diff --git a/resolv/tst-inet_pton.c b/resolv/tst-inet_pton.c -new file mode 100644 -index 0000000000000000..7fffb24cdf9eb1f4 ---- /dev/null -+++ b/resolv/tst-inet_pton.c -@@ -0,0 +1,549 @@ -+/* Test inet_pton functions. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Memory region created by next_to_fault_allocate. */ -+struct next_to_fault -+{ -+ /* The user data. */ -+ char *buffer; -+ size_t length; -+ -+ /* The entire allocated region. */ -+ void *region_start; -+ size_t region_size; -+}; -+ -+/* Allocate a buffer of SIZE bytes just before a page which is mapped -+ with PROT_NONE (so that overrunning the buffer will cause a -+ fault). */ -+static struct next_to_fault -+next_to_fault_allocate (size_t size) -+{ -+ long page_size = sysconf (_SC_PAGE_SIZE); -+ TEST_VERIFY_EXIT (page_size > 0); -+ struct next_to_fault result; -+ result.region_size = roundup (size, page_size) + page_size; -+ TEST_VERIFY_EXIT (size + page_size > size); -+ TEST_VERIFY_EXIT (result.region_size > size); -+ result.region_start -+ = xmmap (NULL, result.region_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ /* Unmap the page after the allocation. */ -+ xmprotect (result.region_start + (result.region_size - page_size), -+ page_size, PROT_NONE); -+ /* Align the allocation within the region so that it ends just -+ before the PROT_NONE page. */ -+ result.buffer = result.region_start + result.region_size - page_size - size; -+ result.length = size; -+ return result; -+} -+ -+/* Deallocate the memory region allocated by -+ next_to_fault_allocate. */ -+static void -+next_to_fault_free (struct next_to_fault *ntf) -+{ -+ xmunmap (ntf->region_start, ntf->region_size); -+ *ntf = (struct next_to_fault) { NULL, }; -+} -+ -+struct test_case -+{ -+ /* The input data. */ -+ const char *input; -+ -+ /* True if AF_INET parses successfully. */ -+ bool ipv4_ok; -+ -+ /* True if AF_INET6 parses successfully. */ -+ bool ipv6_ok; -+ -+ /* Expected result for AF_INET. */ -+ unsigned char ipv4_expected[4]; -+ -+ /* Expected result for AF_INET6. */ -+ unsigned char ipv6_expected[16]; -+}; -+ -+static void -+check_result (const char *what, const struct test_case *t, int family, -+ void *result_buffer, int inet_ret) -+{ -+ TEST_VERIFY_EXIT (inet_ret >= -1); -+ TEST_VERIFY_EXIT (inet_ret <= 1); -+ -+ int ok; -+ const unsigned char *expected; -+ size_t result_size; -+ switch (family) -+ { -+ case AF_INET: -+ ok = t->ipv4_ok; -+ expected = t->ipv4_expected; -+ result_size = 4; -+ break; -+ case AF_INET6: -+ ok = t->ipv6_ok; -+ expected = t->ipv6_expected; -+ result_size = 16; -+ break; -+ default: -+ FAIL_EXIT1 ("invalid address family %d", family); -+ } -+ -+ if (inet_ret != ok) -+ { -+ support_record_failure (); -+ printf ("error: %s return value mismatch for [[%s]], family %d\n" -+ " expected: %d\n" -+ " actual: %d\n", -+ what, t->input, family, ok, inet_ret); -+ return; -+ } -+ if (memcmp (result_buffer, expected, result_size) != 0) -+ { -+ support_record_failure (); -+ printf ("error: %s result mismatch for [[%s]], family %d\n", -+ what, t->input, family); -+ } -+} -+ -+static void -+run_one_test (const struct test_case *t) -+{ -+ size_t test_len = strlen (t->input); -+ -+ struct next_to_fault ntf_out4 = next_to_fault_allocate (4); -+ struct next_to_fault ntf_out6 = next_to_fault_allocate (16); -+ -+ /* inet_pton requires NUL termination. */ -+ { -+ struct next_to_fault ntf_in = next_to_fault_allocate (test_len + 1); -+ memcpy (ntf_in.buffer, t->input, test_len + 1); -+ memset (ntf_out4.buffer, 0, 4); -+ check_result ("inet_pton", t, AF_INET, ntf_out4.buffer, -+ inet_pton (AF_INET, ntf_in.buffer, ntf_out4.buffer)); -+ memset (ntf_out6.buffer, 0, 16); -+ check_result ("inet_pton", t, AF_INET6, ntf_out6.buffer, -+ inet_pton (AF_INET6, ntf_in.buffer, ntf_out6.buffer)); -+ next_to_fault_free (&ntf_in); -+ } -+ -+ /* __inet_pton_length does not require NUL termination. */ -+ { -+ struct next_to_fault ntf_in = next_to_fault_allocate (test_len); -+ memcpy (ntf_in.buffer, t->input, test_len); -+ memset (ntf_out4.buffer, 0, 4); -+ check_result ("__inet_pton_length", t, AF_INET, ntf_out4.buffer, -+ __inet_pton_length (AF_INET, ntf_in.buffer, ntf_in.length, -+ ntf_out4.buffer)); -+ memset (ntf_out6.buffer, 0, 16); -+ check_result ("__inet_pton_length", t, AF_INET6, ntf_out6.buffer, -+ __inet_pton_length (AF_INET6, ntf_in.buffer, ntf_in.length, -+ ntf_out6.buffer)); -+ next_to_fault_free (&ntf_in); -+ } -+ -+ next_to_fault_free (&ntf_out4); -+ next_to_fault_free (&ntf_out6); -+} -+ -+/* The test cases were manually crafted and the set enhanced with -+ American Fuzzy Lop. */ -+const struct test_case test_cases[] = -+ { -+ {.input = ".:", }, -+ {.input = "0.0.0.0", -+ .ipv4_ok = true, -+ .ipv4_expected = {0, 0, 0, 0}, -+ }, -+ {.input = "0.:", }, -+ {.input = "00", }, -+ {.input = "0000000", }, -+ {.input = "00000000000000000", }, -+ {.input = "092.", }, -+ {.input = "10.0.301.2", }, -+ {.input = "127.0.0.1", -+ .ipv4_ok = true, -+ .ipv4_expected = {127, 0, 0, 1}, -+ }, -+ {.input = "19..", }, -+ {.input = "192.0.2.-1", }, -+ {.input = "192.0.2.01", }, -+ {.input = "192.0.2.1.", }, -+ {.input = "192.0.2.1192.", }, -+ {.input = "192.0.2.192.\377..", }, -+ {.input = "192.0.2.256", }, -+ {.input = "192.0.2.27", -+ .ipv4_ok = true, -+ .ipv4_expected = {192, 0, 2, 27}, -+ }, -+ {.input = "192.0.201.", }, -+ {.input = "192.0.261.", }, -+ {.input = "192.0.2\256", }, -+ {.input = "192.0.\262.", }, -+ {.input = "192.062.", }, -+ {.input = "192.092.\256", }, -+ {.input = "192.0\2562.", }, -+ {.input = "192.192.0.2661\031", }, -+ {.input = "192.192.00n2.1.", }, -+ {.input = "192.192.2.190.", }, -+ {.input = "192.255.255.2555", }, -+ {.input = "192.92.219\023.", }, -+ {.input = "192.\260.2.", }, -+ {.input = "1:1::1:1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1 -+ }, -+ }, -+ {.input = "2", }, -+ {.input = "2.", }, -+ {.input = "2001:db8:00001::f", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x1, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf -+ }, -+ }, -+ {.input = "2001:db8:10000::f", }, -+ {.input = "2001:db8:1234:5678:abcd:ef01:2345:67", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x12, 0x34, 0x56, 0x78, -+ 0xab, 0xcd, 0xef, 0x1, 0x23, 0x45, 0x0, 0x67 -+ }, -+ }, -+ {.input = "2001:db8:1234:5678:abcd:ef01:2345:6789:1", }, -+ {.input = "2001:db8:1234:5678:abcd:ef01:2345::6789", }, -+ {.input = "2001:db8::0", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -+ }, -+ }, -+ {.input = "2001:db8::00", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -+ }, -+ }, -+ {.input = "2001:db8::1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = "2001:db8::10", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10 -+ }, -+ }, -+ {.input = "2001:db8::19", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19 -+ }, -+ }, -+ {.input = "2001:db8::1::\012", }, -+ {.input = "2001:db8::1::2\012", }, -+ {.input = "2001:db8::2", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2 -+ }, -+ }, -+ {.input = "2001:db8::3", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3 -+ }, -+ }, -+ {.input = "2001:db8::4", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4 -+ }, -+ }, -+ {.input = "2001:db8::5", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5 -+ }, -+ }, -+ {.input = "2001:db8::6", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6 -+ }, -+ }, -+ {.input = "2001:db8::7", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7 -+ }, -+ }, -+ {.input = "2001:db8::8", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8 -+ }, -+ }, -+ {.input = "2001:db8::9", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9 -+ }, -+ }, -+ {.input = "2001:db8::A", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa -+ }, -+ }, -+ {.input = "2001:db8::B", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb -+ }, -+ }, -+ {.input = "2001:db8::C", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc -+ }, -+ }, -+ {.input = "2001:db8::D", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd -+ }, -+ }, -+ {.input = "2001:db8::E", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe -+ }, -+ }, -+ {.input = "2001:db8::F", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf -+ }, -+ }, -+ {.input = "2001:db8::a", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa -+ }, -+ }, -+ {.input = "2001:db8::b", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb -+ }, -+ }, -+ {.input = "2001:db8::c", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc -+ }, -+ }, -+ {.input = "2001:db8::d", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd -+ }, -+ }, -+ {.input = "2001:db8::e", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe -+ }, -+ }, -+ {.input = "2001:db8::f", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf -+ }, -+ }, -+ {.input = "2001:db8::ff", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff -+ }, -+ }, -+ {.input = "2001:db8::ffff:2\012", }, -+ {.input = "22", }, -+ {.input = "2222@", }, -+ {.input = "255.255.255.255", -+ .ipv4_ok = true, -+ .ipv4_expected = {255, 255, 255, 255}, -+ }, -+ {.input = "255.255.255.255\001", }, -+ {.input = "255.255.255.25555", }, -+ {.input = "2:", }, -+ {.input = "2:a:8:EEEE::EEEE:F:EEE8:EEEE\034*:", }, -+ {.input = "2:ff:1:1:7:ff:1:1:7.", }, -+ {.input = "2f:0000000000000000000000000000000000000000000000000000000000" -+ "0000000000000000000000000000000000000000000000000000000000000000000000" -+ "0G01", -+ }, -+ {.input = "429495", }, -+ {.input = "5::5::", }, -+ {.input = "6.6.", }, -+ {.input = "992.", }, -+ {.input = "::", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -+ }, -+ }, -+ {.input = "::00001", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = "::1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = "::10000", }, -+ {.input = "::1:1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1 -+ }, -+ }, -+ {.input = "::ff:1:1:7.0.0.1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, -+ 0x0, 0x1, 0x0, 0x1, 0x7, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = "::ff:1:1:7:ff:1:1:7.", }, -+ {.input = "::ff:1:1:7ff:1:8:7.0.0.1", }, -+ {.input = "::ff:1:1:7ff:1:8f:1:1:71", }, -+ {.input = "::ffff:02fff:127.0.S1", }, -+ {.input = "::ffff:127.0.0.1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = "::ffff:1:7.0.0.1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0xff, 0xff, 0x0, 0x1, 0x7, 0x0, 0x0, 0x1 -+ }, -+ }, -+ {.input = ":\272", }, -+ {.input = "A:f:ff:1:1:D:ff:1:1::7.", }, -+ {.input = "AAAAA.", }, -+ {.input = "D:::", }, -+ {.input = "DF8F", }, -+ {.input = "F::", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -+ }, -+ }, -+ {.input = "F:A:8:EEEE:8:EEEE\034*:", }, -+ {.input = "F:a:8:EEEE:8:EEEE\034*:", }, -+ {.input = "F:ff:100:7ff:1:8:7.0.10.1", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0x0, 0xf, 0x0, 0xff, 0x1, 0x0, 0x7, 0xff, -+ 0x0, 0x1, 0x0, 0x8, 0x7, 0x0, 0xa, 0x1 -+ }, -+ }, -+ {.input = "d92.", }, -+ {.input = "ff:00000000000000000000000000000000000000000000000000000000000" -+ "00000000000000000000000000000000000000000000000000000000000000000001", -+ }, -+ {.input = "fff2:2::ff2:2:f7", -+ .ipv6_ok = true, -+ .ipv6_expected = { -+ 0xff, 0xf2, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, -+ 0x0, 0x0, 0xf, 0xf2, 0x0, 0x2, 0x0, 0xf7 -+ }, -+ }, -+ {.input = "ffff:ff:ff:fff:ff:ff:ff:", }, -+ {.input = "\272:", }, -+ {NULL} -+ }; -+ -+static int -+do_test (void) -+{ -+ for (size_t i = 0; test_cases[i].input != NULL; ++i) -+ run_one_test (test_cases + i); -+ return 0; -+} -+ -+#include diff --git a/glibc-rh168253-ns_name-tests.patch b/glibc-rh168253-ns_name-tests.patch deleted file mode 100644 index 84145f2..0000000 --- a/glibc-rh168253-ns_name-tests.patch +++ /dev/null @@ -1,891 +0,0 @@ -commit 07d6f1a3ca990e0e4f93b010605d4d87a3abdf24 -Author: Florian Weimer -Date: Tue Apr 4 14:09:56 2017 +0200 - - resolv: Add test coverage for ns_name_unpack, ns_name_ntop - -diff --git a/resolv/Makefile b/resolv/Makefile -index 01086d569f58170a..8441f9d30d83a209 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -43,6 +43,7 @@ routines += gai_sigqueue - tests += \ - tst-bug18665 \ - tst-bug18665-tcp \ -+ tst-ns_name \ - tst-res_hconf_reorder \ - tst-res_use_inet6 \ - tst-resolv-basic \ -@@ -130,5 +131,9 @@ $(objpfx)tst-resolv-network: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-qtypes: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-search: $(objpfx)libresolv.so $(shared-thread-library) - -+$(objpfx)tst-ns_name: $(objpfx)libresolv.so -+$(objpfx)tst-ns_name.out: tst-ns_name.data -+ -+ - # This test case uses the deprecated RES_USE_INET6 resolver option. - CFLAGS-tst-res_use_inet6.c += -Wno-error -diff --git a/resolv/tst-ns_name.c b/resolv/tst-ns_name.c -new file mode 100644 -index 0000000000000000..66d9a6666b2ebde2 ---- /dev/null -+++ b/resolv/tst-ns_name.c -@@ -0,0 +1,303 @@ -+/* Test ns_name-related functions. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This test program processes the tst-ns_name.data file. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* A byte buffer and its length. */ -+struct buffer -+{ -+ unsigned char *data; -+ size_t length; -+}; -+ -+/* Convert a base64-encoded string to its binary representation. */ -+static bool -+base64_to_buffer (const char *base64, struct buffer *result) -+{ -+ /* "-" denotes an empty input. */ -+ if (strcmp (base64, "-") == 0) -+ { -+ result->data = xmalloc (1); -+ result->length = 0; -+ return true; -+ } -+ -+ size_t size = strlen (base64); -+ unsigned char *data = xmalloc (size); -+ int ret = b64_pton (base64, data, size); -+ if (ret < 0 || ret > size) -+ return false; -+ result->data = xrealloc (data, ret); -+ result->length = ret; -+ return true; -+} -+ -+/* A test case for ns_name_unpack and ns_name_ntop. */ -+struct test_case -+{ -+ char *path; -+ size_t lineno; -+ struct buffer input; -+ size_t input_offset; -+ int unpack_result; -+ struct buffer unpack_output; -+ int ntop_result; -+ char *ntop_text; -+}; -+ -+/* Deallocate the buffers associated with the test case. */ -+static void -+free_test_case (struct test_case *t) -+{ -+ free (t->path); -+ free (t->input.data); -+ free (t->unpack_output.data); -+ free (t->ntop_text); -+} -+ -+/* Extract the test case information from a test file line. */ -+static bool -+parse_test_case (const char *path, size_t lineno, const char *line, -+ struct test_case *result) -+{ -+ memset (result, 0, sizeof (*result)); -+ result->path = xstrdup (path); -+ result->lineno = lineno; -+ result->ntop_result = -1; -+ char *input = NULL; -+ char *unpack_output = NULL; -+ int ret = sscanf (line, "%ms %zu %d %ms %d %ms", -+ &input, &result->input_offset, -+ &result->unpack_result, &unpack_output, -+ &result->ntop_result, &result->ntop_text); -+ if (ret < 3) -+ { -+ printf ("%s:%zu: error: missing input fields\n", path, lineno); -+ free (input); -+ return false; -+ } -+ if (!base64_to_buffer (input, &result->input)) -+ { -+ printf ("%s:%zu: error: malformed base64 input data\n", path, lineno); -+ free (input); -+ free (unpack_output); -+ free (result->ntop_text); -+ return false; -+ } -+ free (input); -+ -+ if (unpack_output == NULL) -+ result->unpack_output = (struct buffer) { NULL, 0 }; -+ else if (!base64_to_buffer (unpack_output, &result->unpack_output)) -+ { -+ printf ("%s:%zu: error: malformed base64 unpack data\n", path, lineno); -+ free (result->input.data); -+ free (unpack_output); -+ free (result->ntop_text); -+ return false; -+ } -+ free (unpack_output); -+ -+ /* At this point, all allocated buffers have been transferred to -+ *result. */ -+ -+ if (result->input_offset > result->input.length) -+ { -+ printf ("%s:%zu: error: input offset %zu exceeds buffer size %zu\n", -+ path, lineno, result->input_offset, result->input.length); -+ free_test_case (result); -+ return false; -+ } -+ if (result->unpack_result < -1) -+ { -+ printf ("%s:%zu: error: invalid unpack result %d\n", -+ path, lineno, result->unpack_result); -+ free_test_case (result); -+ return false; -+ } -+ if (result->ntop_result < -1) -+ { -+ printf ("%s:%zu: error: invalid ntop result %d\n", -+ path, lineno, result->ntop_result); -+ free_test_case (result); -+ return false; -+ } -+ -+ bool fields_consistent; -+ switch (ret) -+ { -+ case 3: -+ fields_consistent = result->unpack_result == -1; -+ break; -+ case 5: -+ fields_consistent = result->unpack_result != -1 -+ && result->ntop_result == -1; -+ break; -+ case 6: -+ fields_consistent = result->unpack_result != -1 -+ && result->ntop_result != -1; -+ break; -+ default: -+ fields_consistent = false; -+ } -+ if (!fields_consistent) -+ { -+ printf ("%s:%zu: error: wrong number of fields: %d\n", -+ path, lineno, ret); -+ free_test_case (result); -+ return false; -+ } -+ return true; -+} -+ -+/* Format the buffer as a hexadecimal string and write it to standard -+ output. */ -+static void -+print_hex (const char *label, struct buffer buffer) -+{ -+ printf (" %s ", label); -+ unsigned char *p = buffer.data; -+ unsigned char *end = p + buffer.length; -+ while (p < end) -+ { -+ printf ("%02X", *p & 0xFF); -+ ++p; -+ } -+ putchar ('\n'); -+} -+ -+/* Run the test case specified in *T. */ -+static void -+run_test_case (struct test_case *t) -+{ -+ unsigned char *unpacked = xmalloc (NS_MAXCDNAME); -+ int consumed = ns_name_unpack -+ (t->input.data, t->input.data + t->input.length, -+ t->input.data + t->input_offset, -+ unpacked, NS_MAXCDNAME); -+ if (consumed != t->unpack_result) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong result from ns_name_unpack\n" -+ " expected: %d\n" -+ " actual: %d\n", -+ t->path, t->lineno, t->unpack_result, consumed); -+ return; -+ } -+ if (consumed != -1) -+ { -+ if (memcmp (unpacked, t->unpack_output.data, consumed) != 0) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong data from ns_name_unpack\n", -+ t->path, t->lineno); -+ print_hex ("expected:", t->unpack_output); -+ print_hex ("actual: ", (struct buffer) { unpacked, consumed }); -+ return; -+ } -+ -+ char *text = xmalloc (NS_MAXDNAME); -+ int ret = ns_name_ntop (unpacked, text, NS_MAXDNAME); -+ if (ret != t->ntop_result) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong result from ns_name_top\n" -+ " expected: %d\n" -+ " actual: %d\n", -+ t->path, t->lineno, t->ntop_result, ret); -+ return; -+ } -+ if (ret != -1) -+ { -+ if (strcmp (text, t->ntop_text) != 0) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong data from ns_name_ntop\n", -+ t->path, t->lineno); -+ printf (" expected: \"%s\"\n", t->ntop_text); -+ printf (" actual: \"%s\"\n", text); -+ return; -+ } -+ } -+ free (text); -+ } -+ free (unpacked); -+} -+ -+/* Open the file at PATH, parse the test cases contained in it, and -+ run them. */ -+static void -+run_test_file (const char *path) -+{ -+ FILE *fp = xfopen (path, "re"); -+ char *line = NULL; -+ size_t line_allocated = 0; -+ size_t lineno = 0; -+ -+ while (true) -+ { -+ ssize_t ret = getline (&line, &line_allocated, fp); -+ if (ret < 0) -+ { -+ if (ferror (fp)) -+ { -+ printf ("%s: error reading file: %m\n", path); -+ exit (1); -+ } -+ TEST_VERIFY (feof (fp)); -+ break; -+ } -+ -+ ++lineno; -+ char *p = line; -+ while (isspace (*p)) -+ ++p; -+ if (*p == '\0' || *p == '#') -+ continue; -+ -+ struct test_case test_case; -+ if (!parse_test_case (path, lineno, line, &test_case)) -+ { -+ support_record_failure (); -+ continue; -+ } -+ run_test_case (&test_case); -+ free_test_case (&test_case); -+ } -+ free (line); -+ xfclose (fp); -+} -+ -+static int -+do_test (void) -+{ -+ run_test_file ("tst-ns_name.data"); -+ return 0; -+} -+ -+#include -diff --git a/resolv/tst-ns_name.data b/resolv/tst-ns_name.data -new file mode 100644 -index 0000000000000000..0ff0dc3de7a722ae ---- /dev/null -+++ b/resolv/tst-ns_name.data -@@ -0,0 +1,548 @@ -+# Test input for ns_name_unpack and ns_name_ntop. -+# Copyright (C) 2017 Free Software Foundation, Inc. -+# This file is part of the GNU C Library. -+# -+# The GNU C Library is free software; you can redistribute it and/or -+# modify it under the terms of the GNU Lesser General Public -+# License as published by the Free Software Foundation; either -+# version 2.1 of the License, or (at your option) any later version. -+# -+# The GNU C Library 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 -+# Lesser General Public License for more details. -+# -+# You should have received a copy of the GNU Lesser General Public -+# License along with the GNU C Library; if not, see -+# . -+ -+# This file contains test input and expected output for the -+# ns_name_unpack and ns_name_ntop functions. Empty lines and comments -+# (lines starting with #) are ignored. Test data lines have the -+# following format: -+# -+# INPUT INPUT-OFFSET UNPACK-RESULT UNPACK-OUTPUT NTOP-RESULT NTOP-OUTPUT -+# -+# INPUT, UNPACK-OUTPUT are base64-encoded binary blobs. INPUT-OFFSET, -+# UNPACK-RESULT, NTOP-RESULT are signed integers. NTOP-OUTPUT is an -+# ASCII string (without spaces). If UNPACK-RESULT or NTOP-RESULT are -+# -1, the fields after that are missing (-1 is an error code, so the -+# output buffer is undefined). -+ -+# First some manually-crafted test cases. -+ -+# bytes-1 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+Af8A 0 -1 -+# bytes-1a -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A 0 129 AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A 233 \000.\001.\002.\003.\004.\005.\006.\007.\008.\009.\010.\011.\012.\013.\014.\015.\016.\017.\018.\019.\020.\021.\022.\023.\024.\025.\026.\027.\028.\029.\030.\031.\032.!.\".#.\$.%.&.'.\(.\).*.+.,.-.\../.0.1.2.3.4.5.6.7.8.9.:.\;.<.=.>.? -+# bytes-1b -+AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8A 0 129 AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8A 133 \@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\\.].^._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~.\127 -+# bytes-1c -+AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8A 0 129 AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8A 320 \128.\129.\130.\131.\132.\133.\134.\135.\136.\137.\138.\139.\140.\141.\142.\143.\144.\145.\146.\147.\148.\149.\150.\151.\152.\153.\154.\155.\156.\157.\158.\159.\160.\161.\162.\163.\164.\165.\166.\167.\168.\169.\170.\171.\172.\173.\174.\175.\176.\177.\178.\179.\180.\181.\182.\183.\184.\185.\186.\187.\188.\189.\190.\191 -+# bytes-1d -+AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+Af8A 0 129 AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+Af8A 320 \192.\193.\194.\195.\196.\197.\198.\199.\200.\201.\202.\203.\204.\205.\206.\207.\208.\209.\210.\211.\212.\213.\214.\215.\216.\217.\218.\219.\220.\221.\222.\223.\224.\225.\226.\227.\228.\229.\230.\231.\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253.\254.\255 -+# bytes-4 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtbm8EcHFycwR0dXZ3BHh5ensEfH1+fwSAgYKDBISFhocEiImKiwSMjY6PBJCRkpMElJWWlwSYmZqbBJydnp8EoKGiowSkpaanBKipqqsErK2urwSwsbKzBLS1trcEuLm6uwS8vb6/BMDBwsMExMXGxwTIycrLBMzNzs8E0NHS0wTU1dbXBNjZ2tsE3N3e3wTg4eLjBOTl5ucE6Onq6wTs7e7vBPDx8vME9PX29wT4+fr7BPz9/v8A 0 -1 -+# bytes-4a -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 185 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+# bytes-4b -+BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8A 0 81 BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8A 85 \@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~\127 -+# bytes-4c -+BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaKjBKSlpqcEqKmqqwSsra6vBLCxsrMEtLW2twS4ubq7BLy9vr8A 0 81 BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaKjBKSlpqcEqKmqqwSsra6vBLCxsrMEtLW2twS4ubq7BLy9vr8A 272 \128\129\130\131.\132\133\134\135.\136\137\138\139.\140\141\142\143.\144\145\146\147.\148\149\150\151.\152\153\154\155.\156\157\158\159.\160\161\162\163.\164\165\166\167.\168\169\170\171.\172\173\174\175.\176\177\178\179.\180\181\182\183.\184\185\186\187.\188\189\190\191 -+# bytes-4d -+BMDBwsMExMXGxwTIycrLBMzNzs8E0NHS0wTU1dbXBNjZ2tsE3N3e3wTg4eLjBOTl5ucE6Onq6wTs7e7vBPDx8vME9PX29wT4+fr7BPz9/v8A 0 81 BMDBwsMExMXGxwTIycrLBMzNzs8E0NHS0wTU1dbXBNjZ2tsE3N3e3wTg4eLjBOTl5ucE6Onq6wTs7e7vBPDx8vME9PX29wT4+fr7BPz9/v8A 272 \192\193\194\195.\196\197\198\199.\200\201\202\203.\204\205\206\207.\208\209\210\211.\212\213\214\215.\216\217\218\219.\220\221\222\223.\224\225\226\227.\228\229\230\231.\232\233\234\235.\236\237\238\239.\240\241\242\243.\244\245\246\247.\248\249\250\251.\252\253\254\255 -+# bytes-63 -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0/fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8P72+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+wT8/f7/AA== 0 -1 -+# bytes-63a -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9PgE/AA== 0 67 PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9PgE/AA== 171 \000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032!\"#\$%&'\(\)*+,-\./0123456789:\;<=>.? -+# bytes-63b -+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fgF/AA== 0 67 P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fgF/AA== 71 \@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~.\127 -+# bytes-63c -+P4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vgG/AA== 0 67 P4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vgG/AA== 258 \128\129\130\131\132\133\134\135\136\137\138\139\140\141\142\143\144\145\146\147\148\149\150\151\152\153\154\155\156\157\158\159\160\161\162\163\164\165\166\167\168\169\170\171\172\173\174\175\176\177\178\179\180\181\182\183\184\185\186\187\188\189\190.\191 -+# bytes-63d -+P8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/gH/AA== 0 67 P8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/gH/AA== 258 \192\193\194\195\196\197\198\199\200\201\202\203\204\205\206\207\208\209\210\211\212\213\214\215\216\217\218\219\220\221\222\223\224\225\226\227\228\229\230\231\232\233\234\235\236\237\238\239\240\241\242\243\244\245\246\247\248\249\250\251\252\253\254.\255 -+# compression-loop -+wAA= 0 -1 -+# compression-loop-2 -+wALAAA== 0 -1 -+# empty -+- 0 -1 -+# root -+AA== 0 1 AA== 2 . -+# truncated-compression -+wA== 0 -1 -+# www -+A3d3dwA= 0 5 A3d3dwA= 4 www -+# www-truncated -+A3d3dw== 0 -1 -+# www-truncated-2 -+A3d3 0 -1 -+# www.example.com -+5jrGq8kVxMt3ZS3RA3d3dwdleGFtcGxlA2NvbQA= 12 17 A3d3dwdleGFtcGxlA2NvbQA= 16 www.example.com -+# www.example.com-answer -+5jrGq8kVxMt3ZS3RA3d3dwdleGFtcGxlA2NvbQAAAQABwAw= 33 2 A3d3dwdleGFtcGxlA2NvbQA= 16 www.example.com -+# www.example.com-answer-truncated -+5jrGq8kVxMt3ZS3RA3d3dwdleGFtcGxlA2NvbQAAAQABwA== 33 -1 -+# www.example.com-truncated -+5jrGq8kVxMt3ZS3RA3d3dwdleGFtcGw= 12 -1 -+# www1.example.com-answer -+5jrGq8kVxMt3ZS3RA3d3dwdleGFtcGxlA2NvbQAAAQABBHd3dzHAEA== 33 7 BHd3dzEHZXhhbXBsZQNjb20A 17 www1.example.com -+ -+# Then test cases derived from the above by American Fuzzy Lop (AFL). -+BAABAgMEBAUGBwQICQoLAAwN 0 16 BAABAgMEBAUGBwQICQoLAA== 51 \000\001\002\003.\004\005\006\007.\008\009\010\011 -+PwABAgMEBQYHCAmztLUAABYXGBmInAoLDA0ODyQRNDU2NwE5Ojs8PT4/PwkKCwwNDg8kSwoLDA0ODyQpKSkpKSkpPT4/VTAxMjM0NDY3AYeLjCspCSkpKSkpKSkpKSkpZCcoKSorLC0uPD0+Pz9AQUJDREVGLzAxMjM0NDY3AYoEAKytrq8= 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2ADwBAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2ADwBAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAA 618 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000<\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\@\000\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AA8BAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AA8BAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAA 621 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\015\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\@\000\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjbJNjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAAAQAb 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NskAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NskAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAA 624 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.6\201\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\@\000\000 -+BAABAgMEBAUGBwQICQoLBBINDg8QAAAAEwQUFRYXBBgZGhsEHB0eNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTExNqEykTlhMTEyYLAAEUFAAABjY2NjYAAAE2NhwAAAABAAABBDb/fwAAAzY2NgX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0pDY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/QM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/AAABNn////8= 0 -1 -+BAABAgMEBAUGBwQICQoLBBINDg8EAAAQAAQUFRYXBBgZGhsEHB0eNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTExNqEykTlhMTEyYLAAEUFAAABjY2NjYAAAE2NhwAAAABAAABBDb/fwAAAzY2NgX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0pDY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/QM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/AAABNn////8= 0 -1 -+AgIhIiMEJCUkAScBKAEpASoBKwEsAS0BLgExATgBOQE6IDsBASoBKwEsAS0BLgE3ATgBOQE6IDsBPAE9AT4BPw0BDgEPARABEQESARMBFAEBDgEPARABEQESARMBFCEhISEhISEhISEhISEhIX4hISEhISEhISEhARcFGAEZARoBGwEcAR0BASYBJwEoASkBKjwBPQE+AT8NAQ4BDwEQAREBEgETARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBAAACQCsBLAEtAS4BJwEoAUgBKgErASwBLQEuATsBPAE9AT4BPwA= 0 242 AgIhIiMEJCUkAScBKAEpASoBKwEsAS0BLgExATgBOQE6IDsBASoBKwEsAS0BLgE3ATgBOQE6IDsBPAE9AT4BPw0BDgEPARABEQESARMBFAEBDgEPARABEQESARMBFCEhISEhISEhISEhISEhIX4hISEhISEhISEhARcFGAEZARoBGwEcAR0BASYBJwEoASkBKjwBPQE+AT8NAQ4BDwEQAREBEgETARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBAAACQCsBLAEtAS4BJwEoAUgBKgErASwBLQEuATsBPAE9AT4BPwA= 607 \002!.#\004\$%\$\001'\001\(\001\)\001*\001+\001,\001-\001\.\0011\0018\0019\001:\032\;\001\001*.+.,.-.\..7.8.9.:.\;\001<\001=\001>\001?\013\001\014\001\015\001\016\001\017\001\018\001\019\001\020\001\001\014\001\015\001\016\001.\001\018\001\019\001\020!!!!!!!!!!!.!!!~!!!!!!!!!!\001\023\005\024\001\025\001\026\001\027\001\028\001\029\001\001&\001'.\(.\).*.\001=\001>\001?\013\001\014\001\015\001\016\001\017\001\018\001\019\001\020\001\023\005\024\001\025\001\026\001\027\001\028\001\029\001\030\001\031\001\032\001!\001\"\001#\001\$\001%\001&\001'\001\(\001\000\000.\@+.,.-.\..'.\(.H.*.+.,.-.\..\;.<.=.>.? -+wMAAAcDAwMDAQAA2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2iTY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAUYUwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjYyNk02NlEAEQEANjYABf//BUU2OTY2NiU9PT09NgAAAfI//3Y2AAABNjY0NgAAAYA2PRAA+/v7+/v7+/v///8= 16 -1 -+AwAAJ8AAISEhISEhISEhISEhISEhfiEhISEhISEhISG7u5CjAA== 0 -1 -+AhIAAlBINQAAATU1FTo/SEhIAwMDAwMFRTY5NgA2JT09PQEfNjY8NjYkFTY0NjYyNjY2NjYADDY2QksAAAEBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgD//gABNjY2PDY2JBUAfg== 68 -1 -+AQQBAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAFdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4ASEhISEhISEhISEhISEhIX4hISEhISEhISEhuQG6AbsBvAG9Ab4BvwHAAdwBwgHDAcQBxQHGAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGiEhuQG6AbsBvAG9Ab4BvwHAAdwBwgHDAcQBxQHGAQ3xDQEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBXQEeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAEhISEBqgGrAawBrQGuAa8BsAGxASEhISEhISEhISEhISEhISEhISEhIX4hISEhISEhISEhEhISEhISEhISAAABEhISEhISEhICAgICAgICAgICAgICIssBzAHNAc4BzwHQAdEB0gHTAdQB1QHWASPHAcgByf9/AAABzAHNAc4BzwHQAdEB0gHTg9QB1QHWARISEhISEhISEhISEhISEhIREhISEhISEhISEgAAAH8SAAABEhISEhISEhICAgICAgICAgICAgICIssBzAHNAc4BzwHQAdEB0gHTAdQB1QHWASMELyTrJwQIKSsrACw= 0 -1 -+AQA= 0 -1 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0V3gHfAeAB4QHiAc8B0AHRAdIB0wHUAdUB1gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QD+ 0 -1 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wA= 0 -1 -+BOgDAwgINjY2NjY2NjY2NjY2NjY2NjY2NgAAASY2NjY2NjZAAAAANjY2NjY2NgAAAAE2NjY2NjY2NjY2Ng82NjY2NjY2NjYhNis2RhQ2Nv9///82NjY2NjY2NjY2Nlc2QDY2NjYAAAE2NiM2NjY2NoE2NjY2Np5CPAAhNhM2NjY2NjY2Np42PAAYNhM2NjY2NjY2NgA2NjY2NjY2NjY2NvA2tzY2NjY2NjY2NjY2NjY2NjY2NjY2Njk2NjYxNjY2NjY2Nv9/NjY2NhY2NjY2NgAAATY2NjY2NjaeNjwAGDY2NjY2NjY2FDYAgAAANgAAATY2NjY2NjY2NjYBNgAAATY2 0 255 BOgDAwgINjY2NjY2NjY2NjY2NjY2NjY2NgAAASY2NjY2NjZAAAAANjY2NjY2NgAAAAE2NjY2NjY2NjY2Ng82NjY2NjY2NjYhNis2RhQ2Nv9///82NjY2NjY2NjY2Nlc2QDY2NjYAAAE2NiM2NjY2NoE2NjY2Np5CPAAhNhM2NjY2NjY2Np42PAAYNhM2NjY2NjY2NgA2NjY2NjY2NjY2NvA2tzY2NjY2NjY2NjY2NjY2NjY2NjY2Njk2NjYxNjY2NjY2Nv9/NjY2NhY2NjY2NgAAATY2NjY2NjaeNjwAGDY2NjY2NjY2FDYAgAAANgAAATY2NjY2NjY2NjYBNgAA 412 \232\003\003\008.66666666.6666666666\000\000\001&666666\@\000\000\0006666666\000\000\000\00166666666666\0156666666.6!6+6F\02066\255\127\255\25566666666666W6\@6666\000\000\00166#66666\12966666\158B<\000!6.66666666\1586<\000\0246\0196666.666\00066666666666\2406\183666666666666666666666966616666666\255\1276.66\02266666\000\000\0016666666\1586<\000\02466666666\0206\000\128\000\0006\000\000\0016666666666\0016\000 -+AhIAAlBIAABISEhIUz4AAAE1FTU1LTU1LTW2NTU1NQAAATU1FTo/SEhISEhISEhISEhISEhISEhISEhISAABAABISCZIUw== 68 -1 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPwA= 0 113 AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPwA= 217 \000.\001.\002.\003.\004.\005.\006.\007.\008.\009.\010.\011.\012.\013.\014.\015.\016.\017.\018.\019.\020.\021.\022.\023.\024.\025.\026.\027.\028.\029.\030.\031.\032.!.\".#.\$.%.&.'.\(.\).*.+.,.-.\..7.8.9.:.\;.<.=.>.? -+BOgAAAEDAwgINjY2NgAAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAX//wU2NjY0NgAAAQAAAYA2NhY2Njbn0NDQ0NDQ0NA2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjYAADY2JDY2NDY2NjY2NjY2NjY2NjY2NjY2JDY2f3Z2dnZ2dnZ2dnZ2dnZ2dkE2ATYeBAX//wU2NjY0NgAACQAAAYA2NhY2NjbQ0NDQ0NDQ0NAz0NDQ0NDQ0NDQ0NCQ0AAUFAAAARQUNjY2NjY2Nlg2NjY2TSE2UQARAQAAATY2 0 255 BOgAAAEDAwgINjY2NgAAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAX//wU2NjY0NgAAAQAAAYA2NhY2Njbn0NDQ0NDQ0NA2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjYAADY2JDY2NDY2NjY2NjY2NjY2NjY2NjY2JDY2f3Z2dnZ2dnZ2dnZ2dnZ2dkE2ATYeBAX//wU2NjY0NgAACQAAAYA2NhY2NjbQ0NDQ0NDQ0NAz0NDQ0NDQ0NDQ0NCQ0AAUFAAAARQUNjY2NjY2Nlg2NjY2TSE2UQARAQAA 572 \232\000\000\001.\003\008\008.666\000\000\000\192\0316\128\00066\$\021666\0216\000\004666666666646X\004\005\255\255\00566646\000\000\001\000\000\001\12866.666\231\208\208\208\208\208\208\208\2086666666666.\000\000\000\001\0046666666666666\000\000\000\001\000\027KlKKKKKKK\0016\190\031F\0206666\000\00066\$664666.6666666666666\$66\127vvvvvvvvvvvvvvvA6\0016\030\004\005\255\255\00566646\000\000\009\000\000\001\128.6\022666\208\208\208\208\208\208\208\208\2083\208\208\208\208\208\208\208\208\208\208\208\144\208\000\020\020\000\000\001\020\0206666666X6666M!6Q\000\017.\000 -+AQABAwEJAQoYARkBGmwbARwHGgEeAc0BAAAB0AAAA+gB0w== 0 -1 -+AUABQwFEAUUBRgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8A 0 105 AUABQwFEAUUBRgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8A 109 \@.C.D.E.F.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\\._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~.\127 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAA 618 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\1276X+66666vvvvvvvv\255\011\000 -+AYABnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+ 0 -1 -+BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAATb7IPvz+/sAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NjYAADYAAPs2DAEAAAH0wB82NjY2 0 146 BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAATb7IPvz+/sAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NjYAADYAAPs2DAEAAAH0NjY0NgwAAQAEAQAAATY2AAABNvsg+/P7+wAAAUJENiQPMjQ2NjY2NjY2NgAQNjY2WDY2NjY2NjY2AAABAAE2NjZFNjYVNgAEOTY2AAABNjY2NjY2HDQ2WAAgNjb/Nj42NjY2NgAANgAA+zYMAQAA 607 \232\000\000\001.\003\008\008.666\000\000\000\192\03166d\000\000\000\000\001\000\020\2466\0306646\012\000\001\000\004\001\000\000\00166\000\000\0016\251\032\251\243\251\251\000\000\001BD6\$\015.466666666\000\016666X66666666\000\000\001\000\001666E66\0216\000\004966\000\000\001666666.46X\000\03266\2556>66666\000\0006\000\000\2516\012\001\000\000\001\244.646\012\000\001\000\004\001\000\000\00166\000\000\0016\251\032\251\243\251\251\000\000\001BD6\$\0152466666666\000\016666X666666.6\000\000\001\000\001666E66\0216\000\004966\000\000\001666666\02846X\000\03266\2556>66666\000\0006\000\000\2516\012\001\000 -+AcAB3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+ 0 -1 -+BOgAAAENAwgINjY2NgAAAMAfNjY2NjY2NgAQNjY2WDY2NjY2NjY2APP2FgE2NjZFNjYVNgAENjY2NjY2NjY2NjQ2WDY2NjY2NiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlNjY2NjY2NjYAAAABBB82NgAAATY2NiQVNjQ2NjY2NjY2NjY2NjY2NgAAAAEENgAAATY2NjY2NgAAATY2NjY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2AAAAAQAbS2xLS0tLS0tLATa+HQABNjY2AFA2NiQgNjQ2NjY2NlE2NjY2NjY2NjY2Nho2Nn92dnZ2dpZ2dnZ2dkE2AQAAAQAAARY2 0 255 BOgAAAENAwgINjY2NgAAAMAfNjY2NjY2NgAQNjY2WDY2NjY2NjY2APP2FgE2NjZFNjYVNgAENjY2NjY2NjY2NjQ2WDY2NjY2NiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlNjY2NjY2NjYAAAABBB82NgAAATY2NiQVNjQ2NjY2NjY2NjY2NjY2NgAAAAEENgAAATY2NjY2NgAAATY2NjY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2AAAAAQAbS2xLS0tLS0tLATa+HQABNjY2AFA2NiQgNjQ2NjY2NlE2NjY2NjY2NjY2Nho2Nn92dnZ2dpZ2dnZ2dkE2AQAAAQAA 460 \232\000\000\001.\003\008\0086666\000\000\000\192\0316.66666\000\016666X66666666\000\243\246\022\001666E66\0216\000\004666666666646X666666%.%%%%%%%%%%%%%%%%%%%%%%%%66666666\000\000\000\001\004.66\000\000\001666\$\0216466666666666666\000\000\000\001\004.\000\000\001666666\000\000\00166666666\000\000\000\001\0046666666666666\000\000\000\001\000\027KlKKKKKKK\001.\190\029\000\001666\000P66\$\0326466666Q66666666666\02666\127vvvvv\150vvvvvA6\001\000\000\001\000 -+BAABAgMEERITBBQVFhceHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtbm8EcHFycwR0dXZ3BHh5ensEfH1+fwSAgYKDBISFhocEiImKiwSMjY6PBJCRkpMElJWWlwSYmZqbBJydnp8EoKGiowQ= 0 -1 -+BOgAAAEDAwgIFjY2NgAAAMAfNjY2NjYkFTY0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDY2NjY2NjY2NjY0Nlg2NjY2NjY2NgAAATY2NgAAAADAHzY2NjY2JAkJCf9/CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkVNjQ2NjY2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjYAADY2JDY2NDY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2dnZ2dnZ2dnZBNgE2HgQAQP82NjY2NDYAAAEAAAGA 0 255 BOgAAAEDAwgIFjY2NgAAAMAfNjY2NjYkFTY0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDY2NjY2NjY2NjY0Nlg2NjY2NjY2NgAAATY2NgAAAADAHzY2NjY2JAkJCf9/CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkVNjQ2NjY2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjYAADY2JDY2NDY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2dnZ2dnZ2dnZBNgE2HgQAQP82NjY2NDYAAAEA 526 \232\000\000\001.\003\008\008.666\000\000\000\192\03166666\$\0216466666.66\000\016666X66666666\000\000\001\000\001666E66\0216\000\004666666666646X66666666\000\000.6.6\000\000\000\000\192\03166666\$\009\009\009\255\127\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\021646666666.666666\000\000\000\001\0046666666666666\000\000\000\001\000\027KlKKKKKKK\0016\190\031F\0206666\000\00066\$.64666666666666666\$66\127vvvvvvvvvvvvvvvA6\0016\030\004\000\@\255666646\000\000\001 -+AQABBwEIAQkBCgELAQwBZAEOAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AA== 0 67 AQABBwEIAQkBCgELAQwBZAEOAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AA== 162 \000.\007.\008.\009.\010.\011.\012.d.\014.\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253.\254.\255 -+AQAB3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QFAAP8A 0 67 AQAB3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QFAAA== 163 \000.\223.\224.\225.\226.\227.\228.\229.\230.\231.\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253.\@ -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQLHR4fDTUpIhkEJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAjsA 0 255 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQLHR4fDTUpIhkEJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAjsA 781 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\004\008\002\002\002\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\001\021\022\023\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$.\026\027\004\020#\030\031&5\)\"\025\004\$\$\000\000\002\000\@\002\016\"\002\016\@\002\016\"\002\016\"\002\016\@\002\016\"\002\016\031\004\032\)\"#\004\$\$\000\000\002\000\@\002\016\"\002.\@\002\016\"\002\016\"\006\004\008\002\@\002\002\002\254.\002\; -+YcAAAcDAwA3AAQAQFBQMNjY2AAABNjY2Hlg2NjY2PzY2UQARAQA2NktLS0sBFrsfRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PAFLATa+H0YUwB82Nn7s7OwAAAEB7OHsFAD/ADY0NjYyNjY2NjY9PT0BNjY2AAAAAQA2NDY2MjInNhgYGBgYGBgYGBgYGBgYGBgYGBgYGBg2NgAQNjYAEDY2AAABQAAAAQAAAUsBNr4fRgEAHzY2fuzs7AAAAQHs4ewUNrY2NgAdNjQ2NjZBNj42NjY2NjY2TtDQ0JDQABQUFBS2NjU2Njo2WDY2NjYAAAHQ0DPQ0NDQ0NDQ0ND///8BABAUFAw2NjYAAAE2Ng== 16 255 NjYAAAE2NjYeWDY2NjY/NjZRABEBADY2S0tLSwEWux9GFDY2NjYAADY2WDZ2PDY2NjY2AAABAAE2NjY8AUsBNr4fRhTAHzY2fuzs7AAAAQHs4ewUAP8ANjQ2NjI2NjY2Nj09PQE2NjYAAAABADY0NjYyMic2GBgYGBgYGBgYGBgYGBgYGBgYGBgYGDY2ABA2NgAQNjYAAAFAAAABAAABSwE2vh9GAQAfNjZ+7OzsAAABAezh7BQ2tjY2AB02NDY2NkE2PjY2NjY2NjZO0NDQkNAAFBQUFLY2NTY2OjZYNjY2NgAAAdDQM9DQ0NDQ0NDQ0P///wEAEBQUDDY2NgAA 660 6\000\000\001666\030X6666?66Q\000\017\001\00066KKKK\001\022\187\031F\0206666\000\00066X6v<66666\000\000\001\000.6.6<\001K\0016\190\031F\020\192\03166~\236\236\236\000\000\001\001\236\225\236\020\000\255\0006466266666===\001666\000\000\000\001\000646.22'6\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\02466\000\01666\000\01666\000\000\001\@\000\000\001\000\000\001K\0016\190\031F\001\000.66~\236\236\236\000\000\001\001\236\225\236\0206\18266\000\02964666A6>666.666N\208\208\208\144\208\000\020\020\020\020\1826566:6X6666\000\000\001\208\2083\208\208\208\208\208\208\208\208\208\255\255\255\001\000\016\020\020\012666\000 -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0/fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8P70= 0 -1 -+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPAgKAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISJBISAEASEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhICAgICAgICAgICAgICIiMELyTrJwQIKSorACw= 2 239 AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwICgAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEiQSEgBAEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISAgICAgICAgICAgICAiIjBC8k6ycECCkqKwA= 786 \002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002\128\002\002\002\002\002\002\002\002\002\002\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018.\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\$\018.\000\@\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018.\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018.\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\002\002\002.\002\002.\002\002.\002\002.\"#./\$\235'.\008\)*+ -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9PgE/ 0 -1 -+AQAh5ifGs8kVxMsAAAHRAAABdwdle2FtcGxlA2NvbQAAGgABBHd3dzHAEA== 0 -1 -+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fgF/ 0 -1 -+wMAAAcDgwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0s2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BHzY2PDY2JBU2NDY2MjY2NjY2AAw2NktLAAABARa+H0YUNjY2NgAANjZYNnY8NjY2NjYAAP4AATY2Njw2NiQVNgSzNqI2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjY2NgAQNjZLS0tAAAABSwE2vh9GFMAfNi5+7Ozs7AAAAezs7BQ2NjY2AAAAAAE2NjQ2NjZBNj42NjY2NjY2TtDQ0JDQABQUFBQ2NjU2NkM2WDY2NjZNNjZRABEBAA== 16 2 NjY2NgAQNjZLSzY2WDZ2PDY2NjY2AAABAAE2NjY8NjYkFTYEszaiNjY2NjYF//8FRTY5Nj42JT09PQEfNjY8NjYkFTY0NjYyNjY2NjYADDY2S0sAAAEBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAA/gABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZO0NDQkNAAFBQUFDY2NTY2QzZYNjY2Nk02NlEAEQEA 523 666\000\01666KK66X6v<66666\000\000\001\000\001666<66\$\0216\004\1796\16266666\005\255\255\005E696>6%.==\001\03166<66\$\0216466266666\000\01266KK\000\000\001\001\022\190\031F\0206666\000\00066X6v<66666\000\000\254\000\001666.66\$\0216\004\1796\16266666\005\255\255\005E696>6%===\001666\000\000\000\001\0006466266666\000\01666KKK\@\000\000\001K\001.\190\031F\020\192\0316\.~\236\236\236\236\000\000\001\236\236\236\0206666\000\000\000\000\001664666A6>6666666N\208\208\208\144\208\000\020\020.\02066566C6X6666M66Q\000\017\001 -+P4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vgG/ 0 -1 -+P8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/gH/ 0 -1 -+A3c= 0 -1 -+5jrGq8kVxMt3ZS3RA3d3dwdl 12 -1 -+BAALBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9 64 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0rBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0= 32 -1 -+BAAEBQYHBAgJCgsEDA0ODwQQFBUWFysELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PQ== 16 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 8 73 BgcECAkKCwQMDQ4PBBAREhMEFBUWFwQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/AA== 159 \007\004\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+hAA= 0 -1 -+JAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2Nw== 0 -1 -+FAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCsELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PQ== 0 -1 -+DAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 DAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 224 \000\001\002\003\004\004\005\006\007\004\008\009.\011\004\012\013\014\015\004\016\017\018.\004\020\021\022\023\004\024\025\026\027\004\028\029\030\031\004\032!\".\004\$%&'\004\(\)*+\004,-\./\0040123\0044567\00489:\;\004<=>? -+BgABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BgABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 221 \000\001\002\003\004\004.\006\007\004\008\009.\011\004\012\013\014\015\004\016\017\018.\004\020\021\022\023\004\024\025\026\027\004\028\029\030\031\004\032!\".\004\$%&'\004\(\)*+\004,-\./\0040123\0044567\00489:\;\004<=>? -+BQABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BQABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 188 \000\001\002\003\004.\005\006\007\004.\009\010\011\004\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BEABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BEABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 183 \@\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BABBAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BABBAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 182 \000A\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAAhAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAAhAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 182 \000!\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABIgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABIgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 183 \000\001\"\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMUBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXGwQcHR4fBCAhIiMEJCUmJwQoKSo= 0 -1 -+BAABAgMMBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMMBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 209 \000\001\002\003.\004\005\006\007\004\008\009\010\011\004\012\013.\015\004\016\017\018\019\004\020\021\022\023\004\024\025.\027\004\028\029\030\031\004\032!\"#\004\$%&'\004\(\)*+\004,-\./.0123.4567.89:\;.<=>? -+BAABAgMA 0 6 BAABAgMA 17 \000\001\002\003 -+BAABAgMEAAgJCg== 0 -1 -+BAABAgMEBAUGBwYICQoLBAwNDg8EEAQYGRobBBwdHh8EICEiIwQrBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 0 -1 -+BAABAgMEBAUGBwQIKQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQIKQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 183 \000\001\002\003.\004\005\006\007.\008\)\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLFAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLFAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 209 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015\004\016\017\018\019\004\020\021\022\023\004\024\025\026\027\004.\029\030\031\004\032!\"#\004\$%&'\004\(\)*+\004,-\./\0040123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDg8AEA== 0 21 BAABAgMEBAUGBwQICQoLBAwNDg8A 68 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBRgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBRgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 200 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027\004.\029\030\031\004\032!\"#\004\$%&'\004\(\)*+\004,-\./\0040123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGjsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGjsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 183 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\;.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgIaIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgIaIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 187 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\162#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjJA== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjAA== 0 46 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjAA== 145 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"# -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgJCUmJw== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwAsLQ== 0 56 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwA= 158 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+ -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBA== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vADA= 0 61 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vAA== 164 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./ -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMA 0 66 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMA 169 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEAQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwY8PQ== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8B 0 -1 -+BAAEBQYHBAgJCgsEDA0ODwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 6 71 BAgJCgsEDA0ODwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 151 \008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 3 78 AgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 176 \003\004.\005\006\007\004.\009\010\011\004\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+NAABAgMEBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9 0 -1 -+HAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9 0 -1 -+CAABAgMEBAUGBwQICQoLBAwNDg8EEAQYGRobBBwdHh8EICEiIwQrBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 0 -1 -+AgABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 AgABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 185 \000\001.\003\004.\005\006\007\004.\009\010\011\004\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgM0ERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0= 0 -1 -+AQABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 AQABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 182 \000.\002.\004\004\005.\007\004\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgMmBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMmBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 227 \000\001\002\003.\004\005\006\007\004\008\009\010\011\004\012\013\014\015\004\016\017\018\019\004\020\021\022\023\004\024\025\026\027\004\028\029\030\031\004\032!\".\004\$%&'\004\(\)*+\004,-\./\0040123\0044567\00489:\;\004<=>? -+BAQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELC0uHB0eHwQgISIjBCQlJicEKCkqKwQsLS45BDAxBCAhIiMEJAAB 0 -1 -+BAABAgMEDA0ODwQQERITBBQVFhcEGBkaGwQcLx4fBCAhIiMEJCUmJwQoKyorBA== 0 -1 -+BAABAiAEBAUGBwQICQoLBAxkAA8EEBEeHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDxvPj8A 0 66 BAABAiAEBAUGBwQICQoLBAxkAA8EEBEeHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDxvPj8A 131 \000\001\002\032.\004\005\006\007.\008\009\010\011.\012d\000\015.\016\017\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.? -+BAAkdXV1dR0pELsELC0uPBgZGhsEHgkJ2gEBAmQEBAeAABogBCkJCdonBBQVPUAEGBkaGwQpGgAEKAkJ2gQWJRfaGxITBAEVFgBAGCQwGwT5HClHuwQsLS48GBkaGwQpCQnKARKKBJ2dnZ2dnZ2dnRgsLUAEGCwtLgA= 2 -1 -+BAABAgMEBEAADQ4PBBAREhMEFBUWFwQYGRobBAQgISIjBA8lJicczx4fBCAhIiMEJCUmLwQwMS8EMDEyMww0NTQ3BDg5GwQmJ/UnNjcEODkyMww0NzY3BDg5GwQmJ/UnNjcEODk6OwQ6OwQ8PT4/AA== 0 112 BAABAgMEBEAADQ4PBBAREhMEFBUWFwQYGRobBAQgISIjBA8lJicczx4fBCAhIiMEJCUmLwQwMS8EMDEyMww0NTQ3BDg5GwQmJ/UnNjcEODkyMww0NzY3BDg5GwQmJ/UnNjcEODk6OwQ6OwQ8PT4/AA== 261 \000\001\002\003.\004\@\000\013.\015\004\016\017\018\019\004\020\021\022\023\004\024\025.\027\004\004\032!\"#\004\015%&'\028\207\030\031\004\032!\"#\004\$%&/.01/\004.123\0124547\00489\027\004&'\245'67\0048923\0124767\00489\027\004&'\245'67\00489:\;\004:\;.<=>? -+BAABAgMEBAUiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEOAYHBAgJCoAEDA0ODwQQERITBBQFFhcEGBkaGwQcHR4fBKAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 0 110 BAABAgMEBAUiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEOAYHBAgJCoAEDA0ODwQQERITBBQFFhcEGBkaGwQcHR4fBKAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 222 \000\001\002\003.\004\005\"#.\$%&'.\(\)*+.,-\./.0123.4567.8\006\007\004.\009\010\128\004\012\013\014\015.\016\017\018\019.\020\005\022\023.\024\025\026\027.\028\029\030\031.\160!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BCorBCwtLjL79Pv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+3sEPD0VFhcEGBka0yYMHR4mBCAhIiO0ELS0trTFtLS0tLS09rS0tCsELC0uLQAEAAB/AAA= 4 82 LC0uMvv0+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7ewQ8PRUWFwQYGRrTJgwdHiYEICEiI7QQtLS2tMW0tLS0tLT2tLS0KwQsLS4tAAQAAH8AAA== 270 -\.2\251\244\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251\251{\004<=\021\022\023\004\024\025\026\211&\012\029.&\004\032!\"#\180\016\180\180\182\180\197\180\180\180\180\180\180\246\180\180\180+\004,-\.-\000.\000\000\127\000 -+BAABAh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwQEBQYHBAgJCgsEDP0NDwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKTY3BDg4OjsEPD0+PwA= 0 98 BAABAh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwQEBQYHBAgJCgsEDP0NDwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKTY3BDg4OjsEPD0+PwA= 321 \000\001\002\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029.\003\004\004\005\006\007\004\008\009\010\011\004\012\253\013\015\004\016\017\018\019\004\020\021\022\023\004\024\025.\027\004\028\029\030\031\004\032!\"#\004\$%&'\004\(\)67\00488:\;.<=>? -+BAABAgMEBAUGBwQAAAEABAwNDhQEEBESEwQUNBYXBAcH5wYHogcHBw0HBwcHBwcAEAcHBwcigDUzNjcEODk6OwQ8UT4/AA== 0 70 BAABAgMEBAUGBwQAAAEABAwNDhQEEBESEwQUNBYXBAcH5wYHogcHBw0HBwcHBwcAEAcHBwcigDUzNjcEODk6OwQ8UT4/AA== 200 \000\001\002\003.\004\005\006\007.\000\000\001\000.\012\013\014\020.\016\017\018\019.\0204\022\023.\007\007\231\006.\162\007\007\007\013\007\007.\007\007\007\000\016\007\007.\007\"\1285367.89:\;.? -+DQ4EAAHlDQQEBQYBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBAgJAA4PAwAAGRobBCchHB0eHwQgISIjBCQlJiciIwQkJSYnBCj+3vH+/u7+/v7+BCQlJichIiME/h7//t7+3/7+/v7+/v7+/v7+BAg/AA== 0 118 DQ4EAAHlDQQEBQYBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBAgJAA4PAwAAGRobBCchHB0eHwQgISIjBCQlJiciIwQkJSYnBCj+3vH+/u7+/v7+BCQlJichIiME/h7//t7+3/7+/v7+/v7+/v7+BAg/AA== 354 \014\004\000\001\229\013\004\004\005\006\001\001\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\004.\009\000\014\015\003\000\000\025.\027\004'!\028\029\030\031\004\032!\"#\004\$%&'\"#\004\$%&'\004.\254\222\241\254\254\238\254\254\254\254\004\$%&'!\"#\004\254\030\255\254\222\254\223\254\254\254\254\254\254\254\254\254\254\254\004\008? -+BAAIAgMEBwQsLS4vBC0xCAkKCwQMDQ4PfxA3BDgEAAgCAwQHBDwtLjIzBDQ1NggJCgsEDA0OD38QNwQ/OTotLkYELTEyNggJCgsEDA0OD38QNwQ4BAAIAgMEBwQsLS4vBC0xMjMENDU2CAkKCwQ5OjsEPEg+Pw== 0 -1 -+BAABAgMEBAUGBwLrCQoFBgcD6wkKCwQMDQ7//xAREhMEFBUWFwQYGRob 0 -1 -+BAAP/wAXBBgZGhsEHB0eHwQOIZgAIvQJ//8WGRcXFxcXFxcXFxwlF/oXICEiEAxAABcXFxcXFxcXFxcX/xcXFxccJQxAABcXFxcXFxcX 0 -1 -+DAAB/AMEBAUGBwQICQoLAwxADg8EEBESEwQkJSYnBCgpKisELC1ADg8EBgcECAxADg8TBBQiIwQkJSY5OjsEPD0+ 0 -1 -+BH8PEhMEIn4EABD/BCEiIwQkJSYADg8EBEwSEwQiIwQADf8EAXUjBA0ABCIjBAAQ/wQhIiNVDQ4PBgQPEhMEFCMk+gAA+i4AAAADQAAAAC4uLi4uLi5PLi4uLi4uLi4jAAACAAAO 0 101 BH8PEhMEIn4EABD/BCEiIwQkJSYADg8EBEwSEwQiIwQADf8EAXUjBA0ABCIjBAAQ/wQhIiNVDQ4PBgQPEhMEFCMk+gAA+i4AAAADQAAAAC4uLi4uLi5PLi4uLi4uLi4jAAACAAA= 289 \127\015\018\019.\"~\004\000.\255\004!\"#\004\$%&\000\014\015\004\004L\018.\004\"#\004\000\013\255\004\001u#\004\013\000\004\"#\004\000.\255\004!\"#U\013\014\015\006\004\015\018\019\004\020.\$\250\000\000\250\.\000\000\000\003\@\000\000\000\.\.\.\.\.\.\.O\.\.\.\.\.\.\.\.#\000\000\002\000 -+BAAYGRoCAgICAgICAgICAgIC 0 -1 -+BBwBAhwBBQYAABAACgsEDA0OFwMUBAUGAAAQAAoLBAwNDicEKD8qKwQsMjMENA== 0 -1 -+BAABAvsEBDQmNjcEAEA6O6GhoZ2hoaGhoakhoaGhoaEEPD0FHQcECAkKCwB/DQ4uBBAREhMEFBUWFwQYGAACAAAdHh8EICljAAAAADEySwQ0NTY3BABAOjsEPD1APwQ8PT4= 0 -1 -+BP9/AgMEBAUGBwQICQoLBAwNDg8EEBESEwQEGRobBBwdHh8EICEkJSYnMzMzMzMzMzMzMzMzMysELC0uLwQwMTIzBDQ1NjcEODktOwQ8PT4/AA== 0 -1 -+DQ4PBAgICgtADA0ODwQICQoLAAD//w8EBF4GBwwABF4GBwwNBg8EBBMEBv8ICQoDQAQTBgcEDwQICdsLQAwzBDRONjcEOA== 12 -1 -+BAABAgMEBDAxMjMENCwtLi8EBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgAAIAAHF2hHyEiIwQkJTEnBCgpKisELC0uLwQwMTIzBDQsLS4vBDAxMjMENDU2NwQ4OTpkNjcEODk6OwQ8PQ== 0 -1 -+A+cBAgMEBCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQcECAkKISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OVc7BDw9PgA= 0 -1 -+BAABAhERAwQEBQYHBCEJCAghCQgICAgJCAgI7REICAAICAgICAiICAgICAgICAgICAgICAoLBAwNDg8EBhESEx0UFRYXfyX/JwQoKSorBCwtLi8EMDEyMwQ0NTw9Pg== 0 -1 -+BAABAgMEBQUG5gMI5ycLBAwNDg8EyxG6EykRHQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF/auUs 0 -1 -+CgsjFSQlJicEKCkqKwQsNDQAEDcUFRYX/wAAABsEHB0bBBwdHh8EICEiIxUkAAAbFhcEMTIzBDQAEBsEHB0eHwQgMwQ0NQ== 0 -1 -+BAABAgMEBAUGBwQI7AoLBAwNDicEEBESEwQUFRYXBAYZGhsEHB0eIgQgISIjAj4/AA== 0 49 BAABAgMEBAUGBwQI7AoLBAwNDicEEBESEwQUFRYXBAYZGhsEHB0eIgQgISIjAj4/AA== 143 \000\001\002\003.\004\005\006\007.\008\236\010\011.\012\013\014'.\016\017\018\019.\020\021\022\023.\006\025\026\027.\028\029\030\".\032!\"#.>? -+BBABAgMsLS4A/zA0MvoAAPo2NwQ4PD03PwAEJwQoKR0eHwQg//8aGwABHR4fBCA2IiMEJCUmJwQoKQACEu4rLS4vBDCysn8ENDU2NwQ4ORUWFwQgISIjBCSyBDQ1NjcEODkVFhcGGBkaGwQwMDAwMCoqKioqKioqKiogKioqKioqKioqKioqKioqJSYnBCgpHR4fBCD///+APT5BAA== 0 -1 -+BBABggMEBAUG6wQICQoLBAxuBBQtLiBQMwQzNTY5BDgeOTsEUFEENDUpNwQ4ADkEMDFQKhcELC0uIAQwMVAzBAQzNTY0NQ== 0 -1 -+GQABAgMEBAUGBAIWCwQL8Q8EChESEwYUFRYXpQIDBAQFBgQIFgsEC/EPBAoREhMGFBYXpRgZGhvuHB0dHh7iPQ0ODwQQERITBhQV+gAAdHB0dOICBBwdQIAAKwQsLS6jvzA= 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEDh0eHwQgISIjBAICAgICAgICAgICAgICAgICAgICAgICAjsEPD0= 0 -1 -+BAABAgMEBAX0BgQICf9/BAwNEg8EEBESEwQUFRYXBBgZGhsEFB0eHwQgKSIjBCQk6ycECCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAX0BgQICf9/BAwNEg8EEBESEwQUFRYXBBgZGhsEFB0eHwQgKSIjBCQk6ycECCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 192 \000\001\002\003.\004\005\244\006.\008\009\255\127.\012\013\018\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\020\029\030\031.\032\)\"#.\$\$\235'.\008\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAGQEBAUGBwQICQouLwQwMTIzBDQAgAAASzk6OwQ8PT4EGBkaGwQcHR4fBCAhIyMKJCUmJwQoKSo4BCYtLi8EMDEyMuI0NTYEJi0uLwQwMTIzBDQAAAABAAA6OwQ8PT4/BDcEODk6Oys8PT4/BA== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESKQQUFRYXBBgZGigEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDg8EEBESKQQUFRYXBBgZGigEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 181 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\).\020\021\022\023.\024\025\026\(.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAABAgICAgICAgICLhwEMDEyMwICAgICAgQUFRYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAi4cBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgICAgICAgICLhwEMDEyMwICAgICAgQUFRYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAi4cBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 191 \000\001\002\002.\002\002.\002\002.\.\028.0123.\002\002.\002\002.\020\021\022\023.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\.\028.0123.4567.89:\;.<=>? -+BAABAgMEBAUGBwQICQoLBAwNDgICAgICAicEKCkqKwQsLS4vBDACAgICAgICAgICAicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAgMEBAUGBwQICQoLBAwNDgICAgICAicEKCkqKwQsLS4vBDACAgICAgICAgICAicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 168 \000\001\002\003.\004\005\006\007.\008\009\010\011.\012\013\014\002.\002\002.\002'.\(\)*+.,-\./.0\002\002\002.\002\002.\002\002.\002'.\(\)*+.,-\./.0123.4567.89:\;.<=>? -+BAAYDQ4PBBAREhMBjAMEBAUGDQ4PBBAREhMEFBUWEwQUFRYXBBgZGhsEkx0eHxobBJMdDB8EICEiIwQ2NDUEkx0eDg8EEBESEwQEGBkaGwSTHQ== 0 -1 -+ZAENAWQBDQAA/w== 1 7 AQ0BZAENAA== 12 \013.d.\013 -+BAQIIwoLDwQQEeQcPx4fBCAhIiMEJCUmJx8FIAQoKSorBCwhLi8EMB0yD6cQEcscPx4fBCA+IiMEJCUmJx8EFd4oKSorFCcEGSkqKwQsLTcEODk6OwQ8BwQYBxobBBwdHg/HEBES 3 -1 -+wAADJRoVHignKiuALC1AAAAABCBNLn////97fwAcPj+A 0 -1 -+BAARAgMEBAUGBwQICQrvAwgJCsAEDBcEGAQMDQ4PBBAdHh8EICEiIwQkJSYnBCgpKisELC0uLwQwMQAAEQIDBAQFBgcECAkK7wP/BDQ1NjcEODk6OwQ8PT4/ 0 -1 -+BAABAgMEBAAGBwQICQoLBAwNDg8EEBESKAQUFRYXBBgZGhsEHB0eHwQgISIrBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwQ4OTo7BDw9AEAA 0 81 BAABAgMEBAAGBwQICQoLBAwNDg8EEBESKAQUFRYXBBgZGhsEHB0eHwQgISIrBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwQ4OTo7BDw9AEAA 185 \000\001\002\003.\004\000\006\007.\008\009\010\011.\012\013\014\015.\016\017\018\(.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"+.,-\./.0123.4567.89:\;.<=>?.89:\;.<=\000\@ -+BAABAgMEBAUGBwQICQoPDwQQFBUWFwQYGRobAQEBAQEBAQEBBBwdHh8EICEiIwQkJSYnBCgpKisELC0uL////38zBDQ1NjcEPBA+P0A= 0 -1 -+BA8EAgAsAID/////MjMEMjU2NwMEFgUEBf//9BEAHALNBAb/f0AA6iAEICEiIwQkJSYn+vr6+vr6BPYGACQICQoQAiADvQABEgMEBAUEBQYHBEAA6iAEICEiIwQkJSYn+vr6+vr6+vr6+vr0BBIdLC0u9gQwMSgMBwRkAAAgBEQAIAQgISI= 0 -1 -+BAABAgMEBAUGBwQICQoLBBobBBwdHh8EICEiIwQkJSYnBCgpKisELDEyMwQ0NTY3BAACOjsEPHI+OwQ8PT4/AA== 0 64 BAABAgMEBAUGBwQICQoLBBobBBwdHh8EICEiIwQkJSYnBCgpKisELDEyMwQ0NTY3BAACOjsEPHI+OwQ8PT4/AA== 147 \000\001\002\003.\004\005\006\007.\008\009\010\011.\026\027\004\028.\030\031\004\032!\"#\004\$%&'\004\(\)*+\004,123\0044567\004\000.:\;.\;.<=>? -+wAABAgMEERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJ/snKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwA= 0 -1 -+BB4fBAQcKSkpKSkpKSkpKSkpKSkpKRMpKSkpBCAhDyMEJCUmJwQ= 0 -1 -+AgAAAhAiAhAiFvQAzwACECICECIW9ADpFvQW9ADpA/QAzw== 0 33 AgAAAhAiAhAiFvQAzwACECICECIW9ADpFvQW9ADpA/QA 108 \000\000.\016\".\016\".\244\000\207\000\002\016\"\002\016\"\022\244\000\233\022\244\022\244\000\233\003\244 -+BAABFwMEBAUWFwQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELDsuLwQgISIjBCQlJicEKCkqKwQsOy4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABFwMEBAUWFwQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELDsuLwQgISIjBCQlJicEKCkqKwQsOy4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 147 \000\001\023\003.\004\005\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,\;\./.\032!\"#.\$%&'.\(\)*+.,\;\./.0123.4567.89:\;.<=>? -+BAABAQEBAQEBAQEBAQoL9gwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJieuDCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 81 BAABAQEBAQEBAQEBAQoL9gwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJieuDCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 214 \000\001\001\001.\001.\001.\001.\001.\011\246\012\013\014\015\004\016\017\018.\004\020\021\022\023\004\024\025\026\027\004\028\029\030\031\004\032!\".\004\$%&'\174\012\)*+\004,-\./\0040123\0044567\00489:\;\004<=>? -+BBgZKhsEHIAAHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMgICAgICAgIC 0 -1 -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0/fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8P70= 64 -1 -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0Afg== 0 129 PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0A 235 \000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032!\"#\$%&'\(\)*+,-\./0123456789:\;<=>.?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|} -+PwAhIiMFJSZZKAPoKzQtLi0wMTIzSTU2Nzg5OjsSPT4/PwECy8vLy+fnntTn5wQBBgcILy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL38jBSUmWSgD6Cs0LS4tMDEyMzRGR0hJSktMTYODgwUGBwgJCgsMDQ4PEBETFEAADw== 0 -1 -+wACQkAQAJiYmJiYmJiYmJiYi 0 -1 -+AgBAAhAiAhAiFvQAzwACECICECIW9ADpFvQW9ADpA/QAzw== 0 33 AgBAAhAiAhAiFvQAzwACECICECIW9ADpFvQW9ADpA/QA 106 \000\@.\016\".\016\".\244\000\207\000\002\016\"\002\016\"\022\244\000\233\022\244\022\244\000\233\003\244 -+AgAAAgEiAhAiFusCzwACECICZCIW9A/pFvQW9ADpAwACASICECIW6wLPAAIQDQJkIhb0D+kW9Bb0AOkDJQA= 0 62 AgAAAgEiAhAiFusCzwACECICZCIW9A/pFvQW9ADpAwACASICECIW6wLPAAIQDQJkIhb0D+kW9Bb0AOkDJQA= 200 \000\000.\001\".\016\".\235\002\207\000\002\016\"\002d\"\022\244\015\233\022\244\022\244\000\233\003\000.\001\".\016\".\235\002\207\000\002\016\013\002d\"\022\244\015\233\022\244\022\244\000\233\003% -+AgABAQEBAQEBAQIBAQEBAQEBAQEBAQ== 0 -1 -+AgACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0 0 -1 -+AgAAAhAiAQEBCQEBAQACENQBAQEBAQEBAQEBAWQBAAEBAgEBAQEBKSkp 0 -1 -+AgABAQEBAQEBAQEBAQECAQACAAACECIBAQEBAQEBAQEBAQEBAQE= 0 -1 -+AgAAAhAiAgAAAhAiAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIBVwEBAQEBAQEBAQECAVcBAQEBAQEBAQEBAQECAVcBAQEBAQEBFAE= 0 -1 -+BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwTgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8A 0 81 BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwTgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8A 88 \@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.\224abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~\127 -+BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawBsbQ== 0 56 BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawA= 57 \@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk -+BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fj8A 0 81 BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fj8A 82 \@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~? -+PwABAgMEBQYHCAmztLUAABYXGBmInAoLDA0ODyQRNDU2NwE5Ojs8PT4/PwkKCwwNDg8kSwoLDA0ODyQpKSkpKSkpPT4/VTAxMjM0NDY3AYeLjKqObB0eHyB9KSkpKSkpKWQnKCkqKykJKSkpKSkpKSkpKSlkJygpKissLS48PT4/P0BBQkNERUYvMDEyMzQ0NjcBigQArK2urw== 0 -1 -+PwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyTsJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNLVVZXWFlaW1xdXl9gYWJjZGVmZ2hpMDAwMDEwMDAwMDAwME0wMDAwMDAwMDAwMDAwMDAwMGprbG1ub3BxcnN0dXZ3eHl6ewh9P35/gIGCg4SFhoeIiYo7PD0+Pz9AQUJLTE1OT1BRUouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqMgpaanqKmqq6ytrq+wsbKztLW2t7i5uru8P70= 0 -1 -+KCgoKCgoKDkQgAQwQDJDxsbGyP9EKsbG1sbGxsbGxsbGyP8qxkAqKioqKioqKMbGzcbG1v8qKsbG1sbGxsbGxsbGyP8qKkAqKioqKioqQSoqACgTExMTExMTExMTExMTExMTExMTExMTExMTExMTKioMKioqKir/ACroAyoq 0 -1 -+BAwDAwMDA+gCAwMDAwMDAwMDAwP6A+gCAwMDAwMDAwMDAwP6AAA= 0 38 BAwDAwMDA+gCAwMDAwMDAwMDAwP6A+gCAwMDAwMDAwMDAwP6AAA= 121 \012\003\003\003.\003\232\002.\003\003\003.\003\003\003.\003\003\250.\232\002\003.\003\003\003.\003\003\003.\003\250\000 -+BAABAh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwQEBQYHBAgJCgsEDP0NDwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKTY3BDg4OjsEPD0+P8A= 0 -1 -+//8FDgMEBwQsLS4nBC0AEwIQAAcAAH/fMjMENDU2CAkKTy4gAB8ANgQsLS4vBAcAAH/fMjMENDU2CCAAHwA2BCwtLi8eBC4gAB8ANgQsIAAfAC4vBH8QHgQ/OTpPLiCVlZWVlZWVlZWVlZWVlZWVlZWV 5 -1 -+FgAAEAAnBCgpKisELC0uEdkuEQYDBCEJCAghCQgICBgJCAgIAwIICAAICAgIAAkICCEJCAgIGAgICO0RCAgACAYIFAgICIYICAgICO0RCAgACAYIFAgPBAYREhMdag== 0 -1 -+BA8ICAgEBAUG6wQICQoLBAxuJSY2BBAAAAAEFC0uIFAzBDM1NjkEOB45OwRQUgQ0NSk3BDgAOQQ1NjkEOB45OwRQUQQ0NSk3BDA0UCoX 0 -1 -+PwABFwMEenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6IyQlJicoKSorLC0uLzAxMjM0ACAzODk6Ozw4Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaAVxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0Afg== 0 129 PwABFwMEenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6IyQlJicoKSorLC0uLzAxMjM0ACAzODk6Ozw4Pj8/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaAVxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0A 159 \000\001\023\003\004zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz#\$%&'\(\)*+,-\./01234\000\032389:\;<8>.?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\001\\]^_`abcdefghijklmnopqrstuvwxyz{|} -+PwDuAQMEBQYHCAl8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVHx8fHx8fHx8fHx8fHx8fHx8fHx8fCAhVVZXWFlaW1xdXl9gABBjZGVwcXJzdHV2QAAAAHt8fQB+ 0 128 PwDuAQMEBQYHCAl8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVHx8fHx8fHx8fHx8fHx8fHx8fHx8fCAhVVZXWFlaW1xdXl9gABBjZGVwcXJzdHV2QAAAAHt8fQA= 190 \000\238\001\003\004\005\006\007\008\009||||||||||||||||||||||\032!\"#\$%&56789:\;<\032!\"#\$%&56789:\;<=.??\@ABCDT|||||||||||||||||||||\032!UVWXYZ[\\]^_`\000\016cdepqrstuv\@\000\000\000{|} -+wACQmAQA 0 -1 -+ARABIQEiAYABJAElASYBJwEoASkBKgEaARsBHAEdAR4BHwEgASEBIgGAASQBJQEmAScBKAEpASsBLAEtAS4BNwE4 0 -1 -+AQABAwEEAQUBBgEnASgBKQEqASkBKgErASwBLQEuATcBOAE5AToBOwE8AT0BKwEsAS0BLgE3ATgBOQE6ATsBPAE9 0 -1 -+A98BAgMEBCkpKCkpKSkpKSkpKSkpBikmKSkrKSkpICkpKSkpKQEnBCgpKSkpKSkpKSkGKSYpJDMENA== 0 -1 -+A2QBAgMEBCkpKSkpKSkpKSkpKSkpKQQEKSkpKSkpKSkpKSkpKSkpKSkMKSkpKSkpKSkpKSkpKSkpKCkHBAgJCiFAKSkpKSkpKSkpKSkpKQcEKSkpKSkpKSkpKTcEODlXOwQ= 0 -1 -+BBABAgMsLS4A/yoqMgUAAH82NwQ1NjcEODwVFhcGGBkaG/0vEQYYIgQoKQACEu4rLS4vBDCysioqKiAqKio2MC4wKioqKioEIEciIwQkCCYnKQoCEu4rLS4vBDCysgRFKQACEu4rAwAAfyoqICoCEu4rLS4BADCysioqKiAqKioqJSoqKioqKioqEiolJicEPCk= 0 -1 -+AUABRQFGAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwA= 64 37 AW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AA== 39 n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~.\127 -+BAAEBQYHBAgJCgsEDA0ODwQQERITBBQVFhcEGBkaGwQcHSEiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoqMEpKWmpwSoqao= 32 -1 -+BAAEBQYHBAgJCgsEDA0kJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoqMEpKWmpwSoqao= 8 -1 -+BAABAgMEBAUGBwQICQocHR4fBCAhIiMEJCUsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtHh8EICEiIwQkJSYnBCgpKisELC0uLwSAgYKDBISFhocEiImKiwSMjY6PBJCRkpMElJWWlwSYmZqbBJydnp8EoKGiowSkpaanBKipqqsErK2urwSwsbI= 0 -1 -+BAAEBQYHBAgJCgsEDA0kJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEgAA6OwQ8PT4/BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgNTY3BDg5OjsEPD0+PwRAQUJDBERFRkcEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoqMEpKWmpwSoqao= 8 -1 -+BAAEBQYHBAgJCgsEDA0kJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT5fBGBhYGMEZGVmZwRoaWprBGxtbm8EcHFycwR0dVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjJGOjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoqMEpKWmpwSoqao= 8 -1 -+BOgCAwMD+gPoAgMDAwMDAwMDAwMD+gAMAwMDAwPoF+gCAwMDAwMDA+ICAwP6AAADAwMDAwMDAwMDA/oD6AIDAwMDAwMDAw== 0 -1 -+BOj6A+gCAwMDAwMDAwMDAwP6AAwDAwMDA+gX6AIDAwMDAwMD4gIDA/oAAAMDAwMDAwMDAwMD+gToAgMDA/oD6AIDAwMDAwMDAwMDA/oADAMDAwMD6BfoAgMDAwMDAwPiAgMD+gAAAwMDAwMDAwMDAwP6A+gCAwMDAwMDAwMSAwP6A+gCAwM= 0 -1 -+BOj6A+gCAwMDAwAMAwMDAwPoF+gCAwMDAwMDA+LwAwP6AAADAQMDA/oD6AIDAwPoF+gCAwMDAwMDA+LwAwMDAwMD+gMDAwMDAwMDAwMD+gAMAwMDAwPoF+gCAwMDAwMDA+LwAwP6AAADAwMDAwMDAwMDA/oD6AIDAwMDAwMDAwMDAw== 0 -1 -+BOgDAwgICAgICAgICAgICAgICAgICAgBCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICHQICAgICAEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIdAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI 0 -1 -+BOgCFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFQMDAwMDAwMJ+gPoAgPwAgM= 0 -1 -+GxsbGxsAGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsVGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbAxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGyYbGxsbGxsbGxsbGxsbGxsbGxsb 27 -1 -+BOgCAwMD+gPoAgMDAwMADAMDAwMD6BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAE6AQDAwP6A+gC 0 -1 -+BOgCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC 0 -1 -+BOgDAwgIDAgICAjvCAgICAgIAgjCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCAMLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwuXCwsLCwsLCwsLCwsLCwsLCwsLCwsK6wsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCssLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCqMLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwggICAEICAgIf3QICAgICAEICAfwCAgICAgIB+8IEwgIgAgICB8ICAgICBgICAgICAgSCAgICAgICAgICAgICAgfJoAICAgICAgICACAAAAF/+kFCH8ICAgICAgICAgICHQICAgICJwIwqrCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwtLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCpcLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsIICAgBCAgICH90CAgICAgBCAgH8AgICAgICAfvCAgICIAICAgfCAgICAgYCAgICAgIEggICAgICAgICAgICAgH8AgICAgIAQgIB/AICAgICAgICAgICAjwCAgIHwgICAgIGAgICAgICBIICAgICAgICCAACAgICAgICAgICAjeCAgICAgICAgICAgICAgFHyYICAgICAgICAgAgAAABf/pCFpaWlpaWlp6WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWggICAgBCAgH8AgICAgICAgICAgICPAICAgfCAgICAgYCAgICAgIEggICAgICAgICAgICAgICAgICAgICN4ICAgICAgICAgICAgICAUfJggICAgICAgICACAAAAF/+kIWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpahoaGhoaGhoaGkIaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGf4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaTlpaWlpaWlpaWlpaWlpaWlpaWlpaWggICAEICAfwCAgI///CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwgAACAgH8AgICP//AAAICAgI+QcICAgICAUICAgICAgICAgICAgICAgICAgICAgICAgICAgI//8AAAgICAgICAgICAgIBQgICAgICAgICAgICAkICAgICAgICAgICAgIDA== 0 -1 -+BOgDAwgIFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcCFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXAAADFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwgI 0 -1 -+BOg6OjoIOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Mzo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo= 0 -1 -+BOgDAwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgQEBAQEBA== 0 -1 -+BOgDAwgINjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjaeNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Np42NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY= 0 -1 -+AQABAQECAQcBCAEJAQoBCwEMAQECAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARkBGgEbARwBHQEeAR8BIAEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPw0BDgEPARABEQESARMBFAEXBRgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPwA= 0 185 AQABAQECAQcBCAEJAQoBCwEMAQECAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARkBGgEbARwBHQEeAR8BIAEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPw0BDgEPARABEQESARMBFAEXBRgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgE3ATgBOQE6ATsBPAE9AT4BPwA= 387 \000.\001.\002.\007.\008.\009.\010.\011.\012.\001.\001\011.\012.\013.\014.\015.\016.\017.\018.\019.\020.\021.\022.\025.\026.\027.\028.\029.\030.\031.\032.#.\$.%.&.'.\(.\).*.+.,.-.\..7.8.9.:.\;.<.=.>.?.\001\014\001\015\001\016\001\017\001\018\001\019\001.\001\023\005\024\001\025\001\026\001\027\001\028\001\029\001\030\001\031\001\032.!.\".#.\$.%.&.'.\(.\).*.+.,.-.\..7.8.9.:.\;.<.=.>.? -+AQABAQECAQMBBAEFAQYBJwEoASkBKgEpASoBAQIBOQE6ATsBKwEsAS0BLgE3ATgBOQE6ATsBLQEuATcBOAE5AToBOwE8AQ== 0 -1 -+BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREUwRwRISUtLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnaGiAAA= 0 241 BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREUwRwRISUtLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnaGiAA== 438 \000\001\002\003.\000\000\004\000.\008\009\010\011.\012\013\014\015.\016\017\018\019.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.89:\027.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lm\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.\128\129\130\131.\132\133\134\135.\136\137\138\139.\140\141\142\143.\144\145\146\147.\148\149\150\151.\152\153\154\155.\156\157\161\162 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFRkcESElKSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EYGFiYwRkZWZnBGhpamsEbG0eHwQgISIjBCQlJicEKCkqKwQsLS4vBICBgoME+oWGhwSIOwQ8PQ== 0 -1 -+BAABAgMEBAgJCgsEDA0gISIjMDEyMwQ0NTY3BDg5OjsEPD0iIwQkJSYnBD8pKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/BEBFRkcESElKSwRMTUNPBFBRUlsEVFVWVwRYWVpbBFxNXl8EYGFiYwRkZWZnBGhpamsEbG0eHwQgISIjBCQlJicEKCkqKwQsLScvBICBgoME+oWGhwSIiYqLBDQ1NjcEODk9Pj8E 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmBwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFRkcESElKSwRMTU5PBFBRUlMEVFVWVwRYWVpbBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUOwQ8PQ== 0 -1 -+AgAAAhBiAgAAAhAiAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIBVwEBAQEBAQEBAQECAVcBAQEBAQEBAQEBAQECAVcBAQEBAQEBFAE= 0 -1 -+AykpKSkpKSkpKQQEKSkpKSkpKSkpKSkpKSkpDCkMKSkuKSkpKSkpKSkpKSkpKCkG9QgJCiFAKSkpKSn/KSkpKSkAAAEpKQcEKSkpKSkpKSkpKSkpKSkpKQwpKSkpKSkpKSkpKTsEQAApKSkpKCkG9QgJCiFAKSkpKSn/KSkpKSkpKQcEKSkpKSkyKSkpKbckODlXOwRAAD4pBwQgHCkpKSkA 0 162 AykpKSkpKSkpKQQEKSkpKSkpKSkpKSkpKSkpDCkMKSkuKSkpKSkpKSkpKSkpKCkG9QgJCiFAKSkpKSn/KSkpKSkAAAEpKQcEKSkpKSkpKSkpKSkpKSkpKQwpKSkpKSkpKSkpKTsEQAApKSkpKCkG9QgJCiFAKSkpKSn/KSkpKSkpKQcEKSkpKSkyKSkpKbckODlXOwRAAD4pBwQgHCkpKSkA 365 \)\)\).\)\)\)\)\)\004\004\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\012\)\012\)\)\.\)\)\)\)\)\)\)\)\)\)\)\)\(.\006\245\008\009\010!\@\)\)\)\)\)\255\)\)\)\)\)\000\000\001\)\)\007\004\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\).\)\)\)\)\)\)\)\)\)\)\)\;.\@\000\)\).\)\(\)\006\245\008\009\010!\@\)\)\)\)\)\255\)\)\)\)\)\)\)\007\004\)\)\)\)\)2\)\)\)\)\183\$89W\;.\@\000>\).\004\032\028\)\)\)\) -+AgAAAhBiAQEBAQIQYgIiAQEBAQEBAQEBAQEBAQECAVcBAQEBAQEBAQEBAgFXAQEBAQEBAQEBAQEBAgFXAUEBAQEBAQECAVcBAQE= 0 -1 -+AgBAAhAiAhBAAhAiAhATBAEVFhcEGBkaGwQUHR4fBCApIiMEJCTrJwQIKSorBAgJ/38EDA0SDwQQERITBBQVFhcEGBkaGwQUHR4fBCAp 0 -1 -+AgAAAhBiAgAAAhAiAQEBAgFXAhBiAgAAAhABAQEBAQIBVwEBAQEBAQIQYgIAAAIQIgEBAQEBAQIBVwEBAgFXAQEBAQIBVwFBAQEBAQEBAgFXAQ== 0 -1 -+AgBAAhAiAhBAAhAiAhAMDRIPBBAIEhMEARUWFwQYGRobBBQdHh8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQk6ycECCkAAAE= 0 108 AgBAAhAiAhBAAhAiAhAMDRIPBBAIEhMEARUWFwQYGRobBBQdHh8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQk6ycECCkA 344 \000\@.\016\".\016\@.\016\".\016\012.\018\015\004\016\008\018\019\004\001\021\022\023\004.\025\026\027\004\020\029\030\031\004\032\)\"#\004\$\$\000\000\002\000\@\002\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\025\026\027\004\020\029\030\031\004\032\)\"#\004\$\$\235'\004\008\) -+AgAfBCApJOsnBAgpKisELC0uLwQwQAIQIgIQQAIQIgIQIgYECAAAAQn/fwQMDRIPBBAIEhMEARUWFwQYGRobBBQdHh8EICkiIwQkJOsnBAgpKisELC0xMjMENDU2IgYECAn/fwQMDRIPBBAREhMEFBEWFwQYGRobBBQdHh8EICkiIwQvJOsnBAgpKisELC0uLwQwMTIzBDRCNjcEODk6OwQ8 0 -1 -+AgBAAhAiAhBAAhAiAhAiAhAiBgQICR0eHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGBksLS6KBDAxMjMENDU2IgYECAn/fwQMDRIPBBAREhMEFBUQAAQYGRobBBQdHh8EICkiIwQkJOsnBAgpKisELC0uLwQwMTIzBDRCNjcEOHk6OwQ86ycECCkAAAEsLS4vBDAGBAgJ/38EDBAREhMEFBUQ 0 -1 -+AgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgJ/38EAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGBkagAQUHR4fBCApIiMEJCTrJwQIKQAAAQw= 0 191 AgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgJ/38EAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgZGhsEFB0eHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGBkagAQUHR4fBCApIiMEJCTrJwQIKQA= 603 \000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\025\026\027\004\020\029\030\031\004\032\)\"#\004\$\$\000\000\002\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\025\026\027\004\020\029\030\031\004\032\)\"#\004\$\$\000\000\002\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\025\026\128\004\020\029\030\031\004\032\)\"#\004\$\$\235'\004\008\) -+AgAAAgBAAhAiAhBAAhAdHh8NNSkiGQQkJAAA/wBAAhAiAhBAAhAiAhAiBgQQIgIQQAIQIgIQHwQgKSIjBAQkAAACAEACEAACEEACECICBBAIEhMEARUWFwQYOhobBBQdHh8mNSkiGQQkJAAAAgBAAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQIgYECAJAAgIC/gICOwA= 0 -1 -+BAABAwMEAwjnJwsEDA0OHwTpASMBAQEBAQEBAADm 0 29 BAABAwMEAwjnJwsEDA0OHwTpASMBAQEBAQEBAAA= 88 \000\001\003\003.\003\008\231'.\004\012\013\014\031\004\233\001#\001\001.\001.\001.\000 -+BAAAAQABAgMEBQAAAQU= 0 12 BAAAAQABAgMEBQAA 35 \000\000\001\000.\002.\004\005\000 -+AQAcqAT1BQbmAwgAAAEEDA0ODwQAABHm/LkzKREyAQDo+w== 0 32 AQAcqAT1BQbmAwgAAAEEDA0ODwQAABHm/LkzKREyAQA= 110 \000.\168\004\245\005\006\230\003\008\000\000\001\004\012\013\014\015\004\000\000\017\230\252\1853\)\0172\001 -+AgICAgICAgICAgICAgIAAAF/ 0 16 AgICAgICAgICAgICAgIAAA== 45 \002\002.\002\002.\002\002.\002\002.\002\000 -+BBwcHAwcHBwcHBwc9KgMAQEBQBwcHBwcAcsRfX19fX76EwAAARw= 0 35 BBwcHAwcHBwcHBwc9KgMAQEBQBwcHBwcAcsRfX19fX76EwA= 113 \028\028\028\012.\028\028\028\028\028\028\244\168\012\001\001\001\@\028\028\028\028\028\001\203\017}}}}~\250\019 -+BEAfPj4+HFBRUlMEVAAAASYmJiYmJiYmJiYmrSYVJiZnBGhpP2sAAABhYmMfZGUmJhgmJiYmJjImJiYmJiYmJiYmJiYmJiYmJiatJhUmJiZmZwRoaT9rACYmJiYmJq0mJiYmJmZnBGhpQAAAAQA= 0 108 BEAfPj4+HFBRUlMEVAAAASYmJiYmJiYmJiYmrSYVJiZnBGhpP2sAAABhYmMfZGUmJhgmJiYmJjImJiYmJiYmJiYmJiYmJiYmJiatJhUmJiZmZwRoaT9rACYmJiYmJq0mJiYmJmZnBGhpQAAA 172 \@\031>>.\028PQRS\004T\000\000\001&&&&&&&&&&&\173&\021&&g\004hi?k\000\000\000abc\031de&&\024&&&&&2&&&&&&&&&&&&.&&&&&\173&\021&&&fg\004hi?k\000&&&&&&\173&&&&&fg\004hi\@\000 -+BOgD6wcINjY2NjY2MzY2NjY2NgD2ABA2UDY2NjY2NjY2NjY2NjY2JDY2NjYAAP//AAA2AAABNgAQNlg2NjaHNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYAgAAAKDY2zjY2Np42NjY2Njb/////6DY2QzY2NjYgAQA2 0 125 BOgD6wcINjY2NjY2MzY2NjY2NgD2ABA2UDY2NjY2NjY2NjY2NjY2JDY2NjYAAP//AAA2AAABNgAQNlg2NjaHNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYAgAAAKDY2zjY2Np42NjY2Njb/////6DY2QzY2NjYgAQA= 225 \232\003\235\007.66666636.6666\000\246\000\0166P66666666666666\$6666\000\000\255\255\000\0006\000\000\0016\000\0166X666\135666666.6666666666666666666666\000\128\000\000\(66\206666\158666666\255\255\255\255\23266C6666\032\001 -+BCYmJiYmNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2EhISEhISEhISEhISEhISEhISEhISEhISEhI2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nhw2njY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2HTY2NjZINjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjaeNjY2NjY2NjY2NjY2NjY2NjY2NjY2NiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Ng== 0 -1 -+BOgAAAEDAwgINjY2NgAAAMAfNjY2NjYkFTY0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDY2NjY2NjY2NjY0Nlg2NjY2NjY2NgAAATY2NgAAAADAHzY2NjY2JBU2NDY2NjY2NjY2NjY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2AAAAAQAbS2xLS0tLS0tLATa+H0YUNjY2NgAANjYkNjY0NjY2NjY2NjY2NjY2NjY2NjYkNjZ/dnZ2dnZ2dnZ2dnZ2dnZ2QTYBNh4EAED/NjY2NjQ2AAABAAABgDY2FjY2NtDQ0NDQ0NDQ0DPQ0NDQ0NDQ0NDQ0JDQABQUFBQ2NjY2NjY2WDY2NjZNNjZRABEBAAABNiU9PT09NgBAAAGANj0QAPv7+/v7+/v7+/sg+/v7+0JEAAABNjYyNjY= 0 -1 -+BOgDAwgINjZWNhU2NgE2NjY2NjY2NjY2NjY2UjY2AzY2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIiIiIkAiNugDNjY2NjY2NjY2NjZDNjY2NpiYmDY2NjYiICIiIiIiIiIiIiIiIiJJNjY2NjY2NjY2NjYiIiIiIiJAIjboAzYiIiIiIiIiIiIiIiI2NjY2NjY2NjZkNjY2NjY2NjZNNgAAATY2NjYCAAQANjY2NgAQAIAAADY= 0 180 BOgDAwgINjZWNhU2NgE2NjY2NjY2NjY2NjY2UjY2AzY2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIiIiIkAiNugDNjY2NjY2NjY2NjZDNjY2NpiYmDY2NjYiICIiIiIiIiIiIiIiIiJJNjY2NjY2NjY2NjYiIiIiIiJAIjboAzYiIiIiIiIiIiIiIiI2NjY2NjY2NjZkNjY2NjY2NjZNNgAAATY2NjYCAAQANjY2NgAQAIAA 299 \232\003\003\008.66V6\02166\001.666666666666R66\0036666666666%6I66666666666\"\"\"\"\"\"\@\"6\232\003666.6666666C6666\152\152\1526666\"\032\"\"\"\"\"\"\"\"\"\"\"\"\"I66666666666\"\"\"\"\"\"\@\".\232\0036\"\"\"\"\"\"\"\"\"\"\"\"666666666d66666666M6\000\000\0016666\002\000\004\0006666\000\016\000\128 -+BOgAATY2NjY2fwA2NjY2NjY2NjY2NjY2NjY2NjY2Njb/ADY2NjY2NjY2NjY5NjY2AAAAgFQ2NjY2NjY2NjY2UzY2NjY2tzY2NjY2NjY2NjY2NjY2NjY2NjY2NgAAATY2O0o2NjY2NjY2NjY2NjY2NjYAEDY2OTY2NgAAAIBUNjY2NjY2NjY2NjY2NjY2/zY2NlU2NjY2NjY2NjY2NjY2Nis2NgABAACA/zY2NjY2NjY2NjY2Np42NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2IjY2NjY2IDY2NjY2NjY2NjY2NjY2NjY2IjY2NjY2IDY2NjY2NjY2NjY2IzY2NjY2NjY2NjY2NjZINjY2NjYTDAwMDAwMDAwMDAYMDAwMDAwMDAwMDAwMDDY2NjY2JTY2NjY2NjY2NjY2Np42NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY= 0 -1 -+BOgAAAABAAgINjY2NgAAAMAQNjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTY2NjY2NjQ2WDY2NjY2NjY2AAABNjY2AAD/8cAfNjY2NjYkFTYUNjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFAAAATYAADY2JDY2NDY2NjY2NjY2NnZ2dnZ2QTYBNh4EAED/NjY2NjQ2AAABAAABgDY2FjY2NtDQ0NDQ0NDQ0DPQ0NDQ0NDQ0EDQ0JDQABQUFBQ2NjY2NjY2WDY2NjZNNjZRABEBAAABNjY2RTY5NjY2JT09PT02ADY0NgAAAYA2PRAA+/v7+/v7+w== 0 -1 -+BOgDCAg2NjY2AAAAwB82NjY2NiQVNjQ2NjY2NjY2NgAQNgAAATY2NjY2NjY2AAABAAE2NjZFNjYVNgAENjY2NjY2JzY2NjQ2WDY2NjY2NjY2AAABNjY2AAAAAMAfNjY2NjYkFTY0NjY2NjY2NjY2NjY2NjYAAAABBDY2NjY2NjY2NjY2NjYAAAABABtLbEtLS0tLS0sBAAABRhQ2gDY2AAA2NiQ2NjQ2NjY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2dnZ2dnZ2dnZBNgE2HgQAQP82NjY2NDYAAAEAAAGANhkWNjY20NDQ0NDQ0NDQM9DQ0NDQ0NDQ0NDQkNAAFBQUFDY2NjY2NjZYNjY2Nk02NlEAEQEAAAEjNjZFNjk2NjYlPT09VDYAQP82NjY2NDYAAAGANj0QAPv7+/v7+/v7+/sg+/v7+0JEAAABNgsLCwsLCwsLCwsLCwsLCws= 0 -1 -+wMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjY2Nk02NlEAEQEANjYABf//BUU2OTY2NiU9PT09NgAAAfI//3Y2AAABNjY0NgAAAYA2PRAA+/v7+/v7+/v///8= 16 -1 -+BOgAAGQB4ggISTY2NgAEQMAAAAAAATY2NjY6JDY2NgAQNjZKWDYgNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTExMTEykTExMTEyYLAAEUFAAABjY2NjYAAAE2NhwAAAABAAABBDY2NtAAAzY2NgX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0NjY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/QM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/Nn////82TENMTBMTExMTEykTExMTEyYTACATNjYmfwLuAaMYAAABgDY2SlggIDY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Co2Pk4ABQABADcyNjY= 0 -1 -+BOgAAGQB4ggISTY2NgBEQMAAAADOzs7Ozs6wzs7O//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTEwAAARMTEy0T1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NQcExMTJgsAARQeAAAGNzY2WAAAATY2HAAAAAEAAAEENhY20AADNjY2Bf//BTY2APtIACQ2OTk5OTk5OTk5OTk5OTk5OTk5OTk9NjQ2NjY2NjY2GwAAATY2fzZxdnZ2dnZ2dnbQKirQM9DQ/9Az0ND//3//0AAA5tK70NGQ0AAGAAD/FBQAEAB/NiQ2NjQ2SzY0NjY2NjY2NiRVNv82f+4BoxgAAAGANjZKVSAgNjY2JAAAATY1fzZxdnZ2dnZ2dnbQKjY+TeYFACEANzI2OTk9NjQ2NjY2NjY2GwAAATY2fzZxdnZ2dnZ2dnY= 0 -1 -+AgACAgICAgACAgICAgLXAgICAgICAuEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAAL0 0 52 AgACAgICAgACAgICAgLXAgICAgICAuEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAA== 153 \000\002.\002\002.\000\002.\002\002.\002\215.\002\002.\002\002.\225\001.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002 -+AgwAAhAiAgAAAhAiAQECAVcBAQEBAQEBAQEBAgFXAQEBAQEBAQEBAQEBAgFXAQEBAQA= 0 50 AgwAAhAiAgAAAhAiAQECAVcBAQEBAQEBAQEBAgFXAQEBAQEBAQEBAQEBAgFXAQEBAQA= 120 \012\000.\016\".\000\000.\016\".\001.\001W.\001.\001.\001.\001.\001.\001W.\001.\001.\001.\001.\001.\001.\001W.\001.\001 -+AgAAAhAiAgAAAhAiAQECAVcBAQEBAQEBAQEBAgFXAQEBAQEBARQBAQEBAQIBAQEBAQEBAQIBSgEBAQEBAQEBAQEBAQEBAgFXAVcBAQEBAQEBAQEBAQEAAAEC 0 87 AgAAAhAiAgAAAhAiAQECAVcBAQEBAQEBAQEBAgFXAQEBAQEBARQBAQEBAQIBAQEBAQEBAQIBSgEBAQEBAQEBAQEBAQEBAgFXAVcBAQEBAQEBAQEBAQEA 208 \000\000.\016\".\000\000.\016\".\001.\001W.\001.\001.\001.\001.\001.\001W.\001.\001.\001.\020.\001.\001.\002.\001.\001.\001.\001.\001J.\001.\001.\001.\001.\001.\001.\001.\001W.W.\001.\001.\001.\001.\001.\001 -+BAAEBQYHBAgJCg4PBBAREhMEFBUWFwQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/GEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoi0EpKWmpwSoqaqrBKytrq8EsLGyswS0tba3BLi5ursEvL3BwgAA 8 225 CQoODwQQERITBBQVFhcEGBkaGwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PxhAQUJDBERFRkcESElKSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EYGFiYwRkZWZnBGhpamsEbG1ubwRwcXJzBHR1dncEeHl6ewR8fX5/BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaItBKSlpqcEqKmqqwSsra6vBLCxsrMEtLW2twS4ubq7BLy9wcIA 520 \010\014\015\004\016\017\018\019\004.\021\022\023\004\024\025\026\027\004\028\029\030\031\004\032!\"#\004\$.&'\004\(\)*+\004,-\./\0040123\0044567\00489:\;\004<=>?\024\@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~\127.\128\129\130\131.\132\133\134\135.\136\137\138\139.\140\141\142\143.\144\145\146\147.\148\149\150\151.\152\153\154\155.\156\157\158\159.\160\161\162-.\164\165\166\167.\168\169\170\171.\172\173\174\175.\176\177\178\179.\180\181\182\183.\184\185\186\187.\188\189\193\194 -+AgAAAhBiAgAAAhAiAQECEGICAQIBVwEBAhBiAgAAAhAiAVcBAgFXAQECAVcBAQEBAgFXAAAB 0 52 AgAAAhBiAgAAAhAiAQECEGICAQIBVwEBAhBiAgAAAhAiAVcBAgFXAQECAVcBAQEBAgFXAA== 116 \000\000.\016b.\000\000.\016\".\001.\016b.\001\002.W.\001.\016b.\000\000.\016\".W.\002.W.\001.\001W.\001.\001.\001W -+AgAfBCApIiMEJAgpKisELC0uLwQwQAIQIgIQQAIQIgIQIgYECAAAAQn/fwQMDRIPBBAIEhMEiRUWFwQYGRobBBQdHh8EICkiIwQkJOsnBAgpKisELC0uLwQwMTIzBDQ1NiIGBAgJ/38EDA0SDwQQERITBBQRFhcEGBkaGwQUHR4fBCApIiMELyTrJwQIKSorACw= 0 145 AgAfBCApIiMEJAgpKisELC0uLwQwQAIQIgIQQAIQIgIQIgYECAAAAQn/fwQMDRIPBBAIEhMEiRUWFwQYGRobBBQdHh8EICkiIwQkJOsnBAgpKisELC0uLwQwMTIzBDQ1NiIGBAgJ/38EDA0SDwQQERITBBQRFhcEGBkaGwQUHR4fBCApIiMELyTrJwQIKSorAA== 432 \000\031.\032\)\"#.\$\008\)*.\004,-\./\0040\@\002\016\"\002\016\@\002\016\"\002\016\"\006\004\008\000\000\001\009\255\127\004\012\013\018\015\004\016\008\018\019\004\137\021\022.\004\024\025\026\027\004\020\029\030\031\004\032\)\"#\004\$\$\235'\004\008\).+\004,-\./\0040123\004456\"\006\004\008\009\255\127\004\012\013\018\015\004\016\017\018\019\004\020\017\022\023\004\024\025\026\027.\020\029\030\031.\032\)\"#./\$\235'.\008\)*+ -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYFB0eHyY1KSIZBCQkAAACDkACECICEEACECICECICEEACECICEB8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAAAA== 0 202 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYFB0eHyY1KSIZBCQkAAACDkACECICEEACECICECICEEACECICEB8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAAAA== 593 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\020\029\030\031&5\)\"\025\004\$\$\000\000\002\014\@\002\016\"\002.\@\002\016\"\002\016\"\002\016\@\002\016\"\002\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\000 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CADsA 0 232 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAA== 664 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\128\000\000\0005\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\004\008\002\002\002\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\020\029\030\031&5\)\"\025\004\$\$\000\000\002\000\@.\016\".\016\@.\016\".\016\".\016\@.\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\002\@\002\002.\254\002 -+AgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQYgIAAAIQIgEBAgFXAQECAVcCEGICAAACEAECAAACEGICAAACECIBAQIBVwEBAgFXAhBiAgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQAQIBVwAAAQ== 0 116 AgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQYgIAAAIQIgEBAgFXAQECAVcCEGICAAACEAECAAACEGICAAACECIBAQIBVwEBAgFXAhBiAgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQAQIBVwA= 278 \000\000.\016b.\000\000.\016\".\001.\001W.\001.\001W.\016b.\000\000.\016b.\000\000.\016\".\001.\001W.\001.\001W.\016b.\000\000.\016\001.\000\000.\016b.\000\000.\016\".\001.\001W.\001.\001W.\016b.\000\000.\016b.\000\000.\016\".\001.\001W.\001.\001W.\016b.\000\000.\016\001.\001W -+AQAfBCApIiMEJCTrJ3//BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBf//KwQsLS4vBAAAAQAAAQ== 0 177 AQAfBCApIiMEJCTrJ3//BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBf//KwQsLS4vBAAAAQAA 598 \000.\004\032\)\"#\004\$\$\235'\127\255\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\005\005\005.\005\005\255\255+.,-\./.\000\000\001\000 -+AgAABgYGBgYcBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBAYGBgYGBgYGBgYGBgQGBgYGBgYGBgYGBgYGBgYGBkAGBgYQBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGZAYGBgYGBgYGsgYGBgYGBgYGBgYGBgYFBgYGBgYGBgYGBgYGGgYGBgYGBgYGBgYGBhMGBgYGBgAgBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgboIR4fBCApIiMELyTrJwQIKSorACw= 0 241 AgAABgYGBgYcBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBAYGBgYGBgYGBgYGBgQGBgYGBgYGBgYGBgYGBgYGBkAGBgYQBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGZAYGBgYGBgYGsgYGBgYGBgYGBgYGBgYFBgYGBgYGBgYGBgYGGgYGBgYGBgYGBgYGBhMGBgYGBgAgBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgboIR4fBCApIiMELyTrJwQIKSorAA== 821 \000\000.\006\006\006\006\028\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\004\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\@.\006\006\016\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006d\006\006\006.\006\006\006\006\178\006.\006\006\006\006\006\006.\006\006\006\006\005\006.\006\006\006\006\006\006.\006\006\006\026\006\006.\006\006\006\006\006\006.\006\006\019\006\006\006.\006\000\032\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\232!\030\031.\032\)\"#./\$\235'.\008\)*+ -+AgAfBCApIiMEJCTrJwQIKSqrBCwtLi8EMEECAB8EBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcGBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcOBwcHBwczMzMaOzMzMzMzMzMzMzMzMwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBwcHIQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHBwcHBwcHBwIQIgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHAhAiAhAiBi4vAAABBDAx+X8EDA0SDxAiAhAiBi4vBDAxKjMENDU2IgYECAn5fwQMDRIPBCozBAcHBwcHBwcHBwcHBwcHBwcQERITBBQREkAAARYXMzMzMzMzMzMRMzMzMzMzM/9/EwQUERYXBBgkGhsEFB0CECIGBAgJ+X8EDCcSDwQQERITBEAAFhbogAAAGwQUHQAQMwQ0MX/+//8ICQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHBwcHfwAEJDQdAhAiAhBAAhAiAhAiEkAAARYXBBgZGhsEFB0gHwAzMzM= 0 -1 -+AgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAQQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBOUDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBATlAwQEBAQEBAQEBAQEBAQAAA== 0 165 AgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAQQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBOUDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBATlAwQEBAQEBAQEBAQEBAQA 554 \004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\000\000.\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\229\003\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\004.\004\004\004\229.\004\004\004.\004\004\004\004.\004\004\004\004 -+AgICAgICAgICAgICAgICAg8CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiMELyTrJwQIKSorACw= 2 119 AgICAgICAgICAgICAgIPAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIjBC8k6ycECCkqKwA= 337 \002\002.\002\002.\002\002.\002\002.\002\015.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\"#./\$\235'.\008\)*+ -+BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREV/RwRISUtLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbR42BCAhIiMEJCUmJwQoKSorBCwtLi8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChogAA 0 246 BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREV/RwRISUtLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbR42BCAhIiMEJCUmJwQoKSorBCwtLi8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChogAA 455 \000\001\002\003.\000\000\004\000.\008\009\010\011.\012\013\014\015.\016\017\018\019.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.89:\027.<=>?.\@ABC.DE\127G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lm\0306.\032!\"#.\$%&'.\(\)*+.,-\./.\128\129\130\131.\132\133\134\135.\136\137\138\139.\140\141\142\143.\144\145\146\147.\148\149\150\151.\152\153\154\155.\156\157\158\159.\160\161\162\000 -+BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREUwRwRISUtLBExNTk8EUFFSUwRUVVZXBEJZWlsEXF1eXwRgNTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BJSVlpcEmJmamwScnaGiAAA= 0 241 BAABAgMEAAAEAAQICQoLBAwNDg8EEBESEwQcHR4fBCAhIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BEBBQkMEREUwRwRISUtLBExNTk8EUFFSUwRUVVZXBEJZWlsEXF1eXwRgNTY3BDg5OjsEPD0+PwRAQUJDBERFMEcESElLSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EODk6GwQ8PT4/BJSVlpcEmJmamwScnaGiAA== 370 \000\001\002\003.\000\000\004\000.\008\009\010\011.\012\013\014\015.\016\017\018\019.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.89:\027.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.BYZ[.\\]^_.`567.89:\;.<=>?.\@ABC.DE0G.HIKK.LMNO.PQRS.TUVW.XYZ[.\\]^_.89:\027.<=>?.\148\149\150\151.\152\153\154\155.\156\157\161\162 -+EMDAwMDANjYAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAA= 0 146 EMDAwMDANjYAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAA= 475 \192\192\192\192\19266\000\003\003\003\003\003\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\003.\003\003\000 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFQACAEACECICEEACECICECICEEACEBYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQWAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CADs= 0 253 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFQACAEACECICEEACECICECICEEACEBYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQWAAIAQAIQIgIQQAIQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAA== 715 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\000.\000\@.\016\".\016\@.\016\".\016\".\016\@.\016\022.\004\024:\026\027\004\011\128\000\000\0005\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\004\008\002\002\002\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\020\029\030\031&5\)\"\025\004\$\$\022\000\002\000\@.\016\".\016\@.\016\".\016\".\016\@.\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\002\@\002\002.\254\002 -+AgAfBCApIiMEJCTrJwQIKSqrBCwtLi8EMEECAB8EBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwYHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBzMzMxo7MzMzMzMzMzMzMzMzBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcF//8FBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHAhAiBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwMHBwcHBwcCECICECIGLi8AAAEEMDH5fwQMDRIPECICECIGLi8EMDEqMwQ0NTYiBgQICfl/BAwNEg8EKjMEBwcHBwcHB8XFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHMzMzGjszMzMzMzMzMzMzMzMHBwcHBwcHBwcHBwcHBwcHBwcOBwcHBwcHByEHBwcHBwcHBwcHBwX//wUHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwcHBwcHBwcCECIHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHAwcHBwcHBwIQIgIQIgYuLwAAAQQwMfl/BAwNEg8QIgIQIgYuLwQwMSozBDQ1NiIGBAgJ+X8EDA0SDwQqMwQHBwcHBwcHxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFBwcHBwcHBwcHEBESEwQUERJAAAEWFzMzMzMzMzMzETMzMzMzMzP/fxMEFBEWFwQYJBobBBQdAhAiBgQICfl/BAwnEg8EEBESEwRAABYW6IAAABsEFB0AEDMENDF//v//CAkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBwcHIQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHBwcHBwfFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcUHBwcH 0 -1 -+BB8BAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pl8EYGFgYwRkZWZnBGhpamsEbG1ubwRwcXJzBHR1VlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtbm8EcHFycwR0dXZ3BHh5ensEfH1+fwSAgYKDBISFhocAAAGK 8 163 BgcECAkKCwQMDQ4PBBAREhMEFBUWFwQYGRobBBwdHh8EICEiIwQkJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT5fBGBhYGMEZGVmZwRoaWprBGxtbm8EcHFycwR0dVZXBFhZWlsEXF1eXwRgYWJjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHAA== 277 \007\004\008\009\010\011.\012\013\014\015.\016\017\018\019.\020\021\022\023.\024\025\026\027.\028\029\030\031.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<=>_.`a`c.defg.hijk.lmno.pqrs.tuVW.XYZ[.\\]^_.`abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~\127.\128\129\130\131.\132\133\134\135 -+AhI1AAABNTUVOj9ISEhISEhISEhISEhISAMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYAPRAA+/v7+/v7+wMDAwMDAwMDAwMDAwAAAQMDAwMDAwMDAwMDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMOAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYAAAGA 68 -1 -+AhIAAlBINQAAATU1FTo/SEhISEhIAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFRTY5Nj42JT09PQEfNjY8NjYkFTY0NjYyNjY2NjYADDY2S0sAAAEBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAA/gABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2Mh02NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZO0NDQkNAAFBQUFDY2NTY2QzZYNjY2Nk02NlEAEQEANjY07Ozs7AAA 68 -1 -+BCAhIiMEJCUmJwQoKSorBCwtLi8EMDEFGAEfASABIQEiASMBJAEnASgBKQEqASsBLAEtAS4BNwE4ATkBOiA7ATwBPQE+AT8NAQ4BDwEQAREBEgETARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BJwEoAUgBKgErASwBLQEuATsBPAE9AT4BPwA= 0 161 BCAhIiMEJCUmJwQoKSorBCwtLi8EMDEFGAEfASABIQEiASMBJAEnASgBKQEqASsBLAEtAS4BNwE4ATkBOiA7ATwBPQE+AT8NAQ4BDwEQAREBEgETARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BJwEoAUgBKgErASwBLQEuATsBPAE9AT4BPwA= 293 \032!\"#.\$%&'.\(\)*+.,-\./.01\005\024.\031.\032.!.\".#.\$.'.\(.\).*.+.,.-.\..7.8.9.:.\;\001<\001=\001>\001?\013\001\014\001\015\001\016\001\017\001\018\001\019\001\020\001\023\005\024\001\025\001\026.\027.\028.\029.\030.\031.\032.!.\".#.\$.%.&.'.\(.\).*.+.,.-.\..'.\(.H.*.+.,.-.\..\;.<.=.>.? -+AX8CAAAA 0 6 AX8CAAAA 14 \127.\000\000 -+AgIAAAEC 0 4 AgIAAA== 9 \002\000 -+AQAAZA== 0 3 AQAA 5 \000 -+AQWhQEBAQAAAAQ== 1 7 BaFAQEBAAA== 13 \161\@\@\@\@ -+JB4kJDUkJCQkJCQkJCQCNCQC/yQkJCQkJAAAASQkJAAkHgcAgAA= 0 38 JB4kJDUkJCQkJCQkJCQCNCQC/yQkJCQkJAAAASQkJAAkHgcAgAA= 95 \030\$\$5\$\$\$\$\$\$\$\$\$\0024\$\002\255\$\$\$\$\$\$\000\000\001\$\$\$\000\$\030\007\000\128 -+AQABAwEiAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwESARMBFAEVARYBFwEYARkBGgEbARwBHRABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+Af8A 0 -1 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0V3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AP4= 0 253 AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0V3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AA== 660 \000.\001.\002.\003.\004.\005.\006.\007.\008.\009.\010.\011.\012.\013.\014.\015.\016.\017.\018.\019.\020.\021.\022.\023.\024.\025.\026.\027.\028.\029.\030.\159.\160.\161.\162.\163.\164.\165.\166.\167.\168.\169.\170.\171.\172.\173.\174.\175.\176.\177.\178.\179.\180.\181.\182.\183.\184.\185.\186.\187.\188.\189.\190.\191.\192.\193.\194.\195.\196.\197.\198.\199.\200.\201.\202.\203.\204.\205.\206.\207.\208.\209.\210.\211.\212.\213.\214.\215.\216.\217.\218.\219.\220.\221.\222\001\223\001\224\001\225\001\226\001\227\001\228\001\229\001\230\001\231\001\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHUAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AQEA/wA= 0 255 AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHUAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AQEA 635 \000.\001.\002.\003.\004.\005.\006.\007.\008.\009.\010.\011.\012.\013.\014.\015.\016.\017.\018.\019.\020.\021.\022.\023.\024.\025.\026.\027.\028.\029.\030.\159.\160.\161.\162.\163.\164.\165.\166.\167.\168.\169.\170.\171.\172.\173.\174.\175.\176.\177.\178.\179.\180.\181.\182.\183.\184.\185.\186.\187.\188.\189.\190.\191.\192.\193.\194.\195.\196.\197.\198.\199.\200.\201.\202.\203.\204.\205.\206.\207.\208.\209.\210.\211.\212.\213.\214.\215.\216.\217.\218.\219.\212.\221.\222.\223.\224.\225.\226.\227.\228.\229.\230.\231.\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253.\001 -+AgAADABAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsmCx0eHw01KSIZBCQkAAD/AEACEBgCEEACECICECIGBBAiAhBAAgIQIgYECAICAgICECICEEACECICECIGBAgJIgICAhAiAhBAAhAiAhAiBgQICf9/BAwNIA8EEAgSEwQBFRYXBBgBFRYXBBg6GhsECx0eEA01KSIZBCQ6NSkiGQQkJAAAAgBAAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQOAAIAQAIQIgIQQAIQIgIQIgYECAJAAgIC/gICOwA= 0 239 AgAADABAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsmCx0eHw01KSIZBCQkAAD/AEACEBgCEEACECICECIGBBAiAhBAAgIQIgYECAICAgICECICEEACECICECIGBAgJIgICAhAiAhBAAhAiAhAiBgQICf9/BAwNIA8EEAgSEwQBFRYXBBgBFRYXBBg6GhsECx0eEA01KSIZBCQ6NSkiGQQkJAAAAgBAAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQOAAIAQAIQIgIQQAIQIgIQIgYECAJAAgIC/gICOwA= 793 \000\000.\000\@\002\016\"\002\016\@\002\016\"\002.\"\006\004\008\009\255\127\004\012\013\018\015\004\016\008\018.\004\001\021\022\023\004\024:\026\027&\011\029\030\031\0135\)\".\004\$\$\000\000\255\000\@\002\016\024\002\016\@\002\016\"\002\016\"\006\004\016\"\002.\@\002\002\016\"\006\004\008\002\002\002\002\002\016\"\002.\@\002\016\"\002\016\"\006\004\008\009\"\002\002\002\016.\002\016\@\002\016\"\002\016\"\006\004\008\009\255\127\004\012\013\032\015\004\016\008\018\019\004\001\021\022\023\004\024\001\021.\023\004\024:\026\027\004\011\029\030\016\0135\)\"\025\004\$:5\)\".\004\$\$\000\000\002\000\@\002\016\"\002\016\@\002\016\"\002\016\"\002\016\@\002\016.\002\016\031\004\032\)\"#\004\$\$\014\000\002\000\@\002\016\"\002\016\@\002\016\"\002\016\"\006\004\008\002\@\002.\002\254.\002\; -+BOgDAwgINjY2NjY2NjY2PAA3NhM2NjY2NjY2Nkk2NjY2NjZAAAAANjk2NjY2NgAAAAFANjY2NjY2NjY2Ng82NjY8ADc2EzY2NjY2NjY2ADY2NjY2NjY2NjY28Da3NjY2NjbwNrc2NjY2NjY8ADc2EzY2NjY2NjY2NjY2NvA2tzY2NjYaAAE2NiM2NjY2NoE2NjY2NqVCPAAhNhM2NjY2NjY2Np42O/oYNhM2MjY2NjY2NgA2NjYAAAHwNrc2NjY2NjY2NjY2NjY2NjY2NjY2NjY5NjY2MTY2NjY2Njb/fzY2AAE2NjZ/PjZUnjY8ABg2NjY2Nj5SNhQ+AICAADYAAAE2 0 255 BOgDAwgINjY2NjY2NjY2PAA3NhM2NjY2NjY2Nkk2NjY2NjZAAAAANjk2NjY2NgAAAAFANjY2NjY2NjY2Ng82NjY8ADc2EzY2NjY2NjY2ADY2NjY2NjY2NjY28Da3NjY2NjbwNrc2NjY2NjY8ADc2EzY2NjY2NjY2NjY2NvA2tzY2NjYaAAE2NiM2NjY2NoE2NjY2NqVCPAAhNhM2NjY2NjY2Np42O/oYNhM2MjY2NjY2NgA2NjYAAAHwNrc2NjY2NjY2NjY2NjY2NjY2NjY2NjY5NjY2MTY2NjY2Njb/fzY2AAE2NjZ/PjZUnjY8ABg2NjY2Nj5SNhQ+AICAADYA 419 \232\003\003\008.66666666.<\00076\01966666666I666666\@\000\000\0006966666\000\000\000\001\@6666666666\015666<\00076.66666666\0006666666666.\2406\18366666\2406\183666666<\00076\019666666666666\2406\1836666\026\000\00166#66666\1296.666\165B<\000!6\01966666666\1586\;\250\0246\01962666666\000666\000\000\001\2406\18366666666666.666666666966616666666\255\12766\000\001666\127>6T\1586<\000\02466666>R6\020>\000\128\128\0006 -+BOgDAwgINjY2NjY2NjY2NjYAAH//NgAAf/8XAjZ/UV5eIAAXFxcXFxcXFxcXFwI2fzZeAAABXiAAATYAAEVkNgAANjY2NjY2NgABQDY2NjYyNjYjQzb/fxN1Njb8NjaeQjwAIVkTNjY2Nfs2NjaeNFnkGDITNjY2Njb/HDf/fzY2NgAAAf///382VzY2NgA2NjY2NjY2NjY2NjY2AAAANjb/////NgAAAFw2f////zY2NjE2NjY2//82/382NjYAAAH///9/ZAABNjY2NjY2Np5eXl4RATYAAEVkNgAANjY2NjY2NgABQDY2NgABNg== 0 236 BOgDAwgINjY2NjY2NjY2NjYAAH//NgAAf/8XAjZ/UV5eIAAXFxcXFxcXFxcXFwI2fzZeAAABXiAAATYAAEVkNgAANjY2NjY2NgABQDY2NjYyNjYjQzb/fxN1Njb8NjaeQjwAIVkTNjY2Nfs2NjaeNFnkGDITNjY2Njb/HDf/fzY2NgAAAf///382VzY2NgA2NjY2NjY2NjY2NjY2AAAANjb/////NgAAAFw2f////zY2NjE2NjY2//82/382NjYAAAH///9/ZAABNjY2NjY2Np5eXl4RATYAAEVkNgAANjY2NjY2NgABQDY2NgA= 544 \232\003\003\008.66666666.66\000\000\127\2556\000\000\127\255\023\0026\127Q^^\032\000\023\023\023\023\023\023\023\023\023\023\023\0026\1276^\000\000\001^\032\000\0016\000\000Ed6\000\000666.666\000\001\@6666266#C6\255\127\019u66\25266\158B<\000!Y\0196665\251666\1584Y\228\0242\01966666\255\028.\255\127666\000\000\001\255\255\255\1276W666\0006666666666666\000\000\00066\255\255\255\2556\000\000\000\\6\127\255\255\25566616.66\255\2556\255\127666\000\000\001\255\255\255\127d\000\0016666666\158^^^\017\0016\000\000Ed6\000\0006666666\000\001\@666 -+AykpKSkpKSkpKQQEKSkpKSkpKSkpKSkpKSkpDAAAASkMKSkuKSkpKSkpKSkpKSkpKCkG9QgJfyFAKSkpKSn/KSkpKSkAAAEpKQcEKSkpKSkpKSkpKSkpKSkpKQwpKSkpKSkpKSkpKSkpKQwpDCkpLikpKSkpKSkpKSkpKSkpKSkpKTsEQAIpKSkpKCkG9QgJCiFAKSkpKSn/KSkpKUUpKQcEKSkpKSkyKSkpKbckODlXOwRAAD4pBwQgKSkpKQAAEAA= 0 191 AykpKSkpKSkpKQQEKSkpKSkpKSkpKSkpKSkpDAAAASkMKSkuKSkpKSkpKSkpKSkpKCkG9QgJfyFAKSkpKSn/KSkpKSkAAAEpKQcEKSkpKSkpKSkpKSkpKSkpKQwpKSkpKSkpKSkpKSkpKQwpDCkpLikpKSkpKSkpKSkpKSkpKSkpKTsEQAIpKSkpKCkG9QgJCiFAKSkpKSn/KSkpKUUpKQcEKSkpKSkyKSkpKbckODlXOwRAAD4pBwQgKSkpKQA= 441 \)\)\).\)\)\)\)\)\004\004\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\012\000\000\001\)\012\)\)\.\)\)\)\)\)\)\)\)\)\).\)\(\)\006\245\008\009\127!\@\)\)\)\)\)\255\)\)\)\)\)\000\000\001\)\)\007\004\)\)\)\)\)\)\)\)\)\)\)\)\).\)\)\012\)\)\)\)\)\)\)\)\)\)\)\)\)\)\012\)\012\)\)\.\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\).\004\@\002\)\)\)\)\(\)\006\245\008\009\010!\@\)\)\)\)\)\255\)\)\)\)E\)\)\007\004\)\)\)\)\)2\)\)\)\)\183\$89W\;\004\@\000>\)\007\004\032\)\)\)\) -+BAABFwMBBRYXBBgZGhsEHB0eAAAAACIjBCQlJicEKCkqKwQsOy4vBCAhIiMEJCUmJwQoKSorBCw7Li8EBAQFFhcEGBkaGwQcHR4AAAAAIiMEJCUmJwQoKSorBCw7Li8EICEiIwQkJSYnBCgpKisELDsuLwQwMTIzBDQ1NjcEODk6OwQ8PT5BAA== 0 136 BAABFwMBBRYXBBgZGhsEHB0eAAAAACIjBCQlJicEKCkqKwQsOy4vBCAhIiMEJCUmJwQoKSorBCw7Li8EBAQFFhcEGBkaGwQcHR4AAAAAIiMEJCUmJwQoKSorBCw7Li8EICEiIwQkJSYnBCgpKisELDsuLwQwMTIzBDQ1NjcEODk6OwQ8PT5BAA== 309 \000\001\023\003.\005.\023\004\024\025\026\027\004\028\029\030\000\000\000\000\"#\004\$%&'\004.\)*+\004,\;\./\004\032!\"#\004\$%&'\004\(\)*+\004,\;\./\004\004\004\005\022\023\004\024\025\026\027\004.\029\030\000\000\000\000\"#\004\$%&'\004\(\)*+\004,\;\./\004\032!\"#.\$%&'.\(\)*+.,\;\./.0123.4567.89:\;.<=>A -+PwDuAQMEBQYHCAl8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVCEiIyQlJjU2Nzg5Ojs8ICEiIyQlJiAhVVZXWFlaW1xdXl9gABBjZGVwcXJzdHV2QAAAfA== 0 188 PwDuAQMEBQYHCAl8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8ICEiIyQlJjU2Nzg5Ojs8ICEiIyQlJjU2Nzg5Ojs8PT4/P0BBQkNEVCEiIyQlJjU2Nzg5Ojs8ICEiIyQlJiAhVVZXWFlaW1xdXl9gABBjZGVwcXJzdHV2QAA= 261 \000\238\001\003\004\005\006\007\008\009||||||||||||||||||||||\032!\"#\$%&56789:\;<\032!\"#\$%&56789:\;<=.??\@ABCDT||||||||||||||||||||||||||\032!\"#\$%&56789:\;<\032!\"#\$%&56789:.<=>??\@ABCDT!\"#\$%&56789:\;<\032!\"#\$%&\032!UVWXYZ[\\]^_`\000\016cdepqrstuv\@ -+PwDuKSkpKSkpKSkpRikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKRYpKSlyc3R1dkAAAAB7 0 149 PwDuKSkpKSkpKSkpRikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKRYpKSlyc3R1dkAAAAA= 297 \000\238\)\)\)\)\)\)\)\)\)F\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\".\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\).\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\022\)\)\)rstuv\@\000\000 -+PwDuHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0UHR0dHR0dHR0dHR0BAwAAAQT9BQcICXx8fHx8fHx8AAABAHx8fHx8IAB8 0 245 PwDuHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0UHR0dHR0dHR0dHR0BAwAAAQT9BQcICXx8fHx8fHx8AAABAHx8fHx8IAA= 910 \000\238\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\000\000\001\029\029\029\029\029\029\029\029\029\029\029\029\029>\029\029\029\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\000\000\001\029\029\029.\029\029\029\029\029\029\029\029\029>\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\020\029\029\029\029\029\029\029\029\029\029.\001\003\000\000\001\004\253\005\007\008\009||||||||\000\000\001\000|||||\032 -+AQAAAAEgAAAA8Q8iAhAiAAABDkQICf9/BAAAAAEQCGNjL39jY2NjeHhvY2NjRwEVFjcEGDpaFwQLgAD//3//IgIAAAEQABCAAP//f/8iAhAAEBCb9BYfBENBh6AA+vr6FNkEAAQIZP8zAA== 100 6 BAhk/zMA 11 \008d\2553 -+AgAAAgAAAAEiAg== 0 7 AgAAAgAAAA== 18 \000\000.\000\000 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQIDf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaIiMEBCQAAAIAQAIQAAIfQAIQIgIQIgYECAIChgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEAIECIiAEACECICECIGBAgCQAICAv4CAA== 0 250 AgAAAgBAAhAiAhBAAhAiAhAiBgQIDf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaIiMEBCQAAAIAQAIQAAIfQAIQIgIQIgYECAIChgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEAIECIiAEACECICECIGBAgCQAICAv4CAA== 754 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\013\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\128\000\000\0005\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\"#\004\004\$\000\000\002\000\@\002\016\000\002\031\@\002\016\".\016\".\004\008\002\002\134\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\020\029\030\031&5\)\"\025\004\$\$\016\"\002\016\".\016\@.\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\"\"\000\@\002\016\".\016\".\004\008\002\@\002\002.\254\002 -+AQABAwEiAQcBCAEJAQoBCwEMAQ0BDgEPARIBEwEUARUBFgEXARgBGQEaARsBHAEdEAERARIBEwEUARUBFgEXAX0BGQEaARsBHAEdAR4BnwGgAaEBAAA= 0 86 AQABAwEiAQcBCAEJAQoBCwEMAQ0BDgEPARIBEwEUARUBFgEXARgBGQEaARsBHAEdEAERARIBEwEUARUBFgEXAX0BGQEaARsBHAEdAR4BnwGgAaEBAAA= 230 \000.\003.\".\007.\008.\009.\010.\011.\012.\013.\014.\015.\018.\019.\020.\021.\022.\023.\024.\025.\026.\027.\028.\029.\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001}.\025.\026.\027.\028.\029.\030.\159.\160.\161.\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sNNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAARU2ClA2NtDO09DQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dgAA//92dnb/CwAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sNNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAARU2ClA2NtDO09DQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dgAA//92dnb/CwAA 633 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0136\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\001\0216\010P66\208\206\211\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\1276X+66666v\000\000\255\255vvv\255\011\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQsNjYAAdDQkAAAFBQUFDY2gH82WCs2NjY2NnZ2dnZ2dnZ2/wsAAAEAGw== 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQsNjYAAdDQkAAAFBQUFDY2gH82WCs2NjY2NnZ2dnZ2dnZ2/wsAAAEA 615 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020,66\000\001\208\208\144\000\000\020\020\020\02066\128\1276X+66666vvvvvvvv\255\011\000\000\001 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QAAAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QAAAAAAA 625 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\000\000\000\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEAAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEAAAAAA 623 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\000\000\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAAAAA 621 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\@\000\000 -+BAABAgMEBAUGBwQICQoLBBINDg8EEBESEwQUFRYXBBgZGhsEHB0eNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTExNqEykTlhMTEyYLAAEUFAAABjY2NjYAAAE2NhwAAAABAAABBDb/fwAAAzY2NgX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0pDY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/QM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/AAABNn////8= 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAQAAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAAAFYKzY2NjY2dnZ2dnZ2QEBAQAAA 619 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\000\001X+66666vvvvvv\@\@\@\@\000 -+ISEhISEhISEhISEhISEhISEhISEAA+gAISEhISEhISEhISEhISEhGiEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhISEhIYAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhIRAhISEhISEhISEhISEhISEhISEhISEhISEhIYAhISEhISEpcnN0dXZAAA== 33 205 ISEhISEhGiEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhISEhIYAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhIRAhISEhISEhISEhISEhISEhISEhISEhISEhIYAhISEhISEpcnN0dXZAAA== 218 !!!!!\026!!!!!!!!!!!C!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!~!!!!!!!!!!!.!\128!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!C!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!~!!!!!!!!!!\016!!!!!!.!!!!!!!!!!!!!!!!!!!\128!!!!!!\)rstuv\@ -+AQABAQEAAAEBBBswGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbBhsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsVGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGyobGxsbGxsbGxsbGxsbGxsbGxsbzs7Ozs7Ozs7Ozs4bGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsmGxsbGhsbGxsbNRsbGxsbGxsbGw== 0 7 AQABAQEAAA== 15 \000.\001.\000 -+AQABAQECAQMbGwAAARsbGxsbGzobGyAbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbG2kbGxsbFRsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwMbGxsbGxsbGxsbGxsbGxsbGxsbGxsiGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxvfGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsmGxsbGxsbGxsbGxsbGxsbGxsbGw== 0 -1 -+AQABAQECAQMBBAEFAQYBB+sIAQkBCgELxwwBDQEOAQEXJwEoAT42JT09PTYfNjY8NjYkFTY0NjYyAAABNjY2NjYADDY2S0sAAAEBFr4fRhQ2NjY2AAA2Nlg2iTw2HDY2NgAA/gABRDY2TjY2JBA2BLM2ojY2NjY2Bf8AG0Q2OTZNNiU9PT0BNlM2AAAAAQA2NDY2MjY2NjYyJjY2NjYAEDY2S0tLQAAAAUsBNr4fRhTDHzbAQDYufuzs7OwAAAHs7OwUNjY2NgAAAH//NjY0NjY2QTYAAAE+NjY2NjY2Nk7W0NCQ0AAUFBQUGjY1UzZDNlh/NjY2TTY2UQARAQA= 0 -1 -+AQABAQECAQMBBAEFAAABBwEIAQkBCgELAQwBDQEOAQ8BECABIQEiASMBJAElASYBJwEoAAw2NktLAAABARa+/kYkFTY0NjYyNjY2NjYADDY2S0sAAAEBFr7+RhQ2NjY2AAA2Nlg0djw2NjY2NgAA/t4BNjY2PDY2MxU2AbM2ojY2NjY2Bf82NjYAEDY2S0tLQAAAAUt//74fRhTANjQ2NiQ2NjY2NgAQNjZLAAABfvPs7OwAAAHs7OwUNjY2NgAAAAABNjY0NjY2QTY+NjY2NjY2Nk7Q1NCQ0AAUFBQUNjY1NjZDNlg2NjY2TTY2UQARAQA= 0 13 AQABAQECAQMBBAEFAA== 30 \000.\001.\002.\003.\004.\005 -+AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8CAgICAgICAoAAAgICAAABAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC 0 42 AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8CAgICAgICAoAA 107 \000.\001.\002.\003.\004.\005.\006.\007.\008.\009.\010.\011.\012.\013.\014.\015.\002\002.\002\002.\002\128 -+BOgAAAEDAwgINjY2NgAAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAX//wU2NjY0NgAANjYWNjY259DQ0NDQ0NDQNjY2ABtLbEtLS0tLS0sBNr4fRhQ2NjY2AAA2NiQ2NjQ2NjY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2doF2dnZ2dnZBNgE2HgQF//8FNjY2NDYAAAkAAAGANjYWNjY20NDQ0NDQ0NDQf9DQ0NDQ0NDQ0NDQkNAAFBQAAAEUFDY2NjY2NjZYNjY2Nk0hNlEAEQEAAAE2Ng== 0 -1 -+BOgAAAEDAwgINjY2AAABNgAAAMAAAADAHzaAADY2JBU2NjYVNgAENjw2NjY2NjY2BAX//+fQ0NDQ0NDQ0DY4NjY2NjY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2AAAAAQAbS2xLS0tLS0tLATa+H0YUNjY2NgAANjYgNjY0NjY2NjY2NjY0NjY2NjY2NvoAAPp/dnZ2dnZ2dnZ2dnZ2dnaAQTYBNh4EBf//BTY20NDQ0NDQ0NB2dnZ2dnZ2dnZ2QTYB0NDQ0DPQ0NDQ0ND///+A0JDQABQUAAAaNk0hNlEAEQEAAAE2Ng== 0 -1 -+BOgAAAEDAwgINjY2NeYAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAH//wU2NjY0NgAAAQDoAYA2NhY2Njbn0NDQ0DY2NjY2Fk//AAAAAAABABtLbEtLS0tLSwAAAQQ2NjQ2NjY2Nic2NjY2NjY2NgABAAA2Nn92dnZ2dnZ2dnZ2dnZ2dnZBNgE2HgQF//8FNjY2NDYAADY2NjY2Fk//AAAAAAABABtLbEtLS0sJAAABgDY2FjY2NtDQ0NDQ0NDQ0DPQw9DQ0NDQ0NDQ0JDQABQUAAABFBQ2NjY2NjY2aTY2NjZNITZAABEBAAABNjY= 0 88 BOgAAAEDAwgINjY2NeYAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAH//wU2NjY0NgAAAQDoAYA2NhY2Njbn0NDQ0DY2NjY2Fk//AAAAAAABAA== 217 \232\000\000\001.\003\008\008.665\230\000\000\192\0316\128\00066\$\021666\0216\000\004666666666646X\004\001\255\255\00566646\000\000\001\000\232\001\12866.666\231\208\208\208\20866666\022O\255\000\000\000\000\000\001 -+BOgAAAEDAwgINjY2AAABAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAX//wU2NjY0NgAAAQAAAYA2NhY2Njbn0NDQ0NDQ0NA2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2NjY2NjY2JDY2f3Z2dnZ2dnZ2dnZ2dnZ2dkE2ATYeBAX//wU2NjY0NgAACQAAAYA2NhY2NjbQ0NDQ0NDQ0NAz0NDQ0NDQ0NDQ0NCQ0AAUFAAAARQUNjY2NjY2Nlg2NjY2TSE2UQARAQAAATY2 0 255 BOgAAAEDAwgINjY2AAABAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2NDZYBAX//wU2NjY0NgAAAQAAAYA2NhY2Njbn0NDQ0NDQ0NA2NjY2NjY2NjY2NgAAAAEENjY2NjY2NjY2NjY2NgAAAAEAG0tsS0tLS0tLSwE2vh9GFDY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2NjY2NjY2JDY2f3Z2dnZ2dnZ2dnZ2dnZ2dkE2ATYeBAX//wU2NjY0NgAACQAAAYA2NhY2NjbQ0NDQ0NDQ0NAz0NDQ0NDQ0NDQ0NCQ0AAUFAAAARQUNjY2NjY2Nlg2NjY2TSE2UQARAQAA 583 \232\000\000\001.\003\008\008.66\000\000\001\000\192\0316\128\00066\$\021666\0216\000\004666666666646X\004\005\255\255\00566646\000\000\001\000\000\001\12866.666\231\208\208\208\208\208\208\208\2086666666666.\000\000\000\001\0046666666666666\000\000\000\001\000\027KlKKKKKKK\0016\190\031F\02066666\000\000\000\001\00466666.6666666666666\$66\127vvvvvvvvvvvvvvvA6\0016\030\004\005\255\255\00566646\000\000\009\000\000\001\128.6\022666\208\208\208\208\208\208\208\208\2083\208\208\208\208\208\208\208\208\208\208\208\144\208\000\020\020\000\000\001\020\0206666666X6666M!6Q\000\017.\000 -+BOgAAGQAAAA2AAAAwB82gAA2NoAANjYkFTY2NhU2IAQ2NjY2NjY2NjY2NDYAAAFYBAX//wA2NjY0Nu//NTY2AAAAAQQ2NjY2////fzY0NiMAG0tsS2RLS0tLSwEAAAE2vh9GFDY2NjYAAAE2dnZ2dnZ2dnZ2dgAAAUE+ATYeBAX//wU2NjY0NgAACQAAaWlpaWlpaWlpaWnzaWlpaWn/f2lpaWlpaWlYNjY2Nk0hHVEAEQEAAAE2Ng== 0 6 BOgAAGQA 14 \232\000\000d -+BOgAAAEDAwgINjY2NgAAAMAfNoAANjYkFTY2NhU2AAQ2NjY2NjY2NjY2PSIjBCQlJicEPykqFQQsLS4uBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEVGRwRISUpLBExNQ08EUFFSWwRUVVZXBFhZWlsEXE1eXwRgYWJjBGRlZmcEaGlqawRsbR4fBCAhIiMEJCUmJwQoKSorBCwtJy8EgIGCgwT6hYaHBIiJiosENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwQ= 0 -1 -+AAABBOgAAEFAA+gYAAA2TgD/8sAQAAAAATAkAAABAAE2AwAAdj52ATT/YTk5GVQ5Ad42QCL7/zA= 0 1 AA== 2 . -+wMAAAcDgwMDANjY2NgAAGsAfNjY8NjYkFTo0NjYyNjY2NjYAEDY2S0s2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NiU9PT0BHzY2FDY2NjYAADY2WDZ2PDY2NjY2AAD+AAE2NjY8NjYkFTYEszaiNjY2NjYF//8FRTY5Nj42JT09PQEAAAABADY0NjYyNjY2NjYAEDY2S0tLQABAAUsBNr4fRhQ2////fyQVNgTAHzYufuwp7OwAAAHs7OwUNjY2NgAAAAAAAAE0NjYAAAE+NjY2NjY2Nk7Q0NCQ0AsUFBQUNjY1NjZDNlg2NjY2TTY2UQD//wVFNjk2PjYlPT09AR82NhQ2NjY2AAA2Nlg2djw2NjY2NgAA/gABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NjY2Bf//BUU2OTY+NiU9PT0BAAAAAQA2gAAAADY2NjY2ABA2NktLS0AAAAFLATa+H0YUNv///38kFTYEwB82Ln7s7OzsAAAB7OzsFDY2NhEBAA== 16 2 NjY2NgAQNjZLSzY2WDZ2PDY2NjY2AAABAAE2NjY8NjYkFTYEszaiNjY2JT09PQEfNjYUNjY2NgA= 98 666\000\01666KK66X6v<66666\000\000\001\000\001666<66\$\0216\004\1796\162666%===\001\03166\0206666 -+wMgAAcDgwMDANjY2NgAAGsAfNmY8NjY2QzZYNjY2NjY2NjYAAAE2S0s2NgFK4za+H0YUwB82Ln7s7OzsAAAB7BDsFDY2NjYAAAAAAf//NDZKNjZBNj42NjY2gDY2TtDQQTY+NjY2NjY2Nk7Q4tCQ0AAUFP////81NjZDNlg2Nhc2TTY2UQARAQA= 39 -1 -+wMAAAcDgwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0s2OFg2djw2NjY2NgAAAQABNjY2PDY2QDY1NjZDNgAAAVhAADY2TTY2UQARAQA= 16 -1 -+wMAAAcDgwMDANjY2NgAAGsAfNjY8NjY2cjY2NjY2ABA2NktLS0AAAAFLATYAAAEUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZOHzY2PDY2JBU2NDY2MjY2NjY2AAw2NktLAAABARa+H0YUNjY2NgAANjZYNnY8NjY2NjYAAP4AATY2Njw2NiQVNgSzNjY2cjY2NjY2ABA2NktLS0AAAAFLATYAAAEUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZO0NDQkNAAFBQUFDY2NTY2QzZYNjY2Nk02NlEAEQEA 16 -1 -+wKoAAcDgwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0s2Nlg2djw2NjY2NkAAAQABNjY2PAAAARU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BHzY2PDY2JBU2AAABMjY2NjY2AAw2NktLAAABARa+AAABNjY2NgAANjZYNnY8NjY2NjYAAP4AATY2Njw2NiQVJgSzNqI2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjY2NgAQNjZLgABAAAABSwE2vh9GFMAfNi5+7Ozs7AAAAezs7BQ2NjY2AAAAAAE2NjQ2NjZBNj42NjY2NjY2TtDQ0JDQABQUFBQ2NjU2NkM2WDY2NjZNQDZRABEBAA== 16 2 NjY2NgAQNjZLSzY2WDZ2PDY2NjY2QAABAAE2NjY8AAABFTYEszaiNjY2NjYF//8FRTY5Nj42JT09PQEfNjY8NjYkFTYAAAEyNjY2NjYADDY2S0sAAAEBFr4AAAE2NjY2AAA2Nlg2djw2NjY2NgAA/gABNjY2PDY2JBUmBLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NkuAAEAAAAFLATa+H0YUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZO0NDQkNAAFBQUFDY2NTY2QzZYNjY2Nk1ANlEAEQEA 548 666\000\01666KK66X6v<66666\@\000\001\000\001666<\000\000\001\0216\004\1796\16266666\005\255\255\005E696>6%.==\001\03166<66\$\0216\000\000\001266666\000\01266KK\000\000\001\001\022\190\000\000\0016666\000\00066X6v<66666\000\000\254\000\001666.66\$\021&\004\1796\16266666\005\255\255\005E696>6%===\001666\000\000\000\001\0006466266666\000\01666K\128\000\@\000\000\001K\001.\190\031F\020\192\0316\.~\236\236\236\236\000\000\001\236\236\236\0206666\000\000\000\000\001664666A6>6666666N\208\208\208\144\208\000\020\020.\02066566C6X6666M\@6Q\000\017\001 -+P8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXe3+AbGxsbGxsbGxsbGxsbGxsbGxsbGyMbGxsbGxsbGxsbGxsbGxsbGxsbGxsbFRsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwMbGxsbGxsbGxsbGxsbGxvW19jZ2tvc3d7f4BsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsVGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbAxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGyYbGxsbGxsbGxsbGxsbGxsbGxsb 0 -1 -+wMAAAcDAf////zY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjZLS0tLSwEWAZ8BoAGhAaIBowGkAaUBpgGxAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdFd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QD+ 16 2 NjY2NktLS0tLARYBnwGgAaEBogGjAaQBpQGmAbEBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0V3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AA== 588 666KKKKK\001\022\001\159\001\160\001\161\001\162\001\163\001\164\001\165\001\166\001\177\001\168\001\169\001\170\001\171\001\172\001\173\001\174\001\175\001\176\001\177\001\178\001\179\001\180.\181.\182.\183.\184.\185.\186.\187.\188.\189.\190.\191.\192.\193.\194.\195.\196.\197.\198.\199.\200.\201.\202.\203.\204.\205.\206.\207.\208.\209.\210.\211.\212.\213.\214.\215.\216.\217.\218.\219.\220.\221.\222\001\223\001\224\001\225\001\226\001\227\001\228\001\229\001\230\001\231\001\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253 -+BA8EAgAsAID/////MjMEMjU2NwMEFgUEBf//9BEAHP/NBAb/f0AA6iAEICEiIwQkJTon+vr6+vr6BPYGACQICQoQAgAAAQABEgMEBAUEBQYHBEAA6iDkHyEiIwQkJSYn+vr6+vr6+vr6+vr0BBIdLC0u9gQwMSgMBwRkAAAgBEQAIAQgISI= 0 -1 -+BGQEAgAsAP//8/QQHALNBAb/9P+AFgAEBf//9AAQHALNBAb/9POAIAAiI/r6BgX2BgAkAAABCGQKEAIgBDYl+vr6fwAAAAAEIAAiI/r6BgX2BgAkAAABCGQKEAIgBDYlJif5+/rZ+voE9gYAJAhkChACIAO9AAESGQQEBQQFAwb/fwB/AAAELS72p6enp6enp6enp6enp6cgBJKSkqlxkiAhIg== 0 -1 -+BA8EAgAsAID/////LzMEMjU2NwMEFgUEBf//9BEAHALNBAb/f0AA6iAEICEiIwQkJSYn+vr6+gYHBEAA6iAEICEiIwQkJSYn+vr6+vr6+vr6fwABAAAdLC0u9gQwMSgMBwRkAAAgBBwAIAQgISI= 0 -1 -+BA8EAgAsAID/////MjMEMjU2NwMEJAUAAAH/9BD+HALNBAb/f0AA6iAEICEiIwQkJSYn+voX+vr6BPYGIwQkJSYnABDa+vr6+vr6AAAAgBIdLC0u9gQwMSgMBwRkAAAgBEQAIAQgISI= 0 99 BA8EAgAsAID/////MjMEMjU2NwMEJAUAAAH/9BD+HALNBAb/f0AA6iAEICEiIwQkJSYn+voX+vr6BPYGIwQkJSYnABDa+vr6+vr6AAAAgBIdLC0u9gQwMSgMBwRkAAAgBEQA 306 \015\004\002\000.\000\128\255\255\255\25523\0042567\003\004\$\005\000\000\001\255\244\016\254\028\002\205\004\006\255\127\@\000\234\032\004\032!\"#\004\$%&.\250\250\023\250\250\250\004\246\006#\004\$%&'\000\016\218\250\250\250\250\250\250\000\000\000\128\018\029,-\.\246\00401\(\012.\004d\000\000\032\004D -+73//AO4D9YDuBPOA/0QgIAogChk= 8 -1 -+BA8EAgAsAARAAOogBAIhIiMEJCUmJ/r6+vr6+vr68QT2AQAAAQkKEAIgA70AARIDBAQFBOjMBwRAAOogBAIhIiMEJCUmJ/r6+gAAAfr6+vr6+vr69AT5HSw9LvYEMC8AAAAAAQAAIAZEACAEICEi 0 -1 -+BAABAgMEBAUGBwQICQocHR4fBCAhIiMEJCUsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaMgRcXV5fBGBhYmMEZGVmZwRoaWprBGxtHh8EICEiIwQkJSYnBCgpKgAAAS0uLwSAgYKDBISFhocEiImKiwSMi46PBJCRkpMElJWWlwSYmZqbBJydnp8EoKGiggSkpaanBKipqqsErK2urwSwsbI= 0 126 BAABAgMEBAUGBwQICQocHR4fBCAhIiMEJCUsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaMgRcXV5fBGBhYmMEZGVmZwRoaWprBGxtHh8EICEiIwQkJSYnBCgpKgAA 207 \000\001\002\003.\004\005\006\007.\008\009\010\028.\030\031\004\032!\"#\004\$%,-\./\0040123\0044567\00489:\;.<=>?.\@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ2.\\]^_.`abc.defg.hijk.lm\030\031.\032!\"#.\$%&'.\(\)*\000 -+BAABAgL8BAUGBwQICQoAAAEfBCAhIjMEJCUsLS4vBDAxMjMENDU2NwQ4OTo7BDw9BFRVVmYEWFlaWwRcAAACBGBhYmMMZGVmZwRoAAABaWprBGxtHh8EICEiIwQkJSYnBCgpKisELC0uLwSYs5qbBISdhocEiImKiwSMjY6PBJCRkpMElJWWlwSYs5qbBJydnp8EoKGiowSkpab//6jLqqsErK2urwSwsbI= 0 -1 -+Ig== 0 -1 -+AAABAAAEBAUGBwQICQocHR4fBCAhIiMEJCUsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtHh8EICEiIwQkJSYnBCgpKisELC0uLwSAgYKDBISFhocEiImBiwSMjY6PBJCRkpMElJWWlwSYmZqbBKOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8WL0= 0 1 AA== 2 . -+BAAcAgMEBAUGBwQICQocHR4fBCAhIiMEJDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 -1 -+ACA= 2 -1 -+BOgCFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFQUVFRUVFRUVFRUVFRUVFRUVFRQVFRUVFRUVFQAAARUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRU5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5FRUVFRUVFRUVFRU3FRUDAwMDAwMDAAABCfoD6AID8AID 0 -1 -+BOgCFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFfQVFRUVFRQV+RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRU2FRUVFRUVBQUFBQUFBRUVFS0VFX//FRUVFRUVFRUVFQX//wUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRX6FBUVFRUVFRUVFRUAAAEVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFREVFRUVBQUVFRUVFRUVFRUVFRUVFRUVFRUVFfoUFRUVFRUVFRUVFQAAARUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVERUVFRUFBQUFBQUFBQUFBQUFBQUFBQUFBQQsLS4vBAAAAQAAAQ== 0 -1 -+BOgCFRUVFRUVFRUVFQAAAS8AAAEEMDH5fwQMDRIPECICECIGLi8EMDEqMwQ0NTYiBgQICfl+/AwNEg8EKjMEBwcHBwcHB8XFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFhcXFxcXFxcXFxcXFxcXFxcXFxcXFxQAAAAHFyMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxQcHBwcHBykHBwcHBwcHBwcHBwcHBwcIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHMzMzGjszMzMzMzMzMzMzMzMHBwcHBwcHBwcHBwcHBxYHBwcOBwcHBwcHByEHBwcHBwcHBwcHBwX//wUHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwcHBwcHBwcCECIHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHAwcHBwcHBwIQIgIQIgYuLwAAAQQwMfl/BAwNEg8QIgIQIgYuLwQwMQMzBDQ1NiIGBAgJ+X8EDA0SDwQqMwQHBwcHBwcHxcXlxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcU3CCkqqwQsLS4vBDBBAgAAAQAfBAcHBwcHBwcHB+wGBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBweHBwcHBwcHBwcHBwcHBwcHBwcHcnJycnJycnJycnJycnJycnJycnJycldycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycgcHBwczMzMaOzMzMzMzMzMzMzMzMwcHBwcHBxYHBwcHBwcHBwcHBw4HBwcHBwcHIQcHBwcHBwcHBwcHBf//BQcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHAAAAZAcHBwIQIgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcDBwcHBwcHAhAiAhAiBi4vAAABBDAx+X8EDA0SDxAiAhAiBi4vBDAxKjMENDU2IgYECAn5fvwMDRIPBCozBAcHBwcHBwfFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcUAAAABxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFBwcHBwcHKQcHBwcHBwcHBwcHBwcHBwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcGBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcOBwcHBwczMzMaOzMzMzMzMzMzMzMzMwcHBwcHBwcHBwcHBwcHFgcHBw4HBwcHBwcHIQcHBwcHBwcHBwcHBf//BQcHBwcHBwcHBwcBBwcHIgcHFwcHBwcHBwcHBwcHBwIQIgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDQcXBwcHBwcDBwcHBwcHAhAiAhAiBi4vAAABBDAx+X8EDA0SDxAiAhAiBi4vBDAxAzMENDU2IgYECAn5fwQMDRIPBCozBAcHBwcHBwfFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxebFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXF//9//8XFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcUHBwcHBwcHBwcHB3JycnJycnJychYXMzMzMzMzMzMRMzMzMzMzM/9/EwQUERYXBBgkGhsEFB0CECIGBAgJ+X8EDCcSDwQQERITBEAAFhbogAAAGwQUHQAaMwQ0MX/+//8ICQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBygHBwcHIAAHBwcHBwcHBwcHBwcXBwcHBwcHBwcHB8XFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcW3xcXFxcXFxcXFxcXFxcXFxcXFxcXFxQcHBwc= 0 -1 -+BBwcHAwcHBwcHBw+9KgLAQEBQBwcHBwcwsI2Nv////82NjY2NjY2AAAAAQAjZyw2AAQ2NjY2Ngk2NjY2NIBYNgAQAcw2NjY0/zZLaUtLATa+dnZ2dh9GNjY2NjY2NjYAAAABABtn6gABbEsxS0tpS0sBNr52dnZ2H0Y1ADY2NgAANjYkNjY0LRAAATY2NjYZNjZPNjY2RzYkNk/pEIAAdnZ2dnZ2dv8LAED/NjY2NgAAAQABAAABAAEAgAAAATY2CjYJNjY2NjSAWDYAEAHMNjY2NP82S2lLSwE2vnZ2dnYfRjY2NjY2NjY2AAAAAQAbZ+oAAWxLMUtLaUtLATa+dnZ2dh9GNQA2NjYAADY2JDY2NC0QAAE2NjY2GTY2TzY2Nkc2JDZP6RCAAHZ2dnZ2dnY2AAHQ0JAABf//BRQ/NoABAAABWCs2NjY2//92VHaRdkBAQAAAAAAAAQAjZyw2AAQ2NjY2Ngk2NjYyNIAAAQAb 0 -1 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfAhBAAgQgKRcjBAQkAAACAEACEAACEEACECICECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGBQdHh8mNSkiGQQkJAAAAg5AAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQAAA= 0 206 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfAhBAAgQgKRcjBAQkAAACAEACEAACEEACECICECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGBQdHh8mNSkiGQQkJAAAAg5AAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQAAA= 626 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\016\@.\004\032.\023#\004\004\$\000\000\002\000\@\002\016\000\002\016\@\002\016\"\002\016\"\002\016\"\006\004\008\009\255\127\004\012\013\018\015\004\016\008\018\019.\001\021\022\023.\024\020\029\030.&5\)\"\025\004\$\$\000\000\002\014\@\002\016\"\002\016\@\002\016\"\002\016\"\002\016\@\002\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\000 -+AgAAAuZAAhAiAhBAAhAiAhAiBgQICf9/BAwNAAABEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBAAABQAAAEACECQB8kACECIC8iEGBBAiAhBAAhAiAhAff////yMEByQAAAIAAAABQO0PAAIQQAIQDwIQImAQIh4ECAn/AR8mNSkiGQQkJAAAgiJAZBAiAhAAAAEigBACEAIQIgAAAgBAAhAAAA== 0 64 AgAAAuZAAhAiAhBAAhAiAhAiBgQICf9/BAwNAAABEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBAAABQAAAA== 202 \000\000.\230\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\000\000\001\018\015\004\016\008\018\019\004.\021.\023\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\000\000\005\000\000 -+BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUBJiZmpsEnJ2enwSgoaKjBKSlpqcEqKmqq1RVVldYWZWWlwSYmZqbBJydnp8EoKGiowSkpaanBKipqqtUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH0Afg== 0 -1 -+EgEABIAQABABAIOKAAAB6mtsAaurqwHqa2xtbauri6ChoqMAAAABPVxNP0ABAAEsBf//BQABT20AHgFo6OpzbG2rq6uJb3BxZBZ+ 0 -1 -+AQAAAIMFhIWGhweaiYqLBIyNjo7ykKcAgP//hpaDBISFhocEATY2NjY0hiABADY2NiMAgAAAAAABNjY2NjY2NjZ+AAAAAAAhHxtn6gABbEt2AAAAQBgzNjYAADY2JDY2NP9/ATY2NjY2FTYVTzYAQDY2JACAAAyAGQB2dnZ0dn//Yv8AAAE2NjY0Nt3d3d3d3d0AAAHd3cfd3d3d3d3diosEpI0AIAEAAQB4AAABNjYK3d3d3d3d3d3d3d3d3f3H3cft3d3d3d3diisEpI2PBJCnAID//4aWgwSEhYaHBIiOjwAAAbMgABYWFhYWFgAAARY2fXZ2dgAAAQAb 0 3 AQAA 5 \000 -+BICBgoMEhIWGhwSHiYqLBIyNjo8EkJGSkwQAAAGXBJiZmpsEnJ02AAAAAAsBZxU2AAQ2GjYAAQltbW1tbW1tbW1tbW1tbTY2NjY0gFg2ABABNjY2l5sEnJ02AAAAAAABZxU2AAQ2GjY2NgSYmZqbBJydNgAAAAAAAWcVNgA2NP82NjY2AAAA3gM/NjY2NjY2NjY2NjY2AAAAAQAbZ+oACmxLS0tLaUtLATa+dnaSdh9GFAA2AAABNjT/fzY2NjY2NhVDNk82ABAAACQ2Nv//gAB2dmX///9//wsAAAEiQP82NjYAAAFnFTY0NgHQ0NAz0NDi0NC9EAAA+y0UFAB2AAHQ0JAAABQUZAAAAIABAAABWCs2NjY2NnZ2dnZ2dkABAAAAAAEAGw== 0 41 BICBgoMEhIWGhwSHiYqLBIyNjo8EkJGSkwQAAAGXBJiZmpsEnJ02AAA= 133 \128\129\130\131.\132\133\134\135.\135\137\138\139.\140\141\142\143.\144\145\146\147.\000\000\001\151.\152\153\154\155.\156\1576\000 -+BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ02AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADe/3//NjY2NjY2NjYVNjY2NjYAAAABABtqampqbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2BAAVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/LDY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY3gAEAAAFYKzY2NjY2dnZ2dnZ2QAAAAAAAAQAb 237 1 AA== 2 . -+BGQDAwgINjZWNhU2NgE2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIiIiLyIiIi8EMBQyMwQ0NTY3BDg5LTsEPD0+PwA= 0 -1 -+AAEAAQ== 0 1 AA== 2 . -+BOgDAwgINjZWNhU2NgE2NjY2NjY2NjY2NjY2UjY2AzY2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIjYAAEVkNgAANjY2NjY2NgABQDY2NjYyNjYjQzb/fxN1Njb8NjaeQjwAIVkTNjY2Nfs2NjaeNFnkGDITNjY2NjbvHDf/fzY2NgAAAf///382VzY2NgA2NjY2NjY2NjY2NjY2BQAANjb/////NgAAAFw2f////zY2NjE2NjY2//82/382NjYAAAH///9/ZAABNjY2NjY2Np5eXl4RATYAAEVkNgAANjY2NjY2NgABQDY2NgABNg== 0 236 BOgDAwgINjZWNhU2NgE2NjY2NjY2NjY2NjY2UjY2AzY2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIjYAAEVkNgAANjY2NjY2NgABQDY2NjYyNjYjQzb/fxN1Njb8NjaeQjwAIVkTNjY2Nfs2NjaeNFnkGDITNjY2NjbvHDf/fzY2NgAAAf///382VzY2NgA2NjY2NjY2NjY2NjY2BQAANjb/////NgAAAFw2f////zY2NjE2NjY2//82/382NjYAAAH///9/ZAABNjY2NjY2Np5eXl4RATYAAEVkNgAANjY2NjY2NgABQDY2NgA= 460 \232\003\003\008.66V6\02166\001.666666666666R66\0036666666666%6I66666666666\"\"\"6\000\000Ed6\000\000666.666\000\001\@6666266#C6\255\127\019u66\25266\158B<\000!Y\0196665\251666\1584Y\228\0242\01966666\239\028.\255\127666\000\000\001\255\255\255\1276W666\0006666666666666\005\000\00066\255\255\255\2556\000\000\000\\6\127\255\255\25566616.66\255\2556\255\127666\000\000\001\255\255\255\127d\000\0016666666\158^^^\017\0016\000\000Ed6\000\0006666666\000\001\@666 -+ATY= 0 -1 -+BOgDAwgINjZWAAABNgE2NjY2NjY2NjY2NjY2UjY2AzY2NjY2NjY2NjYlNkk2NjY2Ni02PTY2NiIiIjYAAEVkNgAANjY2NjY2NgABQDY2NjYyNjYjQzb/fxN1Njb8NjaeQgAAATwAIVkTNjY2Nfs2NjaeNFnkGDITNjY2Izb/HDf/f1Q2NgAAAQAAF4AA/382VzY2NgA2NjY2NjY2NjY2NjY2AAAANmT/////FgAAAQAANjb/////NgAAAFw2f////zY2NjE2NjY2//82//9/ZAABNjY2NjY2Np5eXl4RATYAADY2NjY2NjY2NlI2NgM2NjY2NjY2NjY2JTZJNjY2NjYAAAE2NjYiIiI2AABFZDYAADY2NjY2NjYAAUA2NjY2MjY2I0M2/38TdTY2/DY2nkIAAAE8ACFZEzY2NjX7NjY2njRZ5BgyEzY2NjY2/xw3/382NjYAAAEAAAGAAP9/Nlc2NjYANjY2NjY2NjY2NjY2NgAAADY2/////wAAAAEAADY2/////zYAAABcNn////82NjYxNjY2NjY2NgABQDY2NgABNg== 0 -1 -+BAFXAAIEAg== 2 -1 -+BOgDAwgINjZWNhU2NgE2NjY2NjY2NjY2NjY2UjY2EzY2NjY2NjY2NjYlNkk2NjY2NjY2NjY2NiIiIiIiIkAiNugDNjY2NjY2NjY2NjZDNjY2NpiYmDY2NjYiICIiIiIiIiIiIiIiIiJJNjY2NjY2NjY2NjYiIiIiIiJAIjboAzYiIiIiIiIiIiIiIiI2NjY2JzY2NjZkZAAANjY2NjY2NjY2NjYiIiIiIiJAIjboAzYiIiIiIiIiIiIiIgA2NjY2TV8EYGFiYwRkZWZnBGhpamsEbG0eNgQgISIjBCQlJicEKCkqKwQsLS4vBICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaIAAA== 0 -1 -+7I2NjY2NjY2NjY2NjQACjY2NjY2NjY2NjY2NjY2NjY2NAAKNjY2NjY2NjY6NjY2NjY2NjY2Nm42NjY2NjY2NjY2NjWyNjY2NjY2kjY2NjY2NjY2NjTY2NjY2PQAAATY2RDY2U1I2NgAAAQM2NjY2Nvc2dnbQKjYQTfgFACEANzI2OekAABA2NjY2EABxGwAAATY2AAABAHZ2dnZ29g== 0 -1 -+BOgAATY2NjY2fwDiNjY2NjY2NjY2NgAAATY2NjY2NjYmNjb/ADY2NjY2AwAAAQT9BQcICXx8fHx8fHx8AAABAHx8fHx8IAB8 0 61 BOgAATY2NjY2fwDiNjY2NjY2NjY2NgAAATY2NjY2NjYmNjb/ADY2NjY2AwAAAQT9BQcICXx8fHx8fHx8AA== 123 \232\000\0016.666\127\000\2266666666666\000\000\0016666666&66\255\00066666\003\000\000\001\004\253\005\007\008\009|||||||| -+wMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNgAQwMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABPjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjY2Nk02NlEAEQEANjYABf//BUU2OTY2NiU9PT09NgAAAV8//3Y2AAABNjY0NgAAAYA2PRAANjYAAAABADY0NjYyNjY2NjYAEDY2S0tLQAAAAUsBNr4fRhTAHzY2fuzs7OwQFBQMNjY2AAABNjY2Nlg2NjY2TTY2UQARAQA2NgAF//8FRTY5NjY2JT09PT02AAABXz//djYAAAE2NjQ2AAABgDY9EAD7+/v76fv7+////w== 16 -1 -+wMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUX/gDY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjYkNk02f/8AEQEANjYABf//BUU2OTY2NiU9PT09NgAAAfI//3Y2AAgBNjY0NgAAAYA2PRAA+/v7+/v7+/v///8= 16 -1 -+BAABAgMEBAUGBwQICQoLBBINDg8EEBESEwQUFRYXBBgZGhsEHB0eNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMTBMTExNqEykTlhMTEyYLAAEUFAAABjY2NjYAAAE2NhwAAAABAAABBDb/fwAAAzYAAQX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0pjY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/QM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/AAABNn////8= 0 -1 -+xcXFxcXFxcXFxcXFxcXFxcXFxcXFxRDAwExMaExMTExMHzY7TTY2JBU2NDY2MjY2NjY2AxA2NktLS0tLwDY2NjYAABrAHzY2MzYQAN4HBzc2ATY2AxA2NktLS0tLwDY2NjYAABrAHzY2NjY2NjYWvh8AAAFGFDA2NjYAADY2WDZ2PDY2NjY2ADY2NjY2NjYAAAE2NjY2NgMQNjZLS0tLS8A2NjY2AAAawB82NjY2NgCAAAA2NjYuLi4uLi4uLi4hLi4uLi4uLi4uLi4uLi4uNjY2NjY2NjY2ozY2NjZENiU2njY2NjY2NjY2NjY2NjY2FzY2NgAA 197 48 Li4uLi4uLi4uLjY2NjY2NjY2NqM2NjY2RDYlNp42NjY2NjY2NjY2NjY2Nhc2NjYA 65 \.\.\.\.\.\.\.\.\.666666666\1636666D6%6\15866666666666666\023666 -+ASY= 0 -1 -+AAEAIA== 0 1 AA== 2 . -+BBABggMEBAAABBABggMEBAUG6wQICQoLBAxuBBQtLiBQMwQzNVEENDUpNwQ4ADkEMDFQKhcELC0uIAQwMVAzBAQzNTY0NQ== 0 -1 -+AAAAGxsfGxv51ED/ACBk/vYbGxsbGxsbWRsbBQAbGxwbEAAAAAEb/QEAgACYAAEbGxsbGxtAG9EbJhsbAAAAGwMbJhsbAAAABwAg0rBpaWlpaWlpaWlpaWJpaWlpaQAAAAAAAQAAHSmJGw== 27 -1 -+AACrq6r/7Q== 0 1 AA== 2 . -+BAABAgLgAeEBgADjAeQB6QHqAesB8wH0AfUB9gH3AfgB+QH6AfsB/AEaAv4= 0 -1 -+/38AAAEAAAHj/CGaygAEAAA= 0 -1 -+BAABAgICAgICAgICLhwEMDEzAiMEABD/BCEiI1UNDg8GBA81/QQUIyT6AAD6LgAAAANAAAAALi4uLi4uLk8uLi4uLi4uLiMAAAIAAA4= 0 -1 -+BAABAgICAgICAgICLhwEMDEyMwICAgICAgQUFRYXAgICAgICAnWAAAAABCIjBACQ/wQhIiNVDQ4PBgQPCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoSEwQUIyT6AAD6LgAAAANAAAAALi4uLi48Lk8uLi4uLi4uLiMAAAIAAA4= 0 40 BAABAgICAgICAgICLhwEMDEyMwICAgICAgQUFRYXAgICAgICAnWAAA== 106 \000\001\002\002.\002\002.\002\002.\.\028.0123.\002\002.\002\002.\020\021\022\023.\002\002.\002\002.u\128 -+BAABAgICAgICAgICLhwEMDEyMwIGBgYGBgYkBgICAgICBBQVFhcCAgICAgICdSMEDQAEIgAAARD/BCEiI1UNDg8GBA8SEwQDIyT6AAD6LgAAAANAAAAALi4uLi4uLk8uLi4uLi4uLiMAAAIAAA4= 0 77 BAABAgICAgICAgICLhwEMDEyMwIGBgYGBgYkBgICAgICBBQVFhcCAgICAgICdSMEDQAEIgAAARD/BCEiI1UNDg8GBA8SEwQDIyT6AAA= 228 \000\001\002\002.\002\002.\002\002.\.\028.0123.\006\006.\006\006\006\$\006\002.\002\002.\004\020.\022\023\002\002\002\002\002\002\002u#\004\013\000\004\"\000\000\001\016\255.!\"#U.\014\015\006\004\015\018\019\004\003#\$\250\000 -+d3gXBf//BUcQp0CAAAABfx4= 2 -1 -+ZAABAgICAgICZS3RA3d3dwdleGFtcIhlA2NvbQAAAQABwAw= 0 -1 -+Af8= 0 -1 -+BAABAgICAgICAgICLhwEMDEyMwICAgICAgICAgICAgICAgICAgICAgICAgICLhwEMDEyMwQ0NXYBdwF4AXkBegF7AXwBfQF+ATZuAW8BcAFxAXIBcwF0AXUBdgF3Af8BeQF6AXsBfAF9AX4BfwA= 0 110 BAABAgICAgICAgICLhwEMDEyMwICAgICAgICAgICAgICAgICAgICAgICAgICLhwEMDEyMwQ0NXYBdwF4AXkBegF7AXwBfQF+ATZuAW8BcAFxAXIBcwF0AXUBdgF3Af8BeQF6AXsBfAF9AX4BfwA= 228 \000\001\002\002.\002\002.\002\002.\.\028.0123.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\002.\002\..\0040123\00445v\001w\001x\001y\001z\001{\001|\001}\001~\0016n.o.p.q.r.s.t.u.v.w.\255.y.z.{.|.}.~.\127 -+BAABAAABAwgINjY2NgAAAMAfNjZkAAAAAAEAFPY2HjY2NPoAAPoABAEAAAE2NgAAATb7IPvz+/sAAAFCAAABRDYkDzI0NjY2NjY2NjYAAAABNlg2Nv9/NjY2NgAAAQA2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2/zY+NjY2NjYAADYA/wA2DAEAAQH0wB82NjY2 0 -1 -+ABAAFwMfExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4BPw== 0 1 AA== 2 . -+hBABAgMAAAERCf//hBABAgMsARAAAAFkCQsADwAQANRMAACEMAECAwAAAAABHQEBKUIK 0 -1 -+AAFAAGQpCgo= 0 1 AA== 2 . -+BBABAAABf/8BCQEBAQACENQBAQEBAQEBAQEBAWQBAAEBAgEBAQEBKSkp 0 -1 -+BBABAgMsLUcBCQEBAQACENQBAQEBAQEBAQEBAWQBAAEBAgEkAQEBKSkp 0 -1 -+BBABAgMsLS4A/zA0MvoAAPo2NwQ4PD03PwAEJwRZWVlZWVlZWVlZGwABHR4fBCA2IiMEJCUmJwQoKQACEu4rLS4v9y+ysn8ENDU2NwQ4ORUWFwQgISIjBCSyBDQ1Nh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dDx0dHR0dHR0dHR0dHR0FHR0dHR0dHR0dHR0dHR0dFR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0UHR0dHR0dHR0dHQAAAR0BAwAAAQT9BQcICXy0BDB8fHx8AAABAHx8fHx8IAB8 0 222 BBABAgMsLS4A/zA0MvoAAPo2NwQ4PD03PwAEJwRZWVlZWVlZWVlZGwABHR4fBCA2IiMEJCUmJwQoKQACEu4rLS4v9y+ysn8ENDU2NwQ4ORUWFwQgISIjBCSyBDQ1Nh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQAAAR0dHR0dHR0dHR0dHR0+HR0dHR0dHR0dDx0dHR0dHR0dHR0dHR0FHR0dHR0dHR0dHR0dHR0dFR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0UHR0dHR0dHR0dHQAAAR0BAwAA 709 \016\001\002\003.-\.\000\255042\250\000\000\25067\0048<=7?\000\004'\004YYYYYYYYYY\027\000\001\029\030\031\004\0326\"#.\$%&'.\(\)\000\002.\238+-\./\247/\178\178\127\0044567\00489.\022\023\004\032!\"#\004\$\178\004456\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\000\000\001\029\029\029\029\029\029\029\029\029\029.\029\029>\029\029\029\029\029\029\029\029\029\015\029\029\029\029\029\029\029\029\029\029\029\029\029\005\029\029.\029\029\029\029\029\029\029\029\029\029\029\029\021\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029.\029\029\029\029\029\029\029\029\029\029\029\020\029\029\029\029\029\029\029\029\029\029\000\000\001\029\001\003\000 -+4BABAgMsLTw9Nz8ABCcWFwQYGRobBBwdHh8EICEiIwA= 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDgICAgICAicEKCkqqwQsLS4vBDACAi0uLwQwAgICAgICEAICAgICBCgpKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/AA== 0 -1 -+BAABAgMEBAUGBwQICQoLBAwNDgICAgICAicEKCkqKwQsLS4vBDACAgICAgICAgABADY2JzY2NjQ2WDY2NoAAAAA2AAABNjY2AAAAAMAfNjY2NjYkFTY0NjY2NjY2NjY2NjY2NjYAAAABBDY2NjY2NjY2NjY2NjYAAAABABtLbEtLS0tLS0sBAAABRhQ2gDY2NjY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2dnZ2dnZ2AXZBNgE2HgQAQP82NjY2NDYAAAEAAAGANhkWNjY20NDQ0NDQ0NDQM9DQ0NDQ0NDQ0NDQkNAAFBQUFDY2NjY2NjZYNjY2Nk02NlEAEQEAAAEjNjZFNjk2NjYlPT09VDYAQP82NjY2NDYAAAGANj0QAPsAAAH7AAAAZPv7+/sg+/v7+0JEAAABNgsLCwsLCwsLCwsLCwsLCwuYCwsLCwsLCwsLCws= 0 -1 -+AQLAAA== 0 -1 -+BAABAgMEBAUGBwQEDA2ADwQQBBgZGhsEHB0hIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFRkcESElKSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EYGFiYwRkZWZnBGhpamsEbG1ubwRwcXJzBHR1dncEeHl6ewR8fX5/BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaKjBKSlpqcAAAGqqwSsra6vBLCxsrME 0 195 BAABAgMEBAUGBwQEDA2ADwQQBBgZGhsEHB0hIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+PwRAQUJDBERFRkcESElKSwRMTU5PBFBRUlMEVFVWVwRYWVpbBFxdXl8EYGFiYwRkZWZnBGhpamsEbG1ubwRwcXJzBHR1dncEeHl6ewR8fX5/BICBgoMEhIWGhwSIiYqLBIyNjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaKjBKSlpqcA 415 \000\001\002\003.\004\005\006\007.\004\012\013\128.\004\016\004\024\025\026\027\004\028\029!\"#\004\$.&'\004\(\)*+\004,-\./\0040123\0044567\00489:\;\004<=>?\004\@ABC.DEFG.HIJK.LMNO.PQRS.TUVW.XYZ[.\\]^_.`abc.defg.hijk.lmno.pqrs.tuvw.xyz{.|}~\127.\128\129\130\131.\132\133\134\135.\136\137\138\139.\140\141\142\143.\144\145\146\147.\148\149\150\151.\152\153\154\155.\156\157\158\159.\160\161\162\163.\164\165\166\167 -+GxsAAAEbGxsbGxsbGxsbAxsbGxsbGxsbGxsYIBsbGxsbGxs2GxsbGxsbGxsbCxsbGxsbGxsbGxsbFRsbGxsbGxubGxs3GxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsUGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx8DGxsbGxsbAAEbGxsbGxsAAAHqGxsa+gAbGxsbGxsbGxsXGxsbGxsbG4AbGxsbGxsbGxsbGxsbGxsbGxsbGxv7GxsbGxsbGxsbGxsbGxsbGxsbGxs0G/waGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbJh8bGxsEGxsbGxsbGzEbGxsbAPoAAPo= 155 -1 -+BBgfKgAA 0 6 BBgfKgAA 14 \024\031*\000 -+wMAAAAABAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2MzYAEDY2S0tLABBQNktLS0tLATY2/+I2Nlg2djw2NjYAAAE2KQAAAf+ANjY2PDY2MRU2BLMF9AAB//8FRTYAEDY2S0tLQAAAAUsQNr4fRhTAHzY2fuwAAAHsrOwQAAABJBQMNjYAABAANjY2LVg2NjY2NiQVNjQ2NjI2NkMzNgAQNjZLS0s2JUU2HzM2ABA2NktLS0tLARu+H0YUNgABgDY9ARa+H0YUNjYQAPv7+/v7+/v7//8b 16 1 AA== 2 . -+wMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjY2Nk02NlEAEQEANjYABf//BUU2OTY2NiU9PT09NgAAAfJAFXaANj0QAPv7+/v7+/v7//// 16 -1 -+wMAAAcDAwMDANjY2NgAAGtgfNjY8NjYkFTY0NgAAAGQ2NjYAEDY2S0tLS0sBFr4fADaiNjY2NjYF//8FRTY5Nj42JT09PQE2NjYAAAABADY0NncyNjY2NjYAEDY2S0tLQAAAAUsBNr4fRhTAHzY2QOzs7OwQFBQMNjYQAAABNjY2Nlg2NjY2TTY2UQARAQA2NgAF//8FRTY5NjYqJT09PT02AAAB8j//djYAAAE2NjQ2AAABgDY9EAD7+/v7+/v7+////w== 16 -1 -+wMAAAcDAwMA2JBU2NDY2MjY2NjY2ABA2NjY2NjYAADY2WDZ2PDY2NjZLS0tLSwEWvh9GFDZFNjYAADY2WDZ2PDY2NjY2AAABAAE2NjY8NjYkFTYEszaiNjY9NjYF//8FRTY5Nj42JT09PQE2NjYAAAABADY0NjYyNjY2NjYAECc2S0tLQAAAAUsBNr4fRhTAHzY2fuzs7OwQFDY2Nlg2JDY2TTY2UQARAQA2NgAF//8FRTY5NjY2JT09PT02AAAB8j//djYAAAE2NjQ2AAABgDY9EAAAAAH7+/v7+/v7+////w== 16 -1 -+wMAAAcDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ogAENgAQAAD/BWM2OTY+NCU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YQwB82Nn7s7OzsEBQUDDY2NgAAATY2NjZYNjY2Nk02NlEAEQEANjb4Bf//BUU2OTY2NiVEPT09NgAAAfI//3Y2AAABNjY0NgAAAYA2PRAA+/v7+/oAAPr///8= 16 2 NjY2NgAQNjZLS0tLSwEWvh9GFDY2NjYAADY2WDZ2PDY2NjY2AAABAAE2NjY8NjYkFTYEszaiAAQ2ABAAAA== 127 666\000\01666KKKKK\001\022\190\031F\0206666\000\00066X6v<66666\000\000\001\000\001666<66\$\0216\004\1796\162\000.6\000\016\000 -+wMDzAMDAwMDANjY2NgAAGsAfNjY8NjYkFTY0NjYyNjY2NjYAEDY2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2NgAAAQABNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7Ow9PT09NgAAAewQFBQMNjY2AAABNjY2Nlg2NjY2TTY2UQARAQA2NgAF//8FRTY5NjY2JT09PT02AAAB8j//djYAAAE2GjQ2AAABgDY9EAD7+/v7+/v7+/9k/w== 16 -1 -+wMAAAcDAwMDANjY2NgA2S0tLS0sBFr4fRhQ2NjY2AAA2Nlg2djw2NjY2BLM2ojY2Bf//BUU4OTY+NiU9PT0BNjY2AAAAAQAuNDY2YjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Nn7s7OzsEBQUDDY2NgAAATQ2NjZYNjY2Nk02NlEAEQEANugDBf//BUU2OTY2NiU9PT09NgAAAfI//3ZCAAABNjY0NjY2NgAAAYA2PRAA+/v7+/v7+/v/ABA= 16 -1 -+wMAAAcDAwMDANjYEHB0eHwQgISIjBCQlJicAKCkqKwQsLS4vBAkJCQkJCQkJCQkJAAABCQkJCQkJCQkJCQkJCTAxMjP+MzU2NwQ4OTo7BDw9 16 11 BCAhIiMEJCUmJwA= 15 \032!\"#.\$%&' -+AX8= 0 -1 -+AQ== 1 -1 -+wMAAAcDAwMDANjY2NgAbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbwxsbGxsbGxsbGxsbGxsbGxsCGxsbGxsbGxsbGxsbGxsbGxsVGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxkbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbAxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGyYbEBsbGxsbGxsbGxsbGxsbGxsb 16 -1 -+wMAAAQAAAcYEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYX6hcZGhsEHB0eBwcHBwcHBwcHB/cHBwcHBwcHBwcfBCAhIvIAASMEJCUmEAQoKSorBCwtLi8AMA== 16 53 CgsEDA0ODwQQERITBBQVFhfqFxkaGwQcHR4HBwcHBwcHBwcH9wcHBwcHBwcHBx8EICEi8gA= 188 \011\004\012\013\014\015\004\016\017\018.\004\020\021\022\023\234\023\025\026\027\004\028\029\030\007\007\007\007\007.\007\007\007\007\247\007\007.\007\007\007\007\007\007\031.\032!\"\242 -+AgAfBCApIiMEJCTrJwQIKSqrBCwtLi8EMEECAB8EBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwYHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBzMzMxo7MzMzMzMzMzMzMzMzBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHAhAiBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwcHBwcHBwcCECICECIGLi8AAAEEMDH5fwQMDRIPECICECIGLi8EMDEqMwQ0NTYiBgQICfl/BAwNEg8EKjMEBwcHBwcHBwcHBwcHBwcHBxAREhMEFBESQAABFhczMzMzMzMzMxEzMzMzMzMz/38TBBQRFhcEGCQaGwQUHQIQIgYECAn5fwQMJxIPBBAREhMEQAAWFuiAAAAbBBQdABAzBDQxf/7//wgJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcOBwcHBwcHByEHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwcHBwcHBwcHBwd/AAQkNB0CECICEEACECICECISQAABFhcEGBkaGwQUHSAfADMzMw== 0 -1 -+AAEAEP8AAQD3 0 1 AA== 2 . -+AegDCAg2HzY2AAAAwB82NjY2NiQVNjQ2NjY2NjY2NgAQNgAAATY2NjY2NjY2AAABAAE2NjZFNjYVNgAENjY2NjY2JzY2NjQ2WDY2NjY2NjY2AAABNjY2AAAAAMAfNjbj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+M2NjYkFTY0NjY2NjY2NjY2NjY2NjYAAAABBDY2NjY2NjY2NjY2NjYAAAABABtLbEtLS0tLS0sBAAABRhQ2gDY2AAA2NiQ2NjQ2NjY2NjY2NjY2NjY2NjY2NiQ2Nn92dnZ2dnZ2dnZ2dnZ2dnZBNgE2HgQAQP82NjY2NDYAAAEAAAGANhkWNjY20NDQ0NDQ0NDQM9DQ0NDQ0NDQ0NDQkNAAFBQUFDY2NjY2NjZYNjY2Nk02NlEAEQEAAAEjNjZFNjk2NjYlPT09VDYAQP82NjY2NDYAAAGANj0QAPv7+/v7+/v7+/sg+/v7+0JEAAABNgsLCwsLCwsLCwsLCwsLCws= 0 -1 -+Bf//BcDAwMDANjY2NgAAVwECAVcBAQIBVwEBAQECAVcAAA== 16 17 AQIBVwEBAgFXAQEBAQIBVwA= 34 \002.W.\001.\001W.\001.\001.\001W -+BAABAgMEBAUGBwSICQoLBAwA//wNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIj538lRicEKCkqKwQsLS4vBDAxMjMENDU2PgQ4OTo7BDwQPj8A 0 -1 -+BAABAgMEBAUSEwQUFRYXBBgZGhsEHB0eOQQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw8Pj8A 0 66 BAABAgMEBAUSEwQUFRYXBBgZGhsEHB0eOQQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw8Pj8A 131 \000\001\002\003.\004\005\018\019.\020\021\022\023.\024\025\026\027.\028\029\0309.\032!\"#.\$%&'.\(\)*+.,-\./.0123.4567.89:\;.<<>? -+NwAAAAABAQQdIh8EICEiI/8QJSYnBCgpA+j4LBvrGx0eHwQgISKGBKQlJicEKP8qKwAAG4aGhgAQhoaGhoaGhoaGIh8EIICGhoY4PT5SAA== 0 -1 -+AAABAgMEBAXrBgQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8A 0 1 AA== 2 . -+AAEBAgMEBAUGBwQICQoLBAwNBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEAgKSIjBAQkAAACAEACAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYOhobBBQdHh8mNSkiGQQkJAAAAg5AAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQAAA= 0 1 AA== 2 . -+BAABAAABBAUGDQYECAn/fwAAARIPEBAJCgsEfwAAABMEByAACQoLBGQNEgkQEAgSEwQBFRYXBBg6Gv9/Hx0eHw01KSIZBCQkAAD/AEACECICEEACECLzDyIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAJkAAIQQAL+AgAQywIQIgYECAn/fyQkAAAAAAECDkACQCIAAAECEEACJiIBBCQkAAACAEACECJTENQCECICEAAA 0 -1 -+5f8AAgAAAAEEBAX/ZAAICQoL5AwNBgQIgAAAAA38DgQQCBIZBCQcAAAAAUACEP9kAAgJECLtECL/D///AhBAAhAiAhAtBCApIiPpEgAAAAABAAIAQAAAAQJkAAIQCAAAEAAFACkJ/wL/fxcKGOoAAToa/wIcJ/R6enp6enp6enp6enp6enp6enp6enp6AAECA+gAAIACECICEAAA 0 -1 -+A9YBAgMmAAABBwQIGQoACwQMCxQMDQ4AAAAA 0 -1 -+lJWWogwA6P8A 0 -1 -+wMAAAQBkn8CiNjY2NgAAGsAfNjY8yQAhEAACCSICAgIQIgIQQAA= 16 2 AhAiAhBAAA== 14 \016\".\016\@ -+3g== 0 -1 -+AQ== 0 -1 -+AgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQAQIBVwEBAhBiAgAAAhAiAVcBAgFXAQECAVcBAQEBAgFXAAAB 0 64 AgAAAhBiAgAAAhAiAQECAVcBAQIBVwIQYgIAAAIQAQIBVwEBAhBiAgAAAhAiAVcBAgFXAQECAVcBAQEBAgFXAA== 146 \000\000.\016b.\000\000.\016\".\001.\001W.\001.\001W.\016b.\000\000.\016\001.\001W.\001.\016b.\000\000.\016\".W.\002.W.\001.\001W.\001.\001.\001W -+AQABAwEJAQoYARkBGmwbARwHGgEeAc0BAAAB0AAAA+gB01NTAZ8= 0 -1 -+wMAAAcD/AMAbAgICAgICAgIAAgICAgABAAA= 16 7 AgACAgICAA== 18 \000\002.\002\002 -+BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAATb7IAAAAfsAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTY2FTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NjYAADYAAPs2DAEAAAH0ATY2Njw2NiQVNgSzNqI2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjY2NgAQNjZLS0tAAAABSwE2vh9GFMAfNi5+7Ozs7AAAAezs7BQ2NjY2AAAAAAE2NjQ2GTZBNj42LTY2NjY2TtDQ0ID///8UFBQ2NjU2NkM2WDY2NjZNNjZRABEBAA== 0 -1 -+BDY2KwAAAMAfNjZkAAAAAAAAFHY2HjY2NDYMAAEABAEAAAE2NgAAATb7IPvz+/sAAUsBNr4fRhTAHzYufuzs7OwAAAHs7OwUNgABQkQ2JA8yNDY2NjY2NjY2ABA2Nj1YNjY2NjY2NjYAAAEAATY2NkU2EzY2HDQ2WAAgNjb/Nj42NjY2NgAANgAA+zYMAQAA8PMBNjY2PDY2JBU2BLM2ojY2NjY2Bf//BUU2OTY+NiU9PT0BNjY2AOj/AAAyNDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAg+/P7+wAAAUJENiQPMjQ2NjY2SDY2AAE2NjQ2NjZRQzZYNjY2Nk02NlEAEQEA 0 6 BDY2KwAA 8 66+\000 -+BOgANvsE+/vZ+wAAAX////8AMjQ2DjY2NjY2NgAAAID//wEAWCD7T1ZYEzY2NjY2NjYAAAEAATY2NkU2NhU21dXn1dXVINXV1dXV1dXV1dXV1RDV1dXL1dXV1dUABDk2NgAAAv///4c2PjY2NlY2AAAfRhTAHwAAA+g2PDY2fuzs7OwVAAAAADY2UQAR9gA= 0 11 BOgANvsE+/vZ+wA= 31 \232\0006\251.\251\251\217\251 -+BOgAAAEDAwgINjYxNgD/5MApIPvz+wAAAQFCRDYkHjY2NDYMAAE2NjY2NjYAEDY2Nlj7IPvz+/sAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2EzY2NjY2NgAcAQABNjY2RTY2FTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NugDADYAAPs2DAEAAAH0ATY2NjwpNiQVNgSzG6I2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjYfNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAAezs7BQ2NjY2AAAAAAE2NjY2QzZYNjY2Nk02NlEAEQEA 0 202 BOgAAAEDAwgINjYxNgD/5MApIPvz+wAAAQFCRDYkHjY2NDYMAAE2NjY2NjYAEDY2Nlj7IPvz+/sAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2EzY2NjY2NgAcAQABNjY2RTY2FTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NugDADYAAPs2DAEAAAH0ATY2NjwpNiQVNgSzG6I2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjYfNjZkAAAAAA== 455 \232\000\000\001.\003\008\008.616\000\255\228\192\)\032\251\243\251\000\000\001\001BD6\$\0306646\012\000\001666666\000\016666X\251\032\251\243\251\251\000\000\001BD6\$\015.466666666\000\016666X6\019666666\000\028\001\000\001666E66\0216\000\004966\000\000\001666666.46X\000\03266\2556>6666\232\003\0006\000\000\2516\012\001\000\000\001\244.6.6<\)6\$\0216\004\179\027\16266666\005\255\255\005E696>6%===\001666\000\000\000\001\00064662666\03166d\000\000\000 -+BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAE2vh9GFMAfNi5+7AAAAezs7AAAAezs7BQ2NgEAFAEAJA8yNDY2NjY2NjY2ABA2NjZYNvQBNjY2PDY2JBU2BLM2ojY2NgAAATY2Bf//BUU2OTY+NiU9PT0BNjY2AAAAAQA2NDY2MjY2NjY2ABA2NktLS0AAAAFLATa+H0YUwB82Ln7s7OzsAAAB7OzsFDY2NjYAAAAAATY2NDY2NkE2PjY2NjY2NjZO0DZRABEBAA== 0 120 BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAE2vh9GFMAfNi5+7AAAAezs7AAAAezs7BQ2NgEAFAEAJA8yNDY2NjY2NjY2ABA2NjZYNvQBNjY2PDY2JBU2BLM2ojY2NgAAATY2Bf//BUU2OTY+NiU9PT0BNjY2AAAA 302 \232\000\000\001.\003\008\008.666\000\000\000\192\03166d\000\000\000\000\0016\190\031F\020\192\0316\.~\236\000\000\001\236\236\236\000\000\001\236\236\236\02066\001\000\020\001\000\$\01524666.6666\000\016666X6\244\001666<66\$\0216\004\1796\162666\000\000\00166\005\255\255\005E696>6%===\001666\000\000 -+BOgAAAEDAwgINjY2NgAAAAEfNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAATb7IPvz+/t/AAFCRDYkDzI0NjY2NjY2NjYAEFY2Nlg2NjY2NjY2NgAAAQABWTY2RQAAATYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/zY+NjY2NjYAADYAAPs2DAEAAAH0ATYVNjw2NiQVNgSzNqI2NjY2NgX//wVFNjk2PktLQAAAAUsBNr4fRhTAHzYufuzs7OwAAAHs7OwUNjY2NgAAAAABNjY0NjY2QTY+NjY2NjY2Nk7Q0NCQ0AAUFBQUNjY1NjZDNlg2NjY2TSE2UQARAQA= 0 -1 -+BOgAAAEDAwgINjY2NgAAAMAfNjZkAAAAAAABAAEAFPY2HjY2NDYMAAEABAEAAPM2NgAAIzb7IPvz+/sAAAFCRDYkDzI0NjY2NjY2NjYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTa1FTYABDk2NgAAATY2NjY2Nhw0JlgAIDY2/zY+NjY2NjYAADYAAPs2DAEAAAH0ATY2Njw2NiQVNgSzNqI2NjY2NgX//wVFNjk2PjYlPT09ATY2NgAAAAEANjQ2NjI2NjY2NgAQNjZLS0tAAAABSwE2vh9GFMAeNi5+7Ozs7AAAgADs7BQ2NjY2AAAAAAE2NjQ2NjZBNj42NjY2NjY2TtDQ0JDQABQUFBQ2NjU2NkM2WDY2NjZNNDZRABEBAA== 0 -1 -+BOgAAAEDAwgINjY2NgAA6R8fNjZkAAAAAAEAFPY2HjY2NDYMAAEABAEAAAE2NgAAATb7IPvz+wEBAAFCRDYkDzI0NjY2NjYAATYAEDY2Nlg2NjY2NjY2NgAAAQABNjY2RTYyFTYABDk2NgAAATY2NjY2Nhw0NlgAIDY2/w0NDQ0NDQ0NDQ0NNj42NgAAAQAANgAA+zYMAQAAAfQBNjY2PDY2JBU2BLM2ogX//wVFNjk2MjYlPT09ATY2MgAAAAEANjQ2NjI2NjY2NgAQNjZLS0tAAN8AAAEASwE2vh9GFMAfNi5+7Ozs7AAAAezs7BQ2NjY2AAAAAAE2NjQ2NjJBNj42NjY2NjY2TtDQ0JDQABQUFBTOUTU2NkM2WDY2NjZNNjZRABEBAA== 0 -1 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAjyEgQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACFyICECIGBBAiAhBAAoAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQL/x4fDTUpIhljJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIvIQIgIQQAIQIgAQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgAAAECAv4CAjsA 0 255 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAjyEgQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACFyICECIGBBAiAhBAAoAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQL/x4fDTUpIhljJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIvIQIgIQQAIQIgAQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgAAAECAv4CAjsA 780 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\242\018\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\023\".\016\".\004\016\"\002\016\@.\128\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\004\008\002\002\002\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\001\021\022\023\004\024:\026\027\004\011\255\030\031\0135\)\"\025c\$.\026\027\004\020#\030\031&5\)\"\025\004\$\$\000\000\002\000\@\002\016\"\002\016\@\002\016\"\242\016\"\002\016\@\002\016\"\000\016\031\004\032\)\"#\004\$\$\000\000\002\000\@\002\016\"\002.\@\002\016\"\002\016\"\006\004\008\000\000\001\002\002\254.\002\; -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/GgwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQLHR4fDTUpIhkEJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQJQIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAjsA 0 255 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/GgwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgYECAICAgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGAEVFhcEGDoaGwQLHR4fDTUpIhkEJDoaGwQUIx4fJjUpIhkEJCQAAAIAQAIQIgIQQAIQIgIQIgIQJQIQIgIQHwQgKSIjBCQkAAACAEACECICEEACECICECIGBAgCQAICAv4CAjsA 780 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\026.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\004\008\002\002\002\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024\001\021\022\023\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$.\026\027\004\020#\030\031&5\)\"\025\004\$\$\000\000\002\000\@\002\016\"\002\016\@\002\016\"\002\016\"\002\016%\002\016\"\002\016\031\004\032\)\"#\004\$\$\000\000\002\000\@\002\016\"\002.\@\002\016\"\002\016\"\006\004\008\002\@\002\002\002\254.\002\; -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw3oAwAABCQkAAD/AEACECICEEACECICECIGBBAiAkACEAACEEACECICECIGBAgCAgICAhAiAiY1KSIZBCQkBgQICf9/BAwNEg8EEAgSEwQBFRYXBBgBFRYXBBg6GhsECx0eHw01KSIZBCQ6GhsEFCMAAAEMHyY1KSIZBCQkGwACAEACECHtEEACECICECICEEACECICEB8EIBwiIwQkJAAAAgBAAhAiAhBAAhAiAhAiBgQIAkACAgL+AgI7AA== 0 -1 -+DGQAAADKBhgi////fxA33d3d3QECAA0B+/HWEAA43iABAQyAEM/V3d3d8d3d3d3d3d3/AN3d3d3dyADGA+gAIvgP8gbz9A3z9PX2ECIB7SIB7AX43d3d3egD/wDd3d3d3cjd3d3/AAD19hAiAefTAARFAPgB6UD7BCUB/AUjIf8= 16 -1 -+rgGvAbABsQGyAbMBtAG1AbYBtwEBtgG3AbgBuboBuQG6AbsBvAG9Ab4= 0 -1 -+6AU2 3 -1 -+BAABAgMEBAUGBwQICQoLBAwNDg8EEBESEwQUFRYXBBgZGhsEHB0eHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDCAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYAPRAA+/v7+/v7+wMDAwMDAwMDAwMDAwAAAQMDAwMDAwMDAwMDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAQMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMOAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYAAAGA 3 -1 -+IBJDAQAQAAAAOj9IWUhISGVIAwMA//8AACBIAwMAAAHsSDD//wAAAwMDAwMAf9z//wAAAQMDAQMDAwMLAwMDAAEDAwMDAwQDAAA= 68 5 AwMEAwA= 13 \003\004\003 -+BOiACwBA/78AABA2NjYyZxVHAOY1NDYfNkg2NP82NgABNjY2NGcVRwDmNTQYHzY2NjT/NjY2NgAA/wADNjY2H8LCwkYUAFA2NgAAgH0AAAfzATY+BFCCwkYUADYAAAGANjYkNv9//wB/NjY2NjYUAAABNjZPNjYYPgQ5NjbQztDQ0NDQ0Mcz0NDi0NDQAAAA+xAN+TY2BwEBAIkAABQUFBQ2NoAHAH8A6AE2WCs2NjYZNnZ2knZ2dnZ2gAsAAAEAGw== 0 -1 -+BOgA8r8fNFI2wsK+wsLCBABSUBYAAQAAFBuQAAAA7DUmNgAEAAA2EAABAAAUG5AAAAA2AAAA3gAAgOXQ0NDQM9DQAAABAAAAAeZ/NjY2NjZ2dn92dgE2dn92dgE2Jgr//QFQNsLCwsLCwh80f////8JQNsLCwsLCwh80Nk3CwsLCwsLCwsLCADY2+gAA+nZ2AAABSwE0vjYAAACA5dDQ0NAy/+EB0NAAAAEAAAAB5n82NjY2NjZ2f3Z2ATZ2CgAQAAE2NgDo/4Dl0NDQ0DPQ0AAAAQAAAABAztDQ0M12dv/2AAC5ubm5ubm5ubm5ubm5ubkBAUZUADY2ADI2JDY2NJAAAQAA 0 38 BOgA8r8fNFI2wsK+wsLCBABSUBYAAQAAFBuQAAAA7DUmNgAEAAA= 118 \232\000\242\191.4R6\194\194\190\194\194\194\004\000RP\022\000\001\000\000\020\027\144\000\000\000\2365&6\000\004\000 -+BOgAAMAfNjY2wsJCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADe4TU2NjY2NjY2NjY2NjYAAAABABtn6gABbEsAAAFLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQAAUAADPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2AHZ2dnZ2dnb/CwAAAQAb 0 93 BOgAAMAfNjY2wsJCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADe4TU2NjY2NjY2NjY2NjYAAAABABtn6gABbEsA 216 \232\000\000\192.666\194\194B\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.66\00966664\128X6\000\016\00166664\2556666\000\000\000\222\2255666666666666\000\000\000\001\000\027g\234\000\001lK -+BOgAAMAfNjY2wvoAAPrCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0NjY2AAAA3gM2NjY2NjY2NjY2NjY2AAAAAQAbZ+oAAWxLS0tLaUtLATa+dnZ2dh9GFAA2NjYAADY2JDY2NP9/NjY2NjY2FTY2TzY2NjY2JDY2//+AAHZ2dnZ2dnb/CwBA/zY2NjY2NgA0NgAAAQABAIAAAAE2NgpQNjbQztDQ0NDQ0NAz0NDi0NDQAABA+xAUFDY2AAHQ0JAAABQUFBQ2NoABAH82WCs2NjY2NnZ2dnZ2dnZ2/wsAAAEAGw== 0 -1 -+Z+oAASAAS0tLaUtLATa+AAAE6AAAwB82NjbCwsLCwsLCwsLCn8LCwsLCwjY2JBU2NDY2NjY2NjYAAAABABtnFTYABDY2NjY2CTY2NjY0gFg2ABABNl82NjT/NjY2NgABAN4DNjY2NjY2NjY2Njb6AAD6AP8AG2fqAAEgAEtLS2lLSwE2vnZ2dnYfRhQANjY2ACA2NiQ2NjT/fzY2NjY2NhU2Nk82NjY2NiQ2Nv//gAB2dnZ2dnb//3//QP+Dg4ODgzY2NjY0NgAAAQABAIAAAAE2NgpQNjYAAAHQNP9/NjY2NjY2FdA2WCs2NjY2NnZ2dnZ2anZ2/wsAAAEAGw== 27 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngn/fzY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NlI2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngn/fzY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NlI2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAA 624 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\009\255\127664\128X6\000\016\00166664\2556666\000\000\000\222\003666666666R.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\1276X+66666vvvvvvvv\255\011\000 -+BOgAAMBgYGBgYGBgYGBgYGBgYGBgYJ/Cs8LCwsLqNh0VNiE2NkI2NkM2AAAAEOkaZxU2AAQ2NlY2Ngk2lpaWlpaWlpaWlpaWlpaWHTY2IIBYNvQAAQAtATYiNn8AAAA2Nh02NjSAWDgALQE2NjZ/AOQANjY1///13gM2NjYFAGQAAwAAATY2NjZnFTYABDY2VjY2ZAD/f+//f4w2NjY2//82NjZQACAAHBwYHBwcHBwcHBwcAQB//xwcHBwcARAbZ+rwAWxLS3Z2djY2NP8QNjY2NjY2FTY2T3Z2dv8LAEAeNhQgf////xtn6vABbEtLdnZ2NjY0/xA2AdDQkAAAARTSFEAAAAABABs= 0 -1 -+AAAAAQH/Hwb/AB7pAAAAAAAAAABAHyUlJSVWVlZfAP9/ADR3NjYjFBg2VTY29xQYNlU2NvdWVlZWVlYAAAFWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVl8A/wAAEiKA//8C////AATnVwAAxxUAAAAB//++hhAEiDsEOD0= 9 1 AA== 2 . -+ATYkNjb/NiQgAF9fgF9XX184X71fX19fAF9fKysrfwBfAAABAHtfAwAAXwADAwMAAgMD/zYkIABfX19fAAABX19fOV+9X182NjYAAAEVaQAABgQ8PQ== 0 44 ATYkNjb/NiQgAF9fgF9XX184X71fX19fAF9fKysrfwBfAAABAHtfAwAAXwA= 86 6.66\2556\$\032\000__\128_W__8_\189____\000__+++\127\000_\000\000\001\000{_.\000\000_ -+AOgAAMAfNjY2wsLCwsLCwuTiwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZwAAARU2AAQ2NjYAAAE2Ngk2NjY2NIBYNgAQAT02NjY0/zY2NjYAAADeAzY2NjY2NjY2NjYTNjbCwsLk4sKfwsLZwsLCNjYkFTY0NjY2NjY2NgAAABcAGwAAAQE2AAABNv+AhocEiDsEPD0= 0 1 AA== 2 . -+8A== 1 -1 -+BCorBCwtLjL79Pv7/BX7+/v7+/v7+/v7+/v7+/v7+wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcBBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwYHBwcHBwcHBwcHB9EHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBzMzMxo7MzMzMzMzMzMzMzMzBwcHBwcHBwcHBwcHBwcHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcF//8FBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHAhAiBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAAEEMDH5fwQMDRIAECICECIGLi8EMDEqMwQ0NTYiBgQICfl/BAwNEgB/KjMEBwcHBwcHB8XFxcXFxcXFx8XFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFAAABxcXFxcXFxcXFxcXFxcXFxQAAAcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFvcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDgcHKgcHMzMzGjszMzMzMzMzMzMzMzMHBwcHBwcHBwcHBwcHBwcHAAABBwcOBwcHBwcHxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcUHBwcHBwcHBwcHBwcCECIHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAAABBwcHFwcHBwcHAwcHBwcHBwIQIgIQIgYuLwAAAQQwMfl/BAwNEg8QIgIQIgYuLwQwMSozBDQ1NiIGBAgJ+X8EDA0SDwQqMwQHBwcHBwcHxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFscXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbfFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxeHFxcXFxcXFxcXFxcXFxcXFxcXFxcXNxcXFxcXFxcXFxcXFxcXFxcXFxcXF28XFxcXFxcXFxcXFxcXFxcXVxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxQHFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxdTFxcXFxQcHBwcHBwcHBxAREhMEFBESQAABFjEzMzMzMzMzMxEzMzMzMzMz/38TBBQRFhcEGCQaGwQUHQIQIgYECAn5fwQMJxIPBBAREhMEQAAWFuiAAAAbBBQdABAzBDQxf/7//wgJBwcHBwcHBwcHBwcHBwcGBwcHBwcHBwcHBwcHBwcOB08HBwcHByEHBwcHBwcHBwcHBwcHBwcHBwcHCQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBwcHBwcHxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxfv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7xcXFxcXFAMXFxcXFxcXFxQAAAcXFxcXFxcXFxcXFxcUHBwcH 15 -1 -+AAABASIAwA4= 0 1 AA== 2 . -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2NjY2NjY0Ejc2NjYAAADeAzYAAAE2NjY2NjY2NjbeAzYAAAE2NjY2NiQ2NjT/fzY2NjY2NhU2Nk82NjY2NiQ2Nv//gAB2dnZ2dnZ2/wsAQP82NjY2NDYAAAEAAQCAAAABNjYLUDY20M7Q0NDQ0NDQM9DQ4tDQ/38AAAABFBQ2NgAB0NCQAAAUFBQUNjaAAQB/NlgrNjY2NjZ2dnZ2dnZ2dv8LAAABABs= 0 148 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2NjY2NjY0Ejc2NjYAAADeAzYAAAE2NjY2NjY2NjbeAzYAAAE2NjY2NiQ2NjT/fzY2NjY2NhU2Nk82NjY2NiQ2Nv//gAB2dnZ2dnZ2/wsAQP82NjY2NDYAAAEAAQCAAA== 340 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\0046666666664\0187666\000\000\000\222\0036\000\000\001666666666\222\0036\000\000\001666.6\$664\255\127666666\02166O66666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATYmNjY0/zY2NjYAAADeCDY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATYmNjY0/zY2NjYAAADeCDY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAA 618 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\0016&664\2556666\000\000\000\222\0086666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\1276X+66666vvvvvvvv\255\011\000 -+NjYAAAF2ZAAAFwtAAAABgn//AAABA0SAgAABCALLFTZXLNDGAAAU/wABAAIAAAAAgAAAAQkiHBU2V0XQ0JAAABQD6DZPrQAAAQCAAAAAAAEBAAIcFTZXRdDQkAAAFKP/AAAAo5Ojo6O+o56jo6Ojo6Ojo6Ojo6Ojo6MAAAGjdtB/AAAUAAAnNjVA3gABNv8AAzb/AAABdnZ2dnb/CwD8AQAb 54 -1 -+ARERERERES42wsLCwuKfwsLCwsLCNjYkFTYiNjY2NjZ2Ngk2NjY2NIBYNg4QATYF//8F/zYXNjYAAACAAzY2VjY2SjY2NjY2ADYAAAABABsAECcAARw2NjYnpxknJycAAABAAOUBHDY2NgAAAQAAEjY0/382NjZNFzYVNhZPNgABAACA//////8F/zYXNjYRAPLeAzY2NjY2NjY2JCw2//+AAHYAABABNgX//wX/Nhc2NhEA8t4DNjY2NjY2djPQ0OLQ0NAAAAD7EBQUHTblgNDQkAAQKBQUGw== 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAqATY2NjY0/zY2NjYAAADeAzZPNjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAqATY2NjY0/zY2NjYAAADeAzZPNjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sBNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAATY2ClA2NtDO0NDQ0NDQ0DPQ0OLQ0NAAAAD7EBQUNjYAAdDQkAAAFBQUFDY2gAEAfzZYKzY2NjY2dnZ2dnZ2dnb/CwAA 615 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000*\00166664\2556666\000\000\000\222\0036O66666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0016\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\00166\010P66\208\206\208\208\208\208\208\208\208.\208\208\226\208\208\208\000\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\02066\128\001\000\1276X+66666vvvvvvvv\255\011\000 -+BOhtAG0AAAA= 0 6 BOhtAG0A 11 \232m\000m -+MzY238LYnwCAf8LCbzY2th82bzY2thU2NDYANiQlJicEKAAAAAHpARA2NwQ4OAE7BD49Pj8A 4 -1 -+BOgAAMAfNjY2wsJAwsLCwsLCwp/CNjY2NjYAAIABABtnFTYABDY2NjY2CTY2NjY0gGA2ABABNjY2NmcxNgAENjYjNjYnBCgpNjcEODg6OwQ8PT4/AA== 0 -1 -+BOgAEACf1MLCwsLCNgABABtnFTYABjY2NjY2CTY2NjY0gFhZADg4OTsEPD0+PwA= 0 -1 -+ZAGU0g== 0 -1 -+AAEp 1 -1 -+//9/A4o= 5 -1 -+//8FDgMEBwQsLS4nBC0AEwIQAAcAAH/fMjMEAAABCAkKTy4gAB8ANgQsLS4vBAcAAH/fMjMENDU2CCAAHwA2BCwtLi8eBC4gAB8ANgQsIAAfAC4vBH8QHgQ/OTpPLiCVlZWVlZWVlZWVlZWVBwcHBwcHBwcHBwYHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBzMzMxo7MzMzMzMzMzMzMzMzBwcHBwcHBwcHBwcHBxgHBwcHDgcHBwcHBwchBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHAhAiBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcHBwcHBw0HBwcHBwcCECICECIGLi8AAAEEMDH5fwQMDRIPECICECIGLi8EMDEqMwQ0NTYiBgQICfl/BAz/EQ8EKjMEBwcHBwcHBwcHBwcHBwcHBxAREhMEFBESQAABFhczMzMzMzMzMxEzMzMzMzMz/38TBBQRFhcEGCQaGwQUHQIQIgYECAn5fwQMJxIPBBAREhMEQAAWFuiAAAAbBBQdABAzBDQxf/7/FAgJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcOBzMzMwcHBwcHBwcHBwcHBwcHBwcHBw4HBwcHBwcHIQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFwcHBwcHBwcHBwcHBwIQIgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcNBwcHBwcHAhAiAhAiBi4vAAABBDAx+X8EDA0SDxAiAhAiBi4vBDAxKjMENDU2IgYECAn5hgQMDRIPBCozBAcHBwcHBwcHBwcHBwcHBwcQERITBBQREkAAARYXMzMzMzMzMzMRMzMzMzMzM/9/EwQUERYXBBgkGhsEFB0CECIGBAgJ+X8EDCcSBwcHBwcHBwcHBwcHBwcHBwcHBwcXBwcHBwcHBwcHBwcHBwcHfwAEJDQdAhAiAhBAAhAiAhAiEkAAARYXBBgZGhsEFB0gHwAzMzM= 5 -1 -+BA8ICAgEBAUG6wQICQoLBAxuJSY2BBAAAAAEFC0uIFAzBDM1NjkEOB45OwQAAAE0NSk3BDgAOQQrNjkEOH////9QUQQ0KQIQIgYEECICEEACAhAiBgQIAgICAgIQIgIQQAIQIgIQIgYECAkiAgICkCICEEACECICECIGBAgJ/37hDA0gDwQQDRITBAEVFhcEGAEVFhcEGDoaGwQLHR4Q8TQpIhkEJDo1KSIZBCQkAAACAEAQQAIQIgIEECICEEACAhAiBgQIAgICAgIQIgIQQAIQIgIQIgYECAkiAgICECICBBAiAhBAAgIQIgYECAICAgICECICEEACECICECIGBAgJIgICApAiAhBAAhAiAhAiBgQICf9+4QwNIA8EEA0SEwQBFRYXBBgBFRYXBBg6GhsECx0eApAiAhBAAhAiAhAiBgQICf9+4QwNIA8EEA0SEwQBFRYXBBgBFRYXBBg6GhsECx0d/PEkJAAAAgBAEEACECICECIGBAgCHQICAv4QIgYECAJAAgIC/gICOwIQIgIQQAIQIgIQIgIQQAIQIgIQBAQgKSIjBCQkDgACAEACECICEEACECICEAAAASIGBAgCQAICAv4CAjsA 0 -1 -+BAABAgMEERITBBQVFhceHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBGBhYmMEZGVmZwRoaWprBGxtbm8EcHFycwR0dXZ3BHh5ensEfH1+fwSAgYKDBISFhocEiImKiwSMjY6PBJCRkpMElJWWlwSYmZqbBJydnp8EoKGiowSkpaanBKipqqsErK2urwSwsbKzBA== 0 -1 -+BAABAgMEBAUGBwQAAAEABAwNDhQEEBESEwQUNBYXBAcH5wYHogcHByoHBwcHBwcHDQcHBwcHBwAQBwcHByKANTM2NwQ4OTo7BDxRPj8A 0 78 BAABAgMEBAUGBwQAAAEABAwNDhQEEBESEwQUNBYXBAcH5wYHogcHByoHBwcHBwcHDQcHBwcHBwAQBwcHByKANTM2NwQ4OTo7BDxRPj8A 226 \000\001\002\003.\004\005\006\007.\000\000\001\000.\012\013\014\020.\016\017\018\019.\0204\022\023.\007\007\231\006.\162\007\007\007*\007\007.\007\007\007\007\013\007\007.\007\007\007\000\016\007\007.\007\"\1285367.89:\;.? -+BAAJCgsEGA0ODwQQERIEBAUGDQ4PBBAREhMEFBUWEwQUFRYXBBgZGhsEkx0eHxobBJMdDB8EICEiIwQ2NDUEkx0eDg8EEBESEwQEGBkaGwSTHQ== 0 -1 -+BAAEBQYHBAgJCgsEDA0kJSYnBCgpKisELC0uLwQwMTIzBDQ1NjcEgAA6OwQ8PT4/BEBBQkMEREVGRwRISUpLBExNTk8EUFFSUwRUVVZXBFhZWlsEXF1eXwRgNTY3BDg5OjsEPD0+PwRAQUJDBERFRkcEdHV2dwR4eXp7BHx9fn8EgIGCgwSEhYaHBIiJiosEjI2OjwSQkZKTBJSVlpcEmJmamwScnZ6fBKChoqMEpKWmpwSoqaqrBKytrq8EsLGyswQ= 8 -1 -+BAAEBQYHBAgJCgsEDA0ODwQQBBgZGhsEHB0hIiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NTY3BDg5OjsEPD0+XwRgYWBjBGRlZmcEaGlqawRsbW5vBHBxcnMEdHVWVwRYWVpbBFxdXl8EYGFiYwRkZWZnBGhpamsEbG1ubwRwcXJzBHR1dncEeHl6ewR8fX5/BICBgoMEhIWGhwSIiYqLBIyRjo8EkJGSkwSUlZaXBJiZmpsEnJ2enwSgoaKjBKSlpqcEqKmqqwSsra6vBLCxsrME 8 -1 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYOhobBCY1KSIZBCQkAAACDkACECICEEACECICECICEEACECICEB8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAAAA== 0 202 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYOhobBCY1KSIZBCQkAAACDkACECICEEACECICECICEEACECICEB8EICkiIwQkJAAAAgBAAhAiAhBAAhAiAhAAAA== 590 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004&5\)\"\025\004\$\$\000\000\002\014\@\002\016\"\002.\@\002\016\"\002\016\"\002\016\@\002\016\"\002\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\000 -+5h3eAgMEBAUGByQrCS0QAADy/38AzSoAAAFkLi8BLC0uL4AAAAEwMf///4ABQH8AQAAAAQAAY2QAZS8BLC1AZQAAAWVmZwQAAAFwZQBleARkZWZn6AP0//xwAAABYGRlAAAA5RAQAAABAQAAAAHw7uzs/+x/AEBlAPABgoMWEAD//w== 8 8 BgckKwktEAA= 17 \007\$+\009-\016 -+BB8BAAAAAAEEBCEGBwAAAQQICQQhBgQICQoT2xMVAAABFhAoKRsuLwQwE9sTFQAAARYXBBgZMCsCAwQhPw== 8 6 BAQhBgcA 14 \004!\006\007 -+BB8BAgMEBAUGCwQMDQ4PBAgIAQgICAgICAgICAcECAkKCwQMDQ4PBAgIAQgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICAh0B/AICAgBCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj/fwAACAgAAAAACHQAAAH/AAgICAg= 8 122 BgsEDA0ODwQICAEICAgICAgICAgHBAgJCgsEDA0ODwQICAEICAgICAgICAgICAgICQgICAgICAgICAgICAgICAgIdAfwCAgIAQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI/38AAAgIAAAAAAh0AAAB/wA= 427 \011\004\012\013\014\015.\008\008\001\008.\008\008\008\008\008\008\008\007.\008\009\010\011.\012\013\014\015.\008\008\001\008.\008\008\008\008\008\008\008\008.\008\008\009\008\008\008\008\008.\008\008\008\008\008\008\008\008.\008\008t\007\240\008\008\008.\008.\008\008\008\008\008\008\008\008.\008\008\008\008\008\008\008\008.\008\008\008\008\008\008\008\008.\008\008\008\255\127\000\000\008.\000\000\000\000\008t\000\000.\255 -+AgAAAgBAAhAiAhBAAhAiAhAiBgQIDf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaIiMEBCQAAAIAQAIQAAIfQAIQIgIQIgYECAIChgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEAIECIiAEACECICECIGBAgCQAICAv4CADsA 0 250 AgAAAgBAAhAiAhBAAhAiAhAiBgQIDf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsEC4AAAAA1KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaIiMEBCQAAAIAQAIQAAIfQAIQIgIQIgYECAIChgICECICEEACECICECIGBAgJ/38EDA0SDwQQCBITBAEVFhcEGDoaGwQUHR4fJjUpIhkEJCQQIgIQIgIQQAIQIgIQHwQgKSIjBCQkAAACAEAIECIiAEACECICECIGBAgCQAICAv4CAA== 754 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\013\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\128\000\000\0005\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\"#\004\004\$\000\000\002\000\@\002\016\000\002\031\@\002\016\".\016\".\004\008\002\002\134\002.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\020\029\030\031&5\)\"\025\004\$\$\016\"\002\016\".\016\@.\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\"\"\000\@\002\016\".\016\".\004\008\002\@\002\002.\254\002 -+ISEhISEhISEhISEhISEhISEhISEAA+gAISEhISEhISEhISEhISEhGiEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhISEhIYAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhIRAhISEhISEhISEhISEhISEhISEhISEhISEhIYAhISEhISEpcnN0dXZAAAAAew== 33 205 ISEhISEhGiEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhISEhIYAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhQyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF+ISEhISEhISEhIRAhISEhISEhISEhISEhISEhISEhISEhISEhIYAhISEhISEpcnN0dXZAAA== 218 !!!!!\026!!!!!!!!!!!C!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!~!!!!!!!!!!!.!\128!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!C!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!~!!!!!!!!!!\016!!!!!!.!!!!!!!!!!!!!!!!!!!\128!!!!!!\)rstuv\@ -+AUABQwFEAUUBRgFPAVABUQFSAVMBVAFVAVYBVwFYAVkPWgFbAVwBXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+NjY2NjYAAAABBB82NgAAATY2NiQVNjQ2NjY2NjY2NjY2NjY2NgAAAAEENgAAATY2NjY2NgAAATY2NjY2NjY2AAAAAQQ2NjY2NjY2NjY2NjY2AAAANjY2NjY2NjYAAAABBDY2NjY2NjY2NjY2NiQgNjQ2NjY2NlE2NjY2NjY2NjY2Nho2Nn92dnZ2dpZ2dnb//0E2AQAAAQAAARY2 0 -1 -+BwEBQwBkAQABRgFPAVABUQFSAesBVAFVAVYBbAFYAVkBWgFbF1wBAAABXwFgAVQBYgFrAWQBZQFmAWcBaAFpAWoBawdsAV0BbfxvAVs2NgBQNjYkZDY0NiQAZjZRNjY2Nv9aAVsBWwFfAQBQtDY2NjY2/1o2ZjZRNrdENjYAAAQ2NjY2MP9aAAEENgAAATY22jY2PwAABDY2AAAAAQQ2Gf4BNkc2Nr5LS0tLAAABSwE2vh0AATY2NuxQNjYkZDY0JCQ2ZjZRNks2AAABNmRaAVsbXAFfAWAAYQFiAWP/////AAABAWYBNgEAAAEAAAEWNg== 0 -1 -+AUABQvZEAUUBRgFPAVABUQFSAVMBVAFVAVYBVwFLS0tLS0tLATa+HQDxNRc2AFgBWWH/AXMXdAF1AZEBdwF4AXkBegF7AXwBZwFo7GkBagFrAWwAAAFuAW8BcAF/AXIBcwEAAAH1kAF3AXgBeQF6AXsBfAAAAQF9AX42NjY2AAABAAEEHzY2AAABNjY2JBVdXV1dXV1dXV02NDY2NjY2NjY2NjY2NjY2AAAAAAABAQQ2AAABNjY2NjY2AAABAAABNjY2NjY2NjYAAAABGjY2NjY2NjY2NjY2NjYAAAEPHh4eHh4eHh4eHh4eHh4A5B4eAAAAAQAbS2xLS0tLS0tLATa+HQDxNRc2AFA2NiQsNjQ2GzY2NlE2NjY2NjY2NjY2Af/pAAABFjY= 0 -1 -+AAAAAQIAAAGgACABgAGDDKABJQ== 0 1 AA== 2 . -+AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYOhobBBQdHh8mNSkiGQQkJAAAAg5AAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQAAA= 0 206 AgAAAgBAAhAiAhBAAhAiAhAiBgQICf9/BAwNEg8EEAgSEwQBFRYXBBg6GhsECx0eHw01KSIZBCQkAAD/AEACECICEEACECICECIGBBAiAhBAAhAiAhAfBCApIiMEBCQAAAIAQAIQAAIQQAIQIgIQIgIQIgYECAn/fwQMDRIPBBAIEhMEARUWFwQYOhobBBQdHh8mNSkiGQQkJAAAAg5AAhAiAhBAAhAiAhAiAhBAAhAiAhAfBCApIiMEJCQAAAIAQAIQIgIQQAIQIgIQAAA= 588 \000\000.\000\@.\016\".\016\@.\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\011\029\030\031\0135\)\"\025\004\$\$\000\000\255\000\@.\016\".\016\@.\016\".\016\".\004\016\"\002\016\@.\016\".\016\031.\032\)\"#.\004\$\000\000.\000\@.\016\000.\016\@.\016\".\016\".\016\".\004\008\009\255\127\004.\013\018\015\004\016\008\018\019\004\001\021\022.\004\024:\026\027\004\020\029\030\031&5\)\"\025\004\$\$\000\000\002\014\@.\016\".\016\@.\016\".\016\".\016\@.\016\".\016\031.\032\)\"#.\$\$\000\000.\000\@.\016\".\016\@.\016\".\016\000 -+AgAABgYGBgYcBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgQGBgYGBgYGBgYGBgYEBgYGBgYGBgYGBgYGBAYGBgYGBgYGBgYGBgYGBgYGQAYG/xAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgZkBgYGBgYGBgayBgYGBgYGBgYGBgYGBgUGBgYGBgYGBgYGBgYaBgYGBgYGBgYGBgYGEwYGBgYGACAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBughHh8EICkiIwQvJOsnBAgpKisALA== 0 255 AgAABgYGBgYcBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgQGBgYGBgYGBgYGBgYEBgYGBgYGBgYGBgYGBAYGBgYGBgYGBgYGBgYGBgYGQAYG/xAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgZkBgYGBgYGBgayBgYGBgYGBgYGBgYGBgUGBgYGBgYGBgYGBgYaBgYGBgYGBgYGBgYGEwYGBgYGACAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBughHh8EICkiIwQvJOsnBAgpKisA 871 \000\000.\006\006\006\006\028\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\004\006\006\006\006.\006\006\006\006\006\006.\004\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\@.\006\255\016\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006d\006\006\006.\006\006\006\006\178\006.\006\006\006\006\006\006.\006\006\006\006\005\006.\006\006\006\006\006\006.\006\006\006\026\006\006.\006\006\006\006\006\006.\006\006\019\006\006\006.\006\000\032\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\006\006\006\006.\006\006\232!\030\031.\032\)\"#./\$\235'.\008\)*+ -+BAABAgMEERITBBQVFtckHwQgISMjBCQlJicEKCkqKwQsLS4vBIAAMjMENDU2NwQ4/4A7BDw9Pj8EQEFCJwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXV5fBDcEMzk6OwQ6WgQ8PT4/AA== 0 -1 -+BAAB7gMEERITBBQVFhceHwQgIQgjBCQlJgQUFRYXBBgZGhsPHB0eHwQgIQAAAQ== 0 -1 -+AABAAP//ERPyvwJEGB4bBBETNgQUFRPyvwJEGB4fGwQdEzYEKBUWFx4eHwQvHxgekwABDBsAASIjXl5eXl5eXl5eXl5eXl5eXiQ= 0 1 AA== 2 . -+LS4vBDAxMjMENDUAAAE2NwAEAAECAwTyERMEFBUWFx4fBCAhMiMEJCUmJwQoKSorBCwtLi8EMDEyMwQ0NQAAATY3BDg5OjsEPD0+PwRAQUJDBDlFRkcESEn//4AATU5PBFBRUlAEVFVWVwRYWVpbBFxdXl8EYGFiYwRkRmZnamsEbG1ubwRwcXJzBHR1dndpeHl6ewR8fX5/BICBgoMEhIWGEBAQEBAQEBAQEP///38QEBAQEBAQEBCA/xAQEBAQEBAQEBAQEAAAARAQEBAQAAToBAMDgAAAAfoD6AI= 44 -1 -+BAABAgMEERITBBQVFhceHwQgISIjBCQlJicEKCkqKwQsLS4vBDAxMjMENDU2NwQ4OTo7BDw9Pj8EQEFCQwRERUZHBEhJSksETE1OTwRQUVJTBFRVVlcEWFlaWwRcXWRfBGBhYmMEZGVmZwRoaWprfwSAgYKDBISFhhAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAE6AQDAwP6A+gC 0 -1 -+FA== 0 -1 -+AQABAwEiAQcBCAEJAQoBCwEMAZ/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQATZxU2AAQ2Ni42Ngk2NjY2NIBYNgAQATY2NhM0/yI2NjYAAADeAzY2NjY2AAAAAQAbZ+oAAYNLS0tLaUtLATa+kHZ2dh9GFAA2NjYAADYDNjY2NjY2NjY2NjY2NgAAAAEAG2fqAAFsS0tLS2lLSwE2vnZ2dnYfRhQANjY2AAA2NiQ2NjT/fzbsNjY2NhU2NgAAATY2NiQ2Nv//gAB2dnZ2dnZ2/wsANiQ2NjT/fzbCwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NhM0/zY2NjYAAADeAzY2NjYwNjY2NjY2NjYAAAABABtnNjY2Ngk2NjY2NIBYNgAQATZANhM0/zY2NjYAAADeAzY2Njb/NjY2NjYAAAE2NjYAAAABABtn6gABbEtLS0tpS0sBNr6QdnZ2H0YUADY2NgAANgM2NoD///82NjY2NjY2AAAAAQAbZ+oAAWxLS0tLaUtLATkAAAG+dnZ2dh9GFAA2NjYAADY2JDY2NP9/NjY2NjY2FTY2AAABNjY2JDY2//+AAHZ2dnZ2dnb/NjY2AAQ2AAAAAQAbZxU2AAQAAAE2NjY2Ngk2NjY2NIBYNgAQATY2NhM0/zY2NjYAAADeAzY2NjYwNjY2NjY2NjYAAAABABtnNjYhNjYVNjZPNjY2NjYkNjb/34AAbXZ2dnZ2dv8L0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0bnR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0QJA6DY2NjY0NgAAAQABAIAAAAE2NgpQNjbQsSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQEAGw== 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sNNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAARU2ClA2NtDO09DQ0NDQ0DPQ0OLQ0AAgAAD7EBQUNjYAAdDQkAAAFBQUFMLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NgAAAQAb 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjY2NIBYNgAQATY2NjY0/zY2NjYAAADeAzY2NjY2NjY2NjY2NjYAAAABABtn6gABbEtLS0tpS0sNNr52dnZ2H0YUADY2NgAANjYkNjY0/382NjY2NjYVNjZPNjY2NjYkNjb//4AAdnZ2dnZ2dv8LAED/NjY2NjQ2AAABAAEAgAAAARU2ClA2NtDO09DQ0NDQ0DPQ0OLQ0AAgAAD7EBQUNjYAAdDQkAAAFBQUFMLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NgAA 655 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\00966664\128X6\000\016\00166664\2556666\000\000\000\222\0036666666666.66\000\000\000\001\000\027g\234\000\001lKKKKiKK\0136\190vvvv\031F\020\000666\000\00066\$664\255\127666666\02166O.6666\$66\255\255\128\000vvvvvvv\255\011\000\@\255666646\000\000\001\000\001\000\128\000\000\001\0216\010P66\208\206\211\208\208\208\208\208\208.\208\208\226\208\208\000\032\000\000\251\016\020\02066\000\001\208\208\144\000\000\020\020\020\020\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466\000 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxfr6+vr6xcUAAAEAG2cVNgAENjY2NjYJNjY2NjSAWDYAEAE2NjY2NP82NjY2AAAA3gM2Nrw2NjY2NjY2NjY2AAD8AAAbZ+oAAWxLS0tLaUtLDTa+dnZ2dh9GFAA2NjYAADY2JFE2NP9/NjY2NjY2FTY2TzY2NjY2JDY2//+AAHZ2dnZ2dnb/CwBA/zY2NjY0NgAAAQABAIAAAAEVNgpQNjbQztPQ3NDQ0NAz0NDi0NDQAAAA+xAUFDYAAAPo0JAAABQUFBQ2Ns0BAH82WCs2NjY2NnYAAP//dnZ2/wsAAAEAGw== 0 -1 -+BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjYdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugHWEbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHUAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AQEA/wA= 0 255 BOgAAMAfNjY2wsLCwsLCwsLCwp/CwsLCwsI2NiQVNjQ2NjY2NjY2AAAAAQAbZxU2AAQ2NjY2Ngk2NjYdAR4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugHWEbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHUAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9AQEA 717 \232\000\000\192.666\194\194\194\194\194\194\194\194\194\194\159\194\194\194\194\194\19466\$\0216466666.6\000\000\000\001\000\027g\0216\000\00466666\009666\029\001\030\001\159\001\160\001\161\001\162\001\163\001\164\001\165\001\166\001\167\001\168\001\169\001\170\001\171\001\172\001\173.\174.\175.\176.\177.\178.\179.\180.\181.\182.\183.\184.\185.\186.\214.\188\001\189\001\190\001\191\001\192\001\193\001\194\001\195\001\196.\197.\198.\199.\200.\201.\202.\203.\204.\205.\206.\207.\208.\209.\210.\211.\212.\213.\214.\215.\216.\217.\218.\219.\212.\221.\222.\223.\224.\225.\226.\227.\228.\229.\230.\231.\232.\233.\234.\235.\236.\237.\238.\239.\240.\241.\242.\243.\244.\245.\246.\247.\248.\249.\250.\251.\252.\253.\001 -+BOgAAMAfNjY2wsLCwsLCwsLCwp8EMDEFGAEfASABIQEiASMBJAEnASgBKQEqASsBLAEtAS4BNwE4ATkBOiA7ATwBPQE+AT8NAQ4A/gEQAREAAH//ARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASvALMLCwsLCwsLCwp8EMDEFGAEfASABIQEiASMBJAEnASgBKQEqASsBLAEtAS4BNwE4ATkBOiA7ATwBPQE+AT8NAQ4A/gEQAREAAH//ARQBFwUYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASvALAEtAS4BJwEoAUgBKgErASwBLQEuATsBLQEuAScBKAFIASoBKwEsAS0BLgE7ATwBPQE+AT8A 0 -1 -+BAABAgMEAAABBwQICQoLBBINDg8EEBESEwQUFRYXBBgZGhsEHB0eNjY2AAA2NjY2Njw2ATYYNkUAAAIQ//9/TExMTExMTExMTExMTExMTExMTExMTENMbxMTExNqEykTlhMTEyYLAAEUFAAABjY2NjYAUwE2NhwAAAABAAABBDb/fwAAAzY2NgX//wU2NgD7SDYkNjk5OTk5OTk5OTk5OTk5OTk5OTk5PTY0pDY2NjY2NiQAAAE2Nn82cXZ2dnZ2dnZ20Coq0DPQ0P/gM9DQ//9//9AAAAHSu9DRkNAABgAA/xQUAAAGfzYkNjY0Nks2AAQeVTb/AAABNn////8= 0 -1 -+BAABAgMEBAgJCgsEDA0ODwQQERITBAQ0NTY3BDg5OjsEPD0iIwQkJSYnBD8pKisELC0uLwQwMTIzBDQ1NjcEODk6OwQ8PT4/BEBFRkcESElKSwRMTUNPBFBRUlsEVFVWVwRYWVpbBFxNXl8EYGFiYwRkZWZnBGhpamsEbG0eHwQgISIjBCQlJicEKCkqKwQsLScvBICBgoME+oWGhwSIiYqLBDQ1NjcEODk9Pj8EQEFCQw== 0 -1 -+AgAAAhBiAgAAAhAiAQEBAgFXAhBiAgAAAhABAgFXAQECEGICAAACECIBVwEBAgFXAQEBAQIBVwAAAQ== 0 56 AgAAAhBiAgAAAhAiAQEBAgFXAhBiAgAAAhABAgFXAQECEGICAAACECIBVwEBAgFXAQEBAQIBVwA= 129 \000\000.\016b.\000\000.\016\".\001.\002.W.\016b.\000\000.\016\001.\001W.\001.\016b.\000\000.\016\".W.\001.\001W.\001.\001.\001W -+wMAAAcDAwMDANgMDAwMDAwMDA/oAAA== 16 5 AwMD+gA= 13 \003\003\250 diff --git a/glibc-rh168253-ns_name_pack-buffer-size.patch b/glibc-rh168253-ns_name_pack-buffer-size.patch deleted file mode 100644 index 341d742..0000000 --- a/glibc-rh168253-ns_name_pack-buffer-size.patch +++ /dev/null @@ -1,386 +0,0 @@ -commit c803cb9b24c6cea15698768e4301e963b98e742c -Author: Florian Weimer -Date: Thu Apr 13 11:56:28 2017 +0200 - - resolv: Support an exactly sized buffer in ns_name_pack [BZ #21359] - - This bug did not affect name resolution because those functions - indirectly call ns_name_pack with a buffer which is always larger - than the generated query packet, even in the case of the - longest-possible domain name. - -diff --git a/resolv/Makefile b/resolv/Makefile -index db287947a4f7e9a6..d41fd4603d7b7d77 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -44,6 +44,7 @@ tests += \ - tst-bug18665 \ - tst-bug18665-tcp \ - tst-ns_name \ -+ tst-ns_name_compress \ - tst-res_hconf_reorder \ - tst-res_use_inet6 \ - tst-resolv-basic \ -@@ -142,6 +143,7 @@ $(objpfx)tst-resolv-canonname: \ - - $(objpfx)tst-ns_name: $(objpfx)libresolv.so - $(objpfx)tst-ns_name.out: tst-ns_name.data -+$(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so - - - # This test case uses the deprecated RES_USE_INET6 resolver option. -diff --git a/resolv/ns_name.c b/resolv/ns_name.c -index 0d76fe53a6f2245f..08a75e2fe0b4edd6 100644 ---- a/resolv/ns_name.c -+++ b/resolv/ns_name.c -@@ -475,7 +475,7 @@ ns_name_pack(const u_char *src, u_char *dst, int dstsiz, - goto cleanup; - } - n = labellen(srcp); -- if (dstp + 1 + n >= eob) { -+ if (n + 1 > eob - dstp) { - goto cleanup; - } - memcpy(dstp, srcp, n + 1); -diff --git a/resolv/tst-ns_name.c b/resolv/tst-ns_name.c -index 66d9a6666b2ebde2..65eea4c827780826 100644 ---- a/resolv/tst-ns_name.c -+++ b/resolv/tst-ns_name.c -@@ -195,6 +195,7 @@ print_hex (const char *label, struct buffer buffer) - static void - run_test_case (struct test_case *t) - { -+ /* Test ns_name_unpack. */ - unsigned char *unpacked = xmalloc (NS_MAXCDNAME); - int consumed = ns_name_unpack - (t->input.data, t->input.data + t->input.length, -@@ -211,16 +212,19 @@ run_test_case (struct test_case *t) - } - if (consumed != -1) - { -- if (memcmp (unpacked, t->unpack_output.data, consumed) != 0) -+ if (memcmp (unpacked, t->unpack_output.data, -+ t->unpack_output.length) != 0) - { - support_record_failure (); - printf ("%s:%zu: error: wrong data from ns_name_unpack\n", - t->path, t->lineno); - print_hex ("expected:", t->unpack_output); -- print_hex ("actual: ", (struct buffer) { unpacked, consumed }); -+ print_hex ("actual: ", -+ (struct buffer) { unpacked, t->unpack_output.length }); - return; - } - -+ /* Test ns_name_ntop. */ - char *text = xmalloc (NS_MAXDNAME); - int ret = ns_name_ntop (unpacked, text, NS_MAXDNAME); - if (ret != t->ntop_result) -@@ -243,6 +247,137 @@ run_test_case (struct test_case *t) - printf (" actual: \"%s\"\n", text); - return; - } -+ -+ /* Test ns_name_pton. Unpacking does not check the -+ NS_MAXCDNAME limit, but packing does, so we need to -+ adjust the expected result. */ -+ int expected; -+ if (t->unpack_output.length > NS_MAXCDNAME) -+ expected = -1; -+ else if (strcmp (text, ".") == 0) -+ /* The root domain is fully qualified. */ -+ expected = 1; -+ else -+ /* The domain name is never fully qualified. */ -+ expected = 0; -+ unsigned char *repacked = xmalloc (NS_MAXCDNAME); -+ ret = ns_name_pton (text, repacked, NS_MAXCDNAME); -+ if (ret != expected) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong result from ns_name_pton\n" -+ " expected: %d\n" -+ " actual: %d\n", -+ t->path, t->lineno, expected, ret); -+ return; -+ } -+ if (ret >= 0 -+ && memcmp (repacked, unpacked, t->unpack_output.length) != 0) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong data from ns_name_pton\n", -+ t->path, t->lineno); -+ print_hex ("expected:", t->unpack_output); -+ print_hex ("actual: ", -+ (struct buffer) { repacked, t->unpack_output.length }); -+ return; -+ } -+ -+ /* Test ns_name_compress, no compression case. */ -+ if (t->unpack_output.length > NS_MAXCDNAME) -+ expected = -1; -+ else -+ expected = t->unpack_output.length; -+ memset (repacked, '$', NS_MAXCDNAME); -+ { -+ enum { ptr_count = 5 }; -+ const unsigned char *dnptrs[ptr_count] = { repacked, }; -+ ret = ns_name_compress (text, repacked, NS_MAXCDNAME, -+ dnptrs, dnptrs + ptr_count); -+ if (ret != expected) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong result from ns_name_compress\n" -+ " expected: %d\n" -+ " actual: %d\n", -+ t->path, t->lineno, expected, ret); -+ return; -+ } -+ if (ret < 0) -+ { -+ TEST_VERIFY (dnptrs[0] == repacked); -+ TEST_VERIFY (dnptrs[1] == NULL); -+ } -+ else -+ { -+ if (memcmp (repacked, unpacked, t->unpack_output.length) != 0) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong data from ns_name_compress\n", -+ t->path, t->lineno); -+ print_hex ("expected:", t->unpack_output); -+ print_hex ("actual: ", (struct buffer) { repacked, ret }); -+ return; -+ } -+ TEST_VERIFY (dnptrs[0] == repacked); -+ if (unpacked[0] == '\0') -+ /* The root domain is not a compression target. */ -+ TEST_VERIFY (dnptrs[1] == NULL); -+ else -+ { -+ TEST_VERIFY (dnptrs[1] == repacked); -+ TEST_VERIFY (dnptrs[2] == NULL); -+ } -+ } -+ } -+ -+ /* Test ns_name_compress, full compression case. Skip this -+ test for invalid names and the root domain. */ -+ if (expected >= 0 && unpacked[0] != '\0') -+ { -+ /* The destination buffer needs additional room for the -+ offset, the initial name, and the compression -+ reference. */ -+ enum { name_offset = 259 }; -+ size_t target_offset = name_offset + t->unpack_output.length; -+ size_t repacked_size = target_offset + 2; -+ repacked = xrealloc (repacked, repacked_size); -+ memset (repacked, '@', repacked_size); -+ memcpy (repacked + name_offset, -+ t->unpack_output.data, t->unpack_output.length); -+ enum { ptr_count = 5 }; -+ const unsigned char *dnptrs[ptr_count] -+ = { repacked, repacked + name_offset, }; -+ ret = ns_name_compress -+ (text, repacked + target_offset, NS_MAXCDNAME, -+ dnptrs, dnptrs + ptr_count); -+ if (ret != 2) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong result from ns_name_compress" -+ " (2)\n" -+ " expected: 2\n" -+ " actual: %d\n", -+ t->path, t->lineno, ret); -+ return; -+ } -+ if (memcmp (repacked + target_offset, "\xc1\x03", 2) != 0) -+ { -+ support_record_failure (); -+ printf ("%s:%zu: error: wrong data from ns_name_compress" -+ " (2)\n" -+ " expected: C103\n", -+ t->path, t->lineno); -+ print_hex ("actual: ", -+ (struct buffer) { repacked + target_offset, ret }); -+ return; -+ } -+ TEST_VERIFY (dnptrs[0] == repacked); -+ TEST_VERIFY (dnptrs[1] == repacked + name_offset); -+ TEST_VERIFY (dnptrs[2] == NULL); -+ } -+ -+ free (repacked); - } - free (text); - } -diff --git a/resolv/tst-ns_name_compress.c b/resolv/tst-ns_name_compress.c -new file mode 100644 -index 0000000000000000..300ba0bf8f0b3ad1 ---- /dev/null -+++ b/resolv/tst-ns_name_compress.c -@@ -0,0 +1,75 @@ -+/* Test ns_name_compress corner cases. -+ Copyright (C) 2017 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+/* Check that we can process names which fit into the destination -+ buffer exactly. See bug 21359. */ -+static void -+test_exact_fit (const char *name, size_t length) -+{ -+ unsigned char *buf = xmalloc (length + 1); -+ memset (buf, '$', length + 1); -+ enum { ptr_count = 5 }; -+ const unsigned char *dnptrs[ptr_count] = { buf, }; -+ int ret = ns_name_compress (name, buf, length, -+ dnptrs, dnptrs + ptr_count); -+ if (ret < 0) -+ { -+ support_record_failure (); -+ printf ("error: ns_name_compress for %s/%zu failed\n", name, length); -+ return; -+ } -+ if ((size_t) ret != length) -+ { -+ support_record_failure (); -+ printf ("error: ns_name_compress for %s/%zu result mismatch: %d\n", -+ name, length, ret); -+ } -+ if (buf[length] != '$') -+ { -+ support_record_failure (); -+ printf ("error: ns_name_compress for %s/%zu padding write\n", -+ name, length); -+ } -+ free (buf); -+} -+ -+static int -+do_test (void) -+{ -+ test_exact_fit ("abc", 5); -+ test_exact_fit ("abc.", 5); -+ { -+ char long_name[] -+ = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."; -+ TEST_VERIFY (strlen (long_name) == NS_MAXCDNAME - 1); -+ test_exact_fit (long_name, NS_MAXCDNAME); -+ long_name[sizeof (long_name) - 1] = '\0'; -+ test_exact_fit (long_name, NS_MAXCDNAME); -+ } -+ return 0; -+} -+ -+#include -diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c -index 94b1631121de01f3..f2b1fc7490430bce 100644 ---- a/resolv/tst-resolv-basic.c -+++ b/resolv/tst-resolv-basic.c -@@ -25,6 +25,12 @@ - #include - #include - -+#define LONG_NAME \ -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax." \ -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay." \ -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz." \ -+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaat" -+ - static void - response (const struct resolv_response_context *ctx, - struct resolv_response_builder *b, -@@ -43,13 +49,15 @@ response (const struct resolv_response_context *ctx, - qname_compare = qname + 2; - else - qname_compare = qname; -- enum {www, alias, nxdomain} requested_qname; -+ enum {www, alias, nxdomain, long_name} requested_qname; - if (strcmp (qname_compare, "www.example") == 0) - requested_qname = www; - else if (strcmp (qname_compare, "alias.example") == 0) - requested_qname = alias; - else if (strcmp (qname_compare, "nxdomain.example") == 0) - requested_qname = nxdomain; -+ else if (strcmp (qname_compare, LONG_NAME) == 0) -+ requested_qname = long_name; - else - { - support_record_failure (); -@@ -69,6 +77,7 @@ response (const struct resolv_response_context *ctx, - switch (requested_qname) - { - case www: -+ case long_name: - resolv_response_open_record (b, qname, qclass, qtype, 0); - break; - case alias: -@@ -209,6 +218,10 @@ do_test (void) - "name: www.example\n" - "alias: alias.example\n" - "address: 2001:db8::2\n"); -+ check_h (LONG_NAME, AF_INET, -+ "name: " LONG_NAME "\n" -+ "address: 192.0.2.20\n"); -+ - check_ai ("www.example", "80", AF_UNSPEC, - "address: STREAM/TCP 192.0.2.17 80\n" - "address: DGRAM/UDP 192.0.2.17 80\n" -@@ -223,6 +236,13 @@ do_test (void) - "address: STREAM/TCP 2001:db8::2 80\n" - "address: DGRAM/UDP 2001:db8::2 80\n" - "address: RAW/IP 2001:db8::2 80\n"); -+ check_ai (LONG_NAME, "80", AF_UNSPEC, -+ "address: STREAM/TCP 192.0.2.20 80\n" -+ "address: DGRAM/UDP 192.0.2.20 80\n" -+ "address: RAW/IP 192.0.2.20 80\n" -+ "address: STREAM/TCP 2001:db8::4 80\n" -+ "address: DGRAM/UDP 2001:db8::4 80\n" -+ "address: RAW/IP 2001:db8::4 80\n"); - check_ai ("www.example", "80", AF_INET, - "address: STREAM/TCP 192.0.2.17 80\n" - "address: DGRAM/UDP 192.0.2.17 80\n" -@@ -231,6 +251,10 @@ do_test (void) - "address: STREAM/TCP 192.0.2.18 80\n" - "address: DGRAM/UDP 192.0.2.18 80\n" - "address: RAW/IP 192.0.2.18 80\n"); -+ check_ai (LONG_NAME, "80", AF_INET, -+ "address: STREAM/TCP 192.0.2.20 80\n" -+ "address: DGRAM/UDP 192.0.2.20 80\n" -+ "address: RAW/IP 192.0.2.20 80\n"); - check_ai ("www.example", "80", AF_INET6, - "address: STREAM/TCP 2001:db8::1 80\n" - "address: DGRAM/UDP 2001:db8::1 80\n" -@@ -239,6 +263,10 @@ do_test (void) - "address: STREAM/TCP 2001:db8::2 80\n" - "address: DGRAM/UDP 2001:db8::2 80\n" - "address: RAW/IP 2001:db8::2 80\n"); -+ check_ai (LONG_NAME, "80", AF_INET6, -+ "address: STREAM/TCP 2001:db8::4 80\n" -+ "address: DGRAM/UDP 2001:db8::4 80\n" -+ "address: RAW/IP 2001:db8::4 80\n"); - - check_h ("t.www.example", AF_INET, - "name: t.www.example\n" diff --git a/glibc-rh168253-resolv-tests-nondeterministic.patch b/glibc-rh168253-resolv-tests-nondeterministic.patch index 3718441..40c8e33 100644 --- a/glibc-rh168253-resolv-tests-nondeterministic.patch +++ b/glibc-rh168253-resolv-tests-nondeterministic.patch @@ -5,89 +5,12 @@ Date: Thu Jul 6 14:03:39 2017 +0200 resolv: Deal with non-deterministic address order in tst-resolv-basic diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c -index 3dfa1657f50ab588..64eedbbd81d58d95 100644 +index 95aea1bcfb266017..66a0e8a1659219b4 100644 --- a/resolv/tst-resolv-basic.c +++ b/resolv/tst-resolv-basic.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -204,6 +205,68 @@ check_ai (const char *name, const char *service, - expected); - } - -+/* Test for bug 21295: getaddrinfo used to discard address information -+ instead of merging it. */ -+static void -+test_bug_21295 (void) -+{ -+ /* The address order is unpredictable. There are two factors which -+ contribute to that: The stub resolver does not perform proper -+ response matching for A/AAAA queries (an A response could be -+ associated with an AAAA query and vice versa), and without -+ namespaces, system configuration could affect address -+ ordering. */ -+ for (int do_tcp = 0; do_tcp < 2; ++do_tcp) -+ { -+ const struct addrinfo hints = -+ { -+ .ai_family = AF_INET6, -+ .ai_socktype = SOCK_STREAM, -+ .ai_flags = AI_V4MAPPED | AI_ALL, -+ }; -+ const char *qname; -+ if (do_tcp) -+ qname = "t.www.example"; -+ else -+ qname = "www.example"; -+ struct addrinfo *ai = NULL; -+ int ret = getaddrinfo (qname, "80", &hints, &ai); -+ TEST_VERIFY_EXIT (ret == 0); -+ -+ const char *expected_a; -+ const char *expected_b; -+ if (do_tcp) -+ { -+ expected_a = "flags: AI_V4MAPPED AI_ALL\n" -+ "address: STREAM/TCP 2001:db8::3 80\n" -+ "address: STREAM/TCP ::ffff:192.0.2.19 80\n"; -+ expected_b = "flags: AI_V4MAPPED AI_ALL\n" -+ "address: STREAM/TCP ::ffff:192.0.2.19 80\n" -+ "address: STREAM/TCP 2001:db8::3 80\n"; -+ } -+ else -+ { -+ expected_a = "flags: AI_V4MAPPED AI_ALL\n" -+ "address: STREAM/TCP 2001:db8::1 80\n" -+ "address: STREAM/TCP ::ffff:192.0.2.17 80\n"; -+ expected_b = "flags: AI_V4MAPPED AI_ALL\n" -+ "address: STREAM/TCP ::ffff:192.0.2.17 80\n" -+ "address: STREAM/TCP 2001:db8::1 80\n"; -+ } -+ -+ char *actual = support_format_addrinfo (ai, ret); -+ if (!(strcmp (actual, expected_a) == 0 -+ || strcmp (actual, expected_b) == 0)) -+ { -+ support_record_failure (); -+ printf ("error: %s: unexpected response (TCP: %d):\n%s\n", -+ __func__, do_tcp, actual); -+ } -+ free (actual); -+ freeaddrinfo (ai); -+ } -+} -+ - static int - do_test (void) - { -@@ -398,21 +461,7 @@ do_test (void) - check_ai ("t.nxdomain.example", "80", AF_INET6, - "error: Name or service not known\n"); +@@ -495,22 +495,6 @@ do_test (void) + test_bug_21295 (); + test_nodata_nxdomain (); - /* Test for bug 21295. */ - check_ai_hints ("www.example", "80", @@ -104,7 +27,7 @@ index 3dfa1657f50ab588..64eedbbd81d58d95 100644 - "flags: AI_V4MAPPED AI_ALL\n" - "address: STREAM/TCP 2001:db8::3 80\n" - "address: STREAM/TCP ::ffff:192.0.2.19 80\n"); -+ test_bug_21295 (); - +- resolv_test_end (aux); + return 0; diff --git a/glibc-rh168253-struct-resolv_context.patch b/glibc-rh168253-struct-resolv_context.patch index c9cc6d7..b118e6c 100644 --- a/glibc-rh168253-struct-resolv_context.patch +++ b/glibc-rh168253-struct-resolv_context.patch @@ -3,14 +3,14 @@ Author: Florian Weimer Date: Fri Jun 30 21:10:23 2017 +0200 resolv: Introduce struct resolv_context [BZ #21668] - + struct resolv_context objects provide a temporary resolver context which does not change during a name lookup operation. Only when the outmost context is created, the stub resolver configuration is verified to be current (at present, only against previous res_init calls). Subsequent attempts to obtain the context will reuse the result of the initial verification operation. - + struct resolv_context can also be extended in the future to store data which needs to be deallocated during thread cancellation. @@ -419,7 +419,7 @@ index f3e756b68448f6ea..bd3fbcb08250c61c 100644 struct hostent *resbuf, char **buffer, size_t *buffer_size, size_t buflen, diff --git a/resolv/Makefile b/resolv/Makefile -index 79843d0d7ca92ffd..7f5e07d618297f60 100644 +index aafb1c5efab6d685..499f7692f1534aae 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -28,7 +28,8 @@ headers := resolv.h \ @@ -2216,7 +2216,7 @@ index 0000000000000000..27c8d56b36104521 + +#endif /* _RESOLV_CONTEXT_H */ diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 4fb1eaef79bc66a3..efa7118498990073 100644 +index 284311011c84b971..b837939b9a02a1be 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -60,6 +60,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @@ -2228,19 +2228,19 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 #include #include #include -@@ -266,7 +268,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - if (herrno == NETDB_INTERNAL) \ +@@ -252,7 +254,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + break; \ + if (!scratch_buffer_grow (tmpbuf)) \ { \ - __set_h_errno (herrno); \ - _res.options |= old_res_options & DEPRECATED_RES_USE_INET6; \ + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ -+ __resolv_context_put (res_ctx); \ - result = -EAI_SYSTEM; \ ++ __resolv_context_put (res_ctx); \ + result = -EAI_MEMORY; \ goto free_and_return; \ } \ -@@ -279,7 +282,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, +@@ -262,7 +265,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, { \ - if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \ + if (h_errno == NETDB_INTERNAL) \ { \ - _res.options |= old_res_options & DEPRECATED_RES_USE_INET6; \ + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ @@ -2248,7 +2248,17 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 result = -EAI_SYSTEM; \ goto free_and_return; \ } \ -@@ -582,7 +586,8 @@ gaih_inet (const char *name, const struct gaih_service *service, +@@ -275,7 +279,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + { \ + if (!convert_hostent_to_gaih_addrtuple (req, _family, &th, &addrmem)) \ + { \ +- _res.options |= old_res_options & DEPRECATED_RES_USE_INET6; \ ++ __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ ++ __resolv_context_put (res_ctx); \ + result = -EAI_SYSTEM; \ + goto free_and_return; \ + } \ +@@ -572,7 +577,8 @@ gaih_inet (const char *name, const struct gaih_service *service, enum nss_status inet6_status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL; int no_more; @@ -2258,7 +2268,7 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 /* If we do not have to look for IPv6 addresses or the canonical name, use the simple, old functions, which do not support -@@ -765,16 +770,14 @@ gaih_inet (const char *name, const struct gaih_service *service, +@@ -758,16 +764,14 @@ gaih_inet (const char *name, const struct gaih_service *service, no_more = 0; nip = __nss_hosts_database; @@ -2281,7 +2291,7 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 while (!no_more) { -@@ -811,8 +814,9 @@ gaih_inet (const char *name, const struct gaih_service *service, +@@ -801,8 +805,9 @@ gaih_inet (const char *name, const struct gaih_service *service, if (!scratch_buffer_grow (tmpbuf)) { @@ -2293,7 +2303,7 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 result = -EAI_MEMORY; goto free_and_return; } -@@ -911,9 +915,9 @@ gaih_inet (const char *name, const struct gaih_service *service, +@@ -901,9 +906,9 @@ gaih_inet (const char *name, const struct gaih_service *service, canonbuf = getcanonname (nip, at, name); if (canonbuf == NULL) { @@ -2306,7 +2316,7 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 result = -EAI_MEMORY; goto free_and_return; } -@@ -953,7 +957,8 @@ gaih_inet (const char *name, const struct gaih_service *service, +@@ -947,7 +952,8 @@ gaih_inet (const char *name, const struct gaih_service *service, nip = nip->next; } @@ -2314,5 +2324,5 @@ index 4fb1eaef79bc66a3..efa7118498990073 100644 + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); + __resolv_context_put (res_ctx); - if (h_errno == NETDB_INTERNAL) - { + /* If we have a failure which sets errno, report it using + EAI_SYSTEM. */ diff --git a/glibc.spec b/glibc.spec index c17eb92..d5e0dbb 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,6 +1,6 @@ -%define glibcsrcdir glibc-2.25-57-g595f287ae0 +%define glibcsrcdir glibc-2.25-123-gedcf13e25c %define glibcversion 2.25 -%define glibcrelease 12%{?dist} +%define glibcrelease 13%{?dist} # Pre-release tarballs are pulled in from git using a command that is # effectively: # @@ -280,6 +280,7 @@ Patch2036: glibc-gcc-PR69537.patch # extend_alloca removal, BZ 18023 Patch2037: glibc-rh1315108.patch +Patch2038: glibc-rh1315108-glob.patch # Upstream BZ 20313 Patch2110: glibc-rh1351108-update-to-unicode-9.0.0.patch @@ -292,33 +293,18 @@ Patch62: glibc-nss_compat.patch Patch63: glibc-rh1416405.patch Patch64: glibc-bits-types-res_state.patch Patch69: glibc-libc_diag.patch -Patch70: glibc-libc-pointer-arith.patch -Patch71: glibc-dynarray-1.patch -Patch72: glibc-dynarray-2.patch -Patch73: glibc-dynarray-3.patch -Patch74: glibc-dynarray-4.patch -Patch75: glibc-dynarray-5.patch -Patch76: glibc-alloc_buffer-1.patch Patch77: glibc-alloc_buffer-2.patch -Patch78: glibc-rh168253-ns_name-tests.patch Patch79: glibc-rh168253-network-dn_expand-cleanup.patch Patch80: glibc-rh168253-nss_dns-declaration-cleanup.patch Patch81: glibc-rh168253-tst-resolv-canonname.patch Patch82: glibc-rh168253-remove-iquery.patch Patch83: glibc-rh168253-resolv-h-definitions-cleanup.patch -Patch84: glibc-rh168253-ns_name_pack-buffer-size.patch Patch85: glibc-rh168253-remove-ends-fallback.patch Patch86: glibc-rh168253-sock_cloexec.patch Patch87: glibc-rh168253-builtin_expect.patch Patch88: glibc-rh168253-builtin_expect-fixup.patch Patch89: glibc-rh168253-res_dflretry.patch -Patch90: glibc-rh168253-getaddrinfo-malloc-address-list.patch -Patch91: glibc-rh168253-ai_canonname-tests.patch -Patch92: glibc-rh168253-inet_pton-gnu-style.patch -Patch93: glibc-rh168253-getaddrinfo-malloc-canonname.patch Patch94: glibc-rh168253-res_init-tests.patch -Patch95: glibc-rh168253-getaddrinfo-malloc-canonname-strdup-1.patch -Patch96: glibc-rh168253-getaddrinfo-malloc-canonname-strdup-2.patch Patch97: glibc-rh168253-getaddrinfo-malloc-canonname-strdup-3.patch Patch98: glibc-rh168253-res_vinit-hidden.patch Patch99: glibc-rh168253-res_randomid-reorg.patch @@ -330,12 +316,10 @@ Patch104: glibc-rh168253-res_vinit-check-allocations.patch Patch105: glibc-rh168253-res_vinit_1-getline.patch Patch106: glibc-rh168253-tst-inet6_scopeid_pton-getaddrinfo.patch Patch107: glibc-rh168253-inet_pton_length.patch -Patch108: glibc-rh168253-getaddrinfo-inet_pton_length.patch Patch109: glibc-rh168253-inet6_scopeid_pton-node-local.patch Patch110: glibc-rh168253-__res_initstamp-cleanup.patch Patch111: glibc-rh168253-res_libc-gnu-style.patch Patch112: glibc-rh168253-inet_pton-leading-zeros.patch -Patch113: glibc-rh168253-getaddrinfo-merge-ipv6-ipv4-addresses.patch Patch114: glibc-rh168253-getaddrinfo-tests-bug21295.patch Patch115: glibc-rh168253-_-res_vinit-_res_hconf_init.patch Patch116: glibc-rh168253-resolv-tests-timeout.patch @@ -365,14 +349,6 @@ Patch139: glibc-rh168253-resolv_conf-_res-matching.patch Patch140: glibc-rh168253-support_chroot.patch Patch141: glibc-rh168253-resolv-tests-no-patching.patch Patch142: glibc-rh168253-resolv-tests-nondeterministic.patch -Patch143: glibc-rh168253-getaddrinfo-gethosts-res-ctx-release.patch -Patch144: glibc-rh168253-getaddrinfo-gaih_inet-unreachable-return.patch -Patch145: glibc-rh168253-getaddrinfo-errno.patch -Patch146: glibc-rh168253-getaddrinfo-h_errno.patch -Patch147: glibc-rh168253-getaddrinfo-errno-nss-failure.patch -Patch148: glibc-rh168253-getaddrinfo-h_errno-no-success.patch -Patch149: glibc-rh168253-getaddrinfo-no_data.patch -Patch150: glibc-rh168253-getaddrinfo-gethosts-error-handling.patch Patch151: glibc-rh168253-tst-res_use_inet6-mapping.patch Patch152: glibc-rh168253-nss_dns-dead-code.patch Patch153: glibc-rh168253-resolv-oom-memory-leak.patch @@ -969,6 +945,7 @@ microbenchmark tests on the system. %patch0060 -p1 %patch2036 -p1 %patch2037 -p1 +%patch2038 -p1 %patch2110 -p1 %patch2112 -p1 %patch61 -p1 @@ -976,33 +953,18 @@ microbenchmark tests on the system. %patch63 -p1 %patch64 -p1 %patch69 -p1 -%patch70 -p1 -%patch71 -p1 -%patch72 -p1 -%patch73 -p1 -%patch74 -p1 -%patch75 -p1 -%patch76 -p1 %patch77 -p1 -%patch78 -p1 %patch79 -p1 %patch80 -p1 %patch81 -p1 %patch82 -p1 %patch83 -p1 -%patch84 -p1 %patch85 -p1 %patch86 -p1 %patch87 -p1 %patch88 -p1 %patch89 -p1 -%patch90 -p1 -%patch91 -p1 -%patch92 -p1 -%patch93 -p1 %patch94 -p1 -%patch95 -p1 -%patch96 -p1 %patch97 -p1 %patch98 -p1 %patch99 -p1 @@ -1014,12 +976,10 @@ microbenchmark tests on the system. %patch105 -p1 %patch106 -p1 %patch107 -p1 -%patch108 -p1 %patch109 -p1 %patch110 -p1 %patch111 -p1 %patch112 -p1 -%patch113 -p1 %patch114 -p1 %patch115 -p1 %patch116 -p1 @@ -1049,14 +1009,6 @@ microbenchmark tests on the system. %patch140 -p1 %patch141 -p1 %patch142 -p1 -%patch143 -p1 -%patch144 -p1 -%patch145 -p1 -%patch146 -p1 -%patch147 -p1 -%patch148 -p1 -%patch149 -p1 -%patch150 -p1 %patch151 -p1 %patch152 -p1 %patch153 -p1 @@ -2463,6 +2415,23 @@ rm -f *.filelist* %endif %changelog +* Wed Jan 17 2018 Florian Weimer - 2.25-13 +- PTHREAD_STACK_MIN is too small on x86-64 (#1527887) +- CVE-2018-1000001: Make getcwd fail if it cannot obtain an absolute path + (#1533837) +- CVE-2017-16997: Check for empty tokens before dynamic string token + expansion in the dynamic linker (#1526866) +- CVE-2017-15804: glob: Fix overflow in GLOB_TILDE unescaping (swbz#22332) +- CVE-2017-15670: glob: Fix one-byte overflow (#1504807) +- CVE-2017-15671: glob: Fix memory leak (#1504807) +- Auto-sync with upstream branch release/2.25/master, + commit edcf13e25c1559558a6f12ff5a71d4136a39235e: +- nss_files: Avoid large buffers with many host addresses (swbz#22078) +- nss_files: Use struct scratch_buffer for gethostbyname (swbz#18023) +- posix: Fix improper assert in Linux posix_spawn (BZ#22273) +- Don't use IFUNC resolver for longjmp or system in libpthread (swbz#21041) +- x86-64: Use fxsave/xsave/xsavec in _dl_runtime_resolve (swbz#21265) + * Wed Oct 11 2017 Florian Weimer - 2.25-12 - Support an arbitrary number of search domains (#168253) - Detect and apply /etc/resolv.conf changes in libresolv (#1374239) diff --git a/sources b/sources index 8875ed5..a19d37a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (glibc-2.25-57-g595f287ae0.tar.gz) = f295af48509b10c76f962e708248492728615fab57c60ae1a6fc404b0f1127be676d9b067d7f825cb1fcbea348a627b97046551dfd4faa12e57ff8c07c082a73 +SHA512 (glibc-2.25-123-gedcf13e25c.tar.gz) = b9eb5ae4c2f1f26d5bc9a21e2f59e700cf5a3fe01501e19c5da762e92e493fd0da9476536b4e0724cb0751cb0cb6884d91a26c4a6a2c32a4d1154f5a30f4dbea