HDF_BUILD_FORTRAN = ${HDF5_BUILD_FORTRAN}
From 0de523bc42b712fca54f209c554477faea3c37d3 Mon Sep 17 00:00:00 2001
From: Dana Robinson <43805+derobins@users.noreply.github.com>
Date: Sun, 7 Apr 2024 14:09:23 -0700
Subject: [PATCH 4/8] Remove HD macros for C time functions (#4337)
* HDasctime
* HDclock
* HDctime
* HDdifftime
* HDgmtime
* HDlocaltime
* HDmktime
* HDtime
* HDtzset
HDgettimeofday will be done later
---
src/H5Clog_json.c | 44 +++++++++++++++---------------
src/H5Dmpio.c | 4 +--
src/H5FDcore.c | 8 +++---
src/H5FDlog.c | 8 +++---
src/H5FDonion.c | 4 +--
src/H5FDs3comms.c | 4 +--
src/H5FDsec2.c | 8 +++---
src/H5Odbg.c | 8 +++---
src/H5Omtime.c | 4 +--
src/H5private.h | 27 ------------------
src/H5system.c | 6 ++--
src/H5timer.c | 6 ++--
test/API/H5_api_test.c | 2 +-
test/accum.c | 2 +-
test/app_ref.c | 2 +-
test/big.c | 2 +-
test/btree2.c | 6 ++--
test/cmpd_dset.c | 2 +-
test/dsets.c | 2 +-
test/dt_arith.c | 2 +-
test/dtypes.c | 2 +-
test/earray.c | 2 +-
test/farray.c | 2 +-
test/fheap.c | 6 ++--
test/h5test.c | 6 ++--
test/hyperslab.c | 2 +-
test/istore.c | 2 +-
test/links.c | 8 +++---
test/mdset.c | 2 +-
test/mtime.c | 8 +++---
test/set_extent.c | 2 +-
test/swmr_reader.c | 4 +--
test/swmr_remove_reader.c | 4 +--
test/swmr_sparse_reader.c | 4 +--
test/tid.c | 2 +-
test/tselect.c | 18 +++++-------
test/tskiplist.c | 2 +-
test/ttime.c | 4 +--
test/tunicode.c | 2 +-
test/unlink.c | 2 +-
test/vds_swmr_writer.c | 4 +--
testpar/API/H5_api_test_parallel.c | 2 +-
testpar/t_pmulti_dset.c | 2 +-
tools/src/h5ls/h5ls.c | 4 +--
44 files changed, 108 insertions(+), 139 deletions(-)
diff --git a/src/H5Clog_json.c b/src/H5Clog_json.c
index 548e7b83d2e..371d48752c9 100644
--- a/src/H5Clog_json.c
+++ b/src/H5Clog_json.c
@@ -339,7 +339,7 @@ H5C__json_write_start_log_msg(void *udata)
\"action\":\"logging start\"\
},\n\
",
- (long long)HDtime(NULL));
+ (long long)time(NULL));
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -378,7 +378,7 @@ H5C__json_write_stop_log_msg(void *udata)
}\n\
]}\n\
",
- (long long)HDtime(NULL));
+ (long long)time(NULL));
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -417,7 +417,7 @@ H5C__json_write_create_cache_log_msg(void *udata, herr_t fxn_ret_value)
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (int)fxn_ret_value);
+ (long long)time(NULL), (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -455,7 +455,7 @@ H5C__json_write_destroy_cache_log_msg(void *udata)
\"action\":\"destroy\"\
},\n\
",
- (long long)HDtime(NULL));
+ (long long)time(NULL));
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -494,7 +494,7 @@ H5C__json_write_evict_cache_log_msg(void *udata, herr_t fxn_ret_value)
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (int)fxn_ret_value);
+ (long long)time(NULL), (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -535,7 +535,7 @@ H5C__json_write_expunge_entry_log_msg(void *udata, haddr_t address, int type_id,
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)address, (int)type_id, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)address, (int)type_id, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -574,7 +574,7 @@ H5C__json_write_flush_cache_log_msg(void *udata, herr_t fxn_ret_value)
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (int)fxn_ret_value);
+ (long long)time(NULL), (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -618,7 +618,7 @@ H5C__json_write_insert_entry_log_msg(void *udata, haddr_t address, int type_id,
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -659,7 +659,7 @@ H5C__json_write_mark_entry_dirty_log_msg(void *udata, const H5C_cache_entry_t *e
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -700,7 +700,7 @@ H5C__json_write_mark_entry_clean_log_msg(void *udata, const H5C_cache_entry_t *e
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -742,7 +742,7 @@ H5C__json_write_mark_unserialized_entry_log_msg(void *udata, const H5C_cache_ent
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -784,7 +784,7 @@ H5C__json_write_mark_serialized_entry_log_msg(void *udata, const H5C_cache_entry
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -827,7 +827,7 @@ H5C__json_write_move_entry_log_msg(void *udata, haddr_t old_addr, haddr_t new_ad
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)old_addr, (unsigned long)new_addr, type_id,
+ (long long)time(NULL), (unsigned long)old_addr, (unsigned long)new_addr, type_id,
(int)fxn_ret_value);
/* Write the log message to the file */
@@ -869,7 +869,7 @@ H5C__json_write_pin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, h
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -914,7 +914,7 @@ H5C__json_write_create_fd_log_msg(void *udata, const H5C_cache_entry_t *parent,
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
+ (long long)time(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
(int)fxn_ret_value);
/* Write the log message to the file */
@@ -966,7 +966,7 @@ H5C__json_write_protect_entry_log_msg(void *udata, const H5C_cache_entry_t *entr
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, type_id, rw_s, (int)entry->size,
+ (long long)time(NULL), (unsigned long)entry->addr, type_id, rw_s, (int)entry->size,
(int)fxn_ret_value);
/* Write the log message to the file */
@@ -1010,7 +1010,7 @@ H5C__json_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)new_size, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)new_size, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -1051,7 +1051,7 @@ H5C__json_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry,
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -1096,7 +1096,7 @@ H5C__json_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent,
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
+ (long long)time(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
(int)fxn_ret_value);
/* Write the log message to the file */
@@ -1140,7 +1140,7 @@ H5C__json_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_i
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)address, type_id, flags, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)address, type_id, flags, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -1181,7 +1181,7 @@ H5C__json_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (int)fxn_ret_value);
+ (long long)time(NULL), (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
@@ -1222,7 +1222,7 @@ H5C__json_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry
\"returned\":%d\
},\n\
",
- (long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+ (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
/* Write the log message to the file */
if (H5C__json_write_log_message(json_udata) < 0)
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c
index 307629f7718..84a0f25356f 100644
--- a/src/H5Dmpio.c
+++ b/src/H5Dmpio.c
@@ -1184,8 +1184,8 @@ H5D__piece_io(H5D_io_info_t *io_info)
HGOTO_ERROR(H5E_IO, H5E_OPENERROR, FAIL, "couldn't open debugging log file");
/* Print a short header for this I/O operation */
- time_now = HDtime(NULL);
- fprintf(debug_log_file, "##### %s", HDasctime(HDlocaltime(&time_now)));
+ time_now = time(NULL);
+ fprintf(debug_log_file, "##### %s", asctime(localtime(&time_now)));
debug_stream = debug_log_file;
}
diff --git a/src/H5FDcore.c b/src/H5FDcore.c
index c74ef5ed28a..f6967e3e3be 100644
--- a/src/H5FDcore.c
+++ b/src/H5FDcore.c
@@ -391,7 +391,7 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
if (-1 == bytes_wrote) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -399,7 +399,7 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
"write to backing store failed: time = %s, filename = '%s', file descriptor = %d, "
"errno = %d, error message = '%s', ptr = %p, total write size = %llu, bytes this "
"sub-write = %llu, bytes actually written = %llu, offset = %llu",
- HDctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno), (void *)ptr,
+ ctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno), (void *)ptr,
(unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_wrote, (unsigned long long)offset);
} /* end if */
@@ -900,7 +900,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
if (-1 == bytes_read) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -909,7 +909,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
"error message = '%s', file->mem = %p, total read size = %llu, bytes this "
"sub-read = %llu, bytes actually read = %llu, offset = %llu",
- HDctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno),
+ ctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno),
(void *)file->mem, (unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_read, (unsigned long long)offset);
} /* end if */
diff --git a/src/H5FDlog.c b/src/H5FDlog.c
index 677382552e8..c85a6725ec9 100644
--- a/src/H5FDlog.c
+++ b/src/H5FDlog.c
@@ -1228,7 +1228,7 @@ H5FD__log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
if (-1 == bytes_read) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -1240,7 +1240,7 @@ H5FD__log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
"error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, "
"bytes actually read = %llu, offset = %llu",
- HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
+ ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
(unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_read, (unsigned long long)offset);
}
@@ -1447,7 +1447,7 @@ H5FD__log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, ha
if (-1 == bytes_wrote) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -1459,7 +1459,7 @@ H5FD__log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, ha
"file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
"error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = "
"%llu, bytes actually written = %llu, offset = %llu",
- HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
+ ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
(unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_wrote, (unsigned long long)offset);
} /* end if */
diff --git a/src/H5FDonion.c b/src/H5FDonion.c
index 65b7fa51dd8..516295bad5d 100644
--- a/src/H5FDonion.c
+++ b/src/H5FDonion.c
@@ -462,8 +462,8 @@ H5FD__onion_commit_new_revision_record(H5FD_onion_t *file)
FUNC_ENTER_PACKAGE
- HDtime(&rawtime);
- info = HDgmtime(&rawtime);
+ time(&rawtime);
+ info = gmtime(&rawtime);
strftime(rec->time_of_creation, sizeof(rec->time_of_creation), "%Y%m%dT%H%M%SZ", info);
rec->logical_eof = file->logical_eof;
diff --git a/src/H5FDs3comms.c b/src/H5FDs3comms.c
index 2b7b5419c61..f5be8f42f97 100644
--- a/src/H5FDs3comms.c
+++ b/src/H5FDs3comms.c
@@ -1598,8 +1598,8 @@ gmnow(void)
struct tm *ret_value = NULL;
/* Doctor assert, checks against error in time() */
- if ((time_t)(-1) != HDtime(now_ptr))
- ret_value = HDgmtime(now_ptr);
+ if ((time_t)(-1) != time(now_ptr))
+ ret_value = gmtime(now_ptr);
assert(ret_value != NULL);
diff --git a/src/H5FDsec2.c b/src/H5FDsec2.c
index 274a8ad3462..01a4bfd235e 100644
--- a/src/H5FDsec2.c
+++ b/src/H5FDsec2.c
@@ -695,7 +695,7 @@ H5FD__sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
if (-1 == bytes_read) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -703,7 +703,7 @@ H5FD__sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
"error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, "
"bytes actually read = %llu, offset = %llu",
- HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
+ ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
(unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_read, (unsigned long long)offset);
} /* end if */
@@ -801,7 +801,7 @@ H5FD__sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
if (-1 == bytes_wrote) { /* error */
int myerrno = errno;
- time_t mytime = HDtime(NULL);
+ time_t mytime = time(NULL);
offset = HDlseek(file->fd, 0, SEEK_CUR);
@@ -809,7 +809,7 @@ H5FD__sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
"file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
"error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = "
"%llu, bytes actually written = %llu, offset = %llu",
- HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
+ ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
(unsigned long long)size, (unsigned long long)bytes_in,
(unsigned long long)bytes_wrote, (unsigned long long)offset);
} /* end if */
diff --git a/src/H5Odbg.c b/src/H5Odbg.c
index dfc8e878d8f..78bace66392 100644
--- a/src/H5Odbg.c
+++ b/src/H5Odbg.c
@@ -307,16 +307,16 @@ H5O__debug_real(H5F_t *f, H5O_t *oh, haddr_t addr, FILE *stream, int indent, int
char buf[128]; /* Buffer for formatting time info */
/* Time fields */
- tm = HDlocaltime(&oh->atime);
+ tm = localtime(&oh->atime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Access Time:", buf);
- tm = HDlocaltime(&oh->mtime);
+ tm = localtime(&oh->mtime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Modification Time:", buf);
- tm = HDlocaltime(&oh->ctime);
+ tm = localtime(&oh->ctime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Change Time:", buf);
- tm = HDlocaltime(&oh->btime);
+ tm = localtime(&oh->btime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Birth Time:", buf);
} /* end if */
diff --git a/src/H5Omtime.c b/src/H5Omtime.c
index cd7fba4c05f..66f8d1bf4d4 100644
--- a/src/H5Omtime.c
+++ b/src/H5Omtime.c
@@ -271,7 +271,7 @@ H5O__mtime_encode(H5F_t H5_ATTR_UNUSED *f, bool H5_ATTR_UNUSED disable_shared, s
assert(mesg);
/* encode */
- tm = HDgmtime(mesg);
+ tm = gmtime(mesg);
snprintf((char *)p, p_size, "%04d%02d%02d%02d%02d%02d", 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
@@ -415,7 +415,7 @@ H5O__mtime_debug(H5F_t H5_ATTR_UNUSED *f, const void *_mesg, FILE *stream, int i
assert(fwidth >= 0);
/* debug */
- tm = HDlocaltime(mesg);
+ tm = localtime(mesg);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Time:", buf);
diff --git a/src/H5private.h b/src/H5private.h
index 904aa9f3652..e0148f43d70 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -685,15 +685,9 @@ typedef off_t h5_stat_size_t;
#ifndef HDaccess
#define HDaccess(F, M) access(F, M)
#endif
-#ifndef HDasctime
-#define HDasctime(T) asctime(T)
-#endif
#ifndef HDchdir
#define HDchdir(S) chdir(S)
#endif
-#ifndef HDclock
-#define HDclock() clock()
-#endif
#ifndef HDclose
#define HDclose(F) close(F)
#endif
@@ -703,12 +697,6 @@ typedef off_t h5_stat_size_t;
#ifndef HDcreat
#define HDcreat(S, M) creat(S, M)
#endif
-#ifndef HDctime
-#define HDctime(T) ctime(T)
-#endif
-#ifndef HDdifftime
-#define HDdifftime(X, Y) difftime(X, Y)
-#endif
#ifndef HDfdopen
#define HDfdopen(N, S) fdopen(N, S)
#endif
@@ -771,15 +759,9 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
#ifndef HDgettimeofday
#define HDgettimeofday(S, P) gettimeofday(S, P)
#endif
-#ifndef HDgmtime
-#define HDgmtime(T) gmtime(T)
-#endif
#ifndef HDisatty
#define HDisatty(F) isatty(F)
#endif
-#ifndef HDlocaltime
-#define HDlocaltime(T) localtime(T)
-#endif
#ifndef HDlseek
#define HDlseek(F, O, W) lseek(F, O, W)
#endif
@@ -789,9 +771,6 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
#ifndef HDmkdir
#define HDmkdir(S, M) mkdir(S, M)
#endif
-#ifndef HDmktime
-#define HDmktime(T) mktime(T)
-#endif
#ifndef HDnanosleep
#define HDnanosleep(N, O) nanosleep(N, O)
#endif
@@ -911,9 +890,6 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
#ifndef HDstrtok_r
#define HDstrtok_r(X, Y, Z) strtok_r(X, Y, Z)
#endif
-#ifndef HDtime
-#define HDtime(T) time(T)
-#endif
#ifndef HDtmpfile
#define HDtmpfile() tmpfile()
#endif
@@ -923,9 +899,6 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
#ifndef HDtoupper
#define HDtoupper(C) toupper(C)
#endif
-#ifndef HDtzset
-#define HDtzset() tzset()
-#endif
#ifndef HDunlink
#define HDunlink(S) unlink(S)
#endif
diff --git a/src/H5system.c b/src/H5system.c
index 7c540e5bf6b..1379fa7dc95 100644
--- a/src/H5system.c
+++ b/src/H5system.c
@@ -223,12 +223,12 @@ H5_make_time(struct tm *tm)
/* Initialize timezone information */
if (!H5_ntzset) {
- HDtzset();
+ tzset();
H5_ntzset = true;
- } /* end if */
+ }
/* Perform base conversion */
- if ((time_t)-1 == (the_time = HDmktime(tm)))
+ if ((time_t)-1 == (the_time = mktime(tm)))
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCONVERT, FAIL, "badly formatted modification time message");
/* Adjust for timezones */
diff --git a/src/H5timer.c b/src/H5timer.c
index ac04d157fe9..badbc659213 100644
--- a/src/H5timer.c
+++ b/src/H5timer.c
@@ -156,7 +156,7 @@ H5_now(void)
now = now_tv.tv_sec;
}
#else /* H5_HAVE_GETTIMEOFDAY */
- now = HDtime(NULL);
+ now = time(NULL);
#endif /* H5_HAVE_GETTIMEOFDAY */
return (now);
@@ -200,7 +200,7 @@ H5_now_usec(void)
#else /* H5_HAVE_GETTIMEOFDAY */
/* Cast all values in this expression to uint64_t to ensure that all intermediate calculations
* are done in 64 bit, to prevent overflow */
- now = ((uint64_t)HDtime(NULL) * ((uint64_t)1000 * (uint64_t)1000));
+ now = ((uint64_t)time(NULL) * ((uint64_t)1000 * (uint64_t)1000));
#endif /* H5_HAVE_GETTIMEOFDAY */
return (now);
@@ -238,7 +238,7 @@ H5_get_time(void)
ret_value = (double)now_tv.tv_sec + ((double)now_tv.tv_usec / 1000000.0);
}
#else
- ret_value = (double)HDtime(NULL);
+ ret_value = (double)time(NULL);
#endif
FUNC_LEAVE_NOAPI(ret_value)
diff --git a/test/API/H5_api_test.c b/test/API/H5_api_test.c
index ff7ede34038..63dd095fa0f 100644
--- a/test/API/H5_api_test.c
+++ b/test/API/H5_api_test.c
@@ -143,7 +143,7 @@ main(int argc, char **argv)
n_tests_failed_g = 0;
n_tests_skipped_g = 0;
- seed = (unsigned)HDtime(NULL);
+ seed = (unsigned)time(NULL);
srand(seed);
if (NULL == (test_path_prefix = getenv(HDF5_API_TEST_PATH_PREFIX)))
diff --git a/test/accum.c b/test/accum.c
index cabd4a84c7c..ac9754bf4b9 100644
--- a/test/accum.c
+++ b/test/accum.c
@@ -1920,7 +1920,7 @@ test_random_write(H5F_t *f)
TESTING("random writes to accumulator");
/* Choose random # seed */
- seed = (unsigned)HDtime(NULL);
+ seed = (unsigned)time(NULL);
#if 0
/* seed = (unsigned)1155438845; */
fprintf(stderr, "Random # seed was: %u\n", seed);
diff --git a/test/app_ref.c b/test/app_ref.c
index 1315f03c86b..7c4fe3e0f50 100644
--- a/test/app_ref.c
+++ b/test/app_ref.c
@@ -89,7 +89,7 @@ main(void)
h5_reset();
h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename);
- HDsrand((unsigned)HDtime(NULL));
+ HDsrand((unsigned)time(NULL));
TESTING("library shutdown with reference count > 1");
diff --git a/test/big.c b/test/big.c
index 03c7dd5246f..cf8a3f2ef38 100644
--- a/test/big.c
+++ b/test/big.c
@@ -752,7 +752,7 @@ main(int ac, char **av)
sparse_support = is_sparse();
/* Choose random # seed */
- seed = (unsigned long)HDtime(NULL);
+ seed = (unsigned long)time(NULL);
#if 0
/* seed = (unsigned long)1155438845; */
fprintf(stderr, "Random # seed was: %lu\n", seed);
diff --git a/test/btree2.c b/test/btree2.c
index fc7748c7b27..a44a2475732 100644
--- a/test/btree2.c
+++ b/test/btree2.c
@@ -2903,7 +2903,7 @@ test_insert_lots(hid_t fapl, const H5B2_create_t *cparam, const bt2_test_param_t
herr_t ret; /* Generic error return value */
/* Initialize random number seed */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
#if 0
curr_time=1109170019;
fprintf(stderr,"curr_time=%lu\n",(unsigned long)curr_time);
@@ -4973,7 +4973,7 @@ test_update_lots(hid_t fapl, const H5B2_create_t *cparam, const bt2_test_param_t
herr_t ret; /* Generic error return value */
/* Initialize random number seed */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
#if 0
curr_time = 1451342093;
fprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
@@ -8619,7 +8619,7 @@ test_remove_lots(const char *driver_name, hid_t fapl, const H5B2_create_t *cpara
bool single_file_vfd; /* Whether VFD used stores data in a single file */
/* Initialize random number seed */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
#if 0
curr_time = 1163537969;
fprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
diff --git a/test/cmpd_dset.c b/test/cmpd_dset.c
index 227b0c3bae9..383ed7f1b5a 100644
--- a/test/cmpd_dset.c
+++ b/test/cmpd_dset.c
@@ -2831,7 +2831,7 @@ test_pack_ooo(void)
* the compound */
unsigned i, j; /* Indices */
- HDsrand((unsigned)HDtime(NULL));
+ HDsrand((unsigned)time(NULL));
/* Initialize "free_order" array to indicate that all slots in order are
* free */
diff --git a/test/dsets.c b/test/dsets.c
index 3cc9ccbeae6..ca985a85ec6 100644
--- a/test/dsets.c
+++ b/test/dsets.c
@@ -15921,7 +15921,7 @@ main(void)
contig_addr_vfd = (bool)(strcmp(driver_name, "split") != 0 && strcmp(driver_name, "multi") != 0);
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
/* Initialize global arrays */
/* points */
diff --git a/test/dt_arith.c b/test/dt_arith.c
index 3a91ef19a14..62f03aaa4b4 100644
--- a/test/dt_arith.c
+++ b/test/dt_arith.c
@@ -5978,7 +5978,7 @@ main(void)
unsigned long nerrors = 0;
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
reset_hdf5();
diff --git a/test/dtypes.c b/test/dtypes.c
index a7a518e7e88..51dbf123fe0 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -10129,7 +10129,7 @@ main(void)
hid_t fapl = H5I_INVALID_HID;
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
reset_hdf5();
fapl = h5_fileaccess();
diff --git a/test/earray.c b/test/earray.c
index 9cea8f4560a..3770ac44765 100644
--- a/test/earray.c
+++ b/test/earray.c
@@ -2317,7 +2317,7 @@ main(void)
api_ctx_pushed = true;
/* Seed random #'s */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
HDsrandom((unsigned)curr_time);
/* Create an empty file to retrieve size */
diff --git a/test/farray.c b/test/farray.c
index 791cb549f1b..a8f4352c984 100644
--- a/test/farray.c
+++ b/test/farray.c
@@ -1648,7 +1648,7 @@ main(void)
api_ctx_pushed = true;
/* Seed random #'s */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
HDsrandom((unsigned)curr_time);
/* Create an empty file to retrieve size */
diff --git a/test/fheap.c b/test/fheap.c
index cd1f0c5ec1f..0784aa775e9 100644
--- a/test/fheap.c
+++ b/test/fheap.c
@@ -6234,7 +6234,7 @@ test_man_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
fill_size = get_fill_size(tparam);
/* Choose random # seed */
- seed = (unsigned long)HDtime(NULL);
+ seed = (unsigned long)time(NULL);
#if 0
/* seed = (unsigned long)1155438845; */
fprintf(stderr, "Random # seed was: %lu\n", seed);
@@ -15142,7 +15142,7 @@ test_random(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
} /* end else */
/* Choose random # seed */
- seed = (unsigned long)HDtime(NULL);
+ seed = (unsigned long)time(NULL);
#if 0
/* seed = (unsigned long)1156158635; */
fprintf(stderr, "Random # seed was: %lu\n", seed);
@@ -15345,7 +15345,7 @@ test_random_pow2(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_te
} /* end else */
/* Choose random # seed */
- seed = (unsigned long)HDtime(NULL);
+ seed = (unsigned long)time(NULL);
#if 0
/* seed = (unsigned long)1155181717; */
fprintf(stderr, "Random # seed was: %lu\n", seed);
diff --git a/test/h5test.c b/test/h5test.c
index ba68918c2a1..a472dc9d5c5 100644
--- a/test/h5test.c
+++ b/test/h5test.c
@@ -1820,18 +1820,18 @@ h5_wait_message(const char *waitfor)
/* Start timer. If this function runs for too long (i.e.,
expected signal is never received), it will
return failure */
- HDtime(&t0);
+ time(&t0);
/* Wait for return signal from some other process */
while ((returnfile = fopen(waitfor, "r")) == NULL) {
/* make note of current time. */
- HDtime(&t1);
+ time(&t1);
/* If we've been waiting for a signal for too long, then
it was likely never sent and we should fail rather
than loop infinitely */
- if (HDdifftime(t1, t0) > MESSAGE_TIMEOUT) {
+ if (difftime(t1, t0) > MESSAGE_TIMEOUT) {
fprintf(stdout, "Error communicating between processes. Make sure test script is running.\n");
TEST_ERROR;
} /* end if */
diff --git a/test/hyperslab.c b/test/hyperslab.c
index 03b0e9a152b..da014d30355 100644
--- a/test/hyperslab.c
+++ b/test/hyperslab.c
@@ -1144,7 +1144,7 @@ main(int argc, char *argv[])
printf("\n");
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
/*
* Open the library explicitly for thread-safe builds, so per-thread
diff --git a/test/istore.c b/test/istore.c
index 2062e9486b4..5a1fa0ff498 100644
--- a/test/istore.c
+++ b/test/istore.c
@@ -582,7 +582,7 @@ main(int argc, char *argv[])
printf("\n");
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
/* Check to see if the file system supports POSIX-style sparse files.
* Windows NTFS does not, so we want to avoid tests which create
diff --git a/test/links.c b/test/links.c
index 4ea612ebdfd..ffac35651de 100644
--- a/test/links.c
+++ b/test/links.c
@@ -1770,8 +1770,8 @@ test_move_preserves(hid_t fapl_id, bool new_format)
old_modification_time = oinfo.mtime;
/* If this test happens too quickly, the times will all be the same. Make sure the time changes. */
- curr_time = HDtime(NULL);
- while (HDtime(NULL) <= curr_time)
+ curr_time = time(NULL);
+ while (time(NULL) <= curr_time)
;
/* Close the file and reopen it */
@@ -2603,8 +2603,8 @@ test_move_preserves_deprec(hid_t fapl_id, bool new_format)
old_modification_time = oinfo.mtime;
/* If this test happens too quickly, the times will all be the same. Make sure the time changes. */
- curr_time = HDtime(NULL);
- while (HDtime(NULL) <= curr_time)
+ curr_time = time(NULL);
+ while (time(NULL) <= curr_time)
;
/* Close the file and reopen it */
diff --git a/test/mdset.c b/test/mdset.c
index 013eb775553..145618b60ea 100644
--- a/test/mdset.c
+++ b/test/mdset.c
@@ -646,7 +646,7 @@ main(void)
fapl_id = h5_fileaccess();
/* Initialize random number seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
/* Fill dset_name array */
for (i = 0; i < MAX_DSETS; i++) {
diff --git a/test/mtime.c b/test/mtime.c
index 60bfaaaadc7..fad164b9e9c 100644
--- a/test/mtime.c
+++ b/test/mtime.c
@@ -64,7 +64,7 @@ main(void)
TEST_ERROR;
if ((dset = H5Dcreate2(file, "dset", H5T_NATIVE_SCHAR, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
- now = HDtime(NULL);
+ now = time(NULL);
if (H5Dclose(dset) < 0)
TEST_ERROR;
if (H5Sclose(space) < 0)
@@ -110,11 +110,11 @@ main(void)
puts(" cannot be queried on this system. See H5O_mtime_decode().");
return 0;
}
- else if (fabs(HDdifftime(now, oi1.ctime)) > 60.0) {
+ else if (fabs(difftime(now, oi1.ctime)) > 60.0) {
H5_FAILED();
- tm = HDlocaltime(&(oi1.ctime));
+ tm = localtime(&(oi1.ctime));
strftime((char *)buf1, sizeof buf1, "%Y-%m-%d %H:%M:%S", tm);
- tm = HDlocaltime(&now);
+ tm = localtime(&now);
strftime((char *)buf2, sizeof buf2, "%Y-%m-%d %H:%M:%S", tm);
printf(" got: %s\n ans: %s\n", buf1, buf2);
goto error;
diff --git a/test/set_extent.c b/test/set_extent.c
index 018421df45f..1db56bab6b9 100644
--- a/test/set_extent.c
+++ b/test/set_extent.c
@@ -119,7 +119,7 @@ main(void)
contig_addr_vfd = (bool)(strcmp(driver_name, "split") != 0 && strcmp(driver_name, "multi") != 0);
/* Initialize random number seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
h5_reset();
fapl = h5_fileaccess();
diff --git a/test/swmr_reader.c b/test/swmr_reader.c
index 18f204dee31..91057703e27 100644
--- a/test/swmr_reader.c
+++ b/test/swmr_reader.c
@@ -267,7 +267,7 @@ read_records(const char *filename, bool verbose, FILE *verbose_file, unsigned ra
fprintf(verbose_file, "Reading records\n");
/* Get the starting time */
- start_time = HDtime(NULL);
+ start_time = time(NULL);
curr_time = start_time;
/* Create file access property list */
@@ -336,7 +336,7 @@ read_records(const char *filename, bool verbose, FILE *verbose_file, unsigned ra
HDsleep(poll_time);
/* Retrieve the current time */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
} /* end while */
/* Close the memory dataspace */
diff --git a/test/swmr_remove_reader.c b/test/swmr_remove_reader.c
index 614aed2cfa6..8cf22c3debc 100644
--- a/test/swmr_remove_reader.c
+++ b/test/swmr_remove_reader.c
@@ -262,7 +262,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds, uns
fprintf(stderr, "Reading records\n");
/* Get the starting time */
- start_time = HDtime(NULL);
+ start_time = time(NULL);
curr_time = start_time;
/* Create file access property list */
@@ -322,7 +322,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds, uns
HDsleep(poll_time);
/* Retrieve the current time */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
} /* end while */
/* Close the fapl */
diff --git a/test/swmr_sparse_reader.c b/test/swmr_sparse_reader.c
index a6d8fd49d38..695ca273b40 100644
--- a/test/swmr_sparse_reader.c
+++ b/test/swmr_sparse_reader.c
@@ -220,7 +220,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nrecords, uns
fprintf(stderr, "Reading records\n");
/* Get the starting time */
- start_time = HDtime(NULL);
+ start_time = time(NULL);
/* Read records */
for (u = 0; u < nrecords; u++) {
@@ -257,7 +257,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nrecords, uns
} /* end if */
/* Check for timeout */
- if (HDtime(NULL) >= (time_t)(start_time + (time_t)TIMEOUT)) {
+ if (time(NULL) >= (time_t)(start_time + (time_t)TIMEOUT)) {
fprintf(stderr, "Reader timed out\n");
return -1;
} /* end if */
diff --git a/test/tid.c b/test/tid.c
index bf557fa34da..ccc61ba854d 100644
--- a/test/tid.c
+++ b/test/tid.c
@@ -1373,7 +1373,7 @@ void
test_ids(void)
{
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
if (basic_id_test() < 0)
TestErrPrintf("Basic ID test failed\n");
diff --git a/test/tselect.c b/test/tselect.c
index e07b1b62dfb..b545eec0324 100644
--- a/test/tselect.c
+++ b/test/tselect.c
@@ -6362,21 +6362,17 @@ test_select_hyper_union_random_5d(hid_t read_plist)
CHECK(sid2, FAIL, "H5Screate_simple");
/* Get initial random # seed */
- seed = (unsigned)HDtime(NULL) + (unsigned)HDclock();
+ seed = (unsigned)time(NULL);
+ HDsrandom(seed);
/* Crunch through a bunch of random hyperslab reads from the file dataset */
for (test_num = 0; test_num < NRAND_HYPER; test_num++) {
- /* Save random # seed for later use */
- /* (Used in case of errors, to regenerate the hyperslab sequence) */
- seed += (unsigned)HDclock();
- HDsrandom(seed);
-
for (i = 0; i < NHYPERSLABS; i++) {
/* Select random hyperslab location & size for selection */
for (j = 0; j < SPACE5_RANK; j++) {
start[j] = ((hsize_t)HDrandom() % dims1[j]);
count[j] = (((hsize_t)HDrandom() % (dims1[j] - start[j])) + 1);
- } /* end for */
+ }
/* Select hyperslab */
ret = H5Sselect_hyperslab(sid1, (i == 0 ? H5S_SELECT_SET : H5S_SELECT_OR), start, NULL, count,
@@ -6385,8 +6381,8 @@ test_select_hyper_union_random_5d(hid_t read_plist)
if (ret < 0) {
TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed);
break;
- } /* end if */
- } /* end for */
+ }
+ }
/* Get the number of elements selected */
npoints = H5Sget_select_npoints(sid1);
@@ -6407,7 +6403,7 @@ test_select_hyper_union_random_5d(hid_t read_plist)
if (ret < 0) {
TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed);
break;
- } /* end if */
+ }
/* Compare data read with data written out */
tbuf = rbuf;
@@ -6415,7 +6411,7 @@ test_select_hyper_union_random_5d(hid_t read_plist)
if (ret < 0) {
TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed);
break;
- } /* end if */
+ }
/* Set the read buffer back to all zeroes */
memset(rbuf, 0, (size_t)SPACE6_DIM1);
diff --git a/test/tskiplist.c b/test/tskiplist.c
index 7d4cda0dd29..4c76321047f 100644
--- a/test/tskiplist.c
+++ b/test/tskiplist.c
@@ -69,7 +69,7 @@ test_skiplist_init(void)
CHECK_PTR(rev_sort_rand_num, "malloc");
/* Initialize random number seed */
- curr_time = HDtime(NULL);
+ curr_time = time(NULL);
HDsrandom((unsigned)curr_time);
/* Create randomized set of numbers */
diff --git a/test/ttime.c b/test/ttime.c
index 32e6859018f..08e9f967ab7 100644
--- a/test/ttime.c
+++ b/test/ttime.c
@@ -150,7 +150,7 @@ test_time_io(void)
CHECK(dsid, FAIL, "H5Dcreate2");
/* Initialize time data value */
- timenow = HDtime(NULL);
+ timenow = time(NULL);
/* Write time to dataset */
status = H5Dwrite(dsid, H5T_UNIX_D32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &timenow);
@@ -182,7 +182,7 @@ test_time_io(void)
status = H5Dread(dsid, H5T_UNIX_D32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &timethen);
CHECK(status, FAIL, "H5Dread");
- fprintf(stderr, "time written was: %s\n", HDctime(&timethen));
+ fprintf(stderr, "time written was: %s\n", ctime(&timethen));
status = H5Dclose(dsid);
CHECK(status, FAIL, "H5Dclose");
diff --git a/test/tunicode.c b/test/tunicode.c
index a65b469a8a8..d3baf801692 100644
--- a/test/tunicode.c
+++ b/test/tunicode.c
@@ -815,7 +815,7 @@ test_unicode(void)
MESSAGE(5, ("Testing UTF-8 Encoding\n"));
/* Create a random string with length NUM_CHARS */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
memset(test_string, 0, sizeof(test_string));
for (x = 0; x < NUM_CHARS; x++) {
diff --git a/test/unlink.c b/test/unlink.c
index ae8da98b491..62c7e61a1b4 100644
--- a/test/unlink.c
+++ b/test/unlink.c
@@ -2906,7 +2906,7 @@ main(void)
double rdcc_w0;
/* Set the random # seed */
- HDsrandom((unsigned)HDtime(NULL));
+ HDsrandom((unsigned)time(NULL));
/* Open */
h5_reset();
diff --git a/test/vds_swmr_writer.c b/test/vds_swmr_writer.c
index 752cc509e24..b57c2f689dd 100644
--- a/test/vds_swmr_writer.c
+++ b/test/vds_swmr_writer.c
@@ -112,8 +112,8 @@ main(int argc, char *argv[])
TEST_ERROR;
/* Wait one second between writing planes */
- delay = HDtime(0) + (time_t)1;
- while (HDtime(0) < delay)
+ delay = time(0) + (time_t)1;
+ while (time(0) < delay)
;
/* Flush */
diff --git a/testpar/API/H5_api_test_parallel.c b/testpar/API/H5_api_test_parallel.c
index 224c1b8a7c4..71264af418c 100644
--- a/testpar/API/H5_api_test_parallel.c
+++ b/testpar/API/H5_api_test_parallel.c
@@ -223,7 +223,7 @@ main(int argc, char **argv)
n_tests_skipped_g = 0;
if (MAINPROCESS) {
- seed = (unsigned)HDtime(NULL);
+ seed = (unsigned)time(NULL);
}
if (mpi_size > 1) {
diff --git a/testpar/t_pmulti_dset.c b/testpar/t_pmulti_dset.c
index 4d8bc7707ec..a61e1b4dcc4 100644
--- a/testpar/t_pmulti_dset.c
+++ b/testpar/t_pmulti_dset.c
@@ -657,7 +657,7 @@ main(int argc, char *argv[])
/* Generate random number seed, if rank 0 */
if (MAINPROCESS)
- seed = (unsigned)HDtime(NULL);
+ seed = (unsigned)time(NULL);
/* Broadcast seed from rank 0 (other ranks will receive rank 0's seed) */
if (MPI_SUCCESS != MPI_Bcast(&seed, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD))
diff --git a/tools/src/h5ls/h5ls.c b/tools/src/h5ls/h5ls.c
index a5c1aa5b4dc..bef90cf9061 100644
--- a/tools/src/h5ls/h5ls.c
+++ b/tools/src/h5ls/h5ls.c
@@ -2189,9 +2189,9 @@ list_obj(const char *name, const H5O_info2_t *oinfo, const char *first_seen, voi
struct tm *tm;
if (simple_output_g)
- tm = HDgmtime(&(oinfo->mtime));
+ tm = gmtime(&(oinfo->mtime));
else
- tm = HDlocaltime(&(oinfo->mtime));
+ tm = localtime(&(oinfo->mtime));
if (tm) {
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
h5tools_str_reset(&buffer);
From f776a348fc46b262ef0b6d56d958dcf35319e46d Mon Sep 17 00:00:00 2001
From: Dana Robinson <43805+derobins@users.noreply.github.com>
Date: Sun, 7 Apr 2024 14:51:58 -0700
Subject: [PATCH 5/8] Remove HD prefix from toupper/tolower (#4340)
---
src/H5FDs3comms.c | 6 +++---
src/H5private.h | 6 ------
src/H5system.c | 4 ++--
3 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/src/H5FDs3comms.c b/src/H5FDs3comms.c
index f5be8f42f97..bcda801a8dd 100644
--- a/src/H5FDs3comms.c
+++ b/src/H5FDs3comms.c
@@ -244,7 +244,7 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
if (lowername == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for lowercase name copy.");
for (i = 0; i < namelen; i++)
- lowername[i] = (char)HDtolower((int)name[i]);
+ lowername[i] = (char)tolower((int)name[i]);
lowername[namelen] = 0;
/* If value supplied, copy name, value, and concatenated "name: value".
@@ -2172,7 +2172,7 @@ H5FD_s3comms_nlowercase(char *dest, const char *s, size_t len)
H5MM_memcpy(dest, s, len);
do {
len--;
- dest[len] = (char)HDtolower((int)dest[len]);
+ dest[len] = (char)tolower((int)dest[len]);
} while (len > 0);
}
@@ -2264,7 +2264,7 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
strncpy(purl->scheme, curstr, (size_t)len);
purl->scheme[len] = '\0';
for (i = 0; i < len; i++)
- purl->scheme[i] = (char)HDtolower(purl->scheme[i]);
+ purl->scheme[i] = (char)tolower(purl->scheme[i]);
/* Skip "://" */
tmpstr += 3;
diff --git a/src/H5private.h b/src/H5private.h
index e0148f43d70..b8d65405122 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -893,12 +893,6 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
#ifndef HDtmpfile
#define HDtmpfile() tmpfile()
#endif
-#ifndef HDtolower
-#define HDtolower(C) tolower(C)
-#endif
-#ifndef HDtoupper
-#define HDtoupper(C) toupper(C)
-#endif
#ifndef HDunlink
#define HDunlink(S) unlink(S)
#endif
diff --git a/src/H5system.c b/src/H5system.c
index 1379fa7dc95..65b56fd8d81 100644
--- a/src/H5system.c
+++ b/src/H5system.c
@@ -689,7 +689,7 @@ H5_build_extpath(const char *name, char **extpath /*out*/)
* Unix: does not apply
*/
if (H5_CHECK_ABS_DRIVE(name)) {
- drive = HDtoupper(name[0]) - 'A' + 1;
+ drive = toupper(name[0]) - 'A' + 1;
retcwd = HDgetdcwd(drive, cwdpath, MAX_PATH_LEN);
strncpy(new_name, &name[2], name_len);
}
@@ -1404,7 +1404,7 @@ H5_strcasestr(const char *haystack, const char *needle)
const char *h = haystack;
const char *n = needle;
/* loop while lowercase strings match, or needle ends */
- while (HDtolower(*h) == HDtolower(*n) && *n) {
+ while (tolower(*h) == tolower(*n) && *n) {
h++;
n++;
}
From 8def3f61bdf9a7174231e058ea50a32df173fcd6 Mon Sep 17 00:00:00 2001
From: bmribler <39579120+bmribler@users.noreply.github.com>
Date: Sun, 7 Apr 2024 18:01:45 -0400
Subject: [PATCH 6/8] Add VDS and SWMR to documentation (#4336)
---
doxygen/dox/TechnicalNotes.dox | 16 ++++-
doxygen/dox/ViewTools.dox | 2 +-
doxygen/examples/intro_SWMR.html | 99 +++++++++++++++++++++++++++++++
doxygen/examples/intro_VDS.html | 70 ++++++++++++++++++++++
doxygen/img/tutr-swmr1.png | Bin 0 -> 86410 bytes
doxygen/img/tutr-swmr2.png | Bin 0 -> 23079 bytes
doxygen/img/tutr-swmr3.png | Bin 0 -> 33333 bytes
doxygen/img/tutrvds-ex.png | Bin 0 -> 30484 bytes
doxygen/img/tutrvds-map.png | Bin 0 -> 36966 bytes
doxygen/img/tutrvds-multimgs.png | Bin 0 -> 278199 bytes
doxygen/img/tutrvds-snglimg.png | Bin 0 -> 243661 bytes
11 files changed, 185 insertions(+), 2 deletions(-)
create mode 100644 doxygen/examples/intro_SWMR.html
create mode 100644 doxygen/examples/intro_VDS.html
create mode 100755 doxygen/img/tutr-swmr1.png
create mode 100755 doxygen/img/tutr-swmr2.png
create mode 100755 doxygen/img/tutr-swmr3.png
create mode 100755 doxygen/img/tutrvds-ex.png
create mode 100755 doxygen/img/tutrvds-map.png
create mode 100755 doxygen/img/tutrvds-multimgs.png
create mode 100755 doxygen/img/tutrvds-snglimg.png
diff --git a/doxygen/dox/TechnicalNotes.dox b/doxygen/dox/TechnicalNotes.dox
index bca81e4211c..7edf0a0abf7 100644
--- a/doxygen/dox/TechnicalNotes.dox
+++ b/doxygen/dox/TechnicalNotes.dox
@@ -7,6 +7,8 @@
\li \ref IOFLOW
\li \ref TNMDC
\li \ref MT
+\li \ref SWMR
+\li \ref VDS
\li \ref VFL
*/
@@ -45,4 +47,16 @@
\htmlinclude DebuggingHDF5Applications.html
-*/
\ No newline at end of file
+*/
+
+/** \page SWMR Introduction to Single-Writer/Multiple-Reader (SWMR)
+
+\htmlinclude intro_SWMR.html
+
+*/
+
+/** \page VDS Introduction to the Virtual Dataset - VDS
+
+\htmlinclude intro_VDS.html
+
+*/
diff --git a/doxygen/dox/ViewTools.dox b/doxygen/dox/ViewTools.dox
index f4c31c83663..92cbd0099b0 100644
--- a/doxygen/dox/ViewTools.dox
+++ b/doxygen/dox/ViewTools.dox
@@ -997,7 +997,7 @@ In other words, it is an array of four elements, in which each element is a 3 by
This dataset is much more complex. Also note that subsetting cannot be done on Array datatypes.
-See this FAQ for more information on the Array datatype.
+See this section for more information on the Array datatype.
\subsubsection subsubsecViewToolsViewDtypes_objref Object Reference
An Object Reference is a reference to an entire object (dataset, group, or named datatype).
diff --git a/doxygen/examples/intro_SWMR.html b/doxygen/examples/intro_SWMR.html
new file mode 100644
index 00000000000..7b7ece3e20f
--- /dev/null
+++ b/doxygen/examples/intro_SWMR.html
@@ -0,0 +1,99 @@
+
+
+ Introduction to Single-Writer_Multiple-Reader (SWMR)
+
+Introduction to SWMR
+The Single-Writer / Multiple-Reader (SWMR) feature enables multiple processes to read an HDF5 file while it is being written to (by a single process) without using locks or requiring communication between processes.
+All communication between processes must be performed via the HDF5 file. The HDF5 file under SWMR access must reside on a system that complies with POSIX write() semantics.
+The basic engineering challenge for this to work was to ensure that the readers of an HDF5 file always see a coherent (though possibly not up to date) HDF5 file.
+The issue is that when writing data there is information in the metadata cache in addition to the physical file on disk:
+However, the readers can only see the state contained in the physical file:
+The SWMR solution implements dependencies on when the metadata can be flushed to the file. This ensures that metadata cache flush operations occur in the proper order, so that there will never be internal file pointers in the physical file that point to invalid (unflushed) file addresses.
+A beneficial side effect of using SWMR access is better fault tolerance. It is more difficult to corrupt a file when using SWMR.
+Documentation
+
+HDF5 Library APIs
+
+- H5F_START_SWMR_WRITE — Enables SWMR writing mode for a file
+- H5DO_APPEND — Appends data to a dataset along a specified dimension
+- H5P_SET_OBJECT_FLUSH_CB — Sets a callback function to invoke when an object flush occurs in the file
+- H5P_GET_OBJECT_FLUSH_CB — Retrieves the object flush property values from the file access property list
+- H5O_DISABLE_MDC_FLUSHES — Prevents metadata entries for an HDF5 object from being flushed from the metadata cache to storage
+- H5O_ENABLE_MDC_FLUSHES — Enables flushing of dirty metadata entries from a file’s metadata cache
+- H5O_ARE_MDC_FLUSHES_DISABLED — Determines if an HDF5 object has had flushes of metadata entries disabled
+
+
+
+- h5watch — Outputs new records appended to a dataset as the dataset grows
+- h5format_convert — Converts the layout format version and chunked indexing types of datasets created with HDF5-1.10 so that applications built with HDF5-1.8 can access them
+- h5clear — Clears superblock status_flags field, removes metadata cache image, prints EOA and EOF, or sets EOA of a file
+
+Design Documents
+Error while fetching page properties report data:
+Programming Model
+Please be aware that the SWMR feature requires that an HDF5 file be created with the latest file format. See H5P_SET_LIBVER_BOUNDS for more information.
+To use SWMR follow the the general programming model for creating and accessing HDF5 files and objects along with the steps described below.
+SWMR Writer:
+The SWMR writer either opens an existing file and objects or creates them as follows.
+Open an existing file:
+Call H5Fopen using the H5F_ACC_SWMR_WRITE flag.
+Begin writing datasets.
+Periodically flush data.
+Create a new file:
+Call H5Fcreate using the latest file format.
+Create groups, datasets and attributes, and then close the attributes.
+Call H5F_START_SWMR_WRITE to start SWMR access to the file.
+Periodically flush data.
+Example Code:
+Create the file using the latest file format property:
+ fapl = H5Pcreate (H5P_FILE_ACCESS);
+ status = H5Pset_libver_bounds (fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+ fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+[Create objects (files, datasets, ...). Close any attributes and named datatype objects. Groups and datasets may remain open before starting SWMR access to them.]
+Start SWMR access to the file:
+ status = H5Fstart_swmr_write (fid);
+Reopen the datasets and start writing, periodically flushing data:
+ status = H5Dwrite (dset_id, ...);
+ status = H5Dflush (dset_id);
+SWMR Reader:
+The SWMR reader must continually poll for new data:
+Call H5Fopen using the H5F_ACC_SWMR_READ flag.
+Poll, checking the size of the dataset to see if there is new data available for reading.
+Read new data, if any.
+Example Code:
+Open the file using the SWMR read flag:
+ fid = H5Fopen (filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, H5P_DEFAULT);
+Open the dataset and then repeatedly poll the dataset, by getting the dimensions, reading new data, and refreshing:
+ dset_id = H5Dopen (...);
+ space_id = H5Dget_space (...);
+ while (...) {
+ status = H5Dread (dset_id, ...);
+ status = H5Drefresh (dset_id);
+ space_id = H5Dget_space (...);
+ }
+Limitations and Scope
+An HDF5 file under SWMR access must reside on a system that complies with POSIX write() semantics. It is also limited in scope as follows:
+The writer process is only allowed to modify raw data of existing datasets by;
+Appending data along any unlimited dimension.
+Modifying existing data
+The following operations are not allowed (and the corresponding HDF5 files will fail):
+The writer cannot add new objects to the file.
+The writer cannot delete objects in the file.
+The writer cannot modify or append data with variable length, string or region reference datatypes.
+File space recycling is not allowed. As a result the size of a file modified by a SWMR writer may be larger than a file modified by a non-SWMR writer.
+
+Two new tools, h5watch and h5clear, are available for use with SWMR. The other HDF5 utilities have also been modified to recognize SWMR:
+The h5watch tool allows a user to monitor the growth of a dataset.
+The h5clear tool clears the status flags in the superblock of an HDF5 file.
+The rest of the HDF5 tools will exit gracefully but not work with SWMR otherwise.
+Programming Example
+A good example of using SWMR is included with the HDF5 tests in the source code. You can run it while reading the file it creates. If you then interrupt the application and reader and look at the resulting file, you will see that the file is still valid. Follow these steps:
+Download the HDF5-1.10 source code to a local directory on a filesystem (that complies with POSIX write() semantics). Build the software. No special configuration options are needed to use SWMR.
+Invoke two command terminal windows. In one window go into the bin/ directory of the built binaries. In the other window go into the test/ directory of the HDF5-1.10 source code that was just built.
+In the window in the test/ directory compile and run use_append_chunk.c. The example writes a three dimensional dataset by planes (with chunks of size 1 x 256 x 256).
+In the other window (in the bin/ directory) run h5watch on the file created by use_append_chunk.c (use_append_chunk.h5). It should be run while use_append_chunk is executing and you will see valid data displayed with h5watch.
+Interrupt use_append_chunk while it is running, and stop h5watch.
+Use h5clear to clear the status flags in the superblock of the HDF5 file (use_append_chunk.h5).
+View the file with h5dump. You will see that it is a valid file even though the application did not close properly. It will contain data up to the point that it was interrupted.
+
+
diff --git a/doxygen/examples/intro_VDS.html b/doxygen/examples/intro_VDS.html
new file mode 100644
index 00000000000..5f3e0336e4c
--- /dev/null
+++ b/doxygen/examples/intro_VDS.html
@@ -0,0 +1,70 @@
+
+
+ Introduction to the Virtual Dataset - VDS
+
+The HDF5 Virtual Dataset (VDS) feature enables users to access data in a collection of HDF5 files as a single HDF5 dataset and to use the HDF5 APIs to work with that dataset.
+For example, your data may be collected into four files:
+
+
+
+
You can map the datasets in the four files into a single VDS that can be accessed just like any other dataset:
+
+
+
+
The mapping between a VDS and the HDF5 source datasets is persistent and transparent to an application. If a source file is missing the fill value will be displayed.
+See the Virtual (VDS) Documentation for complete details regarding the VDS feature.
+The VDS feature was implemented using hyperslab selection (H5S_SELECT_HYPERSLAB). See the tutorial on Reading From or Writing to a Subset of a Dataset for more information on selecting hyperslabs.
+Programming Model
+To create a Virtual Dataset you simply follow the HDF5 programming model and add a few additional API calls to map the source code datasets to the VDS.
+Following are the steps for creating a Virtual Dataset:
+Create the source datasets that will comprise the VDS
+Create the VDS: ‐ Define a datatype and dataspace (can be unlimited)
+‐ Define the dataset creation property list (including fill value)
+‐ (Repeat for each source dataset) Map elements from the source dataset to elements of the VDS:
+Select elements in the source dataset (source selection)
+Select elements in the virtual dataset (destination selection)
+Map destination selections to source selections (see Functions for Working with a VDS)
+‐ Call H5Dcreate using the properties defined above
+Access the VDS as a regular HDF5 dataset
+Close the VDS when finished
+Functions for Working with a VDS
+The H5P_SET_VIRTUAL API sets the mapping between virtual and source datasets. This is a dataset creation property list. Using this API will change the layout of the dataset to H5D_VIRTUAL. As with specifying any dataset creation property list, an instance of the property list is created, modified, passed into the dataset creation call and then closed:
+ dcpl = H5Pcreate (H5P_DATASET_CREATE);
+ src_space = H5screate_simple ...
+ status = H5Sselect_hyperslab (space, ...
+ status = H5Pset_virtual (dcpl, space, SRC_FILE[i], SRC_DATASET[i], src_space);
+ dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+ status = H5Pclose (dcpl);
+There are several other APIs introduced with Virtual Datasets, including query functions. For details see the complete list of HDF5 library APIs that support Virtual Datasets
+Limitations
+This feature requires HDF5-1.10.
+The number of source datasets is unlimited. However, there is a limit on the size of each source dataset.
+Programming Examples
+Example 1
+This example creates three HDF5 files, each with a one-dimensional dataset of 6 elements. The datasets in these files are the source datasets that are then used to create a 4 x 6 Virtual Dataset with a fill value of -1. The first three rows of the VDS are mapped to the data from the three source datasets as shown below:
+In this example the three source datasets are mapped to the VDS with this code:
+src\_space = H5Screate\_simple (RANK1, dims, NULL);
+for (i = 0; i < 3; i++) {
+ start[0] = (hsize\_t)i;
+ /* Select i-th row in the virtual dataset; selection in the source datasets is the same. */
+ status = H5Sselect\_hyperslab (space, H5S\_SELECT\_SET, start, NULL, count, block);
+ status = H5Pset\_virtual (dcpl, space, SRC\_FILE[i], SRC\_DATASET[i], src\_space);
+}
+
+After the VDS is created and closed, it is reopened. The property list is then queried to determine the layout of the dataset and its mappings, and the data in the VDS is read and printed.
+This example is in the HDF5 source code and can be obtained from here:
+C Example
+For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]
+Example 2
+This example shows how to use a C-style printf statement for specifying multiple source datasets as one virtual dataset. Only one mapping is required. In other words only one H5P_SET_VIRTUAL call is needed to map multiple datasets. It creates a 2-dimensional unlimited VDS. Then it re-opens the file, makes queries, and reads the virtual dataset.
+The source datasets are specified as A-0, A-1, A-2, and A-3. These are mapped to the virtual dataset with one call:
+status = H5Pset\_virtual (dcpl, vspace, SRCFILE, "/A-%b", src\_space);
+
+The %b indicates that the block count of the selection in the dimension should be used.
+C Example
+For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]
+Using h5dump with a VDS
+The h5dump utility can be used to view a VDS. The h5dump output for a VDS looks exactly like that for any other dataset. If h5dump cannot find a source dataset then the fill value will be displayed.
+You can determine that a dataset is a VDS by looking at its properties with h5dump -p. It will display each source dataset mapping, beginning with Mapping 0. Below is an excerpt of the output of h5dump -p on the vds.h5 file created in Example 1.You can see that the entire source file a.h5 is mapped to the first row of the /VDS dataset:
+
+
diff --git a/doxygen/img/tutr-swmr1.png b/doxygen/img/tutr-swmr1.png
new file mode 100755
index 0000000000000000000000000000000000000000..711241619d62cd2a1dc94080fce7cc2274a87a3c
GIT binary patch
literal 86410
zcmd>l1y>te)HbD1w73?67A;P3cPZ{J!QI{6NhubJOL3>TYjA0CcXxNb-22}5{S)6>
z$x3F{%$##(+jE}1ca)NX)JNn`$S^Q4A7!M)RbXJ=tHQv%yFvT_J%bG_kc9rcb5W5J
zg%$4d>xUk|S%}Dsz`)diP@aw9p~py$(%LRCFlc@MeBUL1K_h~mBy^R~a#eLOcl9uK
zHiMD3GI4frfgX`5nwwjhm<610IKjZY1&fpJp7FxA<(BTZP`XCNs
z(NILM_rXBFy#5%
z?6AGFv$Oit?sD2J_zM{^nC!m~P3X`C?f)HSz)%#ziD3NCr!+8(vtyY|2q$t
ziyR5Y`rpfnVgLWTY@|i=#!4T8eVNg}kyn{RA8#XNCSJ
zsL({RPHudZ#)-bwQM+QI8H}Jp$C+-n+=9MB-g#NkDPrigaUc-rhq@q3n%rWvtcw$^
zA2UOT|Nep_jLv|&Q#qX{^8bpnR2q0|@LaQ_s}=knb5|3;VH1lguY5BM>nk;>;r-(y
zYzpx6=QH8C$CpWtS2>7EH#P<<)xVmg1W#Mwzi`O`%scFD$NgE|-zt~%=#V3m%`fx(_
z{}v(x)&kBh%A8-^1!XhhG+>pPM3JfCk=`TR8*5&AqaHY7ABJ(dC!w51dj4lO^fKoD
z$Y`dg;r%o?8ij(IWhzxc%wpnPCy??hdzcf}beSy53@MaIWV
zwz{88*4t=8ba3lThp?U>_Oj<29kN#&l=CII_cB}@9}kN7W-&rbSxv?e0{h{<$rO9y
zgeG<&_~QxL3jKzia|^&o5OD+S1hYxokGCf=E3F=UvhhZ2X)M0?
zj*NIjUoF>Z1w=J8@Ur|Lt=e86kK%v4Iro0#TCblo5XCJ74^uf(}Bq5)Mhdw}!(-RT;u357@H<8-Tdr%^yqn(plm^wO$
zUGjKwUSA)l$oTk(;NjuDANr!OYaBO3PrCEw;$RbcVqh7#xaMlYGJpU6s^>gJr6b+n
z-@h>>McR)p^qkYK$K3hM=6!n{MWzz{k!ikwpdLEF){*PA9NyFQGXbeXjJI%H2mYz
zLlb-N0+1mtP=A(6#=)WP5grp0qugk(4>;xUxwU=1fRIYd$cVIi-^5>9%X6NEoaLKgM)*KZA3{?*7hKz
z0e!>CUlP*NN1Fr+Xk1>~v3X89I;76m$Fkdw^Z86V
zdip;-Mk6VV-b6w|Li*!d8=O2mJZ}r(d!VC;hzQEhpWzJsAASjbIBoU1+I_?1IGU@1
zICQ=gwsZO19tVw?|24>po^SK26EyTS^mpL5fNF8i^}*k%4nH5jp(Z9jeheOCk5y4-
zVY~H*YnG{}zO&83bo)PZf$#1V6=!BEblte~S!b>P7RvMXC9K^*7g62|H_~%8-Rj}M
z$P1raTE5VUNG`Hbt;kH31)qBe_VY{lQAe8j>00tT)wD8w6VYZG7F_p^R*NegQ~R~b
zNz^)+$UTr}b|(mdWHR&AxHsJR?e!(T9`rpSA?WF}Rk14IM)+8(Sj{_
ztNVgC1Oa`Z{cg1kp17UD1QOq$>9HD>9q_tPgXbFYy6iGBb0qkD-rGW{h>j>gOTKcBuBE?P*WqbIj^jE?G<*F~P=PshBO;blP%se!m4es*&-1nO0RisBW!QN>Uzm
ze2F0OmJayPF;S{sMr<>U8s3yQ&zS?m@4Aoicyr{T#)cwNY(Mlx^S=Xg9mJ*eQ!c!)G};uYt>Rc#iliQ!r2
zTL+#TP71MR|Ac9*E|3QvQ*51kJTg0u+|5^Bpbhm{<+s&N
zYkl(`ZarsdJxP?#HO5}&d(;H
zZ-?D{R2T@%GXPbyE25)@Vb66!mww}!-g?^d%?AutN#C;Vc)8Vu;Ngm~iZbJe5jEy=
zMF4}dJ|m~?Wd|5UOe;4z3I1xZTRPnSK}i
zEOQCr_b$-#XY`(AWT%FWWQ=urp6W@)&RqkiY;K^={7B9lM00S6F0ZJyR!ei92
zWX8tkbOiYOhYMn5y^m%_PIuZG*qG5YoH3yDuA`;)sw{g?;vp^`x`pdHxPd_G>!{`X
zDc6^uL`*I@bwd%Ol(e^sj9LRg-NgRy`n9=fF!&DT#EmAKT`c+_5StpY8Z+U9zVX{J
zt~K9j0@C=pT(0meqVNy^db~`YRHOmT-UYAe*=oBE%U7#E;xT!(lO_^SrDh5`lIytBrWk5c0*wgF
zCxrR5uHnH6B+Q}-s_NVwalkkdes8KYWWW8%T;7Zy6ft{a7?uBmdt#^mCh@BiiI1La;iGlFugz%P`
z!vbA`-@iBUp|&>ylRz8@2hK&Qt8*Mp=1DgQ7*m|GapMAbQ}$T|P27wkCu#{u1kD8t
z@W<}?<(fqD8zT&Q3gy!eZ@~2+hDKVgD
z9wOwHr3OxHV*i)XK5-dqygKk69~(yrCn-$zP~heIFYnHSu0#6{t-z=7ZPpM{2pa2g
z#W9$!gSq`H>R5hJsEY&uB^uUS1q>IG22UuthYB%rJ6Tj0vS@LmBu+4>x*F$G1i9pa
zo$zSoK6g7xMkCsr!~!<=ELyH&m|CPev)@57o&GFF3-XN+)DBKIM`6?O%6T&?9ekH6ba;b0EaG2My`i|oPhYL4X?^cEBH~r{<$^7;yb944p6=EH
z+*A^_M5eeL*M(0wwuyD*RGBllpBe2G^x{KD0n+Le^o_JA{S6dU<;d{|A~)1*C_kne
z4213{6G$oqY_RfI^
z1CNv~Gf?IDMOgbU#N=X?NKnzgiXzc@#(IGWDtC!tr6$lIa2K8<@n)OgiuHA)%)wyn
zKc5Je3W|zS`Cd!tug}&DeSE<|)onbrh>%ES0xa*H{a?VQY?oP4(TmebE8}p1kDDbqCjq*dr`PG}7Y^x-^|~f=S}l9`{=>eE51r|72R=MXyO6fFHt!f;9qy+kUnm+_q?GL5
zZObHgAI{>+U-o1`5iq$1v)=HC9nwl4TmYjzkcFvpbLNH-c}&5ib<|jt{k-i_8K9UA
zPq|4Ea|e*68?{?2@*#do3l}E1%rKrCPI?TiZ(l9xg%whf!E*2NF{uYS8?K>vj>qme|TB6-z({qcR+wd$T64wNw~Cs=gKHiHKEw?-)J6zISWB+
zW_2G7tkND=XsFwxq^6dP`RJWRYd!y90VWfBvZwVWryNF
zJ$bpouAvaREU;NT3GH}m()aH~0%G_@!D!ShCjfeFs@ki5pHxfKTzW3D1u+q*F
zz(QCCI^SN2G!49dt%hfZW#Nu{^*b4j?{y)^suTESDBkWZt)bQ
zMrX(Dr9BmBg7%cF6QP*Sh135-`Y*V#Lst>2Ty4V`4P91SD$b;&MeG8lztKE|Z`0UN
zufYj%PbGCMQj{?rdythaGXY1ti1
zx0yf*6EVw~3&w^a8bXgn3-D6%Ja6Ae%B?nb=j*@^i%cl)Aq-EO;_IFwZtA%F1Gj
zN6JHp-tv!SRsArk0NF;DI~bqnaT56ljRz+@<osy>Isu@@PQ7NF+W2QOzm$>%pm*{H
z_daGw4aT|?q%Ie_$NwbR5Z1{f?G`?AcZ)1)Hfd6bmAdtTkbP(NUml4&ObO%WbVWB}
zAep8RE|4sgf+-m!y;#3BE+7Clw<9mtc^pKJ7A;W|o!AQ7phy
zX)B}G;DM3|j{k0~d+0)qV^A>*01mMUWNHY_5(`@O4y>CL>0ijz8DMjf9SgqE$r6Ju
zX#&*WD1VIiwg0=RGc1-9t`|1^!5(K6?mO$S~mk=V<+#jnW*bs){sN
z^!@Y&&v59c9t0{X&TZW7oSbSHc=%>nVSGxaa!lUov$$PW0N^N-`+q20|K*ba8#Nl2&IQsA|5x!l!eL(<*2dCsU&2jSubQC
zmZH28llPBui<=O4^Nji=IQoN6*lVbqe(7j<{V&&tNb(*cg}ZQ>kdhjBe~yQU5~-ZI
z3%rm-!c{7*Lbnm2`!r(}7jXL;{XVUgcqASw@_!h{bNb;{u`e24TW^5BzLlfMJ=-idINWYFg|Rl_+=#a)aPRzVeGOUv2zzY+13H9kdVf{`lYhD;?j{G-t<
z;?SZZ>icv~?`WwtvM#(uYDh<4@ycbvRkHs#9PjXvWTg5yoMsr^`(wS0W6oV!8U3&QK;M=lEO$iGQ1;PtH$=+fEI$(Y0`%t!
zxkQDv2D=uEs#rF9M%|RtIA8!x{r@INhDahzha6ptX^9lJV5(d-&w&?;UG%#ECpTzn
zKCNL&S%vjK)rsMDCN+FjxUTBE@Z2V80DmE@yTR4I!my2+9)g3iI7vx5#v&~4zoP$#
zn9gO`xs&LpHwhjQ%^gAV8lx6^k(Dbi9YAXK^BWzc`~I)-LhW}Z=FqaHj%wF?;30UF
zIzZr5;sqPK?8n6;Yj>=uP0*H<;r~vcOes_Dq3kl-39Vmmf*?{`MFrL{vC4Z0$$P|5
zQLfxsqgf_P;y+RssyS-!{*R#S!W2q=ZeCoQT7`#(hnlVbxX3odCos&+2~OFM1wJjo
zM?K`qs0+rZsLXQp5C3~Bbb{)_|B;0~NJ{hpOivcRVnE=G3FO~>ba1-S$b^)WEHW}W
ziTG)u{GjRpWI2u~q0tN_`o|BYf|OJoJl=mP9;jEnpsPoKL4iJ!DU{<2iuM=HJfl5@
z?UTi@yihot(-jmOZ(b#}(9J&aE@i*EPh4qZEOTWDq=J$XV%CgnT%);pc}z?Hbs^ZBs2Z
zFR%_tL99w-?B#g_0RpJ^|s>+BCaANWRqT#FigF+
zHlvtU9Gy7Qn`s$G7v{4bEF;A>p-N%OXkXi0+l&I4`lSDH!@)N^Zt
z$JFf(Ut{_2(`@(uQs^Olc|?QDy_}DZ{{HxKH~)448GJk8n$|Q+81|%ka1PTcl-7=~
z{c46V(@)~P5oYQ6bh2n-b}4`>^?CZMRG*qErmC#?!{dFAhE8mGu$md&p%)SZwR@?b
zv5I7ndc&AS^Qlpt(E8`!aC3oc+A>jN7p1jH^c$w?OUd&Rt|cG4QxL`BW+ieA5oL|e
z-XpJuK?U?(-?Dd^qhyfoR_sNIUA7{ux`Z^vGZ${tM&)A_mIh}h*)eZYI8&Ucqhy&Q
zL`8&~)2j11xP1$fZ?qvgtvSOafg_+?2~*a@V0JK!1|CBMaAU-g1n7Zku=ryrfu&Jc
zs!4xWqd~Wlrn@xcVrkh6!Gm4ih!>zq5*loWya%v4B!dgL0DJvlGT-b=jdg-8Bb{Ud
z2l|1ROsOHbQe2%ID7ty$rkp39vMvw_jrFxCw)g&K$j{HPmoWqPWoP(
zSFIJAq$JqJV0*X;%?b%$&12ZgF!Xe`F1+A`=JVVySZMi;^Hj@&136`-Ih4&R843{D
z5jfRn>G_DfnA-x~_Od}qJTBL4-Ks|NyO{&8Y*Z@1TZI)bd%VB!2|;e^?e>4oNh$MZ
zG01n^h+kJ{IE2x0dS4hiUM-0iNLaf+I?~!8T*lNU4gSEetjhh749$`DJEZ?f&^?Yo
zWDiSPcEX594={v>f3P&5fkSCDr6AY;;EW=*POQ9i+K%5U88059-#RIp%-S8=+Vxb|
zrnsh}y~1HreG>hp`Y6pp$vP1Ozq{SIuwy$zfOkPSf3QJEsphY3)l7e1#>WT=bu~x7
zX%w62g5wq1THN9z$(D&8%(ho+=~4Qg$57(Futz8anOCMqghY_Y+b9ce=2M>UrJzcc
zte~FkiExp6xA-z2&5tJ25p(|L6{6m?!yqTWmVAOBiACa}jgb-U5I_6Q0+Q9?Di8f$oV(aaA
z?X~8@npIs-FSr811ryguMF^{zk4h~L%La23m{(&jlqiR?D*NYd&E%+lj^efJoxpA+
z_L(=9+}b#+p&O@d*T9!b;m7QNLuV031h5hrr4S~0%0FOvQPtwA5DeC$8f!|>p((&*
zyHYW#$LlRpL+`=9a^*uaU@UYm#Oo?ORE>#xuK)-Ob_{0GmI)k+PAaF^rVC>7Bt_`F
zhg}Lsm+GBX>noe%;5j%g3EhZBeJbnp;hHt{=TWhknB56}>bh_o0BAZqP!iw$FieUo
zUg!3~i8hG>&qopLWg~x#42EKCDA#hspENM@IUwuN!?#UG?nGuxN;(i;qwI4gMkyMR
zd0nXyyK~IoItx|EKSIc@|m8t~VRemWI7}=JGZlz#Sx?1LwHGP#8!Nb|x
zKQAZy7Ft^OYYe{>EfMT^S^{em-;%QZp>%x*NDmE(U4bwxJ)kT))|%3vLq#|mZU9{E
z8I*1t=}azkD6fSZcXg?x*uJYD;1Ku`0bZRSeny^)++_$$pQ#C@yr>OAu$iiv6lU~>
zc%y@%fEIm$@g_a9y2rPhahdYduow~Q8NxW>;I-8BN02q4YY31Qq^`qKb7u5H(SCc4
zv6GelIzB!tI=r;bp{S_$^72$;b?>-szgj*5KUZ`-MyAN+?jG|kdVOz1SRF4iN_|CE
zId3n!mX2HkrB?e%(iYjJ?
zg3@kLS;XR8LAcN+A5QB0Kxm+mY8k9I^OrIJBLJFoU7UaG^KC)K5W5sVqFs;Qzh
zv(N!Zx9=cqV3^40`Z?zz@@}GZ&xjOhUBJ8^xBJ+HuJII)&xvv;*(Zec=g{0Xf^G@!
zuhRG0tGvK0ljQEQ{v?t}-68B9JC+@qiSIAU81&Ta?AZULJHtN`5mRN!TRE{d2wY?I
za5_{vk@sVI;z+k9+o?6^Ec}c_JU(6_LV9`HTJH)PRLVQ;^4c?g)3z{{x;xdvB`%*^
zDzF8yjR$HZvhP38ZF!x)JvrD0JUi*{TA5l{Yz+`O^cBkUmu0~a2|BP*qtR*rjNJiljHl%rmWxm01Nbw~qSEL=cMOJbPMZq>G&ZVWHLm*awJ*+X7vH2s3`
znc*F+`i>lu_2rF(k|j68JCPmxvy)xB?Y%uH!L!=c;rFDpN%a@y*zd`1TQR**fDH$0
z=Hmp#3!hJNg?dAU47MpMAX-`h_IWRx+wQ^H_4Reklv
zVF%yUuoshjs;N8^W{nfsTBu)&EhO2NartqH61n<%&&H^4)o4t`dxd0WCkena>m$z4WpNi}15w<0ts)H}XHiJV$-HD2VQM_)4
zIsPw?22;i6uP`&z*41h>MnS36+vMabgJ%$dC?1GJ2
zGh=hdF>M*XZCBHu+nT=36P>`Qx44-VSB&y)ASenNR|USCo1RMN3=cx-XP*#gDhC@OO+4Z5}5AL5ml1+sD1A@Ek_?W{q7&>S=}yB)fh(+b4`z4TgcB>rWwjiv
z3jJ31{x4N+!R?1G$iW`QXIejf<#n`@4=v#wY+m3tEZYp^2!H+s#BO-ty$PR?*DCUQ
zUbEF@?-ZNq88WLLIT9wpK$C{u6GFl<4Bv#wH`1b+LU2fRh94j
zCgFZbE*w2;xB?o0&S$KOM)B1_)k^xqLgivtDzYN9KP
zfVk&nhG~aoSP6J9E&el~0%AGgL=8aoX4TsHRx0+j;31c7`1v3KV7Jk7weegN81*zV
zHm*|D2|>Pj<>Rc-07B4b^F(d+>fweWu&&*CN54g72j&>zZ13zVb#(@0Mg{CnNb1N^
z9O+M&%qfu)3FzZka+cw~JzwOb(b+B*Vsn;1qttbHq7!K{iP-9ixiPq*1>k889NUPh
z#N(b2!IASeQA_@5`Vjsd`Qt|ch5`n>7zIJ6-82gdCZ_S4LJQ?;4`$9)SL{z_<`e_U
z8rX33C>klhZ3)@Xh=s4=@w=p6I?B@5Iqfi94t@;|4|T83l-uVp3GXUSkNw6XI3J&?BjqHQ
zp5IxeVWS2Dv@ptan}&jc?9;3H>a@$rMdtM*7?4HUke&hq&6lLjIF$(%r8688-T##L
zChR?Ng*AX*n!C)A8Y-WyzfZq;U8u@oD7N%FT|3@G5eg8RNo6^>LAgXeKk^7D6%-*E
zZ~ZLbPQcft)M%x;fkrr`(WtSem;IntpWuf$uN0m4I`
z+^xuO5A!K&>|T(mOkXAIW&u-`x}?4ruP)%*sV|5hL45}n`k|S+bDPai;l@t`>W|>s
zKdSXwIxiEXT2*k9U0)=vtA1qn8=iR3toqy<__AM^l|OkT;8}gcADsd+d}hEJTXIu}
zEfME{!80wO+USp{g6!76Q7}+^s)_|f$(OxNX-Gwt#0!j10|+%E;v$M-=={+Yg7JSd~kfI`1oTx`z0
zOK*N|bkE@s-wp*Oo8=5AfHEeLWT$QYKRF#6)mRZr#)_{DtzZs
zfovpQ75dd*Ar1USEL|kuF+A5}|8RO3&I;}5(ch-(P8XFRqy@r*`PPuA#9aCrH))<~
z#j1(n(&B0*A0KHD`-hUZlPk$Ex&&9pHFw|ho)B4Kx1I_UgMn&Y$$XK-S?hEPb-JZ5
z2+{STRFj7@4#5c7*`YzHann0-KkK`TYpT`@BL{nYxiLK?GMRDC9!PSXwF
z!qEM-;`m5>#MYG4?>Bq3>W&rFYd#!p<-kXTQVMWjVh;!f&NoRmJ#665)WnL^aq1@-
zspTnE6|YXujD_SndLNb)T?4!<$ag;C9IwW0)2X_88rlt+QoC3dGVJxD*X(5Zxboiq
z%v*Jv%k8~eqm+m$^*eNPYs0R4y6~lv1H+U>j0^NT1z%4#IINK{)7SV(M@e}EWm-Bs
zx!}{Lba)3)OB&vxy4x=_WNn_2feMl
z(w`FWYY23N1Bg6qFbkDm{G-dMIvF8Nm|ISJ{U#U3`VRXqD?SI@ZTIV~3Q?br=fbrG
znAKhaL52^=9{SISB%Kcu{4B>Zv4B_NS?0C!wKYQf-n*Qa#~0CMmjjcgyILpDMJGAM
zIB$5}xf6b0xoeH7RevB>mNF!v`Uu7V@br#E6#}_?eEpk^Q4pH%qtrl2w(I5Y3r%IE
zYb9WPt>C*8HO=&%?=XhPLO)i={YmyS4bwRMY%Hmz7?~rQg3}{I*}wiRh&M{CVHGv8(y=66?zope0ZF
zdE0D*>;U(DZgZ+QSK7^3#l6k?8f>+I
zUj&+KUPz~!kZBJi#d3pM1C+8A-MfRE*t6hlR;K{0Rc~J`ym9S3ArnZJ9cFnbPP^8?
ztNzTj8xtTiP!;PTBDzHIUK@Uh?3!xJOwOWHU7BR$Pj$d^}WD2%6_WI~#{
z#>O3Zl3^0?T6L~L1`1VbrkRcaNz2=-xr@Imk7!ECJ}~YMx>W+oILe`CGK%vv`6MDx
zoHA2WaA2}wL3gGVx)_ov;f^(CUUw_4ES)UDMNbmV!T1qD=mp1Z`fBk~mPbtFkDm6d
z&zbR&-(Bu>sed+yxMeDn<;za0wC%DMN@=1Wjd#)Em!+ckm7j_EBg>hWm2SOaGllX*
z|CEDD%gMPiIGL$gOqRXMUccD~@ygZp8!VOUwjhZ~=>_fy`Qd;%eT2e=Smf$U1bL57
z)6xBv>^vB<(!Szx#dUlTOP=>SK6!H7DUNZwUq;WK_?r#h9MMF|-ncW2((Lp{MsIT@
z3NLZ1Y~6F_f4prk#>S7kd9&|nxM}_E5#32U)1bT|G&@N$^hbTx$O>2%2b
z+j0)>p_v%ySYTJ!v~_FP&h?)4ChwvXB)OGRGq(YBlLK{lp;tB^sT5FI80{7b<%$E)
z9sXcN3)s|rOxLjQ2Ux#N$PvfU(C~+%RPiWwMjYi=($hFm?WSoEibJLTESkpFrkj0r
zbCewLR(eKeW>#=mEkx~3;Jl)*(^jtkh!Cy*UeRH;a3j%1on6Dr6jt
zgxvZVr&DZlk#)|h8L_pMl!^M-#%LISy%sQ6wUQZK>4QukpKU#r7lsz$R`gxSLDbL0{z|Il
z<|L5lv|Tg?E&T2QLEE*x&GA%-c96NRdMP|7Mkj(x)hmSkE1S5__x-p>j}7bX-EC_^
z8D-b0`n_C{I&Q{+=;(^-#d6E(+INfYb|vr%vOsz{^TgG+KM!ASULUj8-nS#1f3Qy=
zNuMcj6I*_Iu0RAKi#a9C_!pEC?rm*)eY+u6!*N-8@|cB)S7}Roe#i61qrymK)(OcN
zCB822o;#Dq8l9u90-VS>{Ycn1UJwv_k?yjXTK3OgP
zwrVD!Q;gV3`iIgopfeE-RE3v7f>$5VbudN|dsU?OPOr`RwVlirF$Em=CgDnVkYGBvWAm~?wimnKdrWo
z`O7_dkoNsXw*UwhI?#-DlL|fmdO}1!`lfQGSR-|BuzmdP=^)k<#}f4{KL;CbF2~s|
zVlIYG1Mw7yIu%nw1eyi-&<8myfs$oaD8fjJIWrZdj2vlsZ}+R(`E+L)#5P|Aq-FSX
zX3uijx14<1nTujVCWbpeegMA1gMeYTpn=mup*A^n|IzV1Qi6h!w8_mIW<20CM2OFp
zBrBa8VQcmIQ)8^ZHcjSwQwinM)7eu~8R1_4O0HD&$4_B6iSkKz+L>{Vt8|JzEhY%g
zcnrdkTQ?;G7;4%M9Z`1qQc(NITdkkVJ6Q3clyMtYxWz-Lik@zE3A#Sam@0MOXrf*H
zOnnqzPdb&Han`Ym)0;veaeb+5HV1d{73
z!0((yqR2av+!x0}y)vQhOcE>cJS$OTd0ezO-)3aqdf;1|j-s7qs-vm;lk0Ivx^#KH
zjjBIT?%h_InM=DR_^}DFguDed_Y+hE{6&ZW9gIoQ05|XHyw|4O^3g!`^f6CJv{Izf
zul%o7Z1=@6iDI=jtbtLMYj+EmG&
z_WjP2;>Dv0m&rOVSFXLDiSO&UD#6WQ8G-9gg|{zuqWI_I)nFQ_kF)qgf3eMTm9N}s
z>3{o>XtA<=gx3EItQT34Zj>s6_J@23v!rSoY`cm11K!jh+euV=B0Xvecn7}=q?e)^
z0(|nbVh%ejgr?8Zk`tT@s8rq1_u7G4q;=O*y^<4)svf8kI+r5PXMSkEPr`bh-@GT6
z-vtO6+DbEYsTa+OjA(fbiMoEh#=ETKB~9mYFeoYaBW7mvdvwikU$pYpOD@8=dpfgx
z?#H*R$kM#2#BN0xHPg&wOT3HqpuYleAlrD~{4tyP7%*YQ=aJVv!kk~#^5GNra2YHO
z=X{Rs+ess3vxTDmuD#M{`7}28#%1SkzuJChFp=p;NhutDLwCsJy>@8%aD?_8){kIL
z*+Yz8Hg;2#S&Zf@Z+dz&VSH)-dDUMPY=+s8dar`?SUv1ff1
zSAO3y_W5QfF8cr=_hP2`MAs2&t6Q!yc`=cplur=bpW5@wkh6oN{SyV7uq+D?30K%s-6Pg-=pC*^AJCvp6^HEualXn`e7iTTj=SrErSc8v@ayvn<*~N0&8OO*PZXz2
zn!zl2#W{#34xVVb8V-;OkU>OzQJtdGHEUQXe0~-$HJY|jfYGs=bvnn=#qgYBp8lN1
z;`==kCFx|NZ<}m=QVl^1+nNUojq3*Itt*a>tgl>_(fI|w&=8jf-VALzN@47)yEBOY
z5T{E{^9AtwPQ=sykDmB!RBx6Y(KP|p_=0#s;tyAhiGZ(~76*LVto^b6HmPHf#71-x
z-$aeYCACHolkHv8#ndvBC*xs0@be@03AxXGzv4|_D{J!V1lQRo`+|_WFRW3)MiG?P3uuUJ=~v;F47}O6aEo6OJ|c;&TD2K
zUCTI($7vTG8pAwmCWx9o(^+?zJ2-)^-)Jw9+UznV)4p5Kp>7sYD#%AVx
zU&3=^_TzJA=m5W`!nE>!kt2ww#8-hSh7EqlOMw(ni`
zK3U`;jWfHwnJE@G@BtQqSI^qyRpL0*cg+{se2w%r6zk?h5BACKj7-itEOdNT&yc-13&eK=ie>n9({
zUtrWG&4UtbmI`#ZE)vw1OT6EQ^ME0QyAqQo8O6bo&o~n+9>22Sn&kHkxP8uNN|#ro
zqA
z8srOAfP*`UKoHiA_A@pX#@lAhJ~%DPQp!txzQESQ^z(CF-IQ!pW+JA!nK8@)iCcLT
zzJ6%I2-6n+yKHOXZ|c^Z`C0&v7ih=RQzoBVq_Mg&TTI-|k;&Ws6m5J|&`^TVzTi{IF7ypn^(A@4s@~wR_S=AvJ{6WVT-MDM<<5B(ZCu=u
zOzsSXHW8=y&B?uXu}bG+l7r8$Ex@c^mE)xzBb0L`?!1~7sM`dEdjyAf6OygqmQ7p6
z+QNXZDB10tAMIM}d+rrU!ve^j(5YC`{8+cPnt7AHn<*+1$Ds)%%x_oV;z}cTNw{
zWIdi6|HF{A;nMlYWsw)kLMu1uv*^$x)=maO0sxwF>KxwvCOP5GG$vtq1jKoNW1k+`
z;;aHm#QLQ)3Nr>9O(xiri-EVKF$$?9#3aA!?iTL4hi-i9@#)COwA7t%yGsUMKW=?)
z^CtOHZf0ZhTZB`p|JMJXUR~jruSZbnY;4~)i
z&Yq{SW3rhcJI~yu|C3eBy!MJl+Rma58e+4jKL>+z^4@a(Vy=Bf8^N#aj+pSP
zOf(^Y{Pxg=HTPvh5DH*7bg-~JA~%d7i?pC;>1yX!4P7mXo&GG~#VjDtxac9~C=DJT
z5XsZek469*JMMnWx%A5@`nYy|n&Dh%qSRbwags
zS~gb6i^9F0b$bIsb~$)kG1^tfmfQu}(89EgMM&K3wL{wZIBgto!wmKE%`I08zw`hg
z`S4(GQ*+U9vWCNXv8dlh`VXx{*K&4p&O#G70k1eJ+Oph}l>KP=_?k$MT&kOApcX^F
zu-ky=Ahh_+(rVp>7HawGy>0|!6g0_WkWk($x=>CSZzm0u|6)L`TrNEBg2yL2`0;Ju
zyqpsqTJM1Rwr%>=X9w4HcwACn>LIEpU%Sk9>sKm;I-sazkgsP1bw5{DMy5OHJ;F6X
z>HdD=g+~^#E|#Xz`0j)H<$H
zY{>ibJLZvkn*GU+&nE{_v2l~HSkWZ28>y>b5h8>l?{oeKAKFW%ceze%-_j;g9nEhx2i@
z?^ufRI__$)znX9N=ZPeI*bu$FKha@M=g54ye|RV}L*3za#*gYL^xx7bF6#Rz)Z}7L
z(&HB@F+25yj*2W`?W5CvUuZd3&%Ee<5H|?+uI3FpVIdBOK*KaP)pzf_7ps@a1{>0w
zEXI1rzjOvOy3RtjaGRev|88}aL=(jQ+p6(Vfo<3cP@&s6
z>oN6^>B;`<(C2z=Ok(u;!7}4#wBtWQHQXXGL-4s4c28wG&*hTLG%;A|*KG`bmykPL
z`rdnjTf~0q_Jmfsvpu81?#3Z1@6dE(p4!HemH`2sf|gvQh^KK5j^=|H*?!446hvY7
zy>V~7pOtWJaI;Zz(>)hqLT}IP|8&?5_WCtnebVD5ixZoXt_BGjVyM2StPWn!5v%tD%!}-dnk@I+OlVHA?9gH%X?=J`X+_e
z!z1=|a1@96MWj23yTVWkaH*-LRsQ$a9bg{2k>5MhI$O8QeE}Vy=uozJiCFI+WgnsI
zW?4wH|Lgt|{ao|JLtii8Y)7ZSY5YrvL#p5jCPrU+O=%WwZJtb7xVN5$tG=7uVLP{>
znx`ouZ{{jmYAiwM71K#oq85Q4njohoRz#&AFYzkK$EXTk_3GBfY5eyoMIk@7f8!93
zkCXez2r<>p)=gFkOu*fh98zV(Mp{ct>XT=of$xPxCU+jRnRqk7Sy(YvBC2@Tp)JVX
z%1Vb{4c`1*w}h8%iPRIO8QR#UC|BYwU!&nMPTV(^6_;Y2`RILe7_{|cKX)-;BTTyG
z9+)Yf&jINfjtMS1D13ggvQ#QdOD@LP)BxorGx}h@ILChV0o*iuJo5Jg+#R&Xj-^
z$f)*U3ah-(jdNK`-;bVkT?O1NvL`nneH7IX7{%e+!Qs0;X7P>h87LZMM6K*)^N#g2
z42G4KN-f@N6OpOut&zdeA1KWDn)>uR^QYuP5{ATEXnaRU;^QQ;WvF
z_eCcr`otusNxo*W@OqFFB0#NxR~{c@7HYOEIl;Iy5Ax~SV(6dUHnYT-(&1MniM^Er
zJfbL~|2(9nBdsEZ_O`DM{?kz1*C)B_#@tmf9${!s4NJUNO217z5*H^S
zveM%EZQt)o`9{leKQHG0adegeO}%Xx|I^(qjnXA04blimkCIO5936smD1a^{ca>fobdf2cq&EZhD<9NmbuyU!VxKe6JER
zL?H!&7d-C=Nf@eqlfnI01?6H>8>H4nXW246Q$#E*2ue5OUbvnGJ2o*-sTyyiwtf
zvYO6u2C6T3d`~JIE)eX#*clJ=aoM881K5FML&n09`i#iX@!xaYCeaz=Y;sN##l~90
z!bZ4f5HiU4>D)Y06oQ9`dnx!u=jc?V>~*~tEo-8Ya-!>v|EP@@sb3_ET2JeA=*nRV
zjK?6z*Xfb#<)QP|L#+%)U)v(2U
z?pQ01RFY6~&ezmnEihwoSC-iyesI=OF)DCynOx5}U#1_YjH^=rwdM0~YjAaXxsWCi
zTR$T41;_VLr={eS`Iy^VWK6GqYDG7PN&z4`j=ptO;~Nm^g6Bu!#oTuN9p+Y5Reg=T
zI&MxSeN>MdjM!ffQvv+Zv%lC!ueQh{emj;lBpI4T&3I2lxr;mQ62;t)eT~ADeX7FH
zmPQsjg)@UMf>}AHls9+vOoMf;z;pRbAyvm=_c{~eAPUZbf}KjxcB|)&NAdLmngxH)
zBWn8O?%Skq-{_7@aPh0U0-tv>(dY38;cSwCExE0+1{-N#N8hp*yDC3u&uhJAZbSRd
zy7`eHh7#&LGC{J-K0{ZcCYH5PiIM)sq2TJ8K)w#%^DY>z*`cu%{xY;Rn}}E34U!kj
zd1-e8SVuHT6*SBa`>f%Y^A@lgKvoAhifNvMP{{SbVK*o_dt(ZcmmOTW%4%gGH4fKj
zBDh&*onN?1W3Q+=J#`Fm(lOx=PV(9Z0{T=Ii3522GYqBBTz
zf-Vhq-1UH@hD$@!@N^V3E-C)CNapf}#>VD+TtbKRVR(
zjho6Ff<8m}mCGBf)rJ5aIn`_CX74>spQ8nxNPQ)-p%jl%a+ZAFvA=U;Xkj>GvjfgQ8V(5_Naq+Z(a_H_)WFYG@oO
zjwPo+X9t|-{J(HIMetaui4Eq58VNNeN)zx}cQ7sRlXEV1elklf6hbU=B9Ia^k}@D?
zW9itxn%NK|&?qS2d`z_dUz9}gf^nKH8SEw4jXKmCw6QNFdc)szYU#hzCsB4;On+>UrPUm(_s-TipQDTFR3CNPYAn*iz&V8%uA
zX}IXRa7WMD1GXe;g6B(IIhdKfKM$L&uUlXu>bJ)`6JgfGif9ltgU6hX<1FJT0&gugE;zFkwoRyAQeqO
zoF)TwNnt?$cKs8?Xm&ITBIe2R%4OjL@K!KT>RQ7@^9ot6*eerBn#~R_)>mQ=Vlphn
z#eDXydpGl!i4^Z5yX4;`ic4uclP(3$P4%PdW0je~Qjj6(qO+P5e_J|$&7
z?N;!QR#{68#xtenAv=1+2a9?Pnp-TZ7Kr7mtmDOoM2iS-`n@3oc+q$>U`ZBvSmfu~
z)K}24(*+xB|MZ2@H#1i~^`ONLj&FiJ5pmVBR5nHT)#j3xfmc3^Dt8l?DHMHofB#awfEY_fR&h2J6>@Y6B^nyk56=R>#FcYWhkq|`}e8gho<
zH8B)7kSeH!MdDdDq76+64Bvm*O%`sQEDRAqOM1N5V^pc)t6;d|T6Pq)LQEE@N?n@<
z$z#vP$x=%3qr7?Z{`&4v>}?zr8`xVmXfA#|pMX88^GCIRkzZUvNxPGw-ns^|3#=#e
z<)~k|Ky2O|r|CiBs^3)B@!MoK9RK7V*RlS(rU=7z!vbVwooIVEv2B4@*%&tXFV5W57~D
zpsnHRDJP)xh0iSBZ#{$x$YU`i_|KuJ72dfaPeW(T6}lws^Ki)D~fy0eJ?UZbYwXLe`-v#Uld&bF=jzEHhChC#Yj8ZK!#=_&V^A9JOO7i~@v@Ro$0?T}=Naa6
zu7wF5_%jbWOsv+4T9ilh#GUBJ|;8RswYD*r#~9lt*)v<0lS)R+{2=tx>1{e4+o1w*<;Bu6z@$>QO_dHB;J*{z;dR05_uWiuH
z;8^7c52~W#%AKMHUc#e*gr9@Xb;TiVkc(15!3KFLC?lKlD=FKTQ4O=G%xi`Wfp`Lj
z{%&=?-nH(KOKQLrFst<3ZY-nRP09w-nu=#~5sO>Rc-%`}mlSp89Jz~bg4fapAdRysOm4iD9*YzeC|t39
zz_uA)6=b4)d6L8nO|)r%;^9K=)fR-a#L4RMsQOAJu6OA9*{KPoe6aB?tKnq@jL_G|
zJud}y+4oNE_vuSjoE97G#DI2~ClFo%q+^M^2`DtssB$Xh=Xhk_wKgzuQb@JHc3~yg
z9eSHiCUlkZH(qE;uvAF?K1Ei|NJ@_ny+?j_w6MJVzuR_k6U7@W%*tp(aH+4GvdM20
zBh&~>oxXT#3rP&h{uW%^zZ;bU$*fHO#UcG{){~Pstjd&l*}K*1(9xru=IyNe_+BtB
zR1PE-jWQ45CqCS9l8{l;K~wfN)?9y1{4#)%qc@Vu4c!I*kwJ@)zd)XMr4b%YO#qHi
z@2vBVmD-*=I<`iB-Lxy4>o3hfw^x7pypei9GfZT2(v{t$_5kL|hTnRgAMvgxAX&
z_Rc1kv2c{{7g$^4<~qki|I*?jgf;PvR0T@7ey8EcZ$k=GrQxDK(l6iv0SJ)s^tpBg
zB5phT3dps=0D%L`pK&{v!sFO3w0TW@(qrN`qrY7EpmPg=GU|0PFMwJ$1-F2b=k7gC
z*Dq{o-AcpSp@6-d7+SYBxlEkq@JErk_=>#AF!OVUs9*DYt0`I?FDbkFE#G!zwe9>O_&~B8y>>1YX?Fr*U=3l
zZHh5|hrdwC_uhF1riDWA8bnL?8-<(!)2iIHz(Vf
zFAp0Oxj~AQyn@R<7%D@0tdv!7;Pg(B_*L?bbmxDWfQz>D@AT0^ddn#(wzi;%2`{T1v+?qiHTZn^S&LsA&zB2
zT!}=BZ&_WQ+f4Aw9T?TJ82o;~2(^L4g>=4RuJKflj8<{1SC$)kc07-e8A@+un1XGRY*^;J)PC^A70B%?QfDDLl$RgA7+L~yaslMM<)ymvkX
z72WBwv!OB}VEoW;ca)(|n|f77!iMha#o)buSyICfNs3<+lC!wfiFJZiy?2@T
z_%t)c!w_ruN_b?-iZ$=^x9qxQBfZUlK%JVw`u
z+D8HXqa*iKX#Z(Lws1XTBUe!?m(M((u<3W|q*>=^0fQ)fJLF8e>e2f8V<#9J&piSh
z{QC8W?ku^K89=nYZ^SYq{O+@X*pSBAkky!35c#NmBR?Q!^1;djJ6qO0V3s#8#OJ5J
zW+e}{YGkM&`_?-3@E^z?r!K!d->BK|iX?u8DASYvq`%bMJM1x>5*_{a@Zropb&k>Q
z8Yu%i?xP|wW{~vPCZ>=owf;rXrI`}6AI7K;yM7}cL`+9qP&+u>CnHkZeo>|PZ5{43
zL*x$szg@Up8x{BAqdrW)eJN()`<*-aAKUE_zdY>>6Xs{FM;}I;UL377J)`}?ubAMw
zNa>qi65di@K2~LbOJ>sJJEBi$8R3H#RStGE6k_HrR__{?R
z&-n52r*=gAW*|G>AOV@2tvGr{^)n2L9x$fheqyMaHieG1h^tdrbu368I(4!tajOWb
zB_7XeZVm7*2E&Ujf~GTuoZ~O46_7v}L+UdDYapITn^s%HI3xp7zKKq5&l>ufu-JN+
zz2`kbt)KF;{wQS@a(PgDa}Ephu=FcDshV{pt{%jXqQ}tt{Yc(CCS^thdsX#uG4Cmv
zQRV@ov*k!(+kl|yXF;2IlPF2p=nd_;qtKJV@uqn(otlDakpwiS^mOyBID
zn=b=gRL8Ypu~>=p+SSV+GI!ra;@u5N$?GxyKoM4>6sSgNJ-fFRz4Tfk
zvEKajak*;W=@z;$I$Nvc%zaA(r7t`%8snFbbe7BQy2d;4{bU|U?g%=b9d};G)c!II
zYJJ5;GJUwB?m6F>XZd4Cv}oc3_hidES(kUM8VS(UI@O1-WB5vo4z)=`YxJ};9j)ay
zH~%>hb~A)vnuq6aydCxe59*$N8M1Z$e!7{TA#jJ=^ySg33kDC?rQA6!
zyk-&gFqKNpF5>kj-uP-IXt+PY^4wFxAtDH+RpzSYk!}@9qYn(NcZ%X
zHl;ki?KR^3?>h#$l*Z_M=k;(CY~`Wy;n}DTn{H@P`d4=a2f&wH45Y2Z#>W0wY4?75
zUY_VYO#AkstZ^9wvG}n(GLoz8xx?%jay+ZOUDdg=2Fb)4pucUg7G$v0W)qV?{C*Z!
zhK8n&Ug|w#-k{y=e}hGF^Z#LhRIwY<^93CoiZ;KAzyF$PXy^G$f>mxY_hj|cphhTr
z5Z}tEPniJ@XJGNa9K%F9aos$sf-4{bB%1
zok1d&L$wp~De&ft6ei|kYp5!sbd|l>*ksOu?l%x!$|TAS6pzMkkb4wARmbEz8LBrJ
zEvMq7ZrVfjw@$m*Wngo&lArSQK0I`iUV2U{%v6VAO^WM73}fF+gp^$Wx*pf-b3rbx
z8r@I#yq_u%_}b!%UD=POym>KRly-KWiC5Z?5P3eEM4T95?J-;k{T>VRJ9CwH((l@ib(sR`CFYgf%#wOI4;!kQTfA^QMlQ!si
zDzB~vW}IV{ynE#B0~<&wshC(wYpyUKIyY3h-X;)Ad%)5dSxQ5nqsJ&RNpVp+XFe7v
zAgyVId(E`8Ks;Fr`XIAqSPLH=?TfraZc;DqKPE?k!7iUm~IHqQ>a)R>8V0si4586Ic&c1tkWK$N7nsqWf1Yhx4#7>^R_kn|x
zp&RjaH+$|L9tdCF-LEZ&P_ASAkTUKX9d(aj3YeOX#)H7QP
z_+E(IRy^{H*^Dq-@f
ziL%2bEAYwQmDcg>jr;tt(&6di$a-Nrsjb#qpxxTSyzgg46q0x`IqO_?$F1fu%fnJ?
zO3?`^bl^fMK+(BFo`oOul-?~TQl6flD^yfab7mn)v`HgTcw-9QcAX?kgK~#&yCY2o
zA(mC!2YcnX0@Sy+?SU@3a-qqTikI0<`qs}upbi`pViIYFH*)U!wk~vky&8O261KMF
zj}}`r`JGqWQz&h2+ZRoajH(AYevZgBUaf+5D5L&-3`$p3|4l_LZCM;;qRgznA%+=E
z_ZtFA!C`}tKi`>@>5^V|9{C#9q~d!0Wp<$>u$>_WSTqqcYc)SMULHTNOtZ_xtUGAT
z!EA7_4Kgh18D73`q-5@J`%W6YI=lB%-}>09%J^^gV@SJiftJJ%9nz^`7Q@=;in`O{hP#X?n2}SxC3_lB
z5G$Q7EnB7n;gM^O#V1S!F9{2Om81gC_-XVSfV|S}xUCF`DZqcXVVcZ4W=NQzdlt;@L!8>>)eH@XlEH&9=hBT{+4Dsrk?%lzY)oUcqfmS3;_
z+}uijmKAr)-P`%I9pOCD_jbERo}X1}yay^P|2#qfaTo<04q+dx9y}9B?a4{W`5*X>
zk|pyxQ9gnD&Jgz^3&n~QT{d(o1Ct%7V0d=LCWyNu&A!zW?*DF;HYxZ1bsg_Y{n7b^HlpTX`EVlm
z&vL3P;$APat^&Oz9OJd+X4t4o)+|324aOVQH|s>?=^Nj74YxW@hzcAvfKKNe;T_V*uldus%OUYM1S+MUROiI>c`c$h?s$ygqT_8j>PK*
z=tE4T5;F^zK~N}1pT7IEH%PyO%YA}Iar*?(mQ5x@20WqvO3N5@Gdximet#BtJYl8|
za&?!I+0t+&vRFm4=($c``ywB^tg~@RJ0R&Z??iI-sMoqRh~yvqR^iSpDP$H`@|s@x
zhskwAHsh4F+cdQ2^xo{_*_@3iRPCA;j9&u%TO*cnS0U&ZeZJy>j|KDA)}V=i3Q`}^
zEVp;wLY+Hb@@WRy30|^SO5l@KHHJt673#@2y5XQ6=vRKFICwdt`>)!Ii~VqVco*bP
zfrMp`CLS~bHPYU$*L+)_9#qL>kuz-#)*OQeaw5*#I;Q%4SbA`3w3wAr^w+yXJP)f|
zCBERUp?1lj)r#xIMaz@#QUK~bqABq6sp>G5u3*F*n#5?5^^g1lQbEHN&rjU}S!Dxc
zX_Cckr8cXw*-fo`iFiTzK>QF!092v8Wo-PXQbKalRJQ~7OWV}VF#Kk9nbdfZFxLpB
zxV#ew@bAJ3ZJc}-R!feBt#>o?+ofWJ@dXhp4taPT+?$kz^E>`*@xA`6q3{8v15ZmS
zLi6Q&e0*lpRv*0G3Dd$QSw`0Q(ZF?OLEI}6_|P(1Nf^?%-h5uGx_>|I{yS<&)%}WT
z*n@2LWnc&vcz(M;>?8rn!Pn$OGCUDtIWIRmvEiDfJMd~F9sXlW{0V-l@b??0
z;NboZz0?Yc)8szASWV`d?&Ryd4r7Pv&f8C|9#^Tf&4#hsugNL@Z02~1!s}J9yIx|H
zkf>mIfqrZd!jtwgeaWp&C3X-$A_x7*P3ImNBMM&t~0U)9h!~jgj
zvwkRxObkTPFLff1*Ly7d7^G2W17sB9@(Tdb#`NXlLk~M)?ZfKu7j#VPz&sfa{RpT;
zrKv9s_20dBMzJHl$MT}!(J_5v5bRY()Vd6YNpS}58+RV;0n6r+?lg&ETC2U_h~;%T||F(~k4&Tq2WB1r0Pb5-J;
zp|yZoZ6TC61wV+y>Jzj7Rl?K~UWw3=xFuy5{~9C?Ap=Q3=^y`LHbFFR6=_o&EXN+`
zf7ghWvJ_nxVn6qzRXMCG3TKc4=KfHYtgA&6p~{fskx6N6ZC8K@KQ~hgXJwFrt2v7jhM~P1Bu`i#9L;VBI(51J!MPHVhPM$
zr|DLH)vL4Jn$B4#AjtKer`P_)3%7pWu4B;)=Vw5_&O=9_SvRgiCq?UrG1dBq
z6_?o@os9UrydDPb%ljNE7G6hLh7boz6Tg${D6+vBF4j^vJ{1kmqv`9kp`xda!*rtn
z#we$(vt}d~I^33OVm*MQ_H|-VSdFHgjBDRCSpPK2~WG}kI5E~%}Z+OiWk`y$DKjB{2XcR-(0
zj)Iglf-&r#q_*c#Lc;Ilhyxt<+py|K>EpxH;|o%LV)M)I2qzjzN>__uoy=MEsI067
zU*vIJ$b$%ERAkgVczE+gKdrU3$I@^Hw%fv_`My06++YKQN>B^hV&me9p;lQN$^OOc
z?*JeEOY~1j^&)A42+kKmIxby(_GdA-W!m1YUkDB8dl)f==5Qg+$GtZji$#C1C^=sSCR8vX=+lEaM!9^=jUIW9Lp7seCA{@QXrx_9Qz!o
zF>AryS89uy8C(MA{GobzQGH21VqFw&ffro#!-o3rXZvDl?m`~|nRlN~iAd=SkG^vw
zH@_mI;irT5EAp)57C(BW-vC<$@jm@5&zgn3{Ofoa^)eH#g4?rvS#Bf){tj}xv*+a#
zvIne7@Y`Y1ky_>smlyY-x$;dDL=A}SihnOaVLP-oFh)JQN2B66#$r=yO3Y@-L~C##
zCl7c-S2Ya-!+RH6ZO}dw9Vz?!m`SgvH&T`J+}C?cj^ik`RGAmm$`~Ao$
z0;%gz}#-Qe+5wZNRjLV6({Y>@?Nua}g
zjakCUY9}yw1ZGi?9APK0nkmLPx)G
zwvylMC6)%UG8!u!XCvg?3F36DV@Jd(6V|?cUqO8ceOgq0&|%HE^MHhM_7%xrw4l|%
zV^r39$cVZ`aEZDCxETzFV4W6p;n|FP{zo1mACrdaet7dC5>#Z{)Lp%)mVBJUFV$PE
z|Kd&iV6(ua1b8K+L56G6)DyvvOm1Pjfdd0djwrA88rL_A<~IGgOW(5tyM%&=2YLkZ
z^d0;x>7BRB#{K2={LMuMR3}0jG4v?f<=_Htz^*4wsvxPjMrB+AIwld1Zq*%03EgCz<#wPV=eRQ9MU5p{0
z^!kqYo87}^EpMCoh|L#bNXUSgoA7S+%f&MkFQ^(9`?Yks8e
zIx+&YXJSO&9TK-4CDI)&hyM4?XZ}OlhG11P&6TR@wuDI?20F(6q>P)lhdU{1#4#Bb
z8C%E(gjBMmd^t8iy#V%32ip|#dye+$cBB3
zC{xaj+B>0+ba123-}~e=+fFs!8Jxb#z0+pI@c~sgQwm-WnB$UQj>Y-WD
zF!%igDnvWA)_O3XdCf)xzuY!TFGMS
zvg5gbqoFe{P*Q?9#4@7Ld20JeJ+;pJd2W|0Q!b6jf9|qg^yb}9y3L^$8o|51tdZ#u
zT;pUHLH=UPvK#f_k%nBi-4erpl1N={gQQOn4-x5S&=4Dr&*^l>~
zuc{TVfkLEftI$O~t_TcJYk8Ky(Wey#FAAc6@)H#a9XM*E+rE1LK^S%j?Gu8%AS9s`
zwcegJEb>5@o0*f{L`N6$O6$WHw3=h$x2x4UzzTob_m=RasH3ldLJi95%pL{v4wPED
zYU!mVq6H0du`=J`J#m{S&w^SX{Aj|1bWNgUHoI#E9rG?9JzriBZ(w{^PXQbcCbw5K
zO-AqU2T`RD+>G?G<)429FD&z0@D6maW|OS55Yh*=%E_6d6k7LB)f+k=|FSZ&GO_NE
z!A$Nf#Ljwrq;oOq00q@bTssyqK4rD)rnnc1a;oCAeIO1)k3uiM5~Gbn>ds81_svff
zD^29`;$RaJOj^g<*@ra-HnB%wV;8<|vYL)RR@1g;dcmWL#}Zg@pMLZF{yz9E3Q#=^
zTJ0Xqt5=K>j#ftJ?A@QP%bxCW)TMBmTu)t$Ce
zmaB~0j2RCe7j8)VKS=47$WWGuK}>sf{BZ?N9{DX!KVD&*1s>Y$OM6h0`ntTf?(>~V
za*v+IG7Yapgi?M2!w)?qJ|?Cstb{|q@xRvSQjTf-kJMm}AiGr|yGG;9NfG;sU5iZg
zU9)7hEMM0x$+w`zv5vn*3(VwpNhZFEjlQc*>ayI=X~fkwUWyN7DYy+xezLiE(PO|`
z3aR<-y&et(pxgngqfW+p=%2lv@(`aN;+ZRvnq8Rt4_>P`_Q$E&X*DwQ%5*EO^rPvs
z+eZb|zI)T<>un_rh{4@qjxK-IKxO_B*hMrPo~JfK=}yquH|Yd0Bx-a7mm5$aeMz_3Wx9oo
z$ic=ZCH*ed3r4Sw?K>}@`H;7)=otlwVsaMsQCv;Z9|I%SN*!G3P0r@#Mm76x=DGiQgw|QTQEE=IX
zo1VubMEt3|mXVnGA^TD_D9=l9y6MN3%zksBkxjI$flDNF2%Y+1Kmo)o
zwJ$M`U5p1+j+w;isof-9N9@e|B}R~&!Pl!kfkb{OXw4FZP1QMw7X*bFpS3}}R#gQ_
z@>`1hk|M@TMy(!dyj5axIDAVftQC8Vg#FIZ$#>2GAeR;3vflq)l5k@5S3*z1t`?Z59a)UJxpK>|IqT4)@hHUS^Lj^6GAy>4DF?vn#
zH8*LfCT>sF1>I=weJ5oBO|rLA8)JO6^9f_biG$zoJin=`lAF6@#*9=6!A=Hgw}+Uk
zfeb(M;x4mSDx^tYBOXd3FL>XZm9YoE6_F%q^021H;UFb#wbox>dh>b{=q~;)MB}(5
z@HQ3@u|CRP!W*cQj3@TBJP_y7y6|{6^d^(zlXq2Z`k{x}Ny?#kP!X4WEu!+OmP^D<
zK?k%JhLc(~5Z7e?dcTvBExu{Nq_Uam_fRc@YRVihDR`M4snxNttPU0uWaQ
z2~dEG1n)e*mx*OAH4oUKNFmp=9qGC*{FCGNL!WQ<(^Vu2lukTjy^_iVdQLetA@d3R
z)^hCU4@}l_jYfM%Ign6y-IIKKZ(QVa^Dz1(2LIQY?Ly>wRAxR?I@ZI+s?rye3dy>?
z6a|oB5r?_2kY{0sLHjeEBDwb$p~v9Gb}N1e-#3QRXx=R!qiv4cD757+
zCo9;ejb%NrFKv75CacXNaM0IP?X{d+LFm|R-813JvcZb8EGN>d{;M)~3W1#nz!zyJ
zV;oF8SW0|DZrh#?`Fi?C6*!qPM5hGMI}p%U=w;#6B$;VYSlRYSFmRXt1OQ{r;z8vc
zrJ)a(hAEVKblXke-7SRQs=f|US^On0H;C*&Dkx07AEg%l{`B|^57}sMZ#{jw`GHjb
zTcYTUxv7nZ;zI9u&J++RwLxW*XE~iCFhD+CL~9){?{qj<4WNq97(#EX%-Gua%H%Z!
zKsV1B*KisaiwEMR<4`4$-x9B6&G;|VvyLG~;knP^zr|ZZJ)|{No5hcW1uwoH9{wSw
z_yKMw=#r4atg)C1(st3II{;G*odIl*74{TEEwQTPyie>ZA$%B0r0dIVH0lMQsUUCq
z?T5=yis1FXGK}*@u@c|ct!oUcQc7NJ1f6KDM;Hi51NLd^Xvk7tQ}x_Hx*>Z$b_3*y
z&l9|LiP%V|-6Jui_XZOBngy~SMvPTPDUyy=9OFPS>i&Wns-A-shWm+jbn15g1k&_R
z%1M)d;@F#RDr(-*(!mt9bPkVPiYr5EyKk&*AI?+E4OSuj{Zm(s6CbSl>|(MY48M
zP^6JF;3@qOHZ5XZJ1c~0*}v3
ze?O5zi9S9uOg+CX^LMuUuh-v;S6BO=|IU{Q7*nL_Qo}r|t~aOw1vb~VH(>8Q0%mEy@SXGuWr)K_2!
zQ8_>!woo&LvTGK)c1$g3jein!OY0-{V2Y$>>D?*7ztVZi?%JRl6ffs%|3fOxS@CJ7
z_GndA>%~bl?T5y3)Uuqa8m*C$k{ZEiB4r>{aF)vS13i&+>N&m6{LC+&7Ew{Dpsx(1SRT4bcd|Xol()J;3)Glpdy@u9p5fxaVf<
zZ$4{xc|`Ncy*zaiprATQkzzI2ANTE^@Zd^18wb;hs2~{}o^!ld;j0@q)*1yTnyl<@
zC)6>?qH~9z5SWHs&Ia;vjVpk^Hyz|gaK0qw9ZFG&AbtK#vO>bjgRx8h80eY?J%Fnu
z_vl>c#7Te2K4QPaBug};cQ$$Ux%6#+hjZ01S?NLUd(%p5#CP4mm}p09%TW!pCe>M8^S?frM~7wQ`K+G`!w
zCyp)`t{M$HMNT^W?~##!?xSMr)z(xbJ%awq9+e(5hIrZSW*bAwFa_n?dFk9|}($TSU?@(CK
z4iDx5=~uI*)5Xz>@S7y_cN*rw*y09wJgm23LpN{b%86xX3*L_N_tNm9dMb}#t5jV7
z&}4%py%bQ&lL?_K$;HDMxubRaaGUKuY1-AYkl>6Sz2#~BU$WC;GCpbR_Vmf9{9j5^G4G$A+8
zQaayd1FXaG9La3}wb)0dCABGHgCQN)w4wlMxVIZn7MU{Mbb8jg&=ORPJ`sV#uIqi(
zk1snA)vCW<@55k*^BiR`{Lk^{vD%ge|CdDT)v5|z#CY-5bh51288Krezer<`zVobj
z`YP1ooO6!=4>NhKE2zj$J^Ar0IG&L1hg#qkAm{oXXhyp(fpBlcQx%H#piMbinpPP+
z{G_KmZ8HR065}I$yI#%Hr9$L$d%%9f8NTOeYiD3x*-V8e*ySXy6Fi=Yr*YF04Ba?BtpRDg!fwD{R(K-@1(St!*VNOQERVGLCmW
zl##<*2nS_(0}@OyKJ4HvjTEat9!=O&(%VdnTK|mE_hlusdjE%R77Y84|For~SSy_o~aGbLN
zfq>dAJ#J=Aw-1EN>kmE*
zj2BV1%UUvW12hi%z|GkK;F`&@Ure_4rTcMKI2aj#fyC}{KVz6r^l+MS6IHEVFF!gH&2IG?@WK3C!o6UE?Uvzq6t5#aKZfE1GIk?OBTe@Z0
z+Ue$d0V`BrOe|+Df?6`IXq(on--U&fPQ&Di7XAhQvd8nmUDK1zZeg=?h?t(9!A~6W
z#K}p&U{nE0i$D2)%5~LILI-4eSg?j;+e>HJ%w_GNJVDdA0^T58uY_O{nqn@Kcb_zi
zhHvw}Uut9pXBcS%*n{a`9b7IBG+`qbd*8Y3E-wv}JP1u@1hzlB)nhmOe8BG2+{(1D
zK6Gs@aMUD(SI+19+nvhrM9uUDUQXKowN*9!5v#efEujgQZ`6s&C{niMvz^vo
zM74VeUtO(JiDMl6k;Y@5(yW*X_7S=#5h!ub=RMjFZpHCO()6V|KILl!qn@o1aX%DFE68*+YECGLakoqJoB;|!51%DphB@QU<;SwjqY(!9FdbW
zvC?I=X2?^#{BKO>H}$#ct@#{SQFFnOw<^yi#2D<;@~}BYe-P`%==#P%NKIq@S%Caj
z!BjGjH#X9aB}~|`QVv!O$-F?^3V7?Zepj-NL0TGej{H0LbCpYL9^)1O!%l-Sd~~n#
zx5JpQ+3pRiNwf==22Hs>h{K=h0>?+OIiR&rvL
zSh7g`&b$Cj5=lQ6gRaudVR{ya1v^zeUsYrCPT%*1G73jKnckn6{Dl{zXnt~PsMJ?a
zIuGbuS~3~bn8a1`_b?<`zuPFPK(N$U@u)d_u8mo=1Y@N2(3C`VbBIS3M#Zr~{;sUk
zRWZ7jydu$Yi;m^&wfi+THkdE>vCes(kGK4*u;Z2y3wB@qPs5%pX@Jd849o=2v)=|)
z$R8z`e&(^mKa?aUk6h3xn)Dx~zJU!M*a1W)21&n@0oF{@h{;K9jT{Mzx7ok*%sYcy
zcSCNVgdT6Y8}vBM^-~}=yWf3}zF}F$Rt%)CHnWx5p2lc%0x_^)R(0iMy10l4)CW`I
zNE@OG+plNTyqDY{0?%!7)
z0PARcx%u@_g?>)GRNvh!qavV}EtsAIWgZ(GrXE)z8QlK$Z(#Ny3C%(uX-FQBm85dS
zQW-$s4I*=gt_TJ!k8K+fcpe4NkM`y3A^Pd;f9Qcw*pG=>q|kw)6q$J7
zvT%T`+gXYRfKv3aVnz?J+d|=!e}G*M2Z&Xr{4bN;x3Xc2#a}CzTl;93JG+FQO+}E$yY)S~5|M;h&H}ZUQJno~ki;#(^`=al<)=)niTlog(rd0-0l+%2
zm_3wMEw}b}c(eB7ekPy<+bP5MDy?3hjRN~?z
zl(NKGP*K#RFq+?^^t6dRQ2*|hzAr2~=EjTI04FlaGHeee^>3%hCOhO+=kPdWC;^T;
zGvI|@Nv7a7$hYVLB0g=gyMa9-L_-i?i`WVGomHWdHqw7&>)Rta#46*Nh~3eQ$s?<3BSYz`Ihs$Ni1G
zEXVg*_x)dWjqFzh6Vir~RMkxW-1sBs1b81UawO_zYKg+wx1D<+)Lo{L0P1kSzHxJ0
z5-|V-wHLxv+6z-j(ft5MmB(+7Bl0K!7cCuiFkL1I%sc?mObi6HoDW}+0r=|n?gMdv
zNeTl7JCqD~bDDn~h0dD?@w#;!uvM9NEdd}CfLJB(nwFIn2mEVNA&2o9QSsXL-Dfb;
z`6#lT;k8?l}uGWCjwn>J@=+BaU2(I7R>!vt$5$4g`Q+
zq~)rs5l4Pi0Dex_e{XTNd$*j4$+Lgc!j?6g110bg^nzCljSfUWY4}4Dt*8?-c+S{C
z{7aj}I0MFQT2IPx*Y+7a7~3*vIM|RM?U+wR`Jil7SCPt1L(=pmjE9E_+(i4dp5$VF@*G|z$?ch
zBePaNK<}A6MM_plSV<4uok;Ycb?;1t-sLud=*owc71Mvu2)J5J%u?x|KcCe-fa}>>
zcJEO#GJ@E|1?id_8UcVcgKS`cI+3rj+Q{QZ-$~zWd`#B;|Hq)i4tf8h>aC-y>b~z`
zTT(#s(nyDNmx44%r<61b(w)+E>6Vi26p=={LAo2HyZg6~&*%M)@&19sq1=1+*|FAK
zbIrY$yFVD>=4B>m9Q^l8xJTAmTOYI-`S5S`tgp^?3r#+zfose2F59pF_j1%dppU%|
z2D#Y3`*%?9^~^W?57$>8g6@sf*J}SB_SF9}l!y-p_}r${YvF$jj=2K*Sx@Y4fWuQ_
zDSLHs!5!!H?B~o=9N#U_u~goSAN1(O<98}+%&fBCR{h_zI#(jaiHBZo`QhsP{xK-H
zO>>GOC5;L*@-+ob+2CW0U@AYfE-dH{@?m3Ocomk^A|)m!hEe{T&6wwY9e}9~Rnv9H
z2G;9$0*e8mG=IPYThgL-zXJtNZ>yu2@vWZ}U>#NT_4Vz>(}CV->1@U_px@Y*0R!3u
z&50n}L)3o=+V(C1V>q^(L;Z3Q7oM^Fs!mtvmYPacgMpE+Q^pI*5?6Q6JWoO?j@r<(X=v2EhAH%^4eHIH>E-yy#
zx=Y`(-zC+T;-<8+fP+rJVx6A0B`E)vYKMZ7a+9S4^dToO9!w4GWonu&Z)5v}GxAW>
z?u+SCDz_2;VH+mYBi;(!T+|0uJ^vfgfzC@z%u`hH
zsu0`1eM8YlF1(;;BL)s0B0Ulj45{~=H!z531}jGq3+Hd9wX)gu_J`lOClW~5LV5NT
z6%|%zQzqnmd<4k2j3Ny#r-ah~CaMlJ`Ut^MR4v4YdZ&XO45m6QyUw$tC+iKyGA?pb
zG1UJkwsUm_Sv?p-ozS`)VA_>@a1P>7ylauV~Sj2kqLj3v2PKtz=lwg
z1=i*eG(_LDdKQ-c5*nVR{^oEtxU_O?-!XG}yuR%)G=os#n_<%WP-0NVSHnJd*Gm)Z
z-q>rlr2Z~OnRiLNb3ltmeJ!dY4S_XpWX9?Tz>&Yu@whZf*_4C!bG_G7WSo!SUbpF3
zL2P3_9tjCpSa&<~KhJj!WW`-{UV$bEbQox{R&ITb9%YG07;yRIk%F`6pIr&G&Do2D
z_*hDyUoIawVcY*1oWT`vltzOR2KbLOQ9fh6_U6k#lv3pAel%6tqte=<8_ar`6b;G6)wkbz
z3L2NRd1gVKmtRUm)!)V#q)Y>Uw`fB_LGfKKP0)0_2s55SnV
zoq19{@0|a$z}3Xp=lc`3R3%z9FOhK=euF>(I`IeW6n%15^a)~du!tPFv@rUT>X!dt
zK}j>HZozD~A)l3#qd#7x!M$5K^6wKO&@(!JPUwVy8>JtYTKqOg$t9p-Oq|iu?LQR;Mx|^v?N);6^qCw3b&^envo5^$dbY
z5mMm*2G52a99RiB1e0Nri-(PFjzHLENx7N86<61d<-^aw1BKs~i+|0xfHF;4)WTR`
zjeVyLK^_pQ>>$g1*p919N>?{>#;9=nT}uz$Wed^UG4#?V$NNufuJ_`MmAF
z)7R4792fxV4t$au&612h`120!-|Xx{CT#_xf*Z}aO$G=-((>tlhl$(z==k_F*&pt4
zakX6vAwcK@q+mAr(F@0d!9*$#iVdQ8zSgX=`{!|ed!pmwaypj>(m?H;{1C?4E@(QN
z!@$OUlZ2B$}k=M=RYNc9I|0bj3`(DVo7N8
z14p2D{I}nQn6Ad;AIOSxzdl=v0(BA2c4rPjD|%=eB@4MFZy!8XEYqn*2q)vR`-A1~pT+Viam>MsH
zrxAqE=|X)k5p{$N4YOp;l44?fXDsU8yB31SKhXmrD|Bw4e)k}96@r2UYG~h?ErQEo
z%H|9tt~)IM-eIxW4OD)ZCbtL3Var!ES@s<`M?6xuUtMtE5Jp;|MN`KT3
zCmgDP-z)$dqdp4I0MHJatg+1T#n@r
z0~SW;zjyuwwM+Y(WZ6NT=9aPT4p>%FWn6G@O8r-|xg9>Y_#%R)rN90I>$$(3pFvjK
z?f&+Bx}IA=?^f0=Aa}cSlMbO*Ymx0h*Vi!HS7b`Xh0#Ce>*Qv5c-f$
zRu)Av6d0qTwtGKCMt}Jd;%&gkF#AS%f%)A{{08EVT8G_#&Op8aEP{{~IsrilumI0A
ztIUUv9;bB@+Uve$;w)_3P@4G)a6rBR?d2g%rd@W7DrGj
zsiTvMBgl|xt*ceKbC0pi6AlJ>d|s)ikCE^k)M=S7lFN9P+!)1v3JV$7`O>n(Cw4B5
zev-kf)4aXCTT@94c+PiGCT#b(F$GN$ZB;s6{7OqpW6ZSXp*H$!;B1w$g)Y=_UBkAP
zGFV}icK9N!nYzY|^
zRY!T-EsF@M=UoT6A1YsgTYnfM39YG(t*w1PR4+>T3Ijjf9S`qO;F_10*M~{G?LY8=
z{Goh~k2U4+1Lvt1Jm*R{dq2#1bVuN~uu`*c(@x>jzb{?$5PLi(IviEb+-Yrk_~I&N
z;u@Y^%uZ61IDg?|TK5R;EGlAf*CyB>G#i*4sJ?@rv-Qwcz)u0whh`~`(YY>`N5OK|
zEdFj0ajX|aXMU07;#&thlF?L~F5C9-w6%u+9z39e@z3--+D
zIvaV*qj;wGTI{KgCzmp33(Ft$jS#kWmfZB^{3G-Cy*bfZv
z*oXI;`g8SZBp_lR1LL-|SGV7h;y54V2&}Lb5fwnYn!sN9t{ea#VgLdG7kyo->^$1Z
zOIH4OVkYqA0Ar`n3kkL-FFhN@o`)N`eX(0km`)*L%S_$|h1bLl2n2Z@1>sx2C!bq;
z=p=4sux=xG7wX?|hWQ=u=Vq)wySc?!Ux+)LS+fim4%V@{D?!x7TqhuCJMbUc7WQhN
zz|zIiW>~-KxKrOltp`N~A(O}{TgwQVzSBW77`q63NV~xKtWS3|wLx1TM%Zvq>p(Oa
z+(|8|6jebaQp6zf2P}onA?!ke%+T)p#ccJ;E`tMtuG+~DK?OYu1mV+#4CEP$CKT)!av$bU9z
z@Xy@-gxZPcQJB}ixmbMMm&o=UM2*8Kuy+Ws)K{&xBF$|FBn~ds$p^W{c3&sU)7Jx2
zV2mczfkecQ8;zfLUpOC?7sY1RvjX%SUE$s9)Gz*xtOD-RQlrCcF>D3f#vd0ayzaj0
zoQ&H(;@KubqW3>mG#nZ+a;mE?ChO38N__qpjsNSfc^By!0A&7oO{>rUcGz!pF}GEj
zt3I6eh~z=RYZ>aSuD(8gx6a9p>at9IJDEwubXdAW8@jTQUX9lc10d)z)bH^QYL3nH
zV_<7Vxu!);rX8WA<0|a>2(L4V4Q`D`%}}_qVDlx@U%B!unr`I8icetrfv7*16qdEM-jNW9>Z^0&a4RgBY-Uq
z0rdRL!eKti{Lk_#0cy5+CH<}bid>|j?|eD=$JwB449<(4C(Lbr;X6-au*G&r8MLb9
z7l?=eJos1kz6UNZ2q1$TSYrQ4R%V?Ml!wMn)if^ZxfNkXJll%+e%RaU_}l99f%-Zxps+U{X52#A;IURgYeG6dS?lk?_4->hD6oA4C0g+-wkLS|qpRnu~{biV3
zq}ec#wuLW6tQs+mV7W_!;&ABlGU)e0o
zjlEvOe?x!ni^vPS40<{`B!JC^l@xatnn-~4ZRS}|K2A&e2!6c;@ITFzdMi?1A_kA8
zmqZNS^*&38{{ldmh5F^JX-w#|q?RCK`MG!=QG7o_>JY?g?GbP}SlOpCTcmQu)RB
zlt1iM2ywwrvx#K@D2BIg2h;Zx`A-aq0Z!_j$&8h@-4!_0qGs@1959)U{q*VVVH>=kfbT
ze5f*q?KRzdq_D(p4kmGaDcDvSzh|HCV(n;V{owVg$GMNbwdT`oJn${=0shQWfinwm
zdb_PwQ*j1&q)56XO)?)e3I)GjeEQY+C4f-(i`sjiGVp11a|PbkRzz^B((
zd`AJRoX?h1^<@SJKqAhqvBKOLWRvO=vLX~Xr;px(xtcoKF-L=1eRsS2@iROUInE#7
z!4k4TOsU^;kU@~5lG15rB
zHXUj}5m0bCO-9${W^Nj@aUY)D-mJz#LU34^pp-;xfb~khli@Wuvo4iRD+3Z@ZBKAd
zbjs)dRx=3V&j3)Q{1jq^h0{fb+B!m_XODOYIFP94iR>C@FOnbiIPH}j9G81}fJ1!%
z+`?vO`n!NFThcd7{~mgvcgq7>gYW}!2=DIY#o@|nC}&ur0E{Nev?#L|i7H3aZkf#Y*XrOo6kovbe=vQBWcE;s)n~DOeTM!A$b-+({Gli$y
zKG;Gbg7pDQ8I^#OpP>q{L0Td*&OG%=RUn0Yo4n*U5Jce{?Xw=y60;tk&VZ!|A}lXP
zgS-&1Sh=lP{Pl@#;uMy8751v)qHPeH&>9pxX>P?}S<9AZ
z{xVmqlIv-d%+<=EWqnXe{nm0JLo~!{^8K05!=vLJ90um8v*^gMJIRGJYKi3=hGo
ze7DsbWx{|yTXam!6?G6M%L#isH=wBQ0ZHhHWB=sj(7RVeSKs{B<5#juK#nYhE(La%
zz?+gG1*UmqQA?&bo@oN}kd?L-a4H}R>zXn&n)LArg5@`sD<6Y=yuUPnx+T-^>78tF
z{e>eh6Gn>JJx*LN-F|rr-_+R&i8C!lUp@=N`~rHa
z$#O1*mU-l=1xMeo4q;L^0Z#D;I?I}xFPisHLL*d<4ThPRokWCbW0~pJ>G8u#=XHi3<4$%w;3JTMI5ef
zk?x>p;^RoegO`}@VXmC!ex`A&Z6!+wjIojA!Lc?oDQ2GvrX*DzqbtdMCkXwV^UWH+dGEl%?Q
zFzse?*xQ_+4DOJ(-NY!n-phdDLGM`9msk-O%R_I^>D!X;vqZe(^oOUs1Bpm*8B{2McESC84$2LmupXA&;|5FNQ@=Lm&KlkKUUZhQobLVpRX}C`M%G5jNlFf(lG3|>dLoCK{3m`T+bQ0$
z+54%}dWvIZ!pp&Q0DPYKVQtgPZbS4JKcN1rm;4FrrY$9lte#Y57d1JTI7P!xYao_c
zE9=)^zcOJHQMqsg0&&%|dfSc;d6BVvua(J!r`t;bBoOc74FJNKRR%inrb_QWe*7M0
z{E?_VNf5eO%?Rk0lt~HJwrLg-tW4yn=;+9llwwgVYE~RTTciSv%jAd67iy5VHJYDE
z@bH~7ES2t?Jl{dxqIO@BMXjWxJoo+Ra(jrqiyrjth}5t*b{pt>^~bVB>gB>Fqz#~l
zqTlrhwRbj5BdL?DV{h!>~;2-1qzx
z9BBJ{N7qiPk>YlfB4M
zs1<{)a3X;LNT$Whi@e~sZi70)`ud=x-F%TKW`mrO-pX5pY7&Cy2C3-t8U_LL=A7Fd
zKA}EZoE*>hAMH>7ly=Pr^tXK#1Lq$?0MfkW3Ci|zBLE$Z2_>bq_nQEOhA8%loD0qj
z4kyM*|6w+9ORQcE%MnnmcK%Y2uLoX?mHEG|Ell_MiN=7Kcj&|Yg7&ty4d%C;`1RXj
zmY}N!FLlv(#4%)o4RCvE+ZQX@bqg@vqw7h;B48G$zZ!5(6lr9#otE#Vivt88>p~d8
zg-BavE#_)s*lgsQkeXT&&&J0%BV`cwwq}Y3VLkvPO0`fFL`#+J>?&VqE)v4(kvpwb
zBqb$Xs2p9S;r5}=#JQa}U^_Fvn1IO*02&2@o*3GzlAL5+PzCzsIEzd|nd#80*IDZ4
zav-u>_1RF
z9H3}Wu750U-F|@P|5#BS*5N&T()Or^OOVfPqC?BAsJg7_K=~cWK-OlAGN(tMT^37KtX0IT9sRA2j(OG;H|$YJ5CgoU
z4_1Q}?!WHqC^YpT9FIkKfyk%}wbjZg4CGE^amELCHatQ8!3l&9ET(@*`H%b9YWLE+
zti*e&Si}h09fCR>deD__Zp@S5XF;Vkg4+vQ=J60iY4S?HCnS%SWesloxMSUoYOiK$rJ?+Vlet#9HV;dec;^iYVb|NHAhUY@6ea_`;4!LEGn9|7UrLr{Ep
z8Di@p-GBhwo?WZ|mjJzvPys-2SK;uY{yU6JHa&Sm4u|MW+pf{yE3_2>8*LB4BeyRinC%k+z
zC<1(-HC>ysMl!*>6`t_+YTK@L^9P|TZ1}DqW@5(|&SU|9SXRR?r(h1pAQ!SN-vlHz
zs6Nlp#`A;0MAIQ}OS@zutcP6zpJ5HG>sF9+=+%X?K_!}77L02dE>4_jUBqB;Yg&nB
z&V;gJreBGXTTu-07^z@qGqqs1DLZp>eXA$@B*#aByyc*AoHhZ~#zIa?=
z&%W)EdB^o6dPwjOoZyRC0_gk&clbT2J9V2X^?$2urNW{@Y((&(MLIULz*;RTe4yhL
z{wz+o*Yx9Ma>x2WC@0C>;gN}W;HC?3{Hg-n$p%CT6%*RegOR=E`N|p%0#c_g6HN6%
zlHUo`w_pLh1vuT|s$62XyEk1cRwZ>QmZ?K<=r5>Dm?Rp%2)HNKOF&lWfBSonB8Sc!
zwS0&MbH##^dVS{-fMXS14^0tae
zx}gX@p1p(UwFB4x%>i?pvWSSU#UFmZBYZo-qhaIc&DAU2;+)GJnTN^SybBNQJuK=u
zQ=^aYPm~VX^j%JXj8HV(_In<_fJ@~b7K{iRob|`^UnQlahELl-*nfhG=dg8rbVOIg
zMpvLIIaNFAw5v5Ztj>jRU!X8i!N_4@3=3ZyD_m6`E#`RIJ__PcXfOc)D~22>v)J?Z
zI6QLdCJ>ukByf}oUEe{$+a|yxddPX_-^H35?~b;7&w`2nThcx?B7tANg8uOG7;gTAu9d?UfOH;JEuj^CSnu7J~8s8aP#
zn2ouL=~@DA@KG2kI2Q<|v={8}ZjJ|sz6(7jIs!DzwL;ZA&Ay{0|I79DB1aUVwgJ9Q
zRhySO#`~@yM>16PWyYpqLd@Nezk+z#c3JD55OlQ;#`ymZp>UgW|I+Lf^P+90lG6Ca
zkIY3I55ty@Ue|=;E1lOQyk?oRt<1;>L9FmVLF~9$LpjSDw&(~k5
zI1h#n;Pqef@F^tw9z%Ik5DkPwq|wyW)cs~9Y-XhT%{%48p~DgT%u+()u&_0*vWv`P3f1Gwec*iw9Ug>3*JBBc4)+LByX~Rq5~S2s^dj^+@v|Ff
z8=yQ}GRstwyqMj1iyw3A=B8Z*SFY4??o`2`uCNeQ?iAGWIvO|(vUzpQ+*nw#URr;w
zk$CFVkN?V_JA_0Ke}aD@elXO&mzYhLWZTv%(fa-IG)IYvAXgh&Z_kXShPvvRZNyPe
zkI#Nl_vUm|2>}f){xBNSqWs_Z>mSQHb(bri$Q)j$@;kGBs5DLQl!^(k
z?JUWVCDv0>I2))F5?vF^9p9ii;vu>GHi(+uF=52_n}J?VD^^X+wqv7<*TBw-KBHc?
z^kI17j17@sX`sPwE74+k{4H@$>%}~s_xgtVw$;7Sf=_90s%9gjrs}*$uSM^^*8*6LG{7EZMl}oZ-`6&t6!hq{RyeE`ydzM_c}B)TE?usngP_w;%zeLAXH9ws%X5
zaOa1Xe9$!eKPQfWp)~){bJ)D{(tW}0xS#hV+*ZN*t&6=w(cQwl#&2yipwg?~uQciiP8igLG4A&&@WHrma?D
z4qfM)X-k2JShCKouRKZi4t)!XG@VDs40@}`zg2gD@=w-0K*FfqS-BJg