From: Tim Kientzle Date: Sat, 16 Jul 2011 06:54:28 +0000 (-0400) Subject: Next iteration of RAR reader. X-Git-Tag: v3.0.0a~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20732adb5b936065196de6bccca2013f2fa8c285;p=thirdparty%2Flibarchive.git Next iteration of RAR reader. SVN-Revision: 3483 --- diff --git a/Makefile.am b/Makefile.am index 9f4f64563..4ab2eed08 100644 --- a/Makefile.am +++ b/Makefile.am @@ -486,6 +486,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_mtree.mtree.uu \ libarchive/test/test_read_format_mtree_nomagic.mtree.uu \ libarchive/test/test_read_format_rar.rar.uu \ + libarchive/test/test_read_format_rar_compress_normal.rar.uu \ + libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu \ libarchive/test/test_read_format_rar_noeof.rar.uu \ libarchive/test/test_read_format_rar_subblock.rar.uu \ libarchive/test/test_read_format_raw.data.Z.uu \ diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c index 850e40b6a..e93a8d98c 100644 --- a/libarchive/archive_read_support_format_rar.c +++ b/libarchive/archive_read_support_format_rar.c @@ -30,6 +30,7 @@ #include #endif #include +#include #include "archive.h" #include "archive_endian.h" @@ -83,15 +84,15 @@ #define FHD_EXTFLAGS 0x2000 /* File dictionary sizes */ -#define DICTIONARY_SIZE_64 0 -#define DICTIONARY_SIZE_128 1 -#define DICTIONARY_SIZE_256 2 -#define DICTIONARY_SIZE_512 3 -#define DICTIONARY_SIZE_1024 4 -#define DICTIONARY_SIZE_2048 5 -#define DICTIONARY_SIZE_4096 6 - -#define FILE_IS_DIRECTORY 7 +#define DICTIONARY_SIZE_64 0x00 +#define DICTIONARY_SIZE_128 0x20 +#define DICTIONARY_SIZE_256 0x40 +#define DICTIONARY_SIZE_512 0x60 +#define DICTIONARY_SIZE_1024 0x80 +#define DICTIONARY_SIZE_2048 0xA0 +#define DICTIONARY_SIZE_4096 0xC0 +#define FILE_IS_DIRECTORY 0xE0 +#define DICTIONARY_MASK FILE_IS_DIRECTORY /* OS Flags */ #define OS_MSDOS 0 @@ -115,6 +116,18 @@ #define NS_UNIT 10000000 +#define DICTIONARY_MAX_SIZE 0x400000 + +#define MAINCODE_SIZE 299 +#define OFFSETCODE_SIZE 60 +#define LOWOFFSETCODE_SIZE 17 +#define LENGTHCODE_SIZE 28 +#define HUFFMAN_TABLE_SIZE \ + MAINCODE_SIZE + OFFSETCODE_SIZE + LOWOFFSETCODE_SIZE + LENGTHCODE_SIZE + +#define MAX_SYMBOL_LENGTH 0xF +#define MAX_SYMBOLS 20 + /* Define this here for non-Windows platforms */ #if !((defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)) #define FILE_ATTRIBUTE_DIRECTORY 0x10 @@ -143,6 +156,34 @@ struct rar_file_header char file_attr[4]; }; +struct huffman_tree_node +{ + int branches[2]; +}; + +struct huffman_table_entry +{ + unsigned int length; + int value; +}; + +struct huffman_code +{ + struct huffman_tree_node *tree; + int numentries; + int minlength; + int maxlength; + int tablesize; + struct huffman_table_entry *table; +}; + +struct lzss +{ + unsigned char *window; + int mask; + int64_t position; +}; + struct rar { /* Entries from main RAR header */ @@ -172,6 +213,25 @@ struct rar /* Fields to help with tracking decompression of files. */ int64_t bytes_remaining; int64_t offset; + int64_t bitoffset; + char valid; + struct huffman_code maincode; + struct huffman_code offsetcode; + struct huffman_code lowoffsetcode; + struct huffman_code lengthcode; + unsigned char lengthtable[HUFFMAN_TABLE_SIZE]; + unsigned char *unp_buffer; + struct lzss lzss; + unsigned int dictionary_size; + char output_last_match; + unsigned int lastlength; + unsigned int lastoffset; + unsigned int oldoffset[4]; + unsigned int lastlowoffset; + unsigned int numlowoffsetrepeats; + off_t filterstart; + char start_new_block; + char start_new_table; }; static int archive_read_format_rar_bid(struct archive_read *); @@ -185,11 +245,103 @@ static int archive_read_format_rar_cleanup(struct archive_read *); /* Support functions */ static int read_header(struct archive_read *, struct archive_entry *, char); static time_t get_time(int time); -static void read_exttime(struct archive_entry *, const char *, struct rar *); +static void read_exttime(const char *, struct rar *); static int read_symlink_stored(struct archive_read *, struct archive_entry *, struct archive_string_conv *); static int read_data_stored(struct archive_read *, const void **, size_t *, int64_t *); +static int read_data_lzss(struct archive_read *, const void **, size_t *, + int64_t *); +static int parse_codes(struct archive_read *); +static void free_codes(struct archive_read *); +static unsigned char read_bits(struct archive_read *, char); +static unsigned int read_bits_32(struct archive_read *, char); +static int read_next_symbol(struct archive_read *, struct huffman_code *); +static void create_code(struct archive_read *, struct huffman_code *, + unsigned char *, int, char); +static int add_value(struct archive_read *, struct huffman_code *, int, int, + int); +static int new_node(struct huffman_code *); +static void make_table(struct huffman_code *); +static void make_table_recurse(struct huffman_code *, int, + struct huffman_table_entry *, int, int); +static off_t expand(struct archive_read *, off_t); +static int copy_from_lzss_window(struct archive_read *, const void **, + int64_t, int); + +/* Find last bit set */ +static inline int +rar_fls(unsigned int word) +{ + word |= (word >> 1); + word |= (word >> 2); + word |= (word >> 4); + word |= (word >> 8); + word |= (word >> 16); + return word - (word >> 1); +} + +/* LZSS functions */ +static inline int64_t +lzss_position(struct lzss *lzss) +{ + return lzss->position; +} + +static inline int +lzss_mask(struct lzss *lzss) +{ + return lzss->mask; +} + +static inline int +lzss_size(struct lzss *lzss) +{ + return lzss->mask + 1; +} + +static inline int +lzss_offset_for_position(struct lzss *lzss, int64_t pos) +{ + return pos & lzss->mask; +} + +static inline unsigned char * +lzss_pointer_for_position(struct lzss *lzss, int64_t pos) +{ + return &lzss->window[lzss_offset_for_position(lzss, pos)]; +} + +static inline int +lzss_current_offset(struct lzss *lzss) +{ + return lzss_offset_for_position(lzss, lzss->position); +} + +static inline uint8_t * +lzss_current_pointer(struct lzss *lzss) +{ + return lzss_pointer_for_position(lzss, lzss->position); +} + +static inline void +lzss_emit_literal(struct rar *rar, uint8_t literal) +{ + *lzss_current_pointer(&rar->lzss) = literal; + rar->lzss.position++; +} + +static inline void +lzss_emit_match(struct rar *rar, int offset, int length) +{ + int i, windowoffs = lzss_current_offset(&rar->lzss); + for(i = 0; i < length; i++) + { + rar->lzss.window[(windowoffs + i) & lzss_mask(&rar->lzss)] = + rar->lzss.window[(windowoffs + i - offset) & lzss_mask(&rar->lzss)]; + } + rar->lzss.position += length; +} int archive_read_support_format_rar(struct archive *_a) @@ -359,6 +511,8 @@ archive_read_format_rar_read_data(struct archive_read *a, const void **buff, case COMPRESS_METHOD_FASTEST: case COMPRESS_METHOD_FAST: case COMPRESS_METHOD_NORMAL: + return read_data_lzss(a, buff, size, offset); + case COMPRESS_METHOD_GOOD: case COMPRESS_METHOD_BEST: default: @@ -374,7 +528,24 @@ archive_read_format_rar_read_data_skip(struct archive_read *a) struct rar *rar; rar = (struct rar *)(a->format->data); - __archive_read_consume(a, rar->packed_size); + switch (rar->compression_method) + { + case COMPRESS_METHOD_FASTEST: + case COMPRESS_METHOD_FAST: + case COMPRESS_METHOD_NORMAL: + if (rar->offset) + { + while (rar->bitoffset > 0) + rar->bitoffset -= 8 * __archive_read_consume(a, 1); + break; + } + + case COMPRESS_METHOD_STORE: + case COMPRESS_METHOD_GOOD: + case COMPRESS_METHOD_BEST: + default: + __archive_read_consume(a, rar->packed_size); + } return (ARCHIVE_OK); } @@ -384,6 +555,9 @@ archive_read_format_rar_cleanup(struct archive_read *a) struct rar *rar; rar = (struct rar *)(a->format->data); + free_codes(a); + free(rar->unp_buffer); + free(rar->lzss.window); free(rar); (a->format->data) = NULL; return (ARCHIVE_OK); @@ -438,6 +612,12 @@ read_header(struct archive_read *a, struct archive_entry *entry, rar->arctime = 0; rar->arcnsec = 0; } + else + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "RAR solid archive support unavailable."); + return (ARCHIVE_FATAL); + } if ((h = __archive_read_ahead(a, header_size - 7, NULL)) == NULL) return (ARCHIVE_FATAL); @@ -513,7 +693,7 @@ read_header(struct archive_read *a, struct archive_entry *entry, } if (rar->file_flags & FHD_EXTTIME) - read_exttime(entry, p, rar); + read_exttime(p, rar); __archive_read_consume(a, header_size - 7); @@ -544,7 +724,12 @@ read_header(struct archive_read *a, struct archive_entry *entry, } rar->bytes_remaining = rar->packed_size; - rar->offset = 0; + rar->lzss.position = rar->dictionary_size = rar->offset = rar->bitoffset = 0; + rar->valid = 1; + rar->start_new_table = 1; + free(rar->unp_buffer); + rar->unp_buffer = NULL; + memset(rar->lengthtable, 0, sizeof(rar->lengthtable)); /* Don't set any archive entries for non-file header types */ if (head_type == NEWSUB_HEAD) @@ -573,25 +758,10 @@ read_header(struct archive_read *a, struct archive_entry *entry, if (((rar->mode) & AE_IFMT) == AE_IFLNK) { - switch (rar->compression_method) - { - case COMPRESS_METHOD_STORE: - if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN)) - return ret2; - if (ret > ret2) - ret = ret2; - break; - - case COMPRESS_METHOD_FASTEST: - case COMPRESS_METHOD_FAST: - case COMPRESS_METHOD_NORMAL: - case COMPRESS_METHOD_GOOD: - case COMPRESS_METHOD_BEST: - default: - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unsupported compression method for RAR file."); - return (ARCHIVE_FATAL); - } + if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN)) + return ret2; + if (ret > ret2) + ret = ret2; } return ret; @@ -612,10 +782,10 @@ get_time(int time) } static void -read_exttime(struct archive_entry *entry, const char *p, struct rar *rar) +read_exttime(const char *p, struct rar *rar) { - unsigned rmode, flags, rem, count; - int time, i, j; + unsigned rmode, flags, rem, j, count; + int time, i; struct tm *tm; time_t t; long nsec; @@ -743,3 +913,710 @@ read_data_stored(struct archive_read *a, const void **buff, size_t *size, rar->bytes_remaining -= bytes_avail; return (ARCHIVE_OK); } + +static int +read_data_lzss(struct archive_read *a, const void **buff, size_t *size, + int64_t *offset) +{ + struct rar *rar; + ssize_t bytes_avail; + off_t start, end, actualend; + int ret = (ARCHIVE_OK); + + rar = (struct rar *)(a->format->data); + if (!rar->valid) + return (ARCHIVE_FATAL); + + if (rar->dictionary_size && rar->offset >= rar->unp_size) + { + *buff = NULL; + *size = 0; + *offset = rar->offset; + return (ARCHIVE_EOF); + } + + if (rar->dictionary_size && rar->bytes_remaining > 0) + { + *offset = rar->offset; + if (rar->offset + rar->bytes_remaining > rar->unp_size) + *size = rar->unp_size - rar->offset; + else + *size = rar->bytes_remaining; + ret = copy_from_lzss_window(a, buff, *offset, *size); + rar->offset += *size; + rar->bytes_remaining -= *size; + return ret; + } + + if (rar->start_new_table && ((ret = parse_codes(a)) < (ARCHIVE_WARN))) + return (ARCHIVE_FATAL); + + __archive_read_ahead(a, 1, &bytes_avail); + if (bytes_avail <= 0) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated RAR file data"); + return (ARCHIVE_FATAL); + } + if (bytes_avail > rar->bytes_remaining) + bytes_avail = rar->bytes_remaining; + + start = rar->offset; + end = start + rar->dictionary_size; + rar->filterstart = LONG_MAX; + + if ((actualend = expand(a, end)) < 0) + return (ARCHIVE_FATAL); + + rar->bytes_remaining = actualend - start; + *offset = rar->offset; + if (rar->offset + rar->bytes_remaining > rar->unp_size) + *size = rar->unp_size - rar->offset; + else + *size = rar->bytes_remaining; + ret = copy_from_lzss_window(a, buff, *offset, *size); + rar->offset += *size; + rar->bytes_remaining -= *size; + return ret; +} + +static int +parse_codes(struct archive_read *a) +{ + const void *h; + ssize_t bytes_avail; + int i, j, val, n; + unsigned char bitlengths[MAX_SYMBOLS], zerocount; + struct huffman_code precode; + struct rar *rar = (struct rar *)(a->format->data); + + free_codes(a); + + /* Skip to the next byte */ + while (rar->bitoffset % 8) + rar->bitoffset++; + + if ((h = __archive_read_ahead(a, 1, NULL)) == NULL) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated RAR file data"); + return (ARCHIVE_FATAL); + } + + /* PPMd block flag */ + if (read_bits(a, 1)) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unsupported compression method for RAR file."); + return (ARCHIVE_FATAL); + } + + /* Keep existing table flag */ + if (!read_bits(a, 1)) + memset(rar->lengthtable, 0, sizeof(rar->lengthtable)); + + memset(&bitlengths, 0, sizeof(bitlengths)); + for (i = 0; i < MAX_SYMBOLS;) + { + bitlengths[i++] = read_bits(a, 4); + if (bitlengths[i-1] == 0xF) + { + zerocount = read_bits(a, 4); + if (zerocount) + { + i--; + for (j = 0; j < zerocount + 2 && i < MAX_SYMBOLS; j++) + bitlengths[i++] = 0; + } + } + } + + rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8)); + h = __archive_read_ahead(a, (rar->bitoffset / 8) + 1, &bytes_avail); + if (bytes_avail <= 0) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated RAR file data"); + return (ARCHIVE_FATAL); + } + + memset(&precode, 0, sizeof(precode)); + create_code(a, &precode, bitlengths, MAX_SYMBOLS, MAX_SYMBOL_LENGTH); + + for (i = 0; i < HUFFMAN_TABLE_SIZE;) + { + if ((val = read_next_symbol(a, &precode)) < 0) + return (ARCHIVE_FATAL); + if (val < 16) + { + rar->lengthtable[i] = (rar->lengthtable[i] + val) & 0xF; + i++; + } + else if (val < 18) + { + if (i == 0) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Internal error extracting RAR file."); + return (ARCHIVE_FATAL); + } + + if(val == 16) + n = read_bits(a, 3) + 3; + else + n = read_bits(a, 7) + 11; + + for (j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++) + { + rar->lengthtable[i] = rar->lengthtable[i-1]; + i++; + } + } + else + { + if(val == 18) + n = read_bits(a, 3) + 3; + else + n = read_bits(a, 7) + 11; + + for(j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++) + rar->lengthtable[i++] = 0; + } + } + + create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE, + MAX_SYMBOL_LENGTH); + create_code(a, &rar->offsetcode, &rar->lengthtable[MAINCODE_SIZE], + OFFSETCODE_SIZE, MAX_SYMBOL_LENGTH); + create_code(a, &rar->lowoffsetcode, + &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE], + LOWOFFSETCODE_SIZE, MAX_SYMBOL_LENGTH); + create_code(a, &rar->lengthcode, + &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE + + LOWOFFSETCODE_SIZE], LENGTHCODE_SIZE, MAX_SYMBOL_LENGTH); + + if (!rar->dictionary_size || !rar->lzss.window) + { + /* Seems as though dictionary sizes are not used. Even so, minimize + * memory usage as much as possible. + */ + if (rar->unp_size >= DICTIONARY_MAX_SIZE) + rar->dictionary_size = DICTIONARY_MAX_SIZE; + else + rar->dictionary_size = rar_fls(rar->unp_size) << 1; + rar->lzss.window = (unsigned char *)realloc(rar->lzss.window, + rar->dictionary_size); + memset(rar->lzss.window, 0, rar->dictionary_size); + rar->lzss.mask = rar->dictionary_size - 1; + } + + rar->start_new_table = 0; + rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8)); + return (ARCHIVE_OK); +} + +static void +free_codes(struct archive_read *a) +{ + struct rar *rar = (struct rar *)(a->format->data); + free(rar->maincode.tree); + free(rar->offsetcode.tree); + free(rar->lowoffsetcode.tree); + free(rar->lengthcode.tree); + free(rar->maincode.table); + free(rar->offsetcode.table); + free(rar->lowoffsetcode.table); + free(rar->lengthcode.table); + memset(&rar->maincode, 0, sizeof(rar->maincode)); + memset(&rar->offsetcode, 0, sizeof(rar->offsetcode)); + memset(&rar->lowoffsetcode, 0, sizeof(rar->lowoffsetcode)); + memset(&rar->lengthcode, 0, sizeof(rar->lengthcode)); +} + +static unsigned char +read_bits(struct archive_read *a, char length) +{ + unsigned char ret, m; + const unsigned char *p; + struct rar *rar = (struct rar *)(a->format->data); + if (length <= 0 || length > 8) + { + rar->valid = 0; + return 0; + } + if ((p = __archive_read_ahead(a, + ((rar->bitoffset + length) / 8) + 1, NULL)) == NULL) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated RAR file data"); + rar->valid = 0; + return 0; + } + m = rar->bitoffset % 8; + ret = (*(p + (rar->bitoffset / 8))) << m; + ret |= (*(p + ((rar->bitoffset + (8 - m)) / 8))) >> (8 - m); + rar->bitoffset += length; + return ret >> (8 - length); +} + +static unsigned int +read_bits_32(struct archive_read *a, char length) +{ + unsigned char bits[4]; + struct rar *rar = (struct rar *)(a->format->data); + if (length <= 0 || length > 32) + { + rar->valid = 0; + return 0; + } + memset(&bits, 0, sizeof(bits)); + while (length > 0 && rar->valid) + { + if (length % 8) + { + bits[(32 - length) / 8] = read_bits(a, length % 8); + length -= length % 8; + } + else + { + bits[(32 - length) / 8] = read_bits(a, 8); + length -= 8; + } + } + if (!rar->valid) + return 0; + return archive_be32dec(&bits); +} + +static int +read_next_symbol(struct archive_read *a, struct huffman_code *code) +{ + unsigned char bit; + unsigned int bits; + int length, value, node; + struct rar *rar; + + if (!code->table) + make_table(code); + + rar = (struct rar *)(a->format->data); + + /* Look ahead (peek) at bits */ + bits = read_bits_32(a, code->tablesize); + rar->bitoffset -= code->tablesize; + + length = code->table[bits].length; + value = code->table[bits].value; + + if (length < 0) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid prefix code in bitstream"); + return -1; + } + + if (length <= code->tablesize) + { + /* Skip length bits */ + rar->bitoffset += length; + return value; + } + + /* Skip tablesize bits */ + rar->bitoffset += code->tablesize; + + node = value; + while (!(code->tree[node].branches[0] == + code->tree[node].branches[1])) + { + bit = read_bits(a, 1); + if (code->tree[node].branches[bit] < 0) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid prefix code in bitstream"); + return -1; + } + node = code->tree[node].branches[bit]; + } + + return code->tree[node].branches[0]; +} + +static void +create_code(struct archive_read *a, struct huffman_code *code, + unsigned char *lengths, int numsymbols, char maxlength) +{ + int i, j, codebits = 0, symbolsleft = numsymbols; + new_node(code); + code->numentries = 1; + code->minlength = INT_MAX; + code->maxlength = INT_MIN; + codebits = 0; + for(i = 1; i <= maxlength; i++) + { + for(j = 0; j < numsymbols; j++) + { + if (lengths[j] != i) continue; + add_value(a, code, j, codebits, i); + codebits++; + if (--symbolsleft <= 0) { break; break; } + } + codebits <<= 1; + } +} + +static int +add_value(struct archive_read *a, struct huffman_code *code, int value, + int codebits, int length) +{ + int repeatpos, lastnode, bitpos, bit, repeatnode, nextnode; + + free(code->table); + code->table = NULL; + + if(length > code->maxlength) + code->maxlength = length; + if(length < code->minlength) + code->minlength = length; + + repeatpos = -1; + if (repeatpos == 0 || (repeatpos >= 0 + && (((codebits >> (repeatpos - 1)) & 3) == 0 + || ((codebits >> (repeatpos - 1)) & 3) == 3))) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid repeat position"); + return (ARCHIVE_FATAL); + } + + lastnode = 0; + for (bitpos = length - 1; bitpos >= 0; bitpos--) + { + bit = (codebits >> bitpos) & 1; + + /* Leaf node check */ + if (code->tree[lastnode].branches[0] == + code->tree[lastnode].branches[1]) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Prefix found"); + return (ARCHIVE_FATAL); + } + + if (bitpos == repeatpos) + { + /* Open branch check */ + if (!(code->tree[lastnode].branches[bit] < 0)) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid repeating code"); + return (ARCHIVE_FATAL); + } + + repeatnode = new_node(code); + nextnode = new_node(code); + + /* Set branches */ + code->tree[lastnode].branches[bit] = repeatnode; + code->tree[repeatnode].branches[bit] = repeatnode; + code->tree[repeatnode].branches[bit^1] = nextnode; + lastnode = nextnode; + + bitpos++; /* terminating bit already handled, skip it */ + } + else + { + /* Open branch check */ + if (code->tree[lastnode].branches[bit] < 0) + { + new_node(code); + code->tree[lastnode].branches[bit] = code->numentries++; + } + + /* set to branch */ + lastnode = code->tree[lastnode].branches[bit]; + } + } + + if (!(code->tree[lastnode].branches[0] == -1 + && code->tree[lastnode].branches[1] == -2)) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Prefix found"); + return (ARCHIVE_FATAL); + } + + /* Set leaf value */ + code->tree[lastnode].branches[0] = value; + code->tree[lastnode].branches[1] = value; + + return (ARCHIVE_OK); +} + +static int new_node(struct huffman_code *code) +{ + code->tree = (struct huffman_tree_node *)realloc(code->tree, + (code->numentries + 1) * sizeof(*code->tree)); + code->tree[code->numentries].branches[0] = -1; + code->tree[code->numentries].branches[1] = -2; + return 1; +} + +static void +make_table(struct huffman_code *code) +{ + if (code->maxlength < code->minlength || code->maxlength > 10) + code->tablesize = 10; + else + code->tablesize = code->maxlength; + + code->table = + (struct huffman_table_entry *)malloc(sizeof(*code->table) + * (1 << code->tablesize)); + + make_table_recurse(code, 0, code->table, 0, code->tablesize); +} + +static void make_table_recurse(struct huffman_code *code, int node, + struct huffman_table_entry *table, int depth, + int maxdepth) +{ + int currtablesize, i; + + currtablesize = 1 << (maxdepth - depth); + + if (code->tree[node].branches[0] == + code->tree[node].branches[1]) + { + for(i = 0; i < currtablesize; i++) + { + table[i].length = depth; + table[i].value = code->tree[node].branches[0]; + } + } + else if (node < 0) + { + for(i = 0; i < currtablesize; i++) + table[i].length = -1; + } + else + { + if(depth == maxdepth) + { + table[0].length = maxdepth + 1; + table[0].value = node; + } + else + { + make_table_recurse(code, code->tree[node].branches[0], table, depth + 1, + maxdepth); + make_table_recurse(code, code->tree[node].branches[1], + table + currtablesize / 2, depth + 1, maxdepth); + } + } +} + +static off_t +expand(struct archive_read *a, off_t end) +{ + static const unsigned char lengthbases[] = + { 0, 1, 2, 3, 4, 5, 6, + 7, 8, 10, 12, 14, 16, 20, + 24, 28, 32, 40, 48, 56, 64, + 80, 96, 112, 128, 160, 192, 224 }; + static const unsigned char lengthbits[] = + { 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 2, 2, + 2, 2, 3, 3, 3, 3, 4, + 4, 4, 4, 5, 5, 5, 5 }; + static const unsigned int offsetbases[] = + { 0, 1, 2, 3, 4, 6, + 8, 12, 16, 24, 32, 48, + 64, 96, 128, 192, 256, 384, + 512, 768, 1024, 1536, 2048, 3072, + 4096, 6144, 8192, 12288, 16384, 24576, + 32768, 49152, 65536, 98304, 131072, 196608, + 262144, 327680, 393216, 458752, 524288, 589824, + 655360, 720896, 786432, 851968, 917504, 983040, + 1048576, 1310720, 1572864, 1835008, 2097152, 2359296, + 2621440, 2883584, 3145728, 3407872, 3670016, 3932160 }; + static const unsigned char offsetbits[] = + { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, + 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 }; + static const unsigned char shortbases[] = + { 0, 4, 8, 16, 32, 64, 128, 192 }; + static const unsigned char shortbits[] = + { 2, 2, 3, 4, 5, 6, 6, 6 }; + + int symbol, offs, len, offsindex, lensymbol, i, offssymbol, lowoffsetsymbol; + unsigned char newfile; + struct rar *rar = (struct rar *)(a->format->data); + + if (rar->filterstart < end) + end = rar->filterstart; + + while (1) + { + if (rar->output_last_match && + lzss_position(&rar->lzss) + rar->lastlength <= end) + { + lzss_emit_match(rar, rar->lastoffset, rar->lastlength); + rar->output_last_match = 0; + } + + if(rar->output_last_match || lzss_position(&rar->lzss) >= end) + return lzss_position(&rar->lzss); + + rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8)); + symbol = read_next_symbol(a, &rar->maincode); + rar->output_last_match = 0; + + if (symbol < 256) + { + lzss_emit_literal(rar, symbol); + continue; + } + else if (symbol == 256) + { + newfile = !read_bits(a, 1); + + if(newfile) + { + rar->start_new_block = 1; + rar->start_new_table = read_bits(a, 1); + return lzss_position(&rar->lzss); + } + else + { + parse_codes(a); + continue; + } + } + else if(symbol==257) + { + if (rar->filterstart < end) + end = rar->filterstart; + continue; + } + else if(symbol==258) + { + if(rar->lastlength == 0) + continue; + + offs = rar->lastoffset; + len = rar->lastlength; + } + else if (symbol <= 262) + { + offsindex = symbol - 259; + offs = rar->oldoffset[offsindex]; + + lensymbol = read_next_symbol(a, &rar->lengthcode); + len = lengthbases[lensymbol] + 2; + if (lengthbits[lensymbol] > 0) + len += read_bits_32(a, lengthbits[lensymbol]); + + for (i = offsindex; i > 0; i--) + rar->oldoffset[i] = rar->oldoffset[i-1]; + rar->oldoffset[0] = offs; + } + else if(symbol<=270) + { + offs = shortbases[symbol-263] + 1; + if(shortbits[symbol-263] > 0) + offs += read_bits_32(a, shortbits[symbol-263]); + + len = 2; + + for(i = 3; i > 0; i--) + rar->oldoffset[i] = rar->oldoffset[i-1]; + rar->oldoffset[0] = offs; + } + else + { + len = lengthbases[symbol-271]+3; + if(lengthbits[symbol-271] > 0) + len += read_bits_32(a, lengthbits[symbol-271]); + + offssymbol = read_next_symbol(a, &rar->offsetcode); + offs = offsetbases[offssymbol]+1; + if(offsetbits[offssymbol] > 0) + { + if(offssymbol > 9) + { + if(offsetbits[offssymbol] > 4) + offs += read_bits_32(a, offsetbits[offssymbol] - 4) << 4; + + if(rar->numlowoffsetrepeats > 0) + { + rar->numlowoffsetrepeats--; + offs += rar->lastlowoffset; + } + else + { + lowoffsetsymbol = read_next_symbol(a, &rar->lowoffsetcode); + if(lowoffsetsymbol == 16) + { + rar->numlowoffsetrepeats = 15; + offs += rar->lastlowoffset; + } + else + { + offs += lowoffsetsymbol; + rar->lastlowoffset = lowoffsetsymbol; + } + } + } + else + offs += read_bits_32(a, offsetbits[offssymbol]); + } + + if (offs >= 0x40000) + len++; + if (offs >= 0x2000) + len++; + + for(i = 3; i > 0; i--) + rar->oldoffset[i] = rar->oldoffset[i-1]; + rar->oldoffset[0] = offs; + } + + rar->lastoffset = offs; + rar->lastlength = len; + rar->output_last_match = 1; + } +} + +static int +copy_from_lzss_window(struct archive_read *a, const void **buffer, + int64_t startpos, int length) +{ + int windowoffs, firstpart; + struct rar *rar = (struct rar *)(a->format->data); + + if (!rar->unp_buffer) + { + if ((rar->unp_buffer = malloc(rar->dictionary_size)) == NULL) + { + archive_set_error(&a->archive, ENOMEM, + "Unable to allocate memory for uncompressed data."); + return (ARCHIVE_FATAL); + } + } + + windowoffs = lzss_offset_for_position(&rar->lzss, startpos); + if(windowoffs + length <= lzss_size(&rar->lzss)) + *buffer = &rar->lzss.window[windowoffs]; + else + { + firstpart = lzss_size(&rar->lzss) - windowoffs; + memcpy(&rar->unp_buffer[0], &rar->lzss.window[windowoffs], firstpart); + memcpy(&rar->unp_buffer[firstpart], &rar->lzss.window[0], + length - firstpart); + *buffer = rar->unp_buffer; + } + return (ARCHIVE_OK); +} diff --git a/libarchive/test/test_fuzz.c b/libarchive/test/test_fuzz.c index 978898ee6..7f2dee843 100644 --- a/libarchive/test/test_fuzz.c +++ b/libarchive/test/test_fuzz.c @@ -66,6 +66,10 @@ static struct { {0, "test_read_format_cpio_bin_be.cpio"}, {0, "test_read_format_cpio_svr4_gzip_rpm.rpm"}, /* Test RPM unwrapper */ {0, "test_read_format_rar.rar"}, /* Uncompressed RAR test */ + {0, "test_read_format_rar_compress_normal.rar"}, /* Normal Compressed RAR + * test */ + {0, "test_read_format_rar_multi_lzss_blocks.rar"}, /* Normal Compressed Multi + * LZSS blocks RAR test */ {0, "test_read_format_rar_noeof.rar"}, /* RAR with no EOF header */ {0, "test_read_format_rar_subblock.rar"}, /* RAR with subblocks */ {0, "test_read_format_gtar_sparse_1_17_posix10_modified.tar"}, diff --git a/libarchive/test/test_read_format_rar.c b/libarchive/test/test_read_format_rar.c index 5f35fbc1b..24e46d18c 100644 --- a/libarchive/test/test_read_format_rar.c +++ b/libarchive/test/test_read_format_rar.c @@ -166,9 +166,147 @@ test_noeof(void) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +static void +test_compress_normal(void) +{ + const char reffile[] = "test_read_format_rar_compress_normal.rar"; + int file1_size = 20111; + char file1_buff[file1_size]; + const char file1_test_txt[] = "


\n" + "

\n" + "\n" + ""; + int file2_size = 20; + char file2_buff[file2_size]; + const char file2_test_txt[] = "test text document\r\n"; + struct archive_entry *ae; + struct archive *a; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_file(a, reffile, 10240)); + + /* First header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(file1_size, archive_entry_size(ae)); + assertEqualInt(33188, archive_entry_mode(ae)); + assertA(file1_size == archive_read_data(a, file1_buff, file1_size)); + assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1], + file1_test_txt, sizeof(file1_test_txt) - 1); + + /* Second header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("testlink", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(25, archive_entry_size(ae)); + assertEqualInt(41471, archive_entry_mode(ae)); + assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae)); + + /* Third header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("testdir/test.txt", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(file2_size, archive_entry_size(ae)); + assertEqualInt(33188, archive_entry_mode(ae)); + assertA(file2_size == archive_read_data(a, file2_buff, file2_size)); + assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1], + file2_test_txt, sizeof(file2_test_txt) - 1); + + /* Fourth header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("testdir/LibarchiveAddingTest.html", + archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(file1_size, archive_entry_size(ae)); + assertEqualInt(33188, archive_entry_mode(ae)); + assertA(file1_size == archive_read_data(a, file1_buff, file1_size)); + assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1], + file1_test_txt, sizeof(file1_test_txt) - 1); + + /* Fifth header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("testdir", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(16877, archive_entry_mode(ae)); + + /* Sixth header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("testemptydir", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(16877, archive_entry_mode(ae)); + + /* Test EOF */ + assertA(1 == archive_read_next_header(a, &ae)); + assertEqualInt(6, archive_file_count(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +/* This test is for sufficiently large files that would have been compressed + * using multiple lzss blocks. + */ +static void +test_multi_lzss_blocks(void) +{ + const char reffile[] = "test_read_format_rar_multi_lzss_blocks.rar"; + const char test_txt[] = "-bottom: 0in\">
\n

\n\n"; + int size = 20131111, offset = 0; + char buff[64]; + struct archive_entry *ae; + struct archive *a; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_file(a, reffile, 10240)); + + /* First header. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("multi_lzss_blocks_test.txt", archive_entry_pathname(ae)); + assertA((int)archive_entry_mtime(ae)); + assertA((int)archive_entry_ctime(ae)); + assertA((int)archive_entry_atime(ae)); + assertEqualInt(size, archive_entry_size(ae)); + assertEqualInt(33188, archive_entry_mode(ae)); + while (offset + sizeof(buff) < size) + { + assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff))); + offset += sizeof(buff); + } + assertA(size - offset == archive_read_data(a, buff, size - offset)); + assertEqualMem(buff, test_txt, size - offset); + + /* Test EOF */ + assertA(1 == archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_file_count(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_rar) { test_basic(); test_subblock(); test_noeof(); + test_compress_normal(); + test_multi_lzss_blocks(); } diff --git a/libarchive/test/test_read_format_rar_compress_normal.rar.uu b/libarchive/test/test_read_format_rar_compress_normal.rar.uu new file mode 100644 index 000000000..afc6cc08d --- /dev/null +++ b/libarchive/test/test_read_format_rar_compress_normal.rar.uu @@ -0,0 +1,328 @@ +begin 644 - +M4F%R(1H'`,^0MJ;G<[Z6"DBFSK*16$E +M-Q31OW?HQ-Y&TBESE5=DVFTW&]`WUZ-R-,JS5W=>+E5=6_BE?P@_5^Y56:"L +M($`^[S?PV_AZK/Z?'U_X_+T^W=]3_AKZVM^?C]70;=G;7Z/)8UW[, +ML%^:*>*2_!'DK<]_A]#WF/V'\;FUMXSP>;W;EG:'H6?C7W/_/EN_W\_A]7P] +M]G*FS7.1>%]GZY&GA^<^MQ3WH_*_;XH)9H9_/AGNU_Z>$D2SNV?;N>CS:R_E +MI5]^UT67']VK/PWG"9[8K4L/PNW8K<+_CL>-]_4^5^+YZOAZGM>K>W/ +MW-S;Q[V=?8V-?[]G[_+L_4\?W=*U^MZ7LVO?_7'__N\GW8\W\[V:E\[C9MJW +M-,GT?PKU^A\'_>"#AS-?Y?O9Z>&*_^3^O8_#\>C?_T/J^-/FKVI)YY+Q^W7_ +MICSV;'V/NL+*0F3R-`45O[_2(KOAK/S'\M]>W_C +MCZWI^F*>@R6'IS_]Q[>6X3;X:5<-6$^.]N=V*N8R]E')-@@MPKD& +MSV^Y]GN&?V;/^[GU>N45:R)$"Y>LJYGF]/PV_T?]H4`\_AAS+?+?HFV]W>"M +MMG>1?C8?]63-_?_9B`LB;M&\LES#;)]01=@87X^@((SKV^*+DHJBF?HUY7\P +MF9R*7]G[>>;!'#\W\$4(T1)=?F^O/RY6]+GXH)WY<.:K(M][*^_AO!)IP-R* +M[=Z3F.R;ESE%GIEO36']H8_I,F'AXND#1=`V'/FF6],F&*B@C>!U,F#'/\A4 +M$Q17^&A2',5@R#/E-!?N)]>5>7,I^I,^NX9^FPEI[(-!#US,3XLB!FB#CRH^ +M=#D_,Y1WTW;1#1CBS$`W?Q3>FU?SNS1<-^BJ*WE].PB4+R/QTF.K9H](-;6L(*$7SHKK/39S\,>93/IF;MDTN7L4(_;$FM#N/F))6Z:)6ITBGV9B +M;-$.;*BC(7[D(^P&LYC*BA4>[Q0N:$<-AD[EH3XT,8F'D>#9$-^X?1O4[;TB +M=O,UQ;Z:!HSL[@!#X-[#?OGYCW>"R,5P?&63AE@O!PO03M?LW&)F'-B:"*3*#B@"7DW(]@4I*ES +M.UFZMQ30S)F6@D8JS)@Z[H9CG:Q280H##<*<>$D8H:Z#ED5D(**77LQ +M)851WS^32G\O:6X/;N^BAU]&Y?/X>JYLZ7X:.$,5'&_@R^XCD9T%*148GS?R_7#EUY.%PS45/1:*+`@A&@8<2D@;YR1)*JDN'",GD +MN#]%1,?&F:/7G,W.;B_"JP4F:U&Y$5)\4<=*IDV#/0'BR&O\UFSUFXJ\O,9&]%`N! +M#')JJ=U*U\K\,/A!@&G_K19&<4]=7?XH6-6*D9QK#@T=O%@9<27=S,&]0CFM +M!;N1XO*UA_=QEV"W/6?EJ>+S=5/<'"7Z<[R +M$E_&Q&*=>#K!4^%@Z!_ADDN*Z2D9#\J=..O%T>$]##'R,8`*E!SNWT92'&ZD +M+\\9?.G*W7=2YV<,X8C?@7PA@M^\/\(@!(L8?CH;HOJ.FT-22];[R`?+84`C +M?2G92OU`O)F/$#KW%^5.CM[PS]\KZ"[;/'L_M;DP8F>*KP6+?Y;'X#U=IJ%F(GR"`_ +M!#M"*M^N$(@9[&C^-?SZ^G^B,.MI]0N0-E__I_QULC]*R-D39U?/7V.RT)ZU +M4BV?O\F2X@J`S$>-FP.&&>X&]&>7R?MQ0QX.IH2Q]0!?986K;27HIS!_'G:: +MMGOH]):D+[\@"7W`\=%F8K"Q^:--0SV.L#AW6'7MT!PL? +M82E6D0,,U`ALSPL!H$!/2C$F$)SQ?;,!A!J9=`1PU+,M&!$&XI. +MNTM1/8XH,"[%G#G1K/+%N#K'Y$K6H:*PK.8#6E!#*XJU4!%C2H.=F.$M)?&2 +MU]@:`FG+Y=1MK_TRRD71!+(E`PH+#<[G)D$]J(Z'^2WJ&)(Y.'$LEPJ"3];V +M/>C)3NQ$`9`!OD?R77W9LI0[Z.55^69K<;$H3EV +M?MBWE09(R03R^Q,XTI9.3K+PB9&P9@BJ"5@0` +M&NH*G0J_NXKV'A&&,S/!8+A^R]OI*G:29SF.4WTVX6;BG%OW'QKE2( +M^>P)-CT/02N:=$J#;S]PD,9)+2MAJ?I#,BID1V8`UCT5XOKS/!]0'^&ZX>&` +MJ@YRTT?PY6DN:`C1Y`4&=;5J!]>PL!(%9)N>4DJCF(H5S[9D)<$ZN9M*M\BJ +M"3YW1?2+`BXU9Y72"::*`U^^*U$DT6B5N3/SGRP_M_]N_%LAJPUO=]^YP6=S?LZG4T%JM@U_YZD1;6_FD1D5)?#@=B)O_SUNIB513J:D#_G;I7 +M@*4>`4*K4U=5_^&1O?\O;[=7RZ;U]P@,``^U-K>]7LW?[YI?A_:MU,1U/6=R +M*;,X4NIM`B:0HQP!PKF+U?^5ERH#['*1+82@=YP4P7>#&H#@_X6E2R.F1'(< +MR%9'&O0[&OL^37Z^G5_`2]O%G57Q@H^JF_/QP*"'U(&!Q8(> +MQT"X5=^CT.8]3'9K/E?=]_KUO=M>_=]86RL>[UK]-67)J_@;,[:B9)HA#M*S +MZN8_^C_RS9=Z"W+(P,Y3*)12BF:\.$O9PYB#0\P<7AM:<2M9?DW(D<^H#D29 +M@T!AN9AEKO]^)<(=2M>#.'Q6J'SO?9WQ0H?835R@HE%!H3@ZI`#Z]HSKI +MH.DL*4A>IW\VJG)HP<%T!.!IHT"U"A_=W +M_@83+:$3V9=<+0'FDRM9A97[VH?6J[BIO\Y)?:-USW^G$!"/31!TK/).VN&4 +M9A$TFH"!0!FH?L]1/FRCIJ=_*Z.C!?EJV'M^$IF;HMFA%JU,*/B0;0,*JL22/3Y6!PJ`=00P.(QH^S-$UG-35'9OV,6K)*8YH8YBQ9C +M54=:KU,.3.9.H9X`O6SP$V@>$"-JHO+*&D(BN8YXE?/CE*BZB5UFEC/RJ)J$ +M_O1(*)AGJ&>+#7N140C@JXZ?L!V=%,OS(:7DQTA\9Y%X*Z'1HYK[N94T;E%.T +M$HY(M9R%](CU62ZQ)J5#-:E:&6(@-3:N#J?"^\>10%=MSUU<+O620$15S2[1 +M"@6!=D4AM"8]N7$8J*&YF=2CK`AD>=#IUX:-P@SB5@5-=&M$34O6E&LQQM>Q +M.<($17Y3U.6=\0I+DQI@[T%RY5PI+H=RSQ:+M@L3(/DAF;,<'TCL`49@,1Y4 +M\,B2GR<3\C#-T5C:3E0:UE9@/KAG,9\_$SBTE6I[[/,CE8][=_MN>CU4.(]O +MCC0V_[@7;MRQ8!-PS(*"(H$STDXKU=8_@#HUIH`^8%GB@`>_#R +MA#6`CI+9<"$6U4FD?LDDA:,#/*J\')-RQJ]XG(/47!T*[Y,)`4[UW@5^5*TP +MC/P"KB,A4EMU*:[#Y8EP+*^^)!_P.UF3NVD]X/EIURBWAE3D4BP$*P[WG;`0 +M--5J!KAKO)"W;K9U8_Y?DJ`I/>!KRA)-)D?HG]/HZ4Y0:K!.TU?`X\5&X'5IV5K,JQUIJ:Q8XMZDVES4M=F5F.B>#DAT^:::B,:$.%&VDH=D%V&/$4$A^ +MDBLG^SQI355JCM'FDKV8Q%\H7.(T`2X;C[RIJ>9@6E:6T9;:&8;FCC"CE+61 +MKE'#HHZUC2\=/HL%'6!*C`M+`E_J7\=5BZKC44..J%N^FWWH0D&980UZ&\BZ +M=EQ7^*=G!.T=BEG)RV4>).(G^L:H!`SU65"X>&>1'X@@T`L\84OBO]6A'CY% +M@/O)_T?"IJ4JUPW%08R#H:S,,H,.4NSNJL2NB"C"K0?609[Y)UHC`Q_+EN8S +M-J:2/"/@9/CK+F]J%"^+'Y'`@KXN6E"@-\[V/RD)]OF``K"#O&"DYL#C&E," +M/,=OX6Q'66%[AFT>.`;BZ])-8-=@F9$T[>AG?Q#HO@X/CD6SZ_AO>YXT(UM$ +M9)\89:7O\R5[[^(XZO+)YT*U1-)P-T-JO?Y>ZA2T)J$E]A@2"V`UY^PI6$A= +MHXI*\G5-A]?=#E/EU?*W3'^JIK/J.B1)0JYV16&I`U/-N%Y(5])+YP+U5F%T +M@RO<+)2J]H%+2(`)'1P]18#BC2Q`",Y'1X%Q*>!I;-S&L1P+RLOL'RXD6H0' +MQ2H6)9R4AT\^(P2#V4A +M!^ZP8&WA[`+(\`KRS\6A%S6>Z^?SS(.,'(J6+(],-T(*1ZIE;X@HW0&1KS0L +MZ<85@DP+5;;_/0D+Y.6MT6&=!F4E]KX`U5[I-P58'O+HM>0\X%;Y5T-M.S]] +M+H&SH#2DE>:.B=@-Y)SQ26QZ&*&Z_7?56]7H.0!/V61XBQW?59EK]BXV)5[,N;LV]#P_;T'E,W0-;MB9H&![4H'3N +M_%](?M%,XCW\S-W,J>X\9UI35L3I(+*C[')+;&;X/7C5FA'B +M*[H\PNH-IZFV&5M+244Y/@C6V5A>2W$@YBFY8;#V]U[9H$W-#<-SSRI +MH^>31F\;V&:=*-0RV.7IY#^ZV"JLX13H,7<%&X`&=XX\P*6W"%`YN862'3QS +MBQJSMU[LN+$`4=4P,K:<<-5IVIM#MO;L#,$]]DO:RW'-'8H.)]HBV,.%"0YO +M'\QKERWD2;.M3#\%B+J!SGL(K5C.>(A;R<+)*1#Y8-#EMNK,=Z2WM$!2`")V2$"R!OLV(U3"]W]`!(:! +M#6<]@]?27!)6;<&:!03HSN5;YVY)C>I/1WYV.WAXD+W-&.W.Z`RMOX(VNKWN +M@6,]$?$YX:F)XA-6LW^&_N*!.>$9BED8S?4$*5406C'2'Q[[G#0DQ&G]4(;6 +M?T0>C0VM(7]RQX3?:+2)J:OE5/QDUQBOHMVO3)>DHK>TDZBVG+,Y'_X*:;'W +MS:*:7#E-BS!;P$T!%>,FC:%'?-_-,@NLZ&ZJRJ6*H-5C-*B"G"[+R*P\985O +M\=`H^7B&O\V6$W'\*&C6%0FJ55IE<*JD"O&D4Y"EH\Z-K&&F-_-OK`J=\WV9 +MGCJUVYK&XHT5H6!:N^D,*#M;:2]I\(P?3Q.W="@O%,*J([?E*)07*<*\+.WF%6VVB6W0UV,9AP +M6-7F^`.$1.K->EV0V?*2;6G7CS-`#4=5[6=9GI,H`@KN)+>*@N +M&KW6L]G&<33PNY!9G'K8O:3!#9=9BY@_P,XLMSOJT]P^X%AC)%]]7HC9#SZG +M37/@9OHNP2QXWC1V(-M8C`%.,_P0VXZ"+A9#J:]Z-`B"R6@577;36U(&SN'? +M-;"+'*>`DY^MT9H[296"#300JKFOIY%(U,@\^%/(M5;3GTQO4VV>/W;N>!OK +M:FJV]R4Z=*MBBJ+/%D/'G,>G#0R++M@SFB+F/#%>Z]$;&SLF\94M2Q`\MSF1 +MG\9FZ_0C(#A2QF:JET$0C9EJ&<*EH=6=%+8+Z\#_WJJADJ\#%W9CS1*9"L94 +M_6]CX4@\T9&>]FSVO-MVG;-"<*=7U/8VDI;.C8\GZGJ)$"!,*L0J04"VXE\R +MR[#FEKY#_M9\IMQ5H@]MA:EOOOP0EY&OEAV5=+NJS1C6QIT:ZGI&^N-;O +M=CIE*FNK\J93!#;$X`."6^@BX>(NEN4+;U!8N[H`UDJ"G:(&7`=1!CFD7W/O +M)]S!_1P.YDTGW55@XF#=T?5Z")ARQB7+VV +M&YWU`BG_Y`'"N0'CL_W[_>ZL!S^+(9.G^7YZ&Z9Y*=I-W6'NXO!A.>Y"Z1K\ +MMK%/#-I.F7-)'+!5QNU/3'7K+;479/L16X:1IYJGY\@]-."QGD4('I;6YS"3 +M2:$#I*ZA5O5(P76ZCNW01(2#J@H-;X\2]9F,_G2=6#7K;;R63\$`XJNW^+1?I+Z%,,AR*,R2:-6$?3 +MU-IZ[*-I&].AW+[B6S2)>&&J]S:>>UT%.0981-KV`<(.-"WHC=44R\W(O.!G +MIOJ:.1"S6^7"=AFT.NI38@<>\;,OFIZIDT,AY:;+8;1DE"^"N&R1,M(;2OU* +MK];K+9=B7%`(_T1+0M$=H7KN27_7A^GTQS(RI@/@?QV[#*?NU>=`R:. +MN4A1M!^S1F"<%^KD%Z#A-\O;T(C6=R1DR +M"T;#41I(#6I6]L$S"W6W3=]9MPW(VCG<"8TLWEKC+?1MF!3@-#>GHH16C3=H +ML47Q'H'TDR<3^3'TW)8E]PMJ.A#MR&-"P-IH(88*A9<(0R%[H[^?D*,5V&B9 +M'?S]+X<.8Q&$Y[(ER2<<+=EI./N8A/(#\.''7 +M5B92ZDY#)K"[50-EB*4KHO,<&.]1TSO09W)HG>57;VCI8=.8:6EON]'X9 +M525-&NC$TN\Z=4N34'77V!RAZ63P[4+.R2VI:OP2%NJDR_D:&7/E*BJ2 +M%EO;SUA]TQJ6'_;/20MN1LRIKO\"H6ZTH"JL'5N'ND<$O#.!G4_VMVIY4K+> +MD;RCZGV#>`M(Q91ZF7+M&A\BTGAU+N91$9ALO+[S`=%8\UJ/6V`2Y8#&^,M& +M8GTHZGC5*GU8!Y+V!26*0]"=!`<"B-4.DEI"Z%-IY=S`>K9UJ?X2HZ;4N9D_ +MAK(`0S(Z/W"EWA^D6`DRT/SLO5="QS/F\X1887E?@:J[-0;'&UQ-ETG.5 +MMTWZT->L7R^G3"R'B86E`:-A4P?N"?$?YZ11$5)\*ZYZ+44YLGW?5N_K(58Y +M)0"0XP)HO!^J<)W@3G>I^QE3>`H,>7FPUJ9MJ2Y%#3?J:_LWV6-L1I5N3>XR +M!GS>^JTH?G?%,X8'G*>'-T`VZP"T[(P?H`WH/44@AJ>]]W2JUFLA*&&X1C8A +M!A1:"'"M1R6^-YFE6UDI)7-O\$>RYK],SVA29)08;X7Z#HI%QX;MT?P&+I=: +ME&ZK53),FU"0+9'!B:FAO6@V*N.+BFI,'L%"N>EK%+K4C^E?T%(39% +M2\DB@]C_7<=2-K6CH+=@J`*:G%3V..;7<<$H9*8BVSN5C*NA2;2DI4L)P8K(D%07B=Q0P!IB+Z+SP3VA_'!E4%-=4YQ?FF,)UAK, +MO#V*^Q3-CW1)):*=.2(>.H:8*E2$$DRV&X+!.D,]/C7H+G((,\'#5P_@(X/! +MEO'B9;U'*C;*DUE3K;1O9,*5U]UM5DVXY,ZF010,,Q1I=7,[023J7VD1>5E7 +MVG3D(X`"/AL4:7Y6K3MKFC9HXK8NRX(W$6D<[HPDK.DAH\\1:MG\=^I,U5/, +M+(T22K%U8R^H!L6VR71C#:.,M+RO`X.[*?4).3^(D-JE5'0Q4$=5K?Y_L2'O +M)-T/=6^V\K;AR*Z\??@7L00(E"+'''E=:.8VM)50G#1"%]I`IZ*:ED6F2E0\ +M6JAW2LV+F?(.*Z3,ZGYY"#M&A'Q[-<0EM-)1C3?`O3#K4LG'#I&B$+AZ6QH" +M4$EW@_>Y(EAJC'2`S&-WVC[`J.T^"`#(_HSWH7AWMUFBN#$'_$N5_\(HI\SS +M2MN(/>:@9YAT()!+`+,;``"/3@```V.F!5XVL]H^'3,A`*2!``!T97-T9&ER +M7$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6R`S'*H[3YSJ.T^#!U1#,S1%\6= +MF]T/PH[-`V-[U)/P29F;F3P#KD;FQC9X>MJ;G<[Z6"DBFSK*16$E-Q31OW?H +MQ-Y&TBESE5=DVFTW&]`WUZ-R-,JS5W=>+E5=6_BE?P@_5^Y56:"L($`^[S?P +MV_AZK/Z?'U_X_+T^W=]3_AKZVM^?C]70;=G;7Z/)8UW[,L%^:*>*2 +M_!'DK<]_A]#WF/V'\;FUMXSP>;W;EG:'H6?C7W/_/EN_W\_A]7P]]G*FS7.1 +M>%]GZY&GA^<^MQ3WH_*_;XH)9H9_/AGNU_Z>$D2SNV?;N>CS:R_EI5]^UT67 +M']VK/PWG"9[8K4L/PNW8K<+_CL>-]_4^5^+YZOAZGM>K>W/W-S;Q[V= +M?8V-?[]G[_+L_4\?W=*U^MZ7LVO?_7'__N\GW8\W\[V:E\[C9MJW-,GT?PKU +M^A\'_>"#AS-?Y?O9Z>&*_^3^O8_#\>C?_T/J^-/FKVI)YY+Q^W7_ICSV;'V/ +MNL+*0F3R-`45O[_2(KOAK/S'\M]>W_CCZWI^F*> +M@R6'IS_]Q[>6X3;X:5<-6$^.]N=V*N8R]E')-@@MPKD&SV^Y]GN& +M?V;/^[GU>N45:R)$"Y>LJYGF]/PV_T?]H4`\_AAS+?+?HFV]W>"MMG>1?C8? +M]63-_?_9B`LB;M&\LES#;)]01=@87X^@((SKV^*+DHJBF?HUY7\PF9R*7]G[ +M>>;!'#\W\$4(T1)=?F^O/RY6]+GXH)WY<.:K(M][*^_AO!)IP-R*[=Z3F.R; +MESE%GIEO36']H8_I,F'AXND#1=`V'/FF6],F&*B@C>!U,F#'/\A4$Q17^&A2 +M',5@R#/E-!?N)]>5>7,I^I,^NX9^FPEI[(-!#US,3XLB!FB#CRH^=#D_,Y1W +MTW;1#1CBS$`W?Q3>FU?SNS1<-^BJ*WE].PB4+R/QTF.K9H](-;6L +M(*$7SHKK/39S\,>93/IF;MDTN7L4(_;$FM#N/F))6Z:)6ITBGV9B;-$.;*BC +M(7[D(^P&LYC*BA4>[Q0N:$<-AD[EH3XT,8F'D>#9$-^X?1O4[;TB=O,UQ;Z: +M!HSL[@!#X-[#?OGYCW>"R,5P?&63AE@O!PO03M?LW&)F'-B:"*3*#B@"7DW(]@4I*ES.UFZMQ30 +MS)F6@D8JS)@Z[H9CG:Q280H##<*<>$D8H:Z#ED5D(**77LQ)851WS^3 +M2G\O:6X/;N^BAU]&Y?/X>JYLZ7X:.$,5'&_@R^XCD9T%*148 +MGS?R_7#EUY.%PS45/1:*+`@A&@8<2D@;YR1)*JDN'",GDN#]%1,?& +MF:/7G +M,W.;B_"JP4F:U&Y$5)\4<=*IDV#/0'BR&O\UFSUFXJ\O,9&]%`N!#')JJ=U* +MU\K\,/A!@&G_K19&<4]=7?XH6-6*D9QK#@T=O%@9<27=S,&]0CFM!;N1XO*< +MOQ,V+I597=%5*XV'MJ.?B2!?VVARCU3,A8.AG$54X;[$=HX-*V"D)WW:RZ6J +M?B89CFR08V^J(1\,KS?8YVG>UA_=QEV"W/6?EJ>+S=5/<'"7Z<[R$E_&Q&*= +M>#K!4^%@Z!_ADDN*Z2D9#\J=..O%T>$]##'R,8`*E!SNWT92'&ZD+\\9?.G* +MW7=2YV<,X8C?@7PA@M^\/\(@!(L8?CH;HOJ.FT-22];[R`?+84`C?2G92OU` +MO)F/$#KW%^5.CM[PS]\KZ"[;/'L_M;DP8F>*KP6+?Y;'X#U=IJ%F(GR"`_!#M"*M^N +M$(@9[&C^-?SZ^G^B,.MI]0N0-E__I_QULC]*R-D39U?/7V.RT)ZU4BV?O\F2 +MX@J`S$>-FP.&&>X&]&>7R?MQ0QX.IH2Q]0!?986K;27HIS!_'G::MGOH]):D+[\@"7W`\=%F8K"Q^:--0SV.L#AW6'7MT!PL?82E6D0,, +MU`ALSPL!H$!/2C$F$)SQ?;,!A!J9=`1PU+,M&!$&XI.NTM1/8XH +M,"[%G#G1K/+%N#K'Y$K6H:*PK.8#6E!#*XJU4!%C2H.=F.$M)?&2U]@:`FG+ +MY=1MK_TRRD71!+(E`PH+#<[G)D$]J(Z'^2WJ&)(Y.'$LEPJ"3];V/>C)3NQ$ +M`9`!OD?R77W9LI0[Z.55^69K<;$H3EV?MBWE09( +MR03R^Q,XTI9.3K+PB9&P9@BJ"5@0`&NH*G0J_ +MNXKV'A&&,S/!8+A^R]OI*G:29SF.4WTVX6;BG%OW'QKE2(^>P)-CT/ +M02N:=$J#;S]PD,9)+2MAJ?I#,BID1V8`UCT5XOKS/!]0'^&ZX>&`J@YRTT?P +MY6DN:`C1Y`4&=;5J!]>PL!(%9)N>4DJCF(H5S[9D)<$ZN9M*M\BJ"3YW1?2+ +M`BXU9Y72"::*`U^^*U$DT6B5N3/SGRP_M_]N_%LAJPUO=]^YP6 +M=S?LZG4T%JM@U_YZD1;6_FD1D5)?#@=B)O_SUNIB513J:D#_G;I7@*4>`4*K +M4U=5_^&1O?\O;[=7RZ;U]P@,``^U-K>]7LW?[YI?A_:MU,1U/6=R*;,X4NIM +M`B:0HQP!PKF+U?^5ERH#['*1+82@=YP4P7>#&H#@_X6E2R.F1'(H^JF_/QP*"'U(&!Q8(>QT"X5=^C +MT.8]3'9K/E?=]_KUO=M>_=]86RL>[UK]-67)J_@;,[:B9)HA#M*SZN8_^C_R +MS9=Z"W+(P,Y3*)12BF:\.$O9PYB#0\P<7AM:<2M9?DW(D<^H#D29@T!AN +M9AEKO]^)<(=2M>#.'Q6J'SO?9WQ0H?835R@HE%!H3@ZI`#Z]HSKIH.DL*4A> +MIW\VJG)HP<%T!.!IHT"U"A_=W_@83+:$3 +MV9=<+0'FDRM9A97[VH?6J[BIO\Y)?:-USW^G$!"/31!TK/).VN&49A$TFH"! +M0!FH?L]1/FRCIJ=_*Z.C!?EJV'M^$IF;HMFA%JU,*/B0;0,*JL22/3Y6!PJ`=00P.(QH^S-$UG-35'9OV,6K)*8YH8YBQ9C54=:KU,. +M3.9.H9X`O6SP$V@>$"-JHO+*&D(BN8YXE?/CE*BZB5UFEC/RJ)J$_O1(*)AG +MJ&>+#7N140C@JXZ?L!V=%,OS(:7DQTA\9Y%X*Z'1HYK[N94T;E%.T$HY(M9R% +M](CU62ZQ)J5#-:E:&6(@-3:N#J?"^\>10%=MSUU<+O620$15S2[1"@6!=D4A +MM"8]N7$8J*&YF=2CK`AD>=#IUX:-P@SB5@5-=&M$34O6E&LQQM>Q.<($17Y3 +MU.6=\0I+DQI@[T%RY5PI+H=RSQ:+M@L3(/DAF;,<'TCL`49@,1Y4\,B2GR<3 +M\C#-T5C:3E0:UE9@/KAG,9\_$SBTE6I[[/,CE8][=_MN>CU4.(]OCC0V_[@7 +M;MRQ8!-PS(*"(H$STDXKU=8_@#HUIH`^8%GB@`>_#RA#6`CI+9 +M<"$6U4FD?LDDA:,#/*J\')-RQJ]XG(/47!T*[Y,)`4[UW@5^5*TPC/P"KB,A +M4EMU*:[#Y8EP+*^^)!_P.UF3NVD]X/EIURBWAE3D4BP$*P[WG;`0--5J!KAK +MO)"W;K9U8_Y?DJ`I/>!KRA)-)D?HG]/HZ4Y0:K!.TU?`X\5&X'5IV5K,J +MQUIJ:Q8XMZDVES4M=F5F.B>#DAT^:::B,:$.%&VDH=D%V&/$4$A^DBLG^SQI +M355JCM'FDKV8Q%\H7.(T`2X;C[RIJ>9@6E:6T9;:&8;FCC"CE+61KE'#HHZU +MC2\=/HL%'6!*C`M+`E_J7\=5BZKC44..J%N^FWWH0D&980UZ&\BZ=EQ7^*=G +M!.T=BEG)RV4>).(G^L:H!`SU65"X>&>1'X@@T`L\84OBO]6A'CY%@/O)_T?" +MIJ4JUPW%08R#H:S,,H,.4NSNJL2NB"C"K0?609[Y)UHC`Q_+EN8S-J:2/"/@ +M9/CK+F]J%"^+'Y'`@KXN6E"@-\[V/RD)]OF``K"#O&"DYL#C&E,"/,=OX6Q' +M66%[AFT>.`;BZ])-8-=@F9$T[>AG?Q#HO@X/CD6SZ_AO>YXT(UM$9)\89:7O +M\R5[[^(XZO+)YT*U1-)P-T-JO?Y>ZA2T)J$E]A@2"V`UY^PI6$A=HXI*\G5- +MA]?=#E/EU?*W3'^JIK/J.B1)0JYV16&I`U/-N%Y(5])+YP+U5F%T@RO<+)2J +M]H%+2(`)'1P]18#BC2Q`",Y'1X%Q*>!I;-S&L1P+RLOL'RXD6H0'Q2H6)9R4 +MAT\^(P2#V4A!^ZP8&WA +M[`+(\`KRS\6A%S6>Z^?SS(.,'(J6+(],-T(*1ZIE;X@HW0&1KS0LZ<85@DP+ +M5;;_/0D+Y.6MT6&=!F4E]KX`U5[I-P58'O+HM>0\X%;Y5T-M.S]]+H&SH#2D +ME>:.B=@-Y)SQ26QZ&*&Z_7?56]7H.0!/V61XBQW?59EK]BXV)5[,N;LV]#P_;T'E,W0-;MB9H&![4H'3N_%](?M%, +MXCW\S-W,J>X\9UI35L3I(+*C[')+;&;X/7C5FA'B*[H\PNH- +MIZFV&5M+244Y/@C6V5A>2W$@YBFY8;#V]U[9H$W-#<-SSRIH^>31F\; +MV&:=*-0RV.7IY#^ZV"JLX13H,7<%&X`&=XX\P*6W"%`YN862'3QSBQJSMU[L +MN+$`4=4P,K:<<-5IVIM#MO;L#,$]]DO:RW'-'8H.)]HBV,.%"0YO'\QKERWD +M2;.M3#\%B+J +M!SGL(K5C.>(A;R<+)*1#Y8-#EMNK,=Z2WM$!2`")V2$"R!OLV(U3"]W]`!(:!#6<]@]?2 +M7!)6;<&:!03HSN5;YVY)C>I/1WYV.WAXD+W-&.W.Z`RMOX(VNKWN@6,]$?$Y +MX:F)XA-6LW^&_N*!.>$9BED8S?4$*5406C'2'Q[[G#0DQ&G]4(;6?T0>C0VM +M(7]RQX3?:+2)J:OE5/QDUQBOHMVO3)>DHK>TDZBVG+,Y'_X*:;'WS:*:7#E- +MBS!;P$T!%>,FC:%'?-_-,@NLZ&ZJRJ6*H-5C-*B"G"[+R*P\985O\=`H^7B& +MO\V6$W'\*&C6%0FJ55IE<*JD"O&D4Y"EH\Z-K&&F-_-OK`J=\WV9GCJUVYK& +MXHT5H6!:N^D,*#M;:2]I\(P?3Q.W="@O%,*J([?E*)07*<*\+.WF%6VVB6W0UV,9AP6-7F^`.$ +M1.K->EV0V?*2;6G7CS-`#4=5[6=9GI,H`@KN)+>*@N&KW6L]G& +M<33PNY!9G'K8O:3!#9=9BY@_P,XLMSOJT]P^X%AC)%]]7HC9#SZG37/@9OHN +MP2QXWC1V(-M8C`%.,_P0VXZ"+A9#J:]Z-`B"R6@577;36U(&SN'?-;"+'*>` +MDY^MT9H[296"#300JKFOIY%(U,@\^%/(M5;3GTQO4VV>/W;N>!OK:FJV]R4Z +M=*MBBJ+/%D/'G,>G#0R++M@SFB+F/#%>Z]$;&SLF\94M2Q`\MSF1G\9FZ_0C +M(#A2QF:JET$0C9EJ&<*EH=6=%+8+Z\#_WJJADJ\#%W9CS1*9"L94_6]CX4@\ +MT9&>]FSVO-MVG;-"<*=7U/8VDI;.C8\GZGJ)$"!,*L0J04"VXE\RR[#FE +MKY#_M9\IMQ5H@]MA:EOOOP0EY&OEAV5=+NJS1C6QIT:ZGI&^N-;O=CIE*FNK +M\J93!#;$X`."6^@BX>(NEN4+;U!8N[H`UDJ"G:(&7`=1!CFD7W/O)]S!_1P. +MYDTGW55@XF#=T?5Z")ARQB7+VV&YWU`BG_ +MY`'"N0'CL_W[_>ZL!S^+(9.G^7YZ&Z9Y*=I-W6'NXO!A.>Y"Z1K\MK%/#-I. +MF7-)'+!5QNU/3'7K+;479/L16X:1IYJGY\@]-."QGD4('I;6YS"32:$#I*ZA +M5O5(P76ZCNW01(2#J@H-;X\2]9F,_G2=6#7K;;R63\$`XJNW^+1?I+Z%,,AR*,R2:-6$?3U-IZ[*-I +M&].AW+[B6S2)>&&J]S:>>UT%.0981-KV`<(.-"WHC=44R\W(O.!GIOJ:.1"S +M6^7"=AFT.NI38@<>\;,OFIZIDT,AY:;+8;1DE"^"N&R1,M(;2OU*K];K+9=B +M7%`(_T1+0M$=H7KN27_7A^GTQS(RI@/@?QV[#*?NU>=`R:.N4A1M!^S +M1F"<%^KD%Z#A-\O;T(C6=R1DR"T;#41I( +M#6I6]L$S"W6W3=]9MPW(VCG<"8TLWEKC+?1MF!3@-#>GHH16C3=HL47Q'H'T +MDR<3^3'TW)8E]PMJ.A#MR&-"P-IH(88*A9<(0R%[H[^?D*,5V&B9'?S]+X<.8Q&$Y[(ER2<<+=EI./N8A/(#\.''75B92ZDY# +M)K"[50-EB*4KHO,<&.]1TSO09W)HG>57;VCI8=.8:6EON]'X9525-&NC$ +MTN\Z=4N34'77V!RAZ63P[4+.R2VI:OP2%NJDR_D:&7/E*BJ2%EO;SUA] +MTQJ6'_;/20MN1LRIKO\"H6ZTH"JL'5N'ND<$O#.!G4_VMVIY4K+>D;RCZGV# +M>`M(Q91ZF7+M&A\BTGAU+N91$9ALO+[S`=%8\UJ/6V`2Y8#&^,M&8GTHZGC5 +M*GU8!Y+V!26*0]"=!`<"B-4.DEI"Z%-IY=S`>K9UJ?X2HZ;4N9D_AK(`0S(Z +M/W"EWA^D6`DRT/SLO5="QS/F\X1887E?@:J[-0;'&UQ-ETG.5MTWZT->L +M7R^G3"R'B86E`:-A4P?N"?$?YZ11$5)\*ZYZ+44YLGW?5N_K(58Y)0"0XP)H +MO!^J<)W@3G>I^QE3>`H,>7FPUJ9MJ2Y%#3?J:_LWV6-L1I5N3>XR!GS>^JTH +M?G?%,X8'G*>'-T`VZP"T[(P?H`WH/44@AJ>]]W2JUFLA*&&X1C8A!A1:"'"M +M1R6^-YFE6UDI)7-O\$>RYK],SVA29)08;X7Z#HI%QX;MT?P&+I=:E&ZK53), +MFU"0+9'!B:FAO6@V*N.+BFI,'L%"N>EK%+K4C^E?T%(39%2\DB@]C_ +M7<=2-K6CH+=@J`*:G%3V..;7<<$H9*8BVSN5C*NA2;2DI4L)P8K(D%07B=Q0P!IB+Z+SP3VA_'!E4%-=4YQ?FF,)UAK,O#V*^Q3- +MCW1)):*=.2(>.H:8*E2$$DRV&X+!.D,]/C7H+G((,\'#5P_@(X/!EO'B9;U' +M*C;*DUE3K;1O9,*5U]UM5DVXY,ZF010,,Q1I=7,[023J7VD1>5E7VG3D(X`" +M/AL4:7Y6K3MKFC9HXK8NRX(W$6D<[HPDK.DAH\\1:MG\=^I,U5/,+(T22K%U +M8R^H!L6VR71C#:.,M+RO`X.[*?4).3^(D-JE5'0Q4$=5K?Y_L2'O)-T/=6^V +M\K;AR*Z\??@7L00(E"+'''E=:.8VM)50G#1"%]I`IZ*:ED6F2E0\6JAW2LV+ +MF?(.*Z3,ZGYY"#M&A'Q[-<0EM-)1C3?`O3#K4LG'#I&B$+AZ6QH"4$EW@_>Y +M(EAJCM#'TZD7E[>^E"B3)2K$2:-U +M5%)EX,^[Z/T)6TB:)CD1,U4E(I-+`,]6V+:-&:B>1$ +MSVZ_1\FQU\.SEQ<&;'GQY.#%O^;#M^+%ES69_ +MHXL^[K_Z?#!$V>[L_=W/I^?K5_-Q5_#M>BYO_I+GV]C]S[MCRV9 +MM&&7@GAMW)P9]?=Q;^/>X^4D&3Y&Q0BO#W_2,>[\.MAS1^;O7V_]_'ZWI_5C +MSZ#,MGIV'_:?M\MYIM^'3C\^]+W]G*NS5A/R[W<]V*O,9O\H\F;AQ;=E<@[/ +MM]S]GW#/]G9_ZN?:^O"*NM1(DUR^M5]1?CL8?KY,[_?6H"Y$[NC?+DW.+;@^LR+V)X7\OIF@CG7V_%C\FBK +M'FPZ-?+AYA.9S'E8=OGFX=ZS],/#CLGHC)NX?R\K?2\_BQ9\.7BYJN1> +M#!ROX.+?FDV,#N8]W=])YCN3>7/*+GIR[^;8P]J>/])R<7A\7I$]%Z!N+GSI +MEOIF:>*QXM[!,ZG)D\=A\D*"<>/@\.A2SF*X>0<_*;%P;E/KY5\N#15CV^7V>TB:%\F'>TF.UN:'EYO<6Y!'W\D];;7%,H8_TT5ZV#-SG\ +M6]S*<^G,WMP:7E[CLG^W'36D;C\TR9;M-05M.D:?9S$[.B'FRT4/-9FIF702-"LU,'IR>#GAF/.UQY.*:@-FY"W3"]!COP56VQQG.]T' +M,%Y"-OPPT:$S3T)0I=%1'G[R9/'!!F]2L\N#DF:_>C+>B;Q:AK_GV=GUFXM?+YIR-].@7AH8ZFJL]]*W! +M"_%I\,7#/3_[6/D:\I[?7?\5EK5E4C7FL/!T=O0P-7$P[NMP>#0CS6S+>YO< +M?S1E_';L7I59;^BM2N.Q@[6]G\5(%_MM#PCVIF9K!Z&>.%4[."U'='!L+85( +M5_W=:NEM3\3BS1FU(,=WJSA'V9<%WL>>Z=[;&'NRF[BV\^MARZGB^;U4]XO# +M#]//@H2<,KCB*=OS=853Y#!V+#X2U@"%*( +MSO;]'"0]Z^D+^DIP1IS6]=U+SL\6>;$>'%7PS8+P[\_\@0!2+'-^/0W4/J/3 +M=#63+ZWWP`?AL+%.-]EC957ZDUY.8^<[GK+8?Y<&UFX? +MFTP5J1,8$\];/O\/6O)TV.SU^O_/7Z_9U^Q_+9[/8V/CZ^Q\G7]._8P6D#U' +M#'E]#O0E"8`6:@F6'G-<1;^.MXN0K-$>/?ZVITKZ=,U'C]#YYUO/<'2Z:R2O +ML_;KK"WV>Y6%U/W/EN5[[.Q_'8_GS:8L.O?>&W>6WU^O\M,L\%VV^Q;^_*_0 +M7MV^/LMO)P\=OBU>#8V_E['\I^KVKD+6HGY!F'X@.U.*M_;BFB"WV.C^.O]' +M7Z?Z-Z;K;/U(<@=G#_XP_'K@.++ISC#L\_W/U3%=?^'7_G_+4MY.$GHWV_'./%ZV*C7M[#P4NEP +MW7OX3-X\?#PSPLU^^]W(BO8(>G_M8MR;@7>Q\$UI9N#X6BFUQN>^@`NA'QJX +MHN7SI#J^"&H\VW.59V_%:PGN7#,ZN")NO=VT+E3:&:KB.WT\'P=%DCTO=F+X +ML\6@&T*'CS7L_C+-W0]1W!SO3&/SU?X=BZ.%[H#1O$Z;6&CG1%M^*H!C+[1M +MWWG)?LR9?;02-:8(/]P('4'W<*5];/?I^J&I(??P`)PW@\>BSF*XK7YL]-69 +M]CU@@,V>'R]1MN']>662NB(+,Y0.:@MFY +M[G)D0>VB.I_YEW]#&3>R>'CK)<503'UX)=]&2GOQ$)F0F&^H_DW<-^;*J'?H +MY5K\N9KN71',-9+>'BE%3<>;5':@R4206"OL9KS2FS&3 +MUEX9S(W#S!0J#"N>@3?LI1&K*:AR<-M$VS8(SC?Q4`!UU!J="U_>\KW-X1Q; +MT3/$,%V?IBC5FM@Y>\%)4[I)G/-&4\%-N0S="<;ONCQURJB/L'#2;'T/8LM[ +M3LY4';Y^[(#&9,NE;#J?ULS45,QQLR8:S!CWX?7Q/!^H#_FW79X<4*@\Y=-' +M^'E;!?;F0R\.>KF;I5OJ*H4G +MSO1?KCX:+C:V"KI"FFH0'7[\>UCI-%T2MY.?GGRXG_WN_E=(:VFKS>X!!,/; +M[GV=W\.YX-GN=_9ZGJ:"ZMT&O_CU(BW6_SI$9G4E^+AOQ$\/^?6]3$U13U.I +MBP_1=I7P0E'P3H574ZO5P_XM?R+-S.0EVFT($TS48\$W"O,7U?^ZRZJ`_8Y3.6PRS'>>#3!=\ +M$K0'!_V6E89'ID49#S(:U'&OH>QU^S\G7]?3M?Q-+W>AG6KXR;E3+Q](EJOX +M]GJ/U4W\_'@J"'ZF*T.+BL]CH&\5>_H]FYCZDMQ6?-?N_A]G6^_M?AW?LFME +ML??]E?IU9=35_@NF=NI3).B$.Z5GVN8__)_^K-E[^+;RY+0SFF42QY9TS7P\ +M4/9YN8IM#YIN+YMK9YRMKTT9/@NIB<(IHV*M0HP]WO_C$)FZA$^S+MXM3'F +MP976M+-?ON0_6J[SJ;_GF3@N&Z\]_U<T85^75V,'?LA,UVB[="5JU-E'Q,SF6A+[8HN'%3SV4J +M'6"Z@8:JL3!'T^6T.%H!ZDX8'BB-'[,T5S.=351LW]S%U9)ICK@QUJQ<1JM' +M75P:8F"]NG@,W0/#,1MJB\VT-*<17F.P05^?'E+1=2E=9TL9_-43 +M5.?WT23HF'/5//*PU]S'HAGP.<]/X+Y!B_NY?6>#;XYUL?P:+?!BH&5J +M&)CZ<,L@^]9'+I`P\\HQ[GGU^Z$TPR[P2Y=0W)\*'9O;M8^UU8LM<9XO',M\ +M[&HP6KUL$\?HYYGYM&;DV/;I27I4B7XT?5O.G]B;L['FK\X#2^26J'QSY*\% +M=9T:.;AOYEIHW-%.Z"4>2-KG(KZ4#U;9=:";2H9UJ5LV6,N>Q7N$"@5_">L\,[\6@UKE9PQZ +M\V9GRL?>[O^O<^GZ]#E'M^]O4-O_>37;V\N/AG-PYJ"@ +MH%`Q/29YUZO6C\3'1UIH$_G,6?.@F^6SURC;XLM.12A@*=8=]YVQ-`V;5J" +MYPU[R0N[NW3JT?YP9-0%+!\%SRBDFE;'Z@_L>CTIRIM5S)W35\#QRS0ECS70 +MBXG=ND(=`'5*,M-;3@N!A4=G?!;*YYO63YI6=T[-Q1_W!QUEY:-P7UI[:UG/ +MDO\'P>R6HIO6L=;-IK%EY;VDVEYM5KLU68]$^+R6=/FG341CH0X:-M4H=F+= +MLWN.$$S?I45D_Z/&E7*K:CM1S26_S&47RLO<1I,)=/^F +MW[UDT@YJPAM^S?HNGLWE?\>>W@G=']]^"*$;=1&8/C9ETO?\U*]]_C/CJ^66"^ +M%:T39/!=H;JX/^,'J%+H34,%^TP,`MIC7L.Q4K3D+NCBJ5Y/5-A^ONB]3Y>K +M\UVF/^=4UGZCHFT63.+/2T`!+>1TP3+E*>!TMFYSUC/@7JLOVCY>.BU%`?&E0N==\Z;!494NP +M?3D6&?_-U[&5_W=N'!=N'HQ!M[<".H;UU!_9QS//,V/:]<"_]/W1SXEHD'V4 +MA!_>VC`[N'LF+(^"=>6PX^A%SK/=?I^G,A>8.HJ7.R/8ANS051ZIRM^*:C>@ +M.!KUP6>G&%<.3AK5;>#SZG(7Y/+K>BXL]!F63@N?`157O2=R=6!]Y=%UY#SP +M5;YJZ&[5^?OTN@=GH#2J2O.CJ#L3;RISQ5+8]FQ1=K^N^M6]<&+R3"?VV1Y1 +M8[WU6:M?LIR:LZL;\ONL]7[!7/IYZG6_=*OWV;\LT*>[\4C$'&@!F+0&]GD' +MWSE'XQG[^MHQ/?X]_>\T\X[4J^S+G=S=ZS +MP_OZ#Y37:!UO;$SH&!]J4(T[W\?ZV?O%.,1^'FN;W,J??'&==*:NU.F2=E1^ +MW,G&([D"A_<\Q_#0E>QO[A7^NW/_WRULV?IZ_H^\.2;K&;\'V2M7)>GR899I +M]>V:)S84]^V7MMMQSH[%F<3]XB['%Q4)%[>/])ZYO6\C!L]; +M3#\G8BWDLJB3HIGIO+VHH#V+HS8[,.CO"_]@4K0.]T/6@ +M<[!Q3K5EO/$67;+= +M@U5`P4WU2IW\A_IKVW+ABYW<45Z*.BXS.39ENEL)V!!,"=OS-]S8SU39@]_0 +M!!#H$-MY[#!P4EP8*UUP9T"@QHSW*M\]O)FB]2?1\&>UV]/Q4+WFRUVY[H#* +M[?XT;7J][T"[T=$?G.>14Q/BG-6V[_FW]XL5.>$MQ59&.+Z@LI51)VC'I#X^ +M^YQ<$F@:?ZH0W6P]$'I<&UTA?[UCPQ?:-Q$ZG5^:J?HDUYXK]:W:]FI>DLZW +MMDSU%M7K,YG__%IIL?OFT::7FY3M68AO"JYYIJ(-.%VKR*T_'#"O!X]`L_E\4]?\V7%%Q_3H:.M.H3:E5=,KAJJ0- +M>-(TY#2T>>C:QD4QO]+O6F5/?-]Q,\>K7;KF-YT:+:G8%M=]4,+,[7;I+VQX +M\G!7>>C7F,YON1/)S7\A0;7IP*\;'I>X%O`E9?98:L0_S;AX'6>RK2','P>O +MP#WO.\OP^+1GSN3)>3IK27^WM3YQ"T='63&I9`DX9&[C\.QXJU9?3GE&#]/$ +M[>Z%"O%,55$OWY31*%,XN'8ZOF_"9PH$ZVZ]AV1 +M=/E4FUL]>/,Z`&J-5]KG6M]*V@"3KN,.6(\\,^:81\[>*Q;D5>[:Y[/'&)T\ +M+O`+.,?6Q>Z3!%TNM:N9/_)LXVVYWZM/L6V?/][MSXKO +M6ZG5NOAJ++W09XHB\1X<>_Z]$;GL[DWQPI;2Q` +M^6\9E$_CFNU_0C4!PTL9G54NIHAGLS:LSS5+H=7/12W%P5X'_WJJAP5?!:N[ +MFCFB:9#6,K'UX)>0D'S9;&>^WL^UYMO:OV:%>*>KZL$KI*79Z-CR?VCJ)&*@ +M3#5B*I!H%MXZ^:LG+#W:?-+<$!_[F?--N*W"#[K"UAOOWX(3@HU]6'9JZ7=J +MS2UK:*='74^D;[>:WP>QTS2IKU?E9JF"GMC/,`Y.6^Q8_#XH=+>6:V^H+%[N +M@#K4J"GM$#5P'J(,O:1PWOO@^\0?Z.![UP\ZMR0X[JE[RQ]&//7W])_Z6-;! +M$N@8V\&[/I1&7=Q;=N*X\&[272M*L[1=QZN4BMTK%0PMXBV][56#Q6C=Z/J^@B:?+&4N7NZ&Y[Z@2I__),.%N8HX[/^_O^^]6`\ +M_RLAE?/]7Y]#=.?)IVE=NN;W>=X,4Y[F:Z45^7:X\]F;I.F77$CRXM7&[:>F +M.X-FZU%[9]C'MV:1I\53^/)/TZ<%CGR5"!]+:W/,)FR="!U2NH:MZTC!>MU' +M>[04$*@ZJ:@VWX^.O7)ZV@;MYZH]B=DGU$"EGDYM.Y8LOJ%F(DO[JK'O<>F> +M4NM+>_SG-`#O,G@FM-EBXZ/C\])U8.O6V\%+)^F@'CU=O\K1?LG!0IS9#R5&94FC:PC]/4VL +M&[EGM*+TZGW+[Q5LTC+X;-5[FZ>>UZ"G,S+3B;;_#/A!YZ%W\<75%FKS< +M#CIOM-'40M)W%FZ'74LW',X^_%F7YM/5,K@R'S:;+8NHR50ODZX;DQVV +MD-TK]35?K>M6R[*7%!./]C@M3M$>X+U[DE_[.+]?UEG(U4P1X,,MWX96'=U> +M>,SN[%?91M2]#1W,EE=)8O#'66IJ+STKQ=`V$3:'*3AXLO#'+18Z(/SVMY;> +M7E/?@RPHI#SJ9DZ.N:0H[@?N;>B"=-?KLFX_FG'UGY$:8P4;H +MBS.J2M>+=O=$-]'6=RHR9BVHL-2C24QK66[M@G,+NW73=^U=<-U&T>=R:8Z6 +M;S""[#,]L?B+4$NJ&^"[B +M^+QS+489X[(EY,GCLNV72NK*93?2=0R=87=5`[;$4TKHX+7 +M!E_J.G.]BYW,V._RJ]W:.JPZ>$4X-4F7^<4,O/REHJE0LW=O/K#[TQJ;3_W3 +MTEEUR-Q*FW_X%16ZTL4*K3=6\7ND<&'AG@MZG_$[2 +M,K*/:9M!T:TBG00+P42Y0[)ETA=(3;'+N<,=6SUM/\)4OFUAS-3^&LS +M`0YJ.C^Y"7?#^N/A@F;4_SV<&KH6/,_%YPSL,+YL.*Y5W-H-WMZY*TM5`:70J<7]Y.?$P^?5%$9U)^:NO/1M8\\63[WZ +MMW^LA6UR30"1>8$Z+P?U3A7^!.O]3]WH4WQ0@S!7FPZU,W:R;F.S3?J=?VN] +MFUMC>I5N8O<:@9^+WUK2A_/?BS7C`^>:>'-Z`;>L`NG9&(^B8WJ;U&D$.I[\ +M-_2M:S7`2BTW%&-H"#3HM$!PMK>R;?CP6Z5NK)5)7.[^"/MI1O5:K-29-U"/F4J9_5;WT1![O3RQ3D;F+]GZKR4_JX[S%.W,I9-^@6S>Q<=R:+NM!V +MJN7EQ8J3$=@HJYZK6*;[4F'I7]$)"ND5-^DBA@E_;^.TC:ZT="MV"T`4ZG%6 +M"67MKWG!-#)9H%MQN6UE7H4FV$E52Q2X"9WN]@NG8YA%*0W?8,5P)!J"\IW% +M#AFTQC_6O/!8.A_'!JJ"Q75//*_.FVTP$_'-.MFM;>'N/@M4SM>Z4DEL +M>>G)$8(U#I@J:D(4DR[3<0P3TAGL\K@Q;GDG!GQ>'5P_DR/,\'+?>X[;>H\M +M&V:DVVIUW4;W)Q4KK]]M6V;E_+5XGP=W*?J03J?Q$BZJ5:.IXK%O:K6_Y_N +M.A[X)O0]VM]M\K=R,BW<$>_BKV(*9$T(VN./FOM'6MK9-5"I_3D*;M'0C\?9UYPENFDHYZ;\%>F';67)X +M[.D:(H7)VY'T1*$-.0_>\F.L-6>YNFX^2>EOX_);D=:+-%TQ=6G2/J9!I_E3 +MG(>"ET[=CK?)AS1U#C4H;[6_S/J[WTVX?K?5^/;_K'YC^WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^` +M+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX`````````` +M`````````````````````````9@``````'P`#``````!>WX````````````` +M``````````````````````7J_``%[?E[?@````"]OP`````````````````! +M>WX````O;\```````%[?E[?@`````````````%[?@````````7M^`%ZOP``` +M````````````````````````````````!X```````````````O;\```````` +M`````!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7 +MM^`+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX``````` +M````````````````````````````9@``````'P`#``````!>WX`````````` +M`````````````````````````7J_``%[?E[?@````"]OP``````````````` +M``!>WX````O;\```````%[?E[?@`````````````%[?@````````7M^`%ZOP +M```````````````````````````````````!X```````````````O;\````` +M````````!>WX```````````````"]OP````O;\````````````O;\```"]O[ +MV_7M^`+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX```` +M````````%[?@``````!>WX`````````````!>K\``!>WX`````/````````` +M`````````"]OP```!>WX```````+V_+V_``````````7M^```"]OP``````` +M`+V_`"]7X````````````````````````````````````\`````````````` +M`7M^``````````````O;\```````````````!>WX````7M^````````````7 +MM^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_```````````` +M``O;\```````````````````````````````````,P``````#X`!@``````O +M;\```````````````````````````````````+U?@`"]OR]OP````!>WX``` +M```````````````O;\````7M^```````"]OR]OP`````````````"]OP```` +M````+V_`"]7X````````````````````````````````````\``````````` +M````7M^``````````````O;\```````````````!>WX````7M^`````````` +M``7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_````````` +M`````O;\```````````````````````````````````,P``````#X`!@```` +M``O;\```````````````````````````````````+U?@`"]OR]OP````!>WX +M``````````````````O;\````7M^```````"]OR]OP`````````````"]OP` +M```````+V_`"]7X````````````````````````````````````\```````` +M```````7M^``````````````O;\```````````````!>WX````7M^``````` +M`````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_`````` +M````````O;\```````````````````````````````````,P``````#X`!@` +M`````O;\```````````````````````````````````+U?@`"]OR]OP````! +M>WX``````````````````O;\````7M^```````"]OR]OP`````````````"] +MOP````````+V_`"]7X````````````````````````````````````\````` +M``````````7M^``````````````O;\```````````````!>WX````7M^```` +M````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_``` +M```````````O;\```````````````````````````````````,P``````#X` +M!@``````O;\```````````````````````````````````+U?@`"]OR]OP`` +M``!>WX``````````````````O;\````7M^```````"]OR]OP```````````` +M`"]OP````````+V_`"]7X````````````````````````````````````\`` +M`````````````7M^``````````````O;\```````````````!>WX````7M^` +M```````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_ +M``````````````O;\```````````````````````````````````,P`````` +M#X`!@``````O;\```````````````````````````````````+U?@`"]OR]O +MP````!>WX``````````````````O;\````7M^```````"]OR]OP````````` +M````"]OP````````+V_`"]7X```````````````````````````````````` +M\```````````````7M^``````````````O;\```````````````!>WX````7 +MM^````````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P` +M+V_``````````````O;\```````````````````````````````````,P``` +M```#X`!@``````O;\```````````````````````````````````+U?@`"]O +MR]OP````!>WX``````````````````O;\````7M^```````"]OR]OP`````` +M```````"]OP````````+V_`"]7X````````````````````````````````` +M```\```````````````7M^``````````````O;\```````````````!>WX`` +M``7M^```````#^!$_L_$HKIR@3W\%I0\````+V_````O;^]OU[?@"]OP`'`! +M>WX````+V_``````````X`%[?@`````````````7M^`````````````````` +M`````````````````&8``````!X`!@``````O;\````````````````````` +M``````````````+U?@`"]OR]OP````!>WX``````````````````O;\````7 +MM^```````"]OR]OP`````````````"]OP````````+V_`"]7X``````````` +M`````````````````````````^```````````````+V_``````````````7M +M^````````````````O;\````+V_````````````+V_````O;^]OU[?@"]OP` +M'`!>WX````+V_``````````X`%[?@`````````````7M^``````````````` +M````````````````````&8``````!X`!@``````O;\`````````````````` +M`````````````````+U?@`"]OR]OP````!>WX``````````````````O;\`` +M``7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X```````` +M````````````````````````````^```````````````+V_````````````` +M`7M^````````````````O;\````+V_````````````+V_````O;^]OU[?@"] +MOP`'`!>WX````+V_``````````X`%[?@`````````````7M^```````````` +M```````````````````````&8``````!X`!@``````O;\``````````````` +M````````````````````+U?@`"]OR]OP````!>WX``````````````````O; +M\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X````` +M```````````````````````````````^```````````````+V_`````````` +M````7M^````````````````O;\````+V_````````````+V_````O;^]OU[? +M@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^````````` +M``````````````````````````&8``````!X`!@``````O;\```````````` +M```````````````````````+U?@`"]OR]OP````!>WX````````````````` +M`O;\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X`` +M``````````````````````````````````^```````````````+V_``````` +M```````7M^````````````````O;\````+V_````````````+V_````O;^]O +MU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^`````` +M`````````````````````````````&8``````!X`!@``````O;\````````` +M``````````````````````````+U?@`"]OR]OP````!>WX`````````````` +M````O;\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7 +MX````````````````````````````````````^```````````````+V_```` +M``````````7M^````````````````O;\````+V_````````````+V_````O; +M^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^``` +M````````````````````````````````&8``````!X`!@``````O;\`````` +M`````````````````````````````+U?@`"]OR]OP````!>WX``````````` +M```````O;\````7M^```````"]OR]OP`````````````"]OP````````+V_` +M"]7X````````````````````````````````````^```````````````+V_` +M`````````````7M^````````````````O;\````+V_````````````+V_``` +M`O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^ +M```````````````````````````````````&8``````!X`!@``````O;\``` +M````````````````````````````````+U?@`"]OR]OP````!>WX```````` +M``````````O;\````7M^```````"]OR]OP`````````````"]OP````````+ +MV_`"]7X````````````````````````````````````^```````````````+ +MV_``````````````7M^````````````````O;\````+V_````````````+V_ +M````O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@````````````` +M7M^```````````````````````````````````&8``````!X`!@``````O;\ +M```````````````````````````````````+U?@`"]OR]OP````!>WX````` +M`````````````O;\````7M^```````"]OR]OP`````````````"]OP`````` +M``+V_`"]7X````````````````````````````````````^````````````` +M``+V_``````````````7M^````````````````O;\````+V_```````````` +M+V_````O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````` +M```7M^```````````````````````````````````&8``````!X`!@`````` +MO;\```````````````````````````````````+U?@`"]OR]OP````!>WX`` +M````````````````O;\````7M^```````"]OR]OP`````````````"]OP``` +M`````+V_`"]7X````````````````````````````````````^`````````` +M`````+V_``````````````7M^````````````````O;\````+V_````````` +M```+V_````O;^]OU[?@"]OP`'`!>WX```']'_`95WX```````````````````````````````````9 +M@``````'@`&``````"]OP```````````````````````````````````O5^` +M`+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_+V_``` +M```````````+V_`````````O;\`+U?@````````````````````````````` +M``````#X```````````````O;\`````````````!>WX```````````````"] +MOP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O;\````` +M````#@`7M^`````````````!>WX````````````````````````````````` +M``9@``````'@`&``````"]OP```````````````````````````````````O +M5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_+V_ +M``````````````+V_`````````O;\`+U?@`````````````````````````` +M`````````#X```````````````O;\`````````````!>WX`````````````` +M`"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O;\`` +M```````#@`7M^`````````````!>WX`````````````````````````````` +M`````9@``````'@`&``````"]OP````````````````````````````````` +M``O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_ +M+V_``````````````+V_`````````O;\`+U?@``````````````````````` +M````````````#X```````````````O;\`````````````!>WX``````````` +M````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O; +M\`````````#@`7M^`````````````!>WX``````````````````````````` +M````````9@``````'@`&``````"]OP`````````````````````````````` +M`````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX``````` +M+V_+V_``````````````+V_`````````O;\`+U?@```````````````````` +M```````````````#X```````````````O;\`````````````!>WX```````` +M```````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@``` +M`O;\`````````#@`7M^`````````````!>WX```````````````````````` +M```````````9@``````'@`&``````"]OP``````````````````````````` +M````````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```` +M```+V_+V_``````````````+V_`````````O;\`+U?@````````````````` +M``````````````````#X```````````````O;\`````````````!>WX````` +M``````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@ +M````O;\`````````#@`7M^`````````````!>WX````````````````````` +M``````````````9@``````'@`&``````"]OP```````````````````````` +M```````````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX` +M``````+V_+V_``````````````+V_`````````O;\`+U?@`````````````` +M`````````````````````#X```````````````O;\`````````````!>WX`` +M`````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`% +M[?@````O;\`````````#@`7M^`````````````!>WX`````````````````` +M`````````````````9@``````'@`&``````"]OP````````````````````` +M``````````````O5^``+V_+V_`````%[?@`````````````````"]OP```!> +MWX```````+V_+V_``````````````+V_`````````O;\`+U?@``````````` +M````````````````````````#X```````````````O;\`````````````!>W +MX```````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_`` +M<`%[?@````O;\`````````#@`7M^`````````````!>WX``````````````` +M````````````````````9@``````'@`&``````"]OP`````````````````` +M`````````````````O5^``+V_+V_`````%[?@`````````````````"]OP`` +M`!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@```````` +M```````````````````````````#X```````````````O;\````````````` +M!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V +M_``<`%[?@````O;\`````````#@`7M^`````````````!>WX```````````` +M```````````````````````9@``````'@`&``````"]OP``````````````` +M````````````````````O5^``+V_+V_`````%[?@`````````````````"]O +MP```!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@````` +M``````````````````````````````#X```````````````O;\`````````` +M```!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^ +M`+V_``<`%[?@````O;\`````````#@`7M^``````'\!'_`95``8`````` +M+V_```````````````````````````````````"]7X``O;\O;\`````7M^`` +M````````````````+V_````%[?@```````O;\O;\``````````````O;\``` +M`````"]OP`O5^````````````````````````````````````/@````````` +M`````"]OP`````````````%[?@```````````````+V_````"]OP```````` +M```"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX``````` +M``````%[?@``````````````````````````````````!F```````>``8``` +M```+V_```````````````````````````````````"]7X``O;\O;\`````7M +M^``````````````````+V_````%[?@```````O;\O;\``````````````O;\ +M````````"]OP`O5^````````````````````````````````````/@`````` +M````````"]OP`````````````%[?@```````````````+V_````"]OP````` +M``````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX```` +M`````````%[?@``````````````````````````````````!F```````>``8 +M``````+V_```````````````````````````````````"]7X``O;\O;\```` +M`7M^``````````````````+V_````%[?@```````O;\O;\`````````````` +MO;\````````"]OP`O5^````````````````````````````````````/@``` +M```````````"]OP`````````````%[?@```````````````+V_````"]OP`` +M`````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX` +M````````````%[?@``````````````````````````````````!F```````> +M``8``````+V_```````````````````````````````````"]7X``O;\O;\` +M````7M^``````````````````+V_````%[?@```````O;\O;\``````````` +M```O;\````````"]OP`O5^````````````````````````````````````/@ +M``````````````"]OP`````````````%[?@```````````````+V_````"]O +MP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!> +MWX`````````````%[?@``````````````````````````````````!F````` +M``>``8``````+V_```````````````````````````````````"]7X``O;\O +M;\`````7M^``````````````````+V_````%[?@```````O;\O;\```````` +M``````O;\````````"]OP`O5^``````````````````````````````````` +M`/@``````````````"]OP`````````````%[?@```````````````+V_```` +M"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````. +M`!>WX`````````````%[?@``````````````````````````````````!F`` +M`````>``8``````+V_```````````````````````````````````"]7X``O +M;\O;\`````7M^``````````````````+V_````%[?@```````O;\O;\````` +M`````````O;\````````"]OP`O5^```````````````````````````````` +M````/@``````````````"]OP`````````````%[?@```````````````+V_` +M```"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP``````` +M``.`!>WX`````````````%[?@``````````````````````````````````! +MF```````>``8``````+V_```````````````````````````````````"]7X +M``O;\O;\`````7M^``````````````````+V_````%[?@```````O;\O;\`` +M````````````O;\````````"]OP`O5^````````````````````````````` +M```````/@``````````````"]OP`````````````%[?@```````````````+ +MV_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP```` +M`````.`!>WX`````````````%[?@```````````````````````````````` +M``!F```````>``8``````+V_```````````````````````````````````" +M]7X``O;\O;\`````7M^``````````````````+V_````%[?@```````O;\O; +M\``````````````O;\````````"]OP`O5^`````````````````````````` +M``````````/@``````````````"]OP`````````````%[?@````````````` +M``+V_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP` +M````````.`!>WX`````````````%[?@````````````````````````````` +M`````!F```````>``8``````+V_````````````````````````````````` +M``"]7X``O;\O;\`````7M^``````````````````+V_````%[?@```````O; +M\O;\``````````````O;\````````"]OP`O5^``````````````````````` +M`````````````/@``````````````"]OP`````````````%[?@`````````` +M`````+V_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"] +MOP`````````.`!>WX`````````````%[?@```````````#^`1_"\2RMN6#O^ +MAZ6/```````````````````````,P``````#@`&``````"]OP``````````` +M````````````````````````O5^``+V_+V_`````%[?@```````````````` +M`"]OP```!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@` +J``````````````````````````````````#P```````*GZ#$/7L`0`<` +` +end